基于 LangChain + LangGraph 多智能体框架 与 高德地图 MCP 的智能旅行规划系统。用户只需输入目的地、出行日期、预算和偏好,系统便会自动搜索景点、查询天气、推荐酒店与美食,并由大模型生成一份完整的每日行程计划。
- 多智能体行程规划:LangGraph 编排"搜索景点 → 查询天气 → 搜索酒店 → 搜索餐饮 → LLM 生成计划"五步工作流
- 偏好驱动搜索:支持历史文化、自然风光、美食、购物、亲子、摄影等偏好标签,自动映射为高德 POI 搜索关键词
- LLM 生成计划:OpenAI 兼容接口(支持 OpenAI / DeepSeek / 通义千问 / 智谱等),输出结构化 JSON 行程
- 实时进度反馈:SSE 流式接口,前端实时展示各智能体的执行进度
- 高德地图总览:按天分色在地图上标记所有景点,自动定位城市
- 预算明细:门票、酒店、餐饮、交通、其他费用自动汇总,并随编辑实时重算
- 行程可视化编辑:支持增删景点、调整景点顺序、删除某天行程
- 导出功能:一键导出行程为 PNG 图片或 PDF
- 单次最多规划 14 天 行程
- Python 3.10+
- FastAPI(REST + SSE 流式接口)
- LangChain + LangGraph(多智能体编排)
- amap-mcp-server(高德地图 MCP 工具:
maps_text_search/maps_weather) - Pydantic v2(请求/响应数据模型)
- Vue 3 + TypeScript + Vite
- Ant Design Vue(UI 组件库)
- 高德地图 JS API 2.0(
@amap/amap-jsapi-loader) - html2canvas + jsPDF(导出图片 / PDF)
- Pinia、Vue Router、Axios、dayjs
flowchart LR
A[前端 Vue3 表单] -->|POST /api/trip/plan/stream| B[FastAPI 后端]
B --> C[LangGraph 编排器]
C --> D[搜索景点]
D --> E[查询天气]
D --> F[搜索酒店]
D --> G[搜索餐饮]
E --> H[LLM 生成行程]
F --> H
G --> H
H --> J[结构化行程 JSON]
J --> K[结果页: 概览/预算/地图/每日行程/天气]
K --> L[导出 PNG / PDF]
调度策略:先串行搜索景点确定目的地上下文,再并行调度天气 / 酒店 / 餐饮三个节点(LangGraph fan-out),全部完成后统一进入 LLM 生成节点(fan-in)。节点内部使用
asyncio.gather并发获取 POI 详情补全坐标。
.
├── backend/ # FastAPI 后端
│ ├── app/
│ │ ├── api/trip.py # 行程规划 API(REST + SSE)
│ │ ├── config.py # 环境变量配置
│ │ ├── main.py # 应用入口
│ │ ├── schemas/trip.py # Pydantic 数据模型
│ │ ├── services/
│ │ │ ├── trip_graph.py # LangGraph 编排图(MCP 版,当前生效)
│ │ │ └── trip_planner.py # 行程规划编排器
│ │ └── agents/ # v1 遗留 Agent 代码(当前未使用)
│ ├── .env.example # 环境变量示例
│ └── requirements.txt
├── frontend/ # Vue 3 前端
│ ├── src/
│ │ ├── views/ # Home(规划表单)/ Result(行程结果)
│ │ ├── components/ # MapView / BudgetCard / DayPlanCard
│ │ ├── services/api.ts # 后端 API 封装(含 SSE)
│ │ ├── types/trip.ts # TypeScript 类型定义
│ │ └── router/ # 路由
│ ├── .env.example # 前端环境变量示例
│ └── package.json
└── README.md
cd backend
python -m venv .venv
# Windows: .venv\Scripts\activate Linux/macOS: source .venv/bin/activate
pip install -r requirements.txt
# 配置环境变量
cp .env.example .env
# 编辑 .env,填入 LLM_API_KEY 和 AMAP_API_KEY
# 在项目根目录启动(backend 包路径)
uvicorn backend.app.main:app --reload --port 8000接口文档:http://localhost:8000/docs
cd frontend
npm install
cp .env.example .env.local
# 编辑 .env.local,填入高德 JS API Key 与安全密钥
npm run dev访问 http://localhost:5173(Vite 已将 /api 代理到后端 8000 端口)。
GET /api/health
POST /api/trip/plan
POST /api/trip/plan/stream
POST /api/trip/route
{
"origin": "120.169899,30.239827",
"destination": "120.162923,30.254158",
"mode": "walking"
}返回可绘制路径点 path([[lng,lat], ...])及距离、耗时;mode 支持 walking / driving。
请求示例:
{
"city": "北京",
"start_date": "2026-08-10",
"end_date": "2026-08-13",
"budget": "中等",
"preferences": ["历史文化", "美食"],
"travelers": 2,
"departure_city": "上海"
}SSE 事件类型:init(初始化步骤列表)、progress(单步进度)、result(规划结果)、error(错误信息)。
响应结构包含:行程概览、天气预测、预算明细、每日行程(景点/餐饮/酒店/交通/备注)、旅行贴士。
| 变量 | 说明 | 默认值 |
|---|---|---|
LLM_API_KEY |
LLM API Key(OpenAI 兼容) | - |
LLM_BASE_URL |
LLM 接口地址 | https://api.openai.com/v1 |
LLM_MODEL |
模型名称 | gpt-4o-mini |
LLM_TEMPERATURE |
采样温度 | 0.7 |
LLM_JSON_MODE |
是否启用 JSON 输出模式(不支持 response_format 的接口设为 false) |
true |
AMAP_API_KEY |
高德 Web 服务 Key | - |
HOST / PORT |
服务监听地址 | 0.0.0.0 / 8000 |
DEBUG |
调试模式 | true |
MAX_SEARCH_RESULTS |
每个关键词最大搜索结果数 | 5 |
| 变量 | 说明 |
|---|---|
VITE_AMAP_KEY |
高德 JS API Key(Web 端) |
VITE_AMAP_SECRET |
高德 JS API 安全密钥(v2.0 必需) |
VITE_AMAP_VERSION |
高德 JS API 版本,默认 2.0 |
VITE_API_BASE_URL |
后端 API 地址,开发环境默认 /api |
高德 Key 申请地址:https://console.amap.com/
- v2.0 起使用
amap-mcp-server提供的 MCP 工具获取景点 / 酒店 / 餐饮 / 天气数据,替代 v1 直调高德 REST API 的实现。 backend/app/agents/、backend/app/services/amap_service.py、llm_service.py为 v1 遗留代码,当前 API 并未引用,仅作参考。- 预算中酒店与交通费用为按预算档位估算的固定值(酒店 300 / 600 / 1000 每晚,交通 30 / 80 / 200 每天),门票与餐饮由 LLM 估算。