|
|
3 місяців тому | |
|---|---|---|
| .. | ||
| demo | 3 місяців тому | |
| README.md | 3 місяців тому | |
| agent-config.yml | 3 місяців тому | |
| model-override.yml | 3 місяців тому | |
用户请求
│
▼
┌──────────────────────────────────────────────────┐
│ 多 MCP 数据源 (SSE 建链) │
│ ┌──────────┐ ┌──────────────┐ ┌────────────┐ │
│ │ 高德地图 │ │ Google Maps │ │ 大众点评 │ │
│ │ (国内首选) │ │ (海外备用) │ │ (餐饮补充) │ │
│ │ priority:1│ │ priority:2 │ │ priority:3 │ │
│ └─────┬────┘ └──────┬───────┘ └─────┬──────┘ │
│ └───────────────┼───────────────┘ │
│ │ tools/list │
└────────────────────────┼─────────────────────────┘
│
▼
┌──────────────────────────────────────────────────┐
│ 用户偏好记忆层 (memory) │
│ 预算 | 饮食禁忌 | 出行方式 | 住宿 | 游览节奏 │
└────────────────────────┼─────────────────────────┘
│
▼
┌──────────────────────────────────────────────────┐
│ ReAct Agent Loop (最多 30 轮, 并行工具调用) │
│ │
│ 阶段0:偏好 → 阶段1:侦察 → 阶段2:POI采集 │
│ → 阶段3:编排 → 阶段4:校验 → 阶段5:JSON │
│ │
│ ┌───────────┐ ┌──────────────┐ │
│ │ LLM 推理 │───▶│ tool_calls? │ │
│ │ (Thought) │ │ Y: 并行调工具│ ──▶ SSE 推送 │
│ └───────────┘ │ N: 输出JSON │ 进度到前端 │
│ ▲ └──────┬───────┘ │
│ │ │ │
│ └──── 结果回灌 ◀───┘ │
└────────────────────────┼─────────────────────────┘
│
▼
┌──────────────────────────────────────────────────┐
│ 后处理校验层 (postProcess) │
│ ✓ 营业时间校验 ✓ 天气适配校验 │
│ ✓ 时间冲突检测 ✓ 预算校验 │
│ ✓ 通勤时间校验 ✓ 重复地点检测 │
│ ────────────────────────────── │
│ error → 拒绝并重试 | warning → 追加提醒 │
└────────────────────────┼─────────────────────────┘
│
▼
┌──────────────────────────────────────────────────┐
│ 输出解析 │
│ 1. 代码块清洗 (去除 ```json```) │
│ 2. 提取 JSON 块 ({...}) │
│ 3. 尝试根对象 → ItineraryPlan │
│ 4. 回退 data.itinerary / itinerary │
└────────────────────────┼─────────────────────────┘
│
▼
ItineraryPlan JSON
| 改进方向 | v1 状态 | v2 实现 | 配置位置 |
|---|---|---|---|
| 多数据源 | 仅高德,海外不可用 | 高德 + Google Maps + 大众点评,优先级链式 fallback | mcp.remoteServers[*].priority |
| 流式体验 | 同步阻塞,无进度反馈 | SSE 推送六阶段进度 + 工具调用事件 | streaming.events |
| 用户偏好 | 无记忆,每次从零开始 | memory 持久化偏好(预算/饮食/出行/住宿/兴趣),30天有效 | memory + memory.schema |
| 增量编辑 | 全量重跑,无法局部修改 | 识别修改指令,仅验证受影响 POI,保持其余不变 | systemPrompt 增量编辑模式 |
| 行程校验 | 仅通勤时间约束 | 6 项后处理校验器(营业时间/天气/冲突/预算/通勤/重复) | postProcess.validators |
| 并行工具 | 串行,每轮1个工具 | maxConcurrent: 5,无依赖工具同轮并行 |
mcp.policy.maxConcurrent |
| 成本控制 | 固定 $0.50 总预算 | CEK 引擎 + 7 个阶段预算 + 超额自动降级模型 | runtime.stageBudgets |
以下从产品视角说明"AI 行程规划"功能的核心卖点及其背后的技术实现。
用户感知:生成的行程中每个景点、餐厅、酒店都能在地图上找到,点击即可导航。
实现机制:Agent 通过 MCP 协议实时连接三大地图数据源(高德/Google/大众点评),所有地点均来自真实查询结果。系统提示词设置"反幻觉"硬约束 + 后处理重复检测校验器双重保障。
用户感知:同一天的景点彼此不远,不会出现上午故宫、下午八达岭的离谱安排。
实现机制:逐日编排阶段要求同日行程地理聚集,maps_driving/maps_transit 验证通勤 ≤ 1h。后处理层的 transit_duration_check 校验器做二次确认。
用户感知:下雨天自动安排室内景点,晴天安排户外活动。
实现机制:宏观侦察阶段调用 maps_weather 查天气,编排阶段据此动态调整。后处理层的 weather_adaptation_check 校验器确保雨天不超过 1 个户外景点。
用户感知:生成结果直接可用于地图渲染,前端无需二次查询。
实现机制:v2 的 JSON Schema 更丰富 —— 除经纬度外,还包含 timeSlot(时间段)、transitToNext(到下一站的交通方式和时间)、estimatedCost(单项费用),前端可渲染带时间轴的地图路线。
用户感知:等待时不再焦虑 —— 能看到"正在查询天气..."、"正在搜索景点..."、"正在验证路线..."的实时进度。
实现机制:SSE streaming 配置监听 Agent 输出中的 [STAGE:X/5] 标记和 tool_call/tool_result 事件,实时推送给前端,展示六阶段进度条和当前操作。
用户感知:第二次使用时不需要重复说"我吃素"、"预算有限",AI 已经记住了。
实现机制:memory 模块按用户隔离,持久化 6 个偏好维度(预算/饮食/出行/住宿/兴趣/节奏),30 天有效。阶段〇自动检查历史偏好,仅对缺失项向用户确认。
用户感知:说一句"第二天午餐换成火锅",只改那一项,其余行程不变。
实现机制:增量编辑模式解析修改指令(第几天/第几项/操作类型),仅对修改涉及的 POI 做工具查询验证,保持未修改部分不变。避免全量重跑的资源浪费和行程漂移。
用户感知:不管网络多不稳定,行程都能正常生成。
实现机制:3 层容错 —— 单工具 3 次重试 + 指数退避;高德失败自动切 Google Maps;三源均失败则从已采集候选列表替代。绝不因单次网络问题中断整个规划。
三个 MCP 远程服务按优先级链式 fallback:高德(国内全覆盖) → Google Maps(海外覆盖) → 大众点评(餐饮深度信息)。单一数据源故障不影响整体可用性,且国内外目的地均可支持。
从 v1 的四阶段升级为六阶段(新增偏好采集 + 行程校验),每个阶段有明确目标、工具策略和进度标记。规划过程完全可观测、可调试。
maxConcurrent: 5 允许单轮内并行发起多个无依赖的工具调用(如同时搜索景点/美食/酒店),将 POI 采集阶段的耗时从串行的 N 轮压缩到 ceil(N/5) 轮。
跨会话持久化 6 个偏好维度,30 天有效。第二次使用时自动加载已有偏好,仅确认缺失项。越用越精准,减少沟通成本。
6 个独立校验器(营业时间/天气适配/时间冲突/预算/通勤/重复)在 JSON 生成后做结构化验证。error 级别问题自动拒绝并要求模型重新生成,warning 级别追加到行程 tips 中提醒用户。
支持"修改第 N 天第 M 项"的局部更新,仅对修改涉及的 POI 做工具查询和路线验证。避免全量重跑带来的资源浪费、延迟和行程漂移。
CEK 引擎支持 7 个阶段预算(偏好 $0.03 / 侦察 $0.05 / 采集 $0.25 / 编排 $0.20 / 校验 $0.15 / 输出 $0.05 / 预留 $0.07),超出阶段预算时自动从 qwen-max 降级到 qwen-plus 继续执行,兼顾质量与成本。
SSE streaming 实时推送六阶段进度和工具调用事件到前端,用户在等待时能看到 AI 当前在做什么,大幅降低等待焦虑感。
虽然并行工具调用减少了轮次,但六阶段流水线 + 后处理校验 + 可能的重试,整体延迟仍在 2-4 分钟级别。对于"随便帮我规划一下"的轻量需求,等待时间偏长。
六阶段策略、增量编辑模式、并行工具引导、多数据源切换均依赖 system prompt 的约束力。换模型(如从 qwen-max 到 GPT-4o)可能需要重新调优 prompt。
postProcess.validators 中的 rule 是语义描述而非可执行代码,需要运行时框架实现对应的校验逻辑。当前 lambdagent 框架尚未原生支持 postProcess,需要在应用层(如 Java 后端)额外实现。
高德有官方 MCP 服务 (mcp.amap.com),但 Google Maps 和大众点评的 MCP 服务需要自行搭建或使用第三方封装,增加了部署复杂度。
阶段〇的偏好确认需要用户回答问题,对于希望"一句话直接出结果"的用户可能感到繁琐。需要平衡个性化精度和交互简洁性。