AI Agent 工程化实践
Agent 工程化全景
1. Function Calling 深入
tools = [{
"type": "function",
"function": {
"name": "search_web",
"description": "搜索互联网获取实时信息",
"parameters": {
"type": "object",
"properties": {
"query": {"type": "string", "description": "搜索关键词"}
},
"required": ["query"]
}
}
}]
response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
tools=tools,
tool_choice="auto" # auto / none / required
)
# 若模型决定调用工具
if response.choices[0].message.tool_calls:
tool_call = response.choices[0].message.tool_calls[0]
result = execute_tool(tool_call.function.name, tool_call.function.arguments)
# 将结果追加到 messages 继续对话
2. ReAct 模式实现
System Prompt 示例:
你是一个能调用工具的 AI 助手。每次思考请遵循以下格式:
Thought: 分析当前状况,决定下一步
Action: 调用工具名称
Action Input: 工具参数
Observation: (工具返回结果)
... (循环直到有答案)
Final Answer: 最终答案
终止条件
- 得到足够信息生成最终答案
- 达到最大迭代次数(防止死循环)
- 工具调用失败超过阈值
3. 多 Agent 系统设计
层级架构
Orchestrator Agent(任务分解和协调)
├── Research Agent(信息检索)
├── Code Agent(代码生成执行)
├── Writer Agent(内容生成)
└── Critic Agent(质量评估)
通信方式
- 共享消息队列
- Blackboard 模式(共享状态空间)
- 直接函数调用(同步)
- 事件驱动(异步)
代表框架
| 框架 | 特点 |
|---|---|
| LangGraph | 图结构工作流,状态机,支持循环 |
| AutoGen | 对话式多 Agent,微软出品 |
| CrewAI | 角色化 Agent 团队,简单易用 |
| OpenAI Swarm | 轻量级 handoff 模式 |
4. 记忆系统设计
短期记忆(In-context)
→ 当前对话历史,直接放入 context window
→ 超长时摘要压缩
长期记忆(外部存储)
→ 向量存储(语义检索历史对话)
→ 结构化存储(用户偏好、任务状态)
→ 知识图谱(实体关系)
工作记忆(执行状态)
→ 当前任务的中间结果
→ 工具调用历史
5. 可靠性与安全
幂等性
- 工具调用可能因网络重试多次执行
- 设计工具时保证幂等(查询类天然幂等,写入类需去重)
沙箱执行
- 代码执行 Agent 必须在隔离环境(Docker/E2B)
- 限制文件系统访问、网络访问、执行时间
Prompt 注入防御
- 严格区分系统指令和用户输入
- 对工具输出做内容过滤
- 敏感操作需要用户二次确认
可观测性
- 记录每次 LLM 调用(输入/输出/token 数/延迟)
- 工具调用日志(工具名/参数/结果/耗时)
- 使用 LangSmith / Langfuse / Phoenix 做 tracing
6. 成本与延迟优化
- 缓存:相同输入的 LLM 调用结果缓存(Prompt Cache)
- 模型路由:简单任务用小模型(GPT-4o-mini),复杂任务用大模型
- 流式输出:SSE 降低首字节时间,提升用户体验
- 并行工具调用:无依赖的工具并发执行
- Context 压缩:历史对话摘要,减少 token 消耗
7. 高频面试题
- Agent 如何处理工具调用失败? 重试(指数退避)+ fallback 工具 + 告知 LLM 错误信息让其调整策略
- 如何防止 Agent 无限循环? 最大迭代次数 + 检测重复 action + 超时熔断
- 多 Agent 如何保证任务不重复? 任务队列 + 状态锁 + 幂等性设计
- 如何评估 Agent 质量? 任务完成率、工具调用准确率、token 效率、延迟 P99