|
|
1 mēnesi atpakaļ | |
|---|---|---|
| .. | ||
| app | 1 mēnesi atpakaļ | |
| mcp_servers | 1 mēnesi atpakaļ | |
| scripts | 1 mēnesi atpakaļ | |
| tests | 1 mēnesi atpakaļ | |
| .env.example | 1 mēnesi atpakaļ | |
| .gitignore | 1 mēnesi atpakaļ | |
| README.md | 1 mēnesi atpakaļ | |
| main.py | 1 mēnesi atpakaļ | |
| pyproject.toml | 1 mēnesi atpakaļ | |
| uv.lock | 1 mēnesi atpakaļ | |
TravelMind 是一个基于 LangGraph 多角色 Agent 工作流 的智能行程规划系统:用户用自然语言描述旅行需求(出发地、目的地、日期、预算、偏好等),系统自动完成需求解析、航班/酒店资源查询、目的地地图研究、行程编排、风险评审与迭代优化,最终输出结构化多日行程。
项目名中的 "Mind" 取自 *multi-agent mind*:多个各司其职的 Agent 以 Supervisor 模式协同工作,像一支"思维团队"一样规划行程。
MODEL_BASE_URL系统采用 LangGraph 状态图 编排完整工作流,Supervisor 在关键节点做路由决策:
用户需求
│
▼
┌──────────────┐ 澄清/报错(条件路由) ┌──────────────────┐
│ 需求解析Agent │ ─────────────────────► │ 补充需求/终止 │
└──────┬───────┘ └──────────────────┘
│ TravelRequest(结构化)
▼
┌──────────────┐ 高德 MCP 工具 ┌──────────────────┐
│ 资源查询Agent │ ─────────────────────► │ 地图研究Agent │
│ 航班/酒店 │ │ 景点/餐饮/天气 │
└──────┬───────┘ └────────┬─────────┘
│ 候选资源 │ POI 数据
▼ ▼
┌──────────────────────────────────────────────────────────────┐
│ 候选筛选 → 路线评估 → 行程规划Agent │
│ (生成结构化多日行程) │
└──────────────────────┬───────────────────────────────────────┘
│
▼
┌──────────────────┐ 未通过(重新规划循环) ┌──────────────┐
│ 校验 → 评审Agent │ ◄────────────────────── │ Supervisor │
└──────┬───────────┘ │ (路由决策) │
│ 通过 └──────────────┘
▼
┌──────────────────┐
│ 最终定稿/输出 │
└──────────────────┘
工作流环节:需求解析 → 资源查询 → 候选筛选 → 地图研究 → 路线评估 → 行程规划 → 校验 → 评审 → 最终定稿,其中规划/评审环节存在带重试上限的迭代循环(recursion_limit = 80)。
| Agent | 职责 |
|---|---|
| RequirementAgent 需求解析 | 把自然语言转换为结构化 TravelRequest,意图识别与字段提取(仅解析,不规划);缺字段时走澄清流程 |
| ResourceSearchAgent 资源查询 | 调用航班/酒店 MCP 工具搜索外部资源,指导工具调用顺序并汇总为结构化结果 |
| MapResearchAgent 地图研究 | 调用高德地图 MCP 工具,搜索目的地周边景点、餐饮与天气,返回结构化 POI 数据 |
| ItineraryPlannerAgent 行程规划 | 基于候选资源与地图研究结果,生成包含每日活动安排的结构化多日行程 |
| TripReviewerAgent 行程评审 | 从风险控制角度独立评审,识别节奏、地理、预算等维度的问题并给出修改意见 |
| Supervisor 监督协调 | 汇总校验与评审意见,决定 replan / finalize / finalize_with_risks / terminate |
以下环节刻意使用确定性代码,保证准确性与成本控制:
| 模块 | 原因 |
|---|---|
| Candidate Selector | 排序和过滤规则确定 |
| Route Evaluator | 距离和评分可确定性计算 |
| Plan Validator | ID、日期、预算必须准确 |
| Finalizer | 防止最终展示阶段重新编造信息 |
LLM 只负责自然语言理解、复杂取舍、行程编排和体验审查。
通过 langchain-mcp-adapters 的 MultiServerMCPClient 同时接入两个 MCP 服务器:
mcp_servers/travel_search_server.py(FastMCP)包装 TravelSearchService,提供 search_airports、search_flights、search_return_flights、search_hotels 工具,底层调用 SerpApihttps://mcp.amap.com/mcp,提供 maps_* 系列工具(POI 搜索、餐饮、天气、距离测量、路线规划等)需要 uv 包管理器(或使用任意虚拟环境工具):
# 进入项目目录并安装依赖(自动创建 .venv)
uv sync
cp .env.example .env
编辑 .env,填写以下必填项(app/config.py 会从项目根目录 .env 读取,缺配置时会给出明确错误):
| 变量 | 说明 | 必填 |
|---|---|---|
MODEL_API_KEY |
OpenAI 或兼容服务的 API Key | ✅ |
MODEL_NAME |
模型名,如 gpt-4.1-mini、qwen-plus、deepseek-chat |
✅ |
MODEL_BASE_URL |
OpenAI 官方接口可留空;兼容接口填对应 Base URL | 视服务 |
SERPAPI_API_KEY |
SerpApi 密钥(Google Flights/Hotels 搜索) | ✅ |
AMAP_API_KEY |
高德开放平台密钥(MCP 地图服务) | ✅ |
REQUEST_TIMEOUT_SECONDS |
请求超时(秒),默认 120 |
否 |
⚠️
.env包含敏感密钥,已被.gitignore排除,切勿提交到版本库。密钥缺失时,Settings.require()会抛出带具体变量名的错误。
支持两种输入方式:
# 方式一:命令行参数直接传入
uv run python main.py 帮我规划6月下旬从北京去东京玩5天,预算1.5万以内
# 方式二:交互式输入(支持多行,输入空行结束)
uv run python main.py
运行结束后会输出最终行程方案与执行状态(trace_id、各环节执行次数、Supervisor 决策、总耗时等)。
# 运行全部单元测试
uv run pytest
# 或使用自动化回归入口(只跑本地单元测试)
uv run python -m scripts.run_regression
# 真实接口集成测试(会调用真实模型、SerpApi 和高德 MCP,可能产生费用)
uv run python -m scripts.run_regression --integration
travel-mind/
├── main.py # CLI 入口:读取需求并执行完整工作流
├── pyproject.toml # 项目配置与依赖(uv)
├── .env.example # 环境变量模板(.env 不入库)
├── app/
│ ├── config.py # pydantic-settings 配置中心(读取 .env)
│ ├── llm.py # 大模型工厂(兼容 OpenAI/DeepSeek/Qwen)
│ ├── mcp_client.py # MCP 工具加载器(自建 + 高德双服务器)
│ ├── agents/ # 五个角色 Agent
│ │ ├── requirement_agent.py # 需求解析
│ │ ├── resource_agent.py # 资源查询
│ │ ├── map_agent.py # 地图研究
│ │ ├── itinerary_agent.py # 行程规划
│ │ └── reviewer_agent.py # 行程评审
│ ├── graph/ # LangGraph 工作流(builder + nodes + state)
│ │ ├── planner_builder.py # 完整主图编排
│ │ ├── supervisor_nodes.py # 监督协调与路由
│ │ └── ... # 各环节节点
│ ├── schemas/ # Pydantic 数据模型(航班/酒店/行程/路线…)
│ ├── services/ # 业务服务(搜索/筛选/评估/校验/定稿)
│ ├── clients/
│ │ └── serpapi_client.py # SerpApi HTTP 客户端
│ └── logging_config.py # 日志与 trace_id
├── mcp_servers/
│ └── travel_search_server.py # 自建旅行搜索 MCP 服务器(FastMCP)
├── scripts/ # 各环节调试脚本 + 回归测试入口
└── tests/ # pytest 单元测试
该项目是生产架构导向的可运行 MVP,而不是已上线商业系统:
个人学习/作业项目,未指定开源许可证。