Plan Trip (行程规划)
为用户规划出行行程:意图识别 → 事项收集(出发地、目的地、日期等)→ 行程规划。所有 Agent 均使用 model 对象,且 reply() 均为 async。
When to Use
- 用户说「规划行程」「从XX到XX」「X月X日去北京」等
Agents(按顺序)
- IntentionAgent — 识别意图与改写 query
- EventCollectionAgent — 提取出发地、目的地、日期、目的等
- ItineraryPlanningAgent — 生成行程(每日安排、交通、住宿建议等)
统一模型与异步
- 先创建
OpenAIChatModel(来自 config.LLM_CONFIG),再传给各 Agent 的 model 参数(本项目无 model_config_name)。
- 三个 Agent 的
reply() 都是 async,需 await。
调用示例(简化链式)
import asyncio
import json
from agentscope.message import Msg
from agentscope.model import OpenAIChatModel
from config_agentscope import init_agentscope
from config import LLM_CONFIG
from agents.intention_agent import IntentionAgent
from agents.event_collection_agent import EventCollectionAgent
from agents.itinerary_planning_agent import ItineraryPlanningAgent
async def plan_trip(user_query: str):
init_agentscope()
model = OpenAIChatModel(
model_name=LLM_CONFIG["model_name"],
api_key=LLM_CONFIG["api_key"],
client_kwargs={"base_url": LLM_CONFIG["base_url"], "timeout": 60},
temperature=LLM_CONFIG.get("temperature", 0.7),
max_tokens=LLM_CONFIG.get("max_tokens", 2000),
)
user_msg = Msg(name="user", content=user_query, role="user")
# 1. 意图识别
intention_agent = IntentionAgent(name="IntentionAgent", model=model)
intention_result = await intention_agent.reply(user_msg)
intention_data = json.loads(intention_result.content)
rewritten_query = intention_data.get("rewritten_query", user_query)
# 2. 事项收集(传入 context 格式,与 OrchestrationAgent 一致)
context = {"rewritten_query": rewritten_query, "user_preferences": {}}
event_input = Msg(name="Orchestrator", content=json.dumps({"context": context}), role="user")
event_agent = EventCollectionAgent(name="EventCollectionAgent", model=model)
event_result = await event_agent.reply(event_input)
event_data = json.loads(event_result.content) if isinstance(event_result.content, str) else event_result.content
# 3. 行程规划(传入 previous_results,包含 event_collection 结果)
previous_results = [{"agent_name": "event_collection", "data": event_data}]
plan_input = Msg(
name="Orchestrator",
content=json.dumps({"context": context, "previous_results": previous_results}, ensure_ascii=False),
role="user",
)
plan_agent = ItineraryPlanningAgent(name="ItineraryPlanningAgent", model=model)
plan_result = await plan_agent.reply(plan_input)
plan_data = json.loads(plan_result.content) if isinstance(plan_result.content, str) else plan_result.content
return plan_data
# 使用
result = asyncio.run(plan_trip("规划一下2月27日从上海到北京的路程"))
# result: {"itinerary": {"title", "duration", "route", "daily_plans", "notes", ...}, "planning_complete": bool}
EventCollectionAgent 输出字段(示例)
origin, destination, start_date, end_date, duration_days, trip_purpose, missing_info 等
ItineraryPlanningAgent 输出字段(示例)
itinerary: title, duration, route, daily_plans, notes, estimated_budget 等
planning_complete: bool
错误与缺失信息
- 若意图解析非 JSON,可提示用户重新描述。
- 若
event_data 含 missing_info,可提示用户补全再继续。
行程规划 Prompt 指南
【核心原则】
- 永远提供有价值的行程规划,即使信息不完整
- 不要因为缺少天气、交通等细节信息就拒绝规划
- 基于目的地和日期给出合理的景点推荐和行程安排
- 缺失的信息可以在注意事项中提醒用户补充,但不影响主体规划
- 不要虚构机场、高铁站、火车站、航班号、车次、酒店名称或景点开放信息
- 当出发城市本身缺少明确的大型机场、高铁站或交通枢纽不明确时,必须使用保守表述
例如可写“建议从附近主要机场出发(如上海虹桥/浦东等)”“建议从附近主要高铁站出发”或“建议确认周边可达交通枢纽”,不要直接编造不存在的机场或车站
【规划策略】
- 如果有目的地和日期:给出该地标志性景点的游览路线
- 如果缺少出发地:假设从目的地市内出发,规划市内一日游
- 如果缺少天气信息:根据当前季节给出建议(如冬季建议室内+室外结合)
- 如果缺少开放信息:推荐常规开放的景点,提醒提前确认
- 如果交通枢纽信息不确定:优先给出“附近主要枢纽/建议确认”的保守建议,而不是编造具体机场、车站、航班或车次
【行程规划要点】
- 根据时间合理安排景点数量(一日游通常2-3个主要景点)
- 考虑景点之间的交通时间和距离
- 安排午餐、晚餐时间和推荐地点
- 给出大致的时间安排(如9:00-12:00, 13:00-17:00等)
- 提供交通方式建议(地铁、打车、步行等)
- 若用户偏好飞机但出发城市并非典型航空枢纽,应明确说明需要前往附近机场,不要写成“从该城市机场直飞”
- 若用户偏好高铁或火车,但出发城市的具体车站不明确,不要凭空指定站名;应写成“建议从附近主要高铁站/火车站出发,并提前确认车次”
【任务】
基于已有信息生成实用的行程规划:
- 必须给出具体的景点和活动安排,不能只说"需要补充信息"
- 在daily_plans中给出详细的时间表和景点
- 在notes中补充注意事项和需要确认的信息
- 在missing_info中列出建议用户补充的信息(但不影响规划)
【输出格式】(严格JSON)
{{
"itinerary": {{
"title": "北京3日游",
"duration": "3天",
"route": "北京 -> 北京",
"daily_plans": [
{{
"day": 1,
"date": "2024-02-27",
"city": "北京",
"theme": "历史文化之旅",
"activities": [
{{
"time": "09:00-12:00",
"location": "故宫博物院",
"description": "游览故宫,感受皇家建筑群的宏伟...",
"transport": "地铁1号线天安门东站"
}}
],
"meals": {{ "lunch": "...", "dinner": "..." }}
}}
],
"notes": ["建议提前7天预约故宫门票..."],
"estimated_budget": "约2000元"
}},
"planning_complete": true
}}
1---2name: plan-trip3description: Use this skill when the user wants to plan a trip or asks for itinerary planning. Triggers when user says "规划行程", "安排路线", "我要去XX", "从XX到XX", or provides trip details like dates and destinations. This skill orchestrates IntentionAgent, EventCollectionAgent, and ItineraryPlanningAgent; all agents take model=model and are async.4---56# Plan Trip (行程规划)78为用户规划出行行程:意图识别 → 事项收集(出发地、目的地、日期等)→ 行程规划。所有 Agent 均使用 **model 对象**,且 **reply() 均为 async**。910## When to Use1112- 用户说「规划行程」「从XX到XX」「X月X日去北京」等1314## Agents(按顺序)15161. **IntentionAgent** — 识别意图与改写 query 172. **EventCollectionAgent** — 提取出发地、目的地、日期、目的等 183. **ItineraryPlanningAgent** — 生成行程(每日安排、交通、住宿建议等)1920## 统一模型与异步2122- 先创建 `OpenAIChatModel`(来自 `config.LLM_CONFIG`),再传给各 Agent 的 **model** 参数(本项目无 `model_config_name`)。23- 三个 Agent 的 `reply()` 都是 **async**,需 **await**。2425## 调用示例(简化链式)2627```python28import asyncio29import json30from agentscope.message import Msg31from agentscope.model import OpenAIChatModel32from config_agentscope import init_agentscope33from config import LLM_CONFIG34from agents.intention_agent import IntentionAgent35from agents.event_collection_agent import EventCollectionAgent36from agents.itinerary_planning_agent import ItineraryPlanningAgent3738async def plan_trip(user_query: str):39 init_agentscope()40 model = OpenAIChatModel(41 model_name=LLM_CONFIG["model_name"],42 api_key=LLM_CONFIG["api_key"],43 client_kwargs={"base_url": LLM_CONFIG["base_url"], "timeout": 60},44 temperature=LLM_CONFIG.get("temperature", 0.7),45 max_tokens=LLM_CONFIG.get("max_tokens", 2000),46 )47 user_msg = Msg(name="user", content=user_query, role="user")4849 # 1. 意图识别50 intention_agent = IntentionAgent(name="IntentionAgent", model=model)51 intention_result = await intention_agent.reply(user_msg)52 intention_data = json.loads(intention_result.content)53 rewritten_query = intention_data.get("rewritten_query", user_query)5455 # 2. 事项收集(传入 context 格式,与 OrchestrationAgent 一致)56 context = {"rewritten_query": rewritten_query, "user_preferences": {}}57 event_input = Msg(name="Orchestrator", content=json.dumps({"context": context}), role="user")58 event_agent = EventCollectionAgent(name="EventCollectionAgent", model=model)59 event_result = await event_agent.reply(event_input)60 event_data = json.loads(event_result.content) if isinstance(event_result.content, str) else event_result.content6162 # 3. 行程规划(传入 previous_results,包含 event_collection 结果)63 previous_results = [{"agent_name": "event_collection", "data": event_data}]64 plan_input = Msg(65 name="Orchestrator",66 content=json.dumps({"context": context, "previous_results": previous_results}, ensure_ascii=False),67 role="user",68 )69 plan_agent = ItineraryPlanningAgent(name="ItineraryPlanningAgent", model=model)70 plan_result = await plan_agent.reply(plan_input)71 plan_data = json.loads(plan_result.content) if isinstance(plan_result.content, str) else plan_result.content72 return plan_data7374# 使用75result = asyncio.run(plan_trip("规划一下2月27日从上海到北京的路程"))76# result: {"itinerary": {"title", "duration", "route", "daily_plans", "notes", ...}, "planning_complete": bool}77```7879## EventCollectionAgent 输出字段(示例)8081- `origin`, `destination`, `start_date`, `end_date`, `duration_days`, `trip_purpose`, `missing_info` 等8283## ItineraryPlanningAgent 输出字段(示例)8485- `itinerary`: `title`, `duration`, `route`, `daily_plans`, `notes`, `estimated_budget` 等86- `planning_complete`: bool8788## 错误与缺失信息8990- 若意图解析非 JSON,可提示用户重新描述。91- 若 `event_data` 含 `missing_info`,可提示用户补全再继续。929394## 行程规划 Prompt 指南9596【核心原则】971. **永远提供有价值的行程规划**,即使信息不完整982. **不要因为缺少天气、交通等细节信息就拒绝规划**993. **基于目的地和日期给出合理的景点推荐和行程安排**1004. 缺失的信息可以在注意事项中提醒用户补充,但不影响主体规划1015. **不要虚构机场、高铁站、火车站、航班号、车次、酒店名称或景点开放信息**1026. **当出发城市本身缺少明确的大型机场、高铁站或交通枢纽不明确时,必须使用保守表述**103 例如可写“建议从附近主要机场出发(如上海虹桥/浦东等)”“建议从附近主要高铁站出发”或“建议确认周边可达交通枢纽”,不要直接编造不存在的机场或车站104105【规划策略】106- 如果有目的地和日期:给出该地标志性景点的游览路线107- 如果缺少出发地:假设从目的地市内出发,规划市内一日游108- 如果缺少天气信息:根据当前季节给出建议(如冬季建议室内+室外结合)109- 如果缺少开放信息:推荐常规开放的景点,提醒提前确认110- 如果交通枢纽信息不确定:优先给出“附近主要枢纽/建议确认”的保守建议,而不是编造具体机场、车站、航班或车次111112【行程规划要点】1131. 根据时间合理安排景点数量(一日游通常2-3个主要景点)1142. 考虑景点之间的交通时间和距离1153. 安排午餐、晚餐时间和推荐地点1164. 给出大致的时间安排(如9:00-12:00, 13:00-17:00等)1175. 提供交通方式建议(地铁、打车、步行等)1186. 若用户偏好飞机但出发城市并非典型航空枢纽,应明确说明需要前往附近机场,不要写成“从该城市机场直飞”1197. 若用户偏好高铁或火车,但出发城市的具体车站不明确,不要凭空指定站名;应写成“建议从附近主要高铁站/火车站出发,并提前确认车次”120121【任务】122基于已有信息生成实用的行程规划:1231. **必须给出具体的景点和活动安排**,不能只说"需要补充信息"1242. 在daily_plans中给出详细的时间表和景点1253. 在notes中补充注意事项和需要确认的信息1264. 在missing_info中列出建议用户补充的信息(但不影响规划)127128【输出格式】(严格JSON)129{{130 "itinerary": {{131 "title": "北京3日游",132 "duration": "3天",133 "route": "北京 -> 北京",134 "daily_plans": [135 {{136 "day": 1,137 "date": "2024-02-27",138 "city": "北京",139 "theme": "历史文化之旅",140 "activities": [141 {{142 "time": "09:00-12:00",143 "location": "故宫博物院",144 "description": "游览故宫,感受皇家建筑群的宏伟...",145 "transport": "地铁1号线天安门东站"146 }}147 ],148 "meals": {{ "lunch": "...", "dinner": "..." }}149 }}150 ],151 "notes": ["建议提前7天预约故宫门票..."],152 "estimated_budget": "约2000元"153 }},154 "planning_complete": true155}}