1. 项目背景与核心挑战
在构建大模型应用时,很多开发者都会经历从"全能型Agent"到"模块化协作"的认知转变。我最近基于LangChain 1.0实现了一个典型的出行场景:用户输入"北京飞上海"的需求后,系统自动完成机票预订、机场附近酒店选择以及接送车辆安排的全流程。这个看似简单的需求背后,隐藏着几个关键工程挑战:
单Agent模式的三大痛点:
- 工具混淆:当机票、酒店、打车工具都绑定在同一个Agent时,模型经常错误调用工具(例如用酒店接口查询机票)
- 参数污染:不同工具的参数格式相互干扰(如日期字段有的需要"YYYY-MM-DD"有的需要时间戳)
- 输出不稳定:模型自行添加的解释文本导致下游解析失败
关键发现:让单个Agent同时承担决策、执行和流程控制,违反了单一职责原则。这就像让一个服务员同时负责点菜、烹饪和结账,必然导致效率低下。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 架构设计:分层协作模型
2.1 角色划分
最终采用的架构包含四类角色:
mermaid复制graph TD
A[总协调Agent] --> B[携程Agent:机票]
A --> C[美团Agent:酒店]
A --> D[滴滴Agent:打车]
-
子Agent:每个只绑定一个工具,具有以下强制约束:
- 输入:严格校验参数格式
- 输出:仅返回工具原始响应,禁止附加任何自然语言
- 异常:必须抛出标准错误代码
-
总协调Agent:负责:
- 流程编排(机票→酒店→打车)
- 状态管理(传递航班号→酒店地址)
- 异常处理(重试/降级策略)
2.2 接口标准化
所有子Agent通过Runnable接口暴露服务:
python复制class BaseAgent(Runnable):
@abstractmethod
def invoke(self, input: Dict) -> Dict:
""" 输入输出均为标准化JSON """
# 示例:携程Agent实现
class CtripAgent(BaseAgent):
def invoke(self, input):
assert
