AI+旅游爆火!这个开源神器让你秒出旅行攻略!
📌 开源地址:https://github.com/xyds1025/SmartTrip
💡 关于许可证: 本项目采用 MIT License 开源协议,这意味着你可以免费使用、修改、分发甚至商用!没错,MIT 是最宽松的开源协议之一,你拿去二次开发、做成 SaaS 产品卖钱都合法合规,唯一要求就是保留原作者的版权声明。所以放心大胆地用,不用偷偷摸摸。
一、这玩意儿到底是啥?
你有没有过这样的经历——
想出去玩,打开小红书搜攻略,翻了一百篇笔记,每篇都是"绝绝子",结果信息互相矛盾,搞了三小时还不知道该去哪。
想问ChatGPT,它给你一个"建议去三亚玩三天"的笼统回答,连从哪坐车、住哪个酒店、每天几点去哪都说不清。
更别提老人小孩的出行需求了——你妈膝盖不好,你娃才四岁,那些"特种兵式旅游"攻略根本不适用。
红鱼智游(RedFish SmartTrip) 就是为解决这个问题而生的。
它是一个基于 AI 的智能旅游规划工具,你只需要输入一句话——比如"看海"、"亲子游"、"历史文化"——系统就会自动帮你推荐10个具体景点,每个景点都有完整地址、亮点标签、交通方式、参考费用。选定目的地后,它会自动采集天气、景点、餐厅、酒店、交通、人文风俗、实景图片等数据,然后调用大模型生成一份包含每日行程(精确到分钟)、预算明细、穿衣建议、美食推荐的完整出游计划,还能一键导出PDF!
先来看看界面长啥样:

二、它凭什么让我不用再翻攻略了?
✅ 智能推荐——一句话搞定目的地
你输入"看海",它不会给你推荐"西湖"(虽然早期版本确实有这个问题,现在已经优化了),而是精准匹配三亚亚龙湾、青岛栈桥、厦门鼓浪屿等真正适合"看海"的景点。每个推荐包含:
- 完整地址
:不是"三亚某海边",而是"海南省三亚市吉阳区亚龙湾国家旅游度假区"这种精确到门牌号的地址 - 亮点标签
:["海滨", "美食"] 一目了然 - 多种交通方式
:地铁、公交、出租车,给你多种选择 - 参考费用
:门票60元这种,出门前心里有数
✅ 一键生成计划——10步数据采集,全自动
选定目的地后,系统会自动执行10个采集步骤:
🌤️ 采集天气信息 🏛️ 搜索景点 🍜 搜索美食餐厅 🏨 搜索住宿信息 🚗 查询交通方案 📚 搜索人文环境 🎎 搜索风俗习惯 📸 搜索打卡地点 🎮 搜索游玩项目 🖼️ 获取实景图片
这些步骤全部通过SSE(Server-Sent Events)实时流式输出,前端会动态显示每一步的进度,告别"转圈圈盲等"的痛苦体验。
✅ 高度定制——老幼皆宜的行程安排
你可以设置出行人数(成人/儿童/老人),系统会根据团队构成自动调整:
儿童需要适当的休息时间和适合的活动 老人需要较少的步行、较多的休息、无障碍设施 餐饮选择兼顾不同年龄段的喜好 交通方式考虑老人和儿童的便利性(避免多次换乘)
✅ PDF导出——一键保存,方便分享
生成完计划后,一键导出为PDF文件,方便打印给家人看,或者发到群里炫耀你的规划能力。
✅ 全免费数据源
这是最良心的一点——无需付费订阅任何数据服务:
高德地图API:每日免费额度充足,个人使用绰绰有余 DuckDuckGo搜索:完全免费无限制,用来搜索图片和人文信息 你只需要一个LLM API Key(OpenAI兼容接口即可)
三、技术架构——简单但优雅
先给不想看代码的朋友一个一句话总结:Python后端 + Flask Web服务 + 高德地图API + DuckDuckGo搜索 + 大模型推理 = 完整的AI旅游规划系统。
想深入理解的朋友,跟我来拆解一下:
redfish-smarttrip/├── app.py # Flask 主应用,路由与流式接口├── config_loader.py # 配置加载器(无全局变量)├── collector.py # 免费数据采集(高德 + DuckDuckGo)├── analyzer.py # LLM 分析器(调用 v1 接口)├── generator.py # 计划生成协调器(含进度回调)├── config.json # 配置文件├── requirements.txt # Python 依赖├── templates/│ └── index.html # 前端页面(完整 UI)└── screenshot-home.png # 界面截图
整个系统分为三层:
📊 数据采集层(collector.py)
FreeTravelDataCollector 类负责所有数据采集工作,核心方法:
_get_weather():调用高德天气API,获取实时和未来天气预报 _search_poi():调用高德POI搜索,查找景点、餐厅、酒店,并自动拼接完整地址 _get_transport():调用高德路径规划,获取公交/驾车/步行综合方案 _search_web():通过DuckDuckGo文本搜索,获取人文、风俗、打卡信息 _search_images():通过DuckDuckGo图片搜索,获取实景图片
🧠 AI分析层(analyzer.py)
LLMAnalyzer 类负责调用大模型生成旅游计划。它构建了一个非常详细的系统提示词,要求模型输出结构化JSON,包含:
目的地概览(人文、风俗) 天气及穿衣建议(特别针对老人儿童) 完整往返交通方案(含班次、费用、换乘方式) 每日行程(精确到分钟,含交通方式、耗时、地址) 网红打卡推荐 特色美食推荐 游玩项目推荐 详细预算(交通、住宿、餐饮、门票、购物、其他) 实用贴士
🎯 协调层(generator.py)
TravelPlanGenerator 是整个系统的"指挥官",它串联数据采集和AI分析,并处理数据标准化、字段规范化等细节工作。它还负责将实景图片注入最终结果,并添加元数据(目的地、天数、生成时间、数据来源等)。
🌐 Web层(app.py)
Flask应用提供三个核心路由:
/:首页,渲染前端页面 /suggest:推荐目的地接口,POST请求,输入旅行意愿,返回10个推荐景点 /generate-stream:生成计划流式接口,POST请求,通过SSE实时推送进度和最终结果
四、本地部署保姆级教程
好了,说了这么多,来点实际的。手把手教你从零部署,保证你跟着做就能跑起来。
📋 前置条件
Python 3.9 或以上(别用3.7了,都2025年了) 一个能联网的电脑(废话) 一个高德地图Web API Key(免费申请) 一个LLM API Key(OpenAI兼容接口)
Step 1:克隆代码
git clone https://github.com/xyds1025/SmartTrip.gitcd SmartTrip如果你网络不好,也可以直接去GitHub页面下载ZIP包,解压后进入目录。
Step 2:创建虚拟环境
强烈建议用虚拟环境,别污染你的系统Python:
# 创建虚拟环境python -m venv venv# 激活虚拟环境# Linux/Mac:source venv/bin/activate# Windows:venv\Scripts\activate激活成功后,命令行前面会出现 (venv) 标识。
Step 3:安装依赖
pip install -r requirements.txt依赖非常精简,只有4个包:
flask | |
openai | |
requests | |
ddgs |
如果下载慢,可以用国内镜像源:
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simpleStep 4:申请API密钥
这一步是关键,别跳过。
🔑 申请高德地图API Key
前往 高德开放平台 注册账号 进入控制台,点击"创建新应用" 添加Key,服务平台选择"Web服务" 提交后即可获得一个Key,长这样: a1b2c3d4e5f6g7h8i9j0
⚠️ 注意:一定要选"Web服务"类型,不是"Web端(JS API)",也不是"Android/iOS"。选错了接口调不通。
高德Web服务API个人免费额度每天5000次,对于个人使用来说绰绰有余。你一天生成100个旅行计划都够用。
🔑 获取LLM API Key
这里有几个选择:
| OpenAI | https://api.openai.com/v1 | gpt-4 | |
| 阿里云百炼 | https://dashscope.aliyuncs.com/compatible-mode/v1 | qwen-plus | |
| 智谱AI | https://open.bigmodel.cn/api/paas/v4 | glm-4 | |
| 本地部署(Ollama) | http://localhost:11434/v1 | qwen2.5 |
如果你不想花钱,推荐用Ollama本地部署,完全免费,离线也能用。安装Ollama后,拉一个模型:
ollama pull qwen2.5:7b然后用 http://localhost:11434/v1 作为base_url,模型名填 qwen2.5:7b 即可。
如果你想用国内大模型的免费额度,阿里云百炼和智谱AI都提供免费额度,注册即可使用。
Step 5:配置文件
项目根目录下有一个 config.json 文件,用你喜欢的编辑器打开它:
{ "llm": { "api_key": "你的LLM API Key", "base_url": "https://api.openai.com/v1", "model": "gpt-4" }, "amap": { "api_key": "你的高德Web API Key" }, "travel": { "default_days": 3, "max_poi_per_category": 10 }}各配置项说明:
llm.api_key | sk-xxxxx | |
llm.base_url | https://api.openai.com/v1 | |
llm.model | gpt-4glm-4、qwen-plus | |
amap.api_key | a1b2c3d4e5f6... | |
travel.default_days | 3 | |
travel.max_poi_per_category | 10 |
如果你用的是Ollama本地部署,配置大概长这样:
{ "llm": { "api_key": "ollama", "base_url": "http://localhost:11434/v1", "model": "qwen2.5:7b" }, "amap": { "api_key": "你的高德API Key" }, "travel": { "default_days": 3, "max_poi_per_category": 10 }}💡 小提示:
api_key随便填个字符串就行,Ollama不校验这个字段。
Step 6:启动应用
python app.py看到以下输出就说明启动成功了:
* Serving Flask app 'app'* Debug mode: on* Running on all addresses (0.0.0.0)* Running on http://127.0.0.1:5000
打开浏览器,访问 http://127.0.0.1:5000,就能看到那个漂亮的首页了!
五、使用指南——从零到生成一份完整攻略
第一步:输入旅行意愿
在首页填写以下信息:
- 旅行意愿
:这是最重要的,比如"看海"、"亲子游"、"历史文化"、"美食探店" - 出发地
:可选,填了会帮你规划往返交通 - 天数
:计划玩几天,默认3天 - 人数
:成人、儿童、老人各多少 - 偏好
:比如"轻松"、"紧凑"、"爱吃辣"
点击"推荐目的地"按钮。
第二步:浏览推荐
系统会返回10个具体景点卡片,每个卡片包含:
景点名称和所属城市 完整详细地址(省市区县街道门牌号) 景点简介和亮点标签 从出发地到目的地的大致距离 建议交通方式和旅行时长 多种交通方式选择 参考门票或人均消费
第三步:生成计划
点击你感兴趣的景点卡片上的"生成计划"按钮,后端开始工作:
首先采集天气、景点、餐厅、酒店、交通等10类数据 然后调用大模型生成结构化攻略 每一步都有实时进度反馈,你不会在黑暗中等待
第四步:预览与导出
计划生成后,你会看到:
📋 目的地概览(人文、风俗) 🌤️ 天气及穿衣建议 🚄 完整往返交通方案 📅 每日行程(精确到分钟!) 📸 网红打卡推荐 🍜 特色美食推荐 💰 详细预算(交通、住宿、餐饮、门票、购物、其他) 💡 实用贴士
点击"导出PDF"按钮,即可保存为PDF文件。
六、常见问题排雷
Q1:推荐的目的地不准确怎么办?
最新版代码已经优化了提示词,设置了 temperature=0.1 和 seed=42 来保证稳定性。如果还有偏差,建议:
使用更强大的模型(如GPT-4) 更清晰地描述意愿,比如"适合亲子游的海边度假"而不是简单的"看海"
Q2:生成计划时报错 _search_web() missing 1 required positional argument?
请确认你使用的是最新版本的 collector.py,其中 _search_web 方法已包含 max_results 默认参数。更新代码后重启服务即可。
Q3:需要付费购买高德或DuckDuckGo服务吗?
不需要。 高德Web服务API每日免费额度充足,DuckDuckGo搜索完全免费无限制。你唯一可能需要花钱的地方就是LLM API调用,但如果你用Ollama本地部署,连这个钱都省了。
Q4:支持国内大模型吗?
支持! 只要你的模型接口兼容OpenAI v1格式,并在 base_url 中填入对应地址即可。已验证支持的包括:
智谱 GLM-4 阿里云百炼 Qwen系列 百度文心一言 Ollama本地部署的任何模型
⚠️ 部分模型可能不支持
response_format参数,如果报错,可以在 analyzer.pyL109 中注释掉response_format={"type": "json_object"}这一行。
Q5:生成的PDF乱码或不完整?
确保浏览器允许跨域加载图片(实景图片来自外部),建议使用Chrome或Edge最新版本,并检查网络连接。
Q6:推荐结果每次都不一样?
代码中已设置 temperature=0.1 和 seed=42,大幅降低随机性。若仍有差异,可检查你的LLM服务端是否支持 seed 参数。
Q7:能不能自定义行程的松紧程度?
在"偏好"输入框中注明(如"轻松"、"紧凑"),大模型会根据描述调整每日景点数量和时间安排。
Q8:想增加推荐数量怎么办?
在 app.pyL39 的 /suggest 路由中,修改提示词中的"10个"为所需数量,并同步调整 max_tokens 参数以保证输出长度。
七、进阶玩法
🎮 玩法一:命令行模式
除了Web界面,项目还提供了命令行模式,入口在 main.py:
python main.py然后按提示输入目的地、出发地、天数、偏好即可。生成的计划会以JSON格式打印到终端,并保存到文件。
🎮 玩法二:接入更多大模型
项目使用OpenAI SDK,兼容任何OpenAI v1格式的接口。你可以尝试接入:
- DeepSeek
: https://api.deepseek.com/v1,性价比极高 - 月之暗面(Kimi)
: https://api.moonshot.cn/v1 - MiniMax
: https://api.minimax.chat/v1
只需修改 config.json 中的 base_url 和 model 即可。
🎮 玩法三:自定义提示词
如果你想调整生成计划的内容和风格,可以修改 analyzer.pyL29-L61 中的系统提示词。比如:
增加更多语言风格要求("请用幽默风趣的口吻") 增加特定主题("请重点关注摄影打卡点") 增加预算限制("总预算控制在5000元以内")
🎮 玩法四:Docker部署
如果你想在服务器上部署,可以用Docker:
# 创建Dockerfilecat > Dockerfile << 'EOF'FROM python:3.9-slimWORKDIR /appCOPY requirements.txt .RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simpleCOPY . .EXPOSE 5000CMD ["python", "app.py"]EOF# 构建并运行docker build -t smarttrip .docker run -d -p 5000:5000 -v $(pwd)/config.json:/app/config.json smarttrip八、项目亮点总结
说实话,这个项目虽然代码量不大,但设计得相当精巧,有几个地方值得学习:
1. 配置管理不使用全局变量
config_loader.py 实现了一个简洁的 Config 类,支持层级取值,比如 config.get('llm', 'api_key'),干净利落,没有全局变量污染。
2. SSE流式传输
app.pyL95-L148 的 /generate-stream 接口使用SSE实现实时进度反馈,用 queue.Queue + threading 实现线程间通信,简单有效。前端不需要轮询,数据来了就推送。
3. 数据采集与AI分析分离
collector.py 和 analyzer.py 各司其职,通过 generator.py 协调。这种设计让你可以单独替换数据源或AI模型,而不影响其他部分。
4. 全免费数据源
整个项目没有使用任何付费数据源,高德API免费额度充足,DuckDuckGo搜索完全免费,这对于个人开发者来说太友好了。
九、写在最后
AI旅游规划这个赛道,市面上已经有一些产品了,但大多要么收费、要么功能有限、要么不开源。红鱼智游作为一个开源项目,提供了完整的解决方案,代码简洁、架构清晰、界面精美,MIT协议随便用,这在开源社区里算是一股清流了。
如果你是:
- 旅行爱好者
:直接部署使用,省去做攻略的痛苦 - 开发者
:学习它的架构设计,或者二次开发 - 创业者
:基于它做产品,MIT协议允许商用
别光收藏不行动,赶紧 git clone 下来试试吧!
git clone https://github.com/xyds1025/SmartTrip.git如果觉得好用,给个Star⭐不过分吧?
红鱼AI · 让AI为你的每次出发赋能 🐠
本文由红鱼AI原创,转载请注明出处。
相关文章
发表评论
评论列表
- 这篇文章还没有收到评论,赶紧来抢沙发吧~