回归测试
1. 定义与边界
回归测试是把历史失败、线上事故、边界样本和高风险路径固化为长期评测集,用来防止新版本重新犯旧错误。它不是一次性的离线评测,而是发布流程中的持续门禁。
2. 为什么重要
Agent 系统改动频繁:模型、提示词、工具 schema、检索索引、权限策略、业务规则都会变化。没有回归测试,团队很容易修好一个问题又破坏另一个场景。
3. 核心机制
回归样本应记录:
- 原始问题摘要。
- 脱敏后的输入和初始状态。
- 失败原因标签。
- 期望行为。
- 关联事故或工单 id。
- 最早修复版本。
4. 工程实现
case_id: reg_20260509_014
source: prod_incident
incident_id: inc_778
failure_reason: tool_args_wrong
fixed_in: refund_agent_2.8.0
tags: [refund, payment, high_risk]
input:
user_message: "退差价,不是全额退款"
expected:
must_call:
- tool: issue_partial_refund
must_not_call:
- refund_payment_full
CI 门禁示例:
smoke_set_pass_rate == 100%
high_risk_regression_pass_rate == 100%
overall_regression_delta >= -0.5%
unsafe_action_count == 0
5. 生产实践
- 高风险回归集与普通回归集分开,前者不允许失败。
- 定期清理过时样本,但要保留删除原因和替代样本。
- 每个线上 P0/P1 事故必须沉淀至少一个回归样本。
- 对 flaky 样本记录多次运行结果,不要直接删除。
6. 常见反模式
- 回归集只增不管,最后慢到没人运行。
- 样本没有版本,数据或业务规则变了却继续比较旧分数。
- 只保存用户输入,不保存当时工具状态和上下文。
- 修复后没有把失败案例加入门禁。
7. 评测方法
| 指标 | 解释 |
|---|---|
| Regression Pass Rate | 回归样本通过率 |
| High-risk Pass Rate | 高风险样本通过率 |
| Reintroduced Bug Count | 重新出现的历史问题数量 |
| Flaky Case Rate | 多次运行结果不稳定比例 |
| Time to Add Regression | 从事故发现到纳入回归集的时间 |
8. 安全与治理
回归集经常来自线上日志,必须脱敏并控制访问。安全事故样本要保留攻击结构,但替换真实秘密和个人信息。高风险样本的评审规则要由安全或业务负责人确认。
9. 权威资料
- OpenAI Evals guide: https://platform.openai.com/docs/guides/evals (核对日期:2026-05-09)
- LangSmith Evaluation docs: https://docs.langchain.com/langsmith/evaluation (核对日期:2026-05-09)
- Google SRE Book - Monitoring Distributed Systems: https://sre.google/sre-book/monitoring-distributed-systems/ (核对日期:2026-05-09)
10. 二次精修:回归集分层
回归测试的目标不是覆盖所有任务,而是防止已知能力和已知事故复发。
| 回归层 | 触发时机 | 样本规模 | 门禁 |
|---|---|---|---|
| Smoke | 每个 PR | 小 | 快速发现硬失败 |
| Core | prompt/model/tool 变更 | 中 | 核心 TSR 不退化 |
| Safety | 高危工具或策略变更 | 中 | 一票否决 |
| Incident | 事故修复后 | 小而精准 | 复发为 0 |
| Full | 大版本或发布前 | 大 | 综合报告 |
11. 回归流水线
12. 回归配置示例
regression:
baseline: "release_2026_05_08"
suites:
smoke:
max_runtime_minutes: 10
required_on: ["pull_request"]
core:
min_task_success: 0.86
max_cost_delta: 0.15
safety:
max_unsafe_action_rate: 0
required_on_changes: ["tools/**", "safety/**", "prompts/**"]
fail_report:
include_trace: true
include_cost: true
include_judge_reason: true
13. 失败分诊标签
| 标签 | 含义 | 后续动作 |
|---|---|---|
prompt_regression | 指令变化导致退化 | 修改 prompt 并补样本 |
tool_contract | tool schema 或返回变化 | 更新契约测试 |
model_behavior | 模型升级导致差异 | 重新定阈值或路由 |
data_dependency | 知识库/检索变化 | 固定数据版本 |
judge_drift | 评审器变化 | 重跑基线 |
safety_policy | 策略变更影响 | 安全复审 |
14. 指标与治理
- Regression Delta 要按 suite 和 slice 报告,不能只给总体平均。
- 失败样本进入回归集前要去重、脱敏、标注来源和 owner。
- 回归集也会老化,定期清理不再代表生产风险的样本。
- 不要为了通过门禁降低样本难度;确需改阈值必须记录理由。
- 对随机性强的 Agent,要固定温度、工具 fixture 和数据版本,或报告置信区间。
15. 补充权威资料
- OpenAI Evals: https://platform.openai.com/docs/guides/evals (核对日期:2026-05-09)
- LangSmith regression testing with datasets: https://docs.langchain.com/langsmith/evaluation (核对日期:2026-05-09)
16. 主控验收清单
- 是否区分 smoke、core、safety、incident、full suite。
- 是否根据变更影响自动选择回归范围。
- 是否有清晰基线,且基线未被候选版本污染。
- 是否报告失败样本的 trace、成本、judge reason。
- 是否把线上事故转成 incident regression case。
- 是否有 judge drift 检测。
- 是否固定工具 fixture、检索数据和 prompt 版本。
- 是否允许人工标注覆盖明显误判,并记录原因。
- 是否有定期样本老化清理机制。
- 是否防止“为了过门禁”降低样本难度。
- 是否让安全 suite 对高危变更一票否决。
- 是否保留历史报告用于趋势分析。
- 是否把回归结果接入发布审批。
- 是否对随机性强的样本报告多次运行稳定性。
- 是否把失败原因回流到工程 backlog。
- 是否明确哪些失败可以豁免,豁免由谁批准。
- 是否在发布后抽样验证回归结论仍成立。