1. 项目概述:用LangGraph构建多智能体旅行系统
在当今AI技术快速发展的背景下,传统单体AI系统在处理复杂任务时逐渐暴露出局限性。特别是在旅行规划这类需要多领域协作的场景中,单一AI模型往往难以兼顾专业性和灵活性。本文介绍如何使用LangGraph框架构建一个可中断、可委派的多智能体旅行系统,通过专业分工和权限控制机制,实现更高效、更安全的旅行服务自动化。
这个系统的核心价值在于:
- 将复杂旅行任务拆解为多个专业子任务(航班、酒店、租车等)
- 每个子任务由专门的智能体负责处理
- 通过状态管理机制实现上下文保存与切换
- 敏感操作采用中断-授权流程确保安全性
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 整体架构
系统采用分层设计,主要包含以下组件:
- 主智能体:负责任务调度和全局控制
- 子智能体:包括航班助手、酒店助手、租车助手等专业模块
- 状态管理器:维护对话历史、用户信息和当前执行状态
- 工具网关:管理安全工具和敏感工具的调用权限
2.2 状态管理设计
系统的核心是状态管理机制,主要包含以下数据结构:
python复制class TravelState(TypedDict):
messages: List[Any] # 对话历史
user_info: UserInfo # 用户偏好和个人信息
agent_stack: List[str] # 当前执行的智能体栈
pending_action: Optional[Dict[str, Any]] # 待授权的敏感操作
其中agent_stack是实现智能体切换的关键,它记录了当前执行路径,确保在子智能体完成任务后能正确返回上级上下文。
3. 核心功能实现
3.1 智能体分工与协作
3.1.1 主智能体设计
主智能体作为系统的调度中心,主要职责包括:
- 识别用户意图并路由到合适的子智能体
- 处理简单的通用性问题
- 协调跨领域的复杂任务
其核心逻辑如下:
python复制def main_assistant(state: TravelState) -> TravelState:
llm = make_llm().bind_tools(ROUTING_TOOLS)
sys_msg = SystemMessage(content="你是旅行规划系统的主助手...")
msgs = [sys_msg] + state["messages"]
out = llm.invoke(msgs)
return {**state, "messages": state["messages"] + [out]}
3.1.2 子智能体设计
以航班助手为例,其设计特点包括:
- 专注于航班相关操作
- 只绑定必要的工具集
- 明确区分安全操作和敏感操作
python复制def flight_assistant(state: TravelState) -> TravelState:
llm = make_llm().bind_tools([*SAFE_TOOLS, *SENSITIVE_TOOLS, CompleteOrEscalate])
sys_msg = SystemMessage(content="你是航班助手...")
out = llm.invoke([sys_msg] + state["messages"])
# 拦截敏感操作并转为待授权状态
if hasattr(out, "tool_calls"):
for tc in out.tool_calls:
if tc["name"] in {"update_ticket"}:
return {
**state,
"messages": state["messages"] + [out],
"pending_action": {
"tool": tc["name"],
"args": tc["args"],
"tool_call_id": tc["id"],
},
}
return {**state, "messages": state["messages"] + [out]}
3.2 权限控制机制
3.2.1 工具分类
系统将工具分为两类:
-
安全工具:只读操作,可自动执行
search_flights:查询航班信息search_hotels:查询酒店信息
-
敏感工具:修改操作,需用户授权
cancel_hotel:取消酒店预订update_ticket:改签机票
3.2.2 中断-授权流程
敏感工具的执行流程如下:
- 子智能体识别需要执行敏感操作
- 将操作详情存入
pending_action - 系统中断当前流程,向用户展示操作详情
- 用户确认后继续执行,或拒绝后取消操作
关键实现代码:
python复制def sensitive_tool_gateway(state: TravelState) -> TravelState:
pending = state.get("pending_action")
if not pending:
return state
# 触发中断,等待用户确认
decision = interrupt({
"type": "approval_required",
"title": "需要确认敏感操作",
"action": pending,
"prompt": "请回复:确认 / 取消",
})
if decision.get("approved"):
# 执行工具
tool_name = pending["tool"]
args = pending["args"]
if tool_name == "cancel_hotel":
result = cancel_hotel.invoke(args)
elif tool_name == "update_ticket":
result = update_ticket.invoke(args)
return {
**state,
"pending_action": None,
"messages": state["messages"] + [
ToolMessage(content=str(result), tool_call_id=pending["tool_call_id"])
],
}
else:
# 用户拒绝,返回上级
stack = state["agent_stack"]
if len(stack) > 1:
stack.pop()
return {
**state,
"pending_action": None,
"agent_stack": stack,
"messages": state["messages"] + [
AIMessage(content="好的,我不会执行该操作。我们回到主流程继续。")
],
}
4. 系统工作流程
4.1 正常任务流程
- 用户发起请求(如"帮我改签航班")
- 主智能体识别意图,委派给航班助手
- 航班助手查询相关信息,准备执行改签
- 系统中断流程,请求用户确认改签操作
- 用户确认后完成改签,返回主智能体
4.2 异常处理流程
- 工具执行失败(如酒店已过取消时间)
- 子智能体通过
CompleteOrEscalate工具上报问题 - 系统返回主智能体,由主智能体协调解决方案
- 主智能体根据情况提供替代方案或联系人工客服
5. 扩展性设计
系统采用模块化设计,新增功能只需:
- 定义新的子智能体及其工具集
- 在主智能体中添加路由逻辑
- 更新状态类型定义(如需要新字段)
例如添加签证助手:
python复制# 新增工具
@tool
def check_visa_requirements(country: str) -> Dict[str, Any]:
"""查询签证要求"""
return {"country": country, "requirements": [...]}
# 新增路由工具
@tool
def ToVisaAssistant() -> str:
"""委派到签证助手"""
return "route:visa"
# 更新状态类型
class TravelState(TypedDict):
# ...原有字段...
agent_stack: List[Literal["main", "flights", "hotels", "cars", "visa"]]
6. 部署与运行
6.1 环境准备
bash复制pip install langgraph langchain-core langchain-openai
export OPENAI_API_KEY=你的key
6.2 启动系统
python复制python multi_agent_travel.py
6.3 交互示例
code复制你:帮我查一下长沙到北京,2026-01-10的航班
助手:找到以下航班选项...
你:把我的机票改签到NH008
[系统中断] 需要确认敏感操作
待执行:update_ticket args={'ticket_id': '123', 'new_flight_no': 'NH008'}
确认执行?(确认/取消):确认
助手:改签成功,新航班NH008...
7. 性能优化建议
- 上下文管理:合理控制对话历史长度,避免token消耗过大
- 工具设计:每个子智能体只绑定必要的工具,减少模型混淆可能性
- 缓存策略:对频繁查询的结果进行缓存,降低API调用成本
- 错误处理:为常见错误场景预设处理方案,提升用户体验
8. 常见问题排查
8.1 智能体无法正确路由
可能原因:
- 路由工具未正确定义
- 主智能体的prompt未明确说明委派逻辑
解决方案:
- 检查
ROUTING_TOOLS是否包含所有子智能体的路由工具 - 完善主智能体的系统提示,强调委派职责
8.2 敏感操作未触发中断
可能原因:
- 子智能体直接调用了敏感工具
pending_action机制未正确实现
解决方案:
- 确保子智能体的prompt明确要求敏感操作必须通过授权流程
- 检查
sensitive_tool_gateway的实现逻辑
8.3 上下文丢失
可能原因:
agent_stack未正确维护- 状态在智能体切换时被意外修改
解决方案:
- 在每次智能体切换时仔细检查栈操作
- 实现状态变更的日志记录,便于追踪问题
9. 进阶开发方向
- 多模态交互:集成语音、图像等多模态输入输出
- 个性化推荐:基于用户历史行为优化推荐策略
- 实时协作:支持多用户协同规划旅行
- 离线功能:实现部分功能的离线运行能力
这套多智能体旅行系统展示了LangGraph在复杂任务编排中的强大能力。通过专业分工和权限控制的设计,既提升了自动化效率,又保障了系统安全性。这种架构模式可以扩展到各种需要多领域协作的场景,如电商客服、医疗咨询等。
