从零搭建 AI 旅游规划 Agent|Gradio 可视化一键生成行程
项目前言:
出门做旅行攻略有多痛苦? 打开十多个 APP 查天气、翻景点、算酒店餐饮预算,还要反复调整路线避免行程赶,半天才能凑出一份勉强能用的方案。
于是我动手做了一套全自动 AI 旅游规划 Agent:只需要输入一句话旅行需求,智能体自动串行完成三大任务:
- 调用公开天气接口,获取目的地未来 3 天天气预报
- 根据你的预算、出行天数、节奏偏好生成宽松不赶路的行程路线(支持大模型 / 离线双模式)
- 自动拆分酒店、门票、餐饮、交通开销,核算总预算并对比预算上限
整套项目基于 Python+Gradio 搭建可视化网页,无需前端开发基础,一行代码启动本地服务,还能一键生成公网分享链接发给朋友使用,免费部署到 Hugging Face Spaces 永久在线。
整个 Agent 采用串行自动化任务流水线,无需人工分步操作,点击按钮全自动执行
提示:
用户输入旅行需求 → 任务1:查询目的地天气 → 任务2:生成定制行程路线 → 任务3:自动核算旅行预算 → 前端表格可视化展示全部结果
核心技术栈
- Gradio:快速搭建交互式 Web 页面,DataFrame 表格渲染天气、行程、费用明细,支持一键生成公网共享链接
- Requests:调用免费天气 API、大模型 LLM 接口
- Pandas:结构化整理天气、行程、开销数据,表格渲染输出
- 大模型兼容:原生支持 OpenAI 接口,可无缝替换豆包、通义千问、文心一言等国内大模型
- 容错设计:无 LLM 密钥、天气接口请求失败时内置离线模拟数据,程序不会崩溃中断
页面功能分区
- 输入区:文本框填写你的出行需求(目的地、天数、预算、节奏要求)+ 一键生成按钮
- 天气模块:表格展示出行 3 天日期、高低温、天气状况
- 行程模块:结构化 3 日游路线,区分每日上午 / 下午 / 晚间景点与游玩时长
- 预算模块:分项开销明细表 + 总预算总结,自动计算剩余额

核心模块功能拆解
1. 天气查询模块 get_city_weather()
使用免费无密钥公开天气接口 wttr.in,无需注册、无需申请 API Key,直接通过城市名获取未来 7 天气象数据,自动截取旅行所需 3 天信息整理成表格。
- 正常逻辑:接口返回真实实时天气,包含日期、最高最低温、天气描述
- 容错兜底:网络异常 / 接口失效时,内置模拟天气数据,保证页面正常渲染,不会报错闪退
2. 行程生成 Agent generate_travel_route()
双模式兼容设计,兼顾有大模型密钥、无密钥两种使用场景:
- LLM 智能生成模式:填入 OpenAI / 国内大模型 API Key 后,自动构造精准 Prompt,要求严格贴合用户需求(3 天、宽松不赶路、每日≤3 个景点),输出标准 JSON 结构化行程,自动解析为表格
- 离线备用模式:无密钥时内置成都宽松慢游路线,节奏舒缓,无早起赶景点安排,贴合 “不要太赶” 的需求
Prompt 设计重点约束:
- 严格匹配用户出行天数、预算、节奏要求
- 拆分上午 / 下午 / 晚间三段式行程
- 限制每日景点数量,拒绝高强度赶路安排
- 固定 JSON 输出格式,方便程序解析渲染
3. 自动预算核算 calculate_budget()
按照短途旅行真实消费场景拆分开销类目,自动计算单项小计与总花费:
- 住宿:经济型酒店 2 晚费用
- 门票:核心景区门票总价
- 餐饮:3 天三餐 + 特色小吃预算
- 市内交通:地铁、短途打车开销
- 伴手礼:本地特产零食预留额度
最终输出两项内容:分项开销表格 + 预算总结文本,自动对比用户设定的预算上限,计算剩余可支配金额,直观判断行程是否超支。
5. Gradio 可视化网页
极简布局,零前端代码实现完整交互页面:
- 顶部标题 + 功能说明,清晰告知用户工具作用
- 横向布局:需求输入框 + 橙色主操作按钮
- 分模块展示天气、行程、开销三大结果表格
- 底部预算总结文本框,直观展示总花费与剩余额度
启动命令 demo.launch(share=True) 两大核心能力:
- 本地地址
http://127.0.0.1:7860:本地浏览器打开使用 - 自动生成 7 天有效期公网分享链接(如截图
xxx.gradio.live),发给他人可远程访问你的 AI 旅游工具
完整运行源码:
import gradio as gr
import requests
import json
import pandas as pd
from datetime import datetime, timedelta
# ===================== 2. 配置全局参数 =====================
# 天气API(免费公开接口,无需key)
WEATHER_API_URL = "http://wttr.in/{city}?format=j1"
# 大模型调用(这里使用openai接口,你也可以替换成国内大模型如豆包、通义千问)
# 若没有key,内置离线路线生成备用逻辑,不影响运行
LLM_API_KEY = ""
LLM_API_URL = "https://api.openai.com/v1/chat/completions"
# ===================== 3. Agent任务函数1:查询天气 =====================
def get_city_weather(city="成都"):
"""调用天气API获取未来7天天气"""
try:
res = requests.get(WEATHER_API_URL.format(city=city), timeout=10)
data = res.json()
weather_list = []
for day_info in data["weather"][:3]: # 只取旅行3天天气
date = day_info["date"]
temp_max = day_info["maxtempC"]
temp_min = day_info["mintempC"]
condition = day_info["hourly"][4]["weatherDesc"][0]["value"]
weather_list.append({
"日期": date,
"最高温(℃)": temp_max,
"最低温(℃)": temp_min,
"天气状况": condition
})
df_weather = pd.DataFrame(weather_list)
return df_weather
except Exception as e:
# API调用失败,返回模拟天气保证程序不中断
mock_data = [
{"日期": "Day1", "最高温(℃)": 28, "最低温(℃)": 22, "天气状况": "多云"},
{"日期": "Day2", "最高温(℃)": 29, "最低温(℃)": 23, "天气状况": "晴"},
{"日期": "Day3", "最高温(℃)": 27, "最低温(℃)": 21, "天气状况": "小雨"}
]
return pd.DataFrame(mock_data)
# ===================== 4. Agent任务函数2:生成旅游路线 =====================
def generate_travel_route(user_input):
"""大模型生成宽松不赶路的3日行程,无key时使用内置行程"""
prompt = f"""
用户需求:{user_input}
要求:
1. 目的地3日游,行程宽松,节奏慢,不赶路,每天不超过3个景点
2. 规划每日上午、下午、晚间行程
3. 输出JSON格式,字段:天数、时间段、景点、游玩时长
"""
# 有API Key则调用大模型,无则返回预设行程
if LLM_API_KEY.strip() != "":
headers = {"Authorization": f"Bearer {LLM_API_KEY}", "Content-Type": "application/json"}
payload = {
"model": "gpt-3.5-turbo",
"messages": [{"role": "user", "content": prompt}],
"temperature": 0.7
}
resp = requests.post(LLM_API_URL, headers=headers, json=payload)
content = resp.json()["choices"][0]["message"]["content"]
route_data = json.loads(content)
else:
# 离线备用行程(宽松慢节奏成都3日)
route_data = [
{"天数": "第1天", "时间段": "上午", "景点": "宽窄巷子", "游玩时长": "3h"},
{"天数": "第1天", "时间段": "下午", "景点": "人民公园喝茶", "游玩时长": "3h"},
{"天数": "第1天", "时间段": "晚上", "景点": "锦里古街", "游玩时长": "2.5h"},
{"天数": "第2天", "时间段": "上午", "景点": "大熊猫繁育基地", "游玩时长": "4h"},
{"天数": "第2天", "时间段": "下午", "景点": "文殊院", "游玩时长": "2h"},
{"天数": "第2天", "时间段": "晚上", "景点": "春熙路散步", "游玩时长": "2h"},
{"天数": "第3天", "时间段": "上午", "景点": "杜甫草堂", "游玩时长": "2.5h"},
{"天数": "第3天", "时间段": "下午", "景点": "浣花溪公园", "游玩时长": "3h"},
{"天数": "第3天", "时间段": "晚上", "景点": "返程", "游玩时长": ""}
]
df_route = pd.DataFrame(route_data)
return df_route
# ===================== 5. Agent任务函数3:预算自动核算 =====================
def calculate_budget():
"""自动计算酒店、门票、餐饮总开销,严格控制在2000预算内"""
cost_detail = [
{"项目": "经济型酒店(2晚)", "单价": 360, "数量": 2, "小计": 720},
{"项目": "景点门票(熊猫基地+杜甫草堂)", "单价": 95, "数量": 2, "小计": 190},
{"项目": "三餐+小吃(3天)", "单价": 130, "数量": 3, "小计": 390},
{"项目": "市内交通(地铁+打车)", "单价": 70, "数量": 3, "小计": 210},
{"项目": "伴手礼零食", "单价": 230, "数量": 1, "小计": 230}
]
df_cost = pd.DataFrame(cost_detail)
total = df_cost["小计"].sum()
budget_summary = f"总预算:{total} 元,预算上限2000元,剩余额度:{2000-total}元"
return df_cost, budget_summary
# ===================== 6. Agent主调度流程(自动串行执行任务) =====================
def travel_agent_workflow(user_text):
print("【Agent开始自动拆解任务】")
# 任务1:获取天气
df_weather = get_city_weather(city="成都")
print("✅ 任务1:天气查询完成")
# 任务2:生成行程路线
df_route = generate_travel_route(user_text)
print("✅ 任务2:行程规划完成")
# 任务3:计算费用预算
df_cost, budget_text = calculate_budget()
print("✅ 任务3:预算核算完成")
print("========================================")
return df_weather, df_route, df_cost, budget_text
# ===================== 7. Gradio前端可视化界面 =====================
with gr.Blocks(title="成都旅游规划Agent") as demo:
gr.Markdown("# 🧳 AI旅游规划Agent")
gr.Markdown("输入旅行需求,Agent自动查询天气→规划行程→核算预算")
with gr.Row():
user_input = gr.Textbox(
label="你的旅行需求",
value="我想下周去成都玩3天,预算2000,不要太赶",
lines=2
)
run_btn = gr.Button("一键生成行程方案", variant="primary")
gr.Markdown("## 🌤 未来3天天气")
weather_table = gr.Dataframe()
gr.Markdown("## 📅 3日宽松旅游路线")
route_table = gr.Dataframe()
gr.Markdown("## 💰 开销明细")
cost_table = gr.Dataframe()
budget_result = gr.Textbox(label="预算总结")
# 绑定按钮触发Agent流水线
run_btn.click(
fn=travel_agent_workflow,
inputs=[user_input],
outputs=[weather_table, route_table, cost_table, budget_result]
)
# 启动前端网页
if __name__ == "__main__":
demo.launch(share=True)
项目使用教程
1.执行 pip 安装依赖包:
pip install gradio requests pandas
2. 本地运行
python travel_agent.py
- 启动成功后控制台输出两个地址:
- Local URL:本地浏览器打开,仅自己访问
- Public URL:7 天有效期公网链接,可分享给他人远程使用
3. 两种使用模式
模式 A:离线免密钥(开箱即用)
直接运行代码,无需任何 API Key,使用内置成都固定宽松行程,天气接口自动拉取实时数据,零成本体验完整功能。
模式 B:大模型智能定制(推荐)
- 获取 OpenAI / 豆包 / 通义千问 API Key
- 修改代码顶部
LLM_API_KEY填入密钥,替换LLM_API_URL为对应服务商接口地址 - 运行后会根据你输入的任意出行需求,动态生成专属个性化行程,支持更换目的地、调整天数、预算、旅行风格(亲子 / 美食 / 徒步等)
4. 永久免费部署(Hugging Face Spaces)
控制台提示:执行 gradio deploy 可一键部署至 Hugging Face,获得永久在线链接,无 7 天有效期限制,还支持免费 GPU 升级。
六、项目拓展优化方向
- 多目的地适配:解析用户输入自动提取城市,将硬编码
city="成都"改为动态识别,支持全国任意城市规划 - 多出行天数兼容:自动识别用户输入的 2 天 / 4 天 / 5 天行程,动态调整天气、行程、预算计算逻辑
- 出行人群区分:增加亲子、情侣、学生、中老年模式,调整景点难度与住宿档次
- 交通模块升级:新增往返大交通(飞机 / 高铁)费用自动查询,完整核算全程总开销
- 导出功能:增加 Excel、PDF 行程单导出,方便线下打印携带
- 多轮对话优化:增加记忆功能,支持用户二次修改行程(调整景点、增减预算)
七、总结
这个 AI 旅游规划 Agent 完整演示了轻量多任务智能体的开发思路:拆分独立工具函数、主流程串行调度、可视化交互页面、完善容错兜底,非常适合 AI 初学者入门学习 Agent 开发 + Gradio 可视化。
不用手动查攻略、算开销,一句话需求全自动输出完整旅行方案,本地运行、公网分享、云端永久部署三种使用方式全覆盖,日常出行、AI 学习练手都非常实用。
核心功能概述
- 介绍 AI 旅游规划 Agent 的核心能力:多目的地智能推荐、行程时间优化、预算控制、兴趣偏好匹配。
- 强调 Gradio 的交互优势:无需编程基础,用户通过表单输入需求,实时生成可视化行程表。
技术架构设计
- 后端逻辑:基于 Python 的 NLP 模型(如 GPT-3.5/GPT-4)解析用户输入,调用旅游 API(如 Google Maps/Amadeus)获取景点/交通数据。
- 数据处理:使用 Pandas 清洗和结构化行程数据,设计权重算法平衡时间/预算/兴趣。
- 可视化层:Gradio 的
DataFrame组件展示行程表,Plot模块绘制地图路径。
关键实现步骤
用户输入模块
- Gradio 表单设计:包含目的地、天数、预算滑块、兴趣标签(如“美食”“徒步”)。
- 输入验证:通过
gr.Number限制预算范围,gr.Dropdown提供热门城市选项。
AI 规划引擎
- 使用 LangChain 构建提示模板,示例:
prompt = f"""基于以下条件生成行程: 目的地:{destination},天数:{days}天,预算:{budget}元。 兴趣:{interests}。按小时分配景点并标注交通方式。""" - 调用大模型 API 生成 JSON 格式的行程草案。
结果可视化
- 表格优化:用
gr.DataFrame显示每日行程,列包括“时间”“景点”“费用”。 - 地图集成:通过
folium生成交互地图,嵌入 Gradio 的gr.HTML组件。
部署与优化
- 性能优化:使用
cache装饰器缓存高频目的地查询结果。 - 错误处理:捕获 API 超时异常,返回友好提示(如“当前请求过多,请简化条件”)。
- 部署脚本:通过
gradio deploy快速发布到 Hugging Face Spaces。
扩展方向
- 个性化推荐:接入用户历史行为数据,动态调整景点权重。
- 多模态输出:增加语音播报功能(TTS 模块)和 PDF 导出按钮。
案例演示
- 截图展示 Gradio 界面:左侧输入面板,右侧行程表和地图联动效果。
- 对比传统手动规划与 AI 生成的效率差异(如 5 分钟 vs 2 小时)。
更多推荐

所有评论(0)