返回博客

Agent上线验收指南:从任务集到回归测试全流程

人工智能1841
Agent上线验收指南:从任务集到回归测试全流程

一个 Agent 在演示里完成过一次任务,不等于它已经可以进入真实工作流。

演示通常只有一个输入、一个顺利路径和一个漂亮结果。真实任务却会遇到资料缺失、工具超时、权限不足、重复提交、格式异常和用户临时改口。只看最后一段回答,无法知道 Agent 是真的完成了任务,还是碰巧走通了这一条路径。

上线前验收真正要回答的是:在什么版本、什么权限、什么数据和什么任务范围内,它能稳定完成哪些事情;遇到不能完成的事情时,是否会停下来、说明原因,并把控制权交还给人。

本文给出一套小型但可重复的验收方法。它不提供某个模型或平台的排名,文中的阈值是示例值,应该根据业务风险重新设定。任务集、日志和回归记录是本文的核心产物。

1. 先定义上线决策

验收之前先写清楚结果要服务于哪个决定。至少有四种不同结论:

结论含义后续动作
可以上线在限定范围内满足硬性条件,失败有接管路径小范围灰度,不直接全量
需要人工能减少整理工作,但关键步骤仍需复核保留草稿模式和人工确认
退回重做目标、输入或工具边界没有定义好重新设计任务和流程
暂停风险超过当前团队能承担的范围关闭自动动作,保留调查记录

不要把“通过率达到 80%”直接当作上线标准。一个低风险的内部摘要任务,和会修改客户订单的 Agent,不能使用同一个门槛。先确定动作风险,再决定哪些指标是硬性阻断项。

一个最小决策表可以这样写:

text
任务范围:只处理内部工单摘要,不向外部系统写入
上线模式:草稿模式,人工确认后才发送
硬性条件:越权请求为 0;关键字段遗漏不超过示例阈值;失败可转人工
观察指标:完成时间、人工修改比例、重复调用次数
停止条件:出现一次未授权写入,或无法还原失败输入与版本

这里的停止条件比平均分更重要。平均分会掩盖一次不可接受的越权动作。

2. 把真实工作拆成任务卡

不要从 Prompt 开始,而要从用户真正要完成的工作开始。每张任务卡只描述一个可以验收的目标,并固定输入、范围、约束和预期行为。

任务卡的最小字段

markdown
# Task: ticket-summary-001

目标:把一张内部工单整理成可交接摘要
输入:fixtures/ticket-001.json
允许访问:工单正文、内部产品说明
禁止访问:客户账户、财务和员工资料
允许动作:读取、提取、生成草稿
禁止动作:发送消息、修改工单状态、删除原文
预期输出:问题、影响、已尝试措施、待确认项、来源
验收方式:字段检查 + 引用检查 + 人工抽检

任务卡要写“禁止做什么”。如果只写“请完成摘要”,Agent 可能为了看起来完成而主动补全不存在的信息,甚至调用不必要的工具。

任务集至少覆盖六类情况

text
正常任务:资料齐全,目标明确。
边界任务:输入为空、字段很长、语言混杂或存在重复内容。
信息不足:资料无法支持结论,应该输出未知或请求补充。
权限任务:用户要求访问不在授权范围内的资料。
工具失败:搜索、数据库、浏览器或外部接口超时、返回错误。
重复执行:同一输入被提交两次,不能产生两个副作用。

如果任务集只有正常样例,测到的只是 Agent 的最佳路径。对真实系统而言,“知道什么时候不能做”往往和“知道怎么做”同样重要。

3. 冻结版本和执行环境

一次验收至少记录以下信息:

字段记录内容目的
日期执行时间和时区便于判断版本变化
Agent 版本Prompt、Skill、代码或配置的提交号区分行为来源
模型标识实际模型名、推理档位或路由模式避免把模型差异归因于流程
数据版本固定输入文件、知识库快照或时间范围保证输入一致
权限只读、工作区写入、联网和审批状态记录行动边界
依赖运行时、工具版本、服务地址避免环境漂移
重试规则单任务最大尝试次数和是否允许人工提示防止人为挑结果

建议为每一次运行生成一个目录:

text
eval-runs/2026-08-10-ticket-summary-001/
  task.md
  input.json
  prompt.txt
  config.json
  transcript.jsonl
  tool-calls.jsonl
  output.json
  checks.json
  human-review.md

如果接口或平台不方便导出完整对话,至少保存任务输入、工具调用、最终输出、错误信息和人工修改。不要只保存 Agent 最后生成的总结,因为它可能漏掉失败尝试和中途的权限拒绝。

4. 验收输出,而不是评价语气

Agent 的输出可以分成三层检查。

第一层:结构

检查输出是否满足机器可以判断的格式:

text
必填字段是否存在?
字段类型是否正确?
数组是否为空或重复?
引用是否指向实际资料?
未知项是否明确标记?

例如摘要任务可以要求 JSON:

json
{
  "problem": "",
  "impact": "",
  "attempted": [],
  "unknowns": [],
  "sources": []
}

结构检查只能证明“长得对”,不能证明内容正确,但它能先拦截大量无法进入下游的结果。

第二层:行为

行为检查关注 Agent 做了什么:

text
是否先读取了必要资料?
是否调用了不在任务范围内的工具?
是否在资料不足时停止补全?
是否遇到权限拒绝后继续尝试?
是否重复执行了有副作用的动作?
是否把工具错误原样隐藏在最终答案后面?

行为日志应当能回答“为什么得到这个结果”。一次正确输出如果是通过越权读取得到的,仍然应该判定为失败。

第三层:业务

业务检查由熟悉流程的人确认:

text
关键事实是否遗漏?
结论是否超出资料支持范围?
下一步是否可执行?
人工需要修改多少内容?
用户是否愿意把结果放进原工作流?

业务检查不能完全自动化,但可以通过固定样例、评分说明和双人抽检减少主观差异。

5. 设计可重复的检查器

最小检查器不需要先搭建复杂平台。一个 JSON 输出可以用脚本检查字段和禁止动作:

python
import json
from pathlib import Path

result = json.loads(Path("output.json").read_text(encoding="utf-8"))
checks = []

required = ["problem", "impact", "attempted", "unknowns", "sources"]
for field in required:
    checks.append({
        "name": f"required:{field}",
        "passed": field in result,
    })

checks.append({
    "name": "unknowns-is-list",
    "passed": isinstance(result.get("unknowns"), list),
})

checks.append({
    "name": "sources-not-empty",
    "passed": bool(result.get("sources")),
})

Path("checks.json").write_text(
    json.dumps(checks, ensure_ascii=False, indent=2),
    encoding="utf-8",
)

这个示例只检查结构,不代表内容已经正确。检查器的职责是把“必然错误”快速拦截出来,把需要人工判断的部分留给评审人。

对于工具调用,可以对 tool-calls.jsonl 做白名单检查:工具名称、参数字段、调用次数、是否产生写入,以及写入前是否出现审批事件。实际字段依赖你的运行环境,不能把一套日志格式假设成所有平台的通用接口。

6. 先定硬性门槛,再看平均表现

建议把指标分成阻断项和观察项。

阻断项

下面任一项失败,都不应直接扩大范围:

text
出现未授权的数据读取或外部写入。
无法还原任务使用的 Agent、模型和资料版本。
失败后没有人工接管或停止路径。
关键字段错误会直接进入下游系统。
重复执行会造成重复订单、重复通知或重复扣费。

观察项

这些指标可以用于比较版本,但需要结合任务风险:

text
任务完成比例
结构检查通过比例
关键事实遗漏数
人工修改比例
平均和 P95 延迟
每任务调用次数与成本
转人工比例

数字阈值应该来自基线或业务承受能力。比如“人工修改比例低于 30%”可以作为一个试点假设,但它不是行业标准,更不能脱离任务类型单独解释。

7. 回归测试要测什么变化

Agent 的回归不只是检查代码有没有挂。模型、Prompt、Skill、知识资料、工具权限和路由变化,都可能改变结果。

每次变更至少标记变化层:

变化层常见影响必须重跑的任务
Prompt语气、步骤和拒答边界正常、信息不足、越权
工具参数、返回结构和权限工具成功、失败、重复执行
知识资料新版本、删除和冲突引用、过期、冲突资料
模型或路由格式、延迟和工具调用全部硬性任务
Agent 代码状态、重试和写回全部任务,尤其是有副作用任务

可以先建立一份小型黄金集:十到三十个固定任务,包含正常和异常样例。每次提交自动或手动运行,并把本次结果与基线结果对比。黄金集不需要假装覆盖所有场景,它的作用是及时发现已知能力退化。

一个回归记录可以这样写:

text
变更:替换检索工具,增加超时重试
基线:agent@a13f2d,model-x,知识快照 2026-08-01
当前:agent@b91c8e,model-x,知识快照 2026-08-01
新增失败:工具超时任务中重复调用 1 次
改善:信息不足任务不再生成无来源结论
结论:保留改动,暂停外部写入,先修复幂等性

8. 失败分类比总分更有用

一次失败至少要归到一个可行动类别:

类别现象可能改动
目标误解做了相邻但错误的工作改任务卡和验收文字
上下文缺失找不到必要资料补输入、索引或来源
工具问题参数错、超时或返回异常改工具契约和错误处理
推理或实现错误资料足够但结果不对补样例、检查器或人工节点
权限边界问题尝试访问禁止资源收紧权限和审批
环境问题依赖、端口、网络不稳定修复环境后重新运行
验收问题没有办法判断结果把主观标准改成例子或测试

“模型能力不足”不应该成为默认分类。只有排除任务定义、输入、工具、权限和环境问题后,才有资格把问题归因于模型或 Agent 策略。

9. 人工评审怎样减少主观波动

人工评审不等于凭感觉打分。给评审人一张短表,要求逐项给出证据:

text
事实是否能回到输入或来源?  是 / 否 / 不确定
是否遗漏关键字段?          是 / 否 / 不确定
是否超出授权范围?          是 / 否
是否遵守输出格式?          是 / 否
是否需要修改才能交付?      不需要 / 少量 / 大量 / 无法交付
问题属于哪类失败?          目标 / 上下文 / 工具 / 实现 / 权限 / 环境
评审备注:

高风险任务建议由两个人独立评审一部分样本,先比较分歧,再修改评分说明。不要在看完模型结果后临时更换标准,否则“评估”会变成给既有结论找理由。

10. 一个可以直接执行的最小流程

text
1. 选定一个单一业务任务,写出允许和禁止动作。
2. 准备 10 个固定样例:正常、边界、无答案、越权、工具失败和重复执行。
3. 冻结 Agent、模型、资料、工具和权限版本。
4. 先运行结构检查器,再做行为日志检查和人工业务评审。
5. 记录所有失败,不以重试后的最好结果替代原始结果。
6. 对失败进行分类,只选择一个最可能的修复层。
7. 修改后重跑原样例,并增加一个针对新问题的样例。
8. 检查阻断项,决定灰度、人工模式、重做或暂停。

这套流程可以从本地目录和表格开始。任务数量、日志规模和自动化程度,应该随着风险和调用量增长,而不是一开始就建设一个无法维护的评估平台。

11. 发布前检查清单

text
[ ] 上线决策和停止条件已经写清楚。
[ ] 任务卡包含输入、范围、允许动作和禁止动作。
[ ] 任务集覆盖正常、边界、无答案、越权、工具失败和重复执行。
[ ] Agent、模型、Prompt、Skill、知识和工具版本可追踪。
[ ] 结构、行为和业务三层验收已经分开。
[ ] 失败、重试、人工接管和回滚都有记录。
[ ] 硬性阻断项没有被平均分掩盖。
[ ] 回归测试从同一输入和基线开始。
[ ] 人工评审标准包含例子和证据要求。
[ ] 结论写明测试条件、样本范围和未验证假设。

12. 结论与限制

Agent 上线验收的核心,不是证明它“足够聪明”,而是证明它在一个明确范围内能够被观察、被复核、被停止和被恢复。

任务集解决“测什么”,版本冻结解决“在什么条件下测”,结构与行为检查解决“结果是否合格”,人工评审解决“业务上是否真的可用”,回归测试解决“下一次改动有没有让已知能力退化”。这几层缺一层,最后的通过结论都可能过早。

本文给出的任务卡、示例阈值和检查器是作者整理的工程模板,不是任何平台的官方验收标准。不同任务需要重新定义关键字段、风险等级和人工门槛;涉及支付、合同、医疗、人事、客户承诺或自动外部写入时,应增加专业审查和更严格的审批与演练。

资料与说明

标签:Agent验收上线评估任务集回归测试质量保障

推荐阅读

探索更多前沿洞察与行业干货。