很早之前就想写一篇关于如何测试一个 agent 的文章,一直拖到现在,在这里我将分出十篇文章,来回答” 如何测试一个 agent?“这个比较大的问题
第一篇我想讲一下 agent 的评测和观测有什么区别,该怎么做。
首先,很多人测试 Agent 时,第一反应是看最后回答对不对。但这是远远不够的,对 LLM 来说,黑盒状态下我们只能看到 prompt - answer,对于 agent 来说,关键并不在于它会不会生成文本,而在于它会在任务执行过程中做决策:它会读上下文、制定计划、调用工具、更新状态、写入记忆、处理失败,触发兜底策略等等。
如上所说,我们设计不同的 prompt,对 answer 进行一些维度的打分和评估,比如这个答案符不符合预期,写出来的格式对不对,回答风格怎么样,这就是效果评测 (Agent Evaluation);而我们如果测试它任务执行过程中做的决策,这就是过程观测 (Agent Observation / Trace Analysis)。
一个完整的 Agent 测试体系,至少要同时回答两个问题:效果评测回答 “任务有没有完成”,过程观测回答 “任务是怎么完成的”。
效果评测关注结果:
Trace 观测关注过程:
效果评测像验收结果,Trace 观测像调查证据。只看效果,无法定位问题;只看 Trace,没有评分,也无法判断质量是否达标。
常见问题不要只按 “答对 / 答错” 分类,而要按证据缺口分类:
tool call、permission decision 和 audit trace。trace/span、工具返回和上下文快照。第一批样本不要只放成功路径。一个最小 Agent 评测集至少要覆盖:
一个最小 trace 应至少包含:
task_id、run_id、dataset_id。OpenTelemetry 的通用模型里,trace 是完整链路,span 是其中一次操作。迁移到 Agent 测试里,可以把一次任务作为 trace,把模型调用、工具调用、检索、审批、状态更新和评分都作为 span。
不要只给一个总分。建议从一开始就拆成多层:
任务:让一个代码 Agent 修复登录失败 bug。
最低可接受 Trace:
task: 修复登录失败 bug
context: 读取 auth 模块、测试文件、错误日志
plan: 先复现失败,再定位原因,再修改,再跑测试
tool: Bash npm test -> Read auth.ts -> Edit auth.ts -> Bash npm test
observe: 第一次测试失败,第二次测试通过
state: failing -> investigating -> patched -> verified
score: result_pass=true, tool_args_pass=true, trace_pass=true
如果最终回答说 “已修复”,但 trace 里没有测试命令、没有文件 diff、没有错误输出,那就不能算完整通过。
从 Claude Code 官方文档看,一次 agentic loop 可以简化成三段:gather context、take action、verify results。Agent SDK 的 loop 则进一步拆成:接收 prompt,模型评估并返回文本或工具调用,执行工具,把工具结果反馈给模型,循环直到没有工具调用,再返回最终结果。
在测试视角里,可以把它改写成:
Task
-> Context
-> Plan
-> Tool / Act
-> Observe
-> State
-> Memory
-> Failure Recovery
-> Safety
-> Regression
这个顺序不是为了画漂亮流程图,而是为了提醒测试人员:Agent 的质量问题可能发生在任意中间环节。上下文拿错,计划再漂亮也会偏;工具参数错,最终答案可能只是编得像;状态更新错,下一轮会重复执行;记忆写错,后续任务会被污染。