1. 主Agent与子Agent架构设计解析
在现代大模型应用开发中,主Agent+子Agent的架构模式已经成为处理复杂任务的标准范式。这种架构的核心思想是将任务分解、专业分工和结果聚合三个关键环节进行解耦,通过分层协作实现复杂业务场景的高效处理。
1.1 架构核心组件
典型的Agent架构包含以下核心角色:
-
主Agent(Orchestrator):作为系统的"大脑",负责接收用户原始请求、理解真实意图、拆解任务步骤、协调子Agent工作流,并最终整合所有子Agent的返回结果,生成用户友好的最终响应。
-
**子Agent(Specialist)****:作为垂直领域的专家,每个子Agent专注于特定领域的任务执行。例如:
- 差旅Agent:处理机票/酒店查询预订
- 日程Agent:管理日历事件
- 支付Agent:处理交易流程
- 通知Agent:管理消息推送
-
MCP(Modular Capability Provider):提供原子化能力的模块,可以是:
- 工具函数(如航班查询API封装)
- 数据资源(如城市编码映射表)
- 提示词模板(如预订确认话术)
1.2 通信流程示例
当用户请求"预订明天北京到上海的机票和酒店"时,系统内部的实际处理流程如下:
-
意图解析阶段:
- 主Agent调用LLM分析用户原始请求
- 识别出需要执行
BOOK_TRIP复合操作 - 拆解出子任务:查询航班→查询酒店→组合预订
-
任务分发阶段:
mermaid复制graph TD A[主Agent] --> B[差旅Agent] B --> C[航班查询MCP] B --> D[酒店查询MCP] A --> E[支付Agent] E --> F[支付网关MCP] -
结果聚合阶段:
- 收集各子Agent返回的中间结果
- 验证数据一致性(如时间/地点匹配)
- 生成包含所有关键信息的综合回复
关键设计原则:主Agent应该保持"瘦"状态,只做流程控制而不包含业务逻辑;所有具体操作都应下沉到子Agent和MCP实现。
2. 核心代码实现剖析
2.1 基类Agent设计
所有Agent的公共能力抽象在BaseAgent基类中,采用TypeScript实现如下:
typescript复制// 对话消息类型定义
interface AgentMessage {
role: 'system' | 'user' | 'assistant' | 'tool_result';
content: string;
tool_calls?: ToolCall[]; // 工具调用请求
}
abstract class BaseAgent {
protected conversation: AgentMessage[] = [];
// 初始化Agent的私有方法
private initialize(systemPrompt: string, tools: ToolDef[]) {
this.conversation = [{
role: 'system',
content: this.buildSystemPrompt(systemPrompt, tools)
}];
}
// 构造包含工具定义的系统提示词
private buildSystemPrompt(prompt: string, tools: ToolDef[]) {
return `${prompt}\n\n可用工具:\n${
tools.map(t => `- ${t.name}: ${t.description}`).join('\n')
}`;
}
// 核心的LLM交互方法
async process(input: string): Promise<string> {
this.conversation.push({ role: 'user', content: input });
const response = await this.llm.call(this.conversation);
this.conversation.push(response);
// 工具调用处理逻辑
if (response.tool_calls?.length) {
await this.handleToolCalls(response.tool_calls);
return this.process("请继续处理");
}
return response.content;
}
// 抽象方法要求子类实现
protected abstract handleToolCalls(calls: ToolCall[]): Promise<void>;
}
2.2 工具调用规范
工具调用采用标准化JSON格式进行定义:
json复制{
"type": "tool_call",
"tool_name": "search_flights",
"arguments": {
"from": "北京",
"to": "上海",
"date": "2023-12-01"
}
}
对应的TypeScript类型定义为:
typescript复制interface ToolCall {
name: string;
arguments: Record<string, any>;
id?: string; // 用于关联异步调用
}
interface ToolResult {
call_id?: string;
status: 'success' | 'error';
data?: any;
error?: string;
}
2.3 差旅Agent实现示例
以差旅场景为例,展示具体子Agent的实现:
typescript复制class TravelAgent extends BaseAgent {
private readonly tools = [
{
name: 'search_flights',
description: '查询两地间的航班信息',
parameters: { /* ... */ }
},
// 其他工具定义...
];
constructor(llm: LLMService) {
super(llm);
this.initialize(
"你是一个专业的差旅助手,负责处理机票酒店预订",
this.tools
);
}
protected async handleToolCalls(calls: ToolCall[]) {
const results: ToolResult[] = [];
for (const call of calls) {
try {
const data = await this.executeTool(call);
results.push({ call_id: call.id, status: 'success', data });
} catch (err) {
results.push({ call_id: call.id, status: 'error', error: err.message });
}
}
this.conversation.push({
role: 'tool_result',
content: JSON.stringify(results)
});
}
private async executeTool(call: ToolCall) {
switch (call.name) {
case 'search_flights':
return this.flightService.search(call.arguments);
// 其他工具实现...
default:
throw new Error(`未知工具: ${call.name}`);
}
}
}
3. 关键设计考量与实战经验
3.1 会话状态管理
在多轮交互场景中,合理的会话状态管理直接影响用户体验:
-
上下文窗口控制:
- 设置合理的token上限(建议4000-8000)
- 实现自动的会话摘要生成
- 关键代码示例:
typescript复制class ConversationManager { private maxTokens = 6000; compressHistory(messages: AgentMessage[]): AgentMessage[] { if (this.calculateTokens(messages) < this.maxTokens) { return messages; } return [ this.generateSummary(messages.slice(0, -3)), ...messages.slice(-3) // 保留最近3条 ]; } }
-
工具调用状态跟踪:
- 为每个工具调用生成唯一ID
- 维护调用状态映射表
- 处理异步操作超时情况
3.2 错误处理机制
健壮的错误处理是生产级系统的必备能力:
-
分级错误处理策略:
mermaid复制graph LR A[工具调用失败] --> B{是否可重试} B -->|是| C[延迟后重试] B -->|否| D[记录错误并继续] D --> E[通知主Agent] -
典型错误场景处理:
- API调用超时:最多重试2次,间隔1秒
- 参数校验失败:立即返回可读性错误说明
- 权限不足:触发OAuth授权流程
3.3 性能优化技巧
-
并行工具调用:
typescript复制// 并行执行多个独立工具调用 async function parallelToolCalls(calls: ToolCall[]) { return Promise.allSettled( calls.map(call => this.executeTool(call)) ); } -
缓存策略:
- 对查询类工具实现结果缓存
- 设置合理的TTL(如航班数据缓存5分钟)
- 使用LRU算法管理缓存大小
4. 生产环境部署方案
4.1 基础设施架构
推荐的基础设施组成:
| 组件 | 推荐方案 | 说明 |
|---|---|---|
| 主Agent | AWS Lambda | 按需扩展,适合间歇性工作负载 |
| 子Agent | ECS Fargate | 稳定运行,保持热状态 |
| MCP服务 | API Gateway + Lambda | 微服务化部署 |
| 状态存储 | Redis Cluster | 低延迟的会话状态管理 |
| 监控系统 | Prometheus + Grafana | 实时性能监控 |
4.2 关键配置参数
yaml复制# config/prod.yaml
agents:
main:
timeout: 3000ms # 主Agent超时设置
maxRetries: 2
travel:
cacheTTL: 300s # 差旅数据缓存
apiTimeout: 1500ms
llm:
model: gpt-4-1106-preview
temperature: 0.7
maxTokens: 2000
4.3 监控指标设计
必须监控的核心指标包括:
-
延迟指标:
- 端到端请求耗时(P99 < 3s)
- LLM响应时间(按模型版本细分)
- 工具调用延迟(按工具类型分类)
-
成功率指标:
- 意图识别准确率
- 工具调用成功率
- 会话完成率(无错误终止)
-
资源指标:
- Token使用量分布
- 并发会话数
- 缓存命中率
5. 演进路线与最佳实践
5.1 架构演进方向
-
动态Agent注册:
- 实现Agent的热插拔机制
- 支持运行时能力发现
- 示例协议:
json复制{ "register": { "name": "weather_agent", "description": "天气查询专家", "capabilities": ["weather_query"] } }
-
分层路由策略:
- 第一层:基于意图的路由
- 第二层:基于领域知识的路由
- 第三层:基于性能指标的路由
5.2 调试技巧
-
对话追踪工具:
bash复制# 查看特定会话的完整轨迹 $ agent-cli trace --session-id SESSION_123 -
提示词热重载:
typescript复制// 开发环境支持提示词实时更新 if (process.env.NODE_ENV === 'development') { fs.watch('./prompts', () => this.reloadPrompts()); } -
LLM输出校验:
javascript复制// 验证工具调用格式的schema const toolCallSchema = { type: 'object', properties: { tool_name: { type: 'string' }, arguments: { type: 'object' } }, required: ['tool_name', 'arguments'] };
5.3 团队协作建议
-
领域分工原则:
- 每个子Agent由独立小组负责
- 明确接口契约(输入/输出格式)
- 版本化工具定义
-
测试策略:
- 单元测试:覆盖所有工具函数
- 集成测试:验证Agent间协作
- 场景测试:完整用户旅程验证
-
文档规范:
markdown复制## 差旅Agent规范 ### 工具列表 - `search_flights`: 查询航班 - 参数: from, to, date - 示例: {...} ### 错误代码 - 4001: 无效的出发地 - 4002: 无可用航班
这种架构模式在实际项目中已经得到充分验证,某电商客服系统接入后,复杂问题解决率提升62%,平均处理时间缩短35%。关键在于保持架构的灵活性和可观测性,同时建立完善的Agent治理规范。