Agent 调试与优化
问题
开发了一个 AI Agent 但它经常出错:调用错误的工具、陷入循环、任务完成质量差,如何排查和优化?
答案
一、Agent 常见问题
| 问题 | 表现 | 根因 |
|---|---|---|
| 工具选择错误 | 调用了不该调的工具 | 工具描述不清晰 |
| 死循环 | 反复调用同一工具 | 缺少终止条件 |
| 遗忘上下文 | 忘记前面的步骤结果 | 上下文过长丢失信息 |
| 任务偏离 | 做了用户没要求的事 | 规划能力不足 |
| 错误传播 | 一步出错导致后续全错 | 缺少错误处理和回退 |
二、排查流程
三、优化策略
1. 工具描述优化
// ❌ 模糊的工具描述
const badTool = {
name: 'search',
description: '搜索',
}
// ✅ 清晰的工具描述
const goodTool = {
name: 'search_knowledge_base',
description: '在公司内部知识库中搜索文档。当用户询问公司政策、产品信息时使用。不能搜索外网信息。',
parameters: {
query: { type: 'string', description: '搜索关键词,应该是具体的短语而非完整句子' },
},
}
2. 防死循环
async function agentLoop(query: string) {
const MAX_STEPS = 10 // 硬性上限
const MAX_SAME_TOOL = 3 // 连续调同一工具上限
let steps = 0
let sameToolCount = 0
let lastTool = ''
while (steps < MAX_STEPS) {
const action = await plan(query, context)
if (action.type === 'finish') break
// 检测重复调用
if (action.tool === lastTool) {
sameToolCount++
if (sameToolCount >= MAX_SAME_TOOL) {
context.push({ role: 'system', content: '你已经多次调用同一工具,请尝试其他方法或直接给出回答。' })
}
} else {
sameToolCount = 0
}
lastTool = action.tool
steps++
const result = await executeTool(action)
context.push(result)
}
}
3. 可观测性
| 记录内容 | 用途 |
|---|---|
| 每步的推理过程(Thought) | 理解 Agent 决策逻辑 |
| 工具调用参数和返回 | 定位工具问题 |
| Token 消耗 | 成本监控 |
| 尝试次数和总步数 | 效率评估 |
| 最终结果和用户反馈 | 效果评价 |
Agent 调试心法
Agent 的问题 80% 出在 Prompt(System Prompt + 工具描述) 上。先优化 Prompt,再考虑架构优化。
常见面试问题
Q1: 如何提升 Agent 的规划能力?
答案:
- ReAct Prompt:强制 Agent 先 Thought 再 Action
- Plan-then-Execute:先拟定计划再逐步执行
- few-shot 示例:在 Prompt 中给出正确的推理链示例
- 更强的模型:复杂任务用 GPT-4o / Claude 3.5 Sonnet
Q2: Agent 和 Workflow 怎么选?
答案:
| 维度 | Agent(自主决策) | Workflow(固定流程) |
|---|---|---|
| 灵活性 | 高 | 低 |
| 可控性 | 低 | 高 |
| 可预测性 | 低 | 高 |
| 适用场景 | 开放性任务 | 流程固定的任务 |
建议:能用 Workflow 解决就不用 Agent。Agent 适合任务步骤不确定的场景。
Q3: 多 Agent 系统的常见问题?
答案:
- 协调开销:Agent 间通信消耗大量 Token
- 责任不清:多个 Agent 都不做某个子任务
- 调试困难:链路长、状态复杂
建议:从单 Agent 开始,确有需求再拆分。大多数场景 单 Agent + 多工具 就够了。