开发规范(Development Standards)
Agent 应用开发中代码、Prompt、版本号与文档的标准化规范体系
每次变更后用已验证的测试集重新跑一遍,确保没有破坏已有功能。
内容摘要
回归测试(Regression Testing)是一种质量保障手段:每次对 Agent 做了任何改动(改 Prompt、换模型、调参数),都拿出一批之前验证过能正确处理的测试用例重新跑一遍,看看新的改动有没有把原来好用的功能搞坏。
回归测试(Regression Testing)是一种质量保障手段:每次对 Agent 做了任何改动(改 Prompt、换模型、调参数),都拿出一批之前验证过能正确处理的测试用例重新跑一遍,看看新的改动有没有把原来好用的功能搞坏。
传统软件的回归测试已经很成熟,但 AI Agent 的回归测试面临三个独有的难题。第一,LLM 的输出是非确定性的——同样的输入不会每次给出一模一样的答案。第二,Prompt 的修改会产生隐性副作用——改进了 A 功能的 Prompt 可能悄悄削弱了 B 功能。第三,模型供应商会静默更新 API——你的代码一行没改,但模型行为已经变了。这三个问题叠在一起,导致 Agent 系统特别容易出现"改着改着就坏了"的情况。
回归测试的核心思路是:不要求每次输出完全一样,而是维护一个"黄金数据集"(Golden Dataset),里面存着历史上验证过的、被信任的测试用例。每次变更后,用新版本在这些用例上跑,和旧版本的表现做对比。如果某些指标明显下滑,就拦住,不让发布。
| 结构 | 作用 | 说明 |
|---|---|---|
| 黄金数据集 | 充当"标准答案库" | 经人工审核的高质量测试用例集合,是回归测试的基石 |
| 基准线 | 充当"对标参考" | 当前线上版本在黄金数据集上的性能指标快照 |
| 评估指标 | 量化"好坏" | 准确率、相关性、忠实度等多维度评分,用于判断是否回归 |
| 质量门禁 | 充当"发布阀门" | 设定阈值,指标下滑超过阈值就拦住,防止问题流入生产 |
黄金数据集不是随便采样的测试数据,而是经过人工审核、业务认可、定期维护的"标准答案库"。每条用例包含四个要素:输入(用户问题或指令)、期望行为(参考答案或行为描述)、评判标准(怎么判定 Agent 的输出达标)、元数据(创建时间、版本号、标签)。
一个实用的分层策略:核心功能测试占 60%(Agent 的主要职责场景),边界条件测试占 20%(难题、歧义、特殊输入),回归防护测试占 20%(曾经出过 bug 的场景)。
数据来源包括:用户反馈中的高频问题、客服团队积累的问法集、质量审计中发现的失败案例、新功能发布时的验收测试集。规模上,200-500 条高质量用例足以覆盖大多数场景。
基准线是一份性能指标的快照。用当前线上版本在黄金数据集上跑一遍,把各维度的指标(准确率、延迟、成本等)记录下来。这份快照就是后续所有变更的对标参考。
基准线不是一成不变的。当新版本确认表现更优并安全上线后,基准线就会更新为新版本的指标。通过保留历史基准线,可以追踪系统质量的长期趋势。
AI Agent 的回归测试不能用传统的"精确匹配"来判断对错,需要更灵活的评估方式:
质量门禁是发布流程中的一道关卡。它的核心是两类阈值:
只有同时满足绝对阈值和相对阈值,变更才能通过门禁进入发布。这个机制集成在 CI/CD 流水线中,代码合并或模型更新时自动触发。
回归测试的工作机制分为五步:
这套机制的关键在于"对比"而非"绝对判断"——不是要求每次输出完全正确,而是确保新版本不比旧版本差。
图中的核心流转点在"质量门禁"节点。它是整条流程的分叉点:通过则进入正向循环(发布 -> 更新基准线 -> 下一轮迭代),不通过则进入修复循环(分析原因 -> 重新调整 -> 再次评估)。这两个循环保证了系统质量只会向上走,不会悄悄退化。
下面这张时序图展示了回归测试在 CI/CD 流水线中的实际触发过程:
以下是一个最小化的回归测试框架示例,展示核心机制:构建测试集、运行评估、对比基准线。
# 基于 deepeval==2.5.1 验证(截至 2026-03)
from dataclasses import dataclass, field
from typing import List, Dict
@dataclass
class GoldenCase:
"""黄金数据集中的一条测试用例"""
input: str # 用户输入
expected: str # 期望行为描述
tags: List[str] = field(default_factory=list) # 分类标签
@dataclass
class BaselineSnapshot:
"""基准线快照:记录某个版本的性能指标"""
version: str
scores: Dict[str, float] # {"accuracy": 0.85, "relevancy": 0.90, ...}
def run_regression_test(
golden_dataset: List[GoldenCase],
baseline: BaselineSnapshot,
new_scores: Dict[str, float],
threshold: float = 0.05
) -> Dict:
"""
回归测试核心逻辑:对比新版本指标与基准线
参数:
golden_dataset: 黄金数据集
baseline: 历史基准线
new_scores: 新版本在黄金数据集上的评分结果
threshold: 允许的最大下降幅度(默认 5%)
返回:
包含通过/失败判定和详细对比的字典
"""
regressions = []
for metric, old_score in baseline.scores.items():
new_score = new_scores.get(metric, 0)
drop = old_score - new_score
if drop > threshold:
regressions.append({
"metric": metric,
"baseline": old_score,
"current": new_score,
"drop": round(drop, 4)
})
passed = len(regressions) == 0
return {
"passed": passed,
"baseline_version": baseline.version,
"regressions": regressions,
"verdict": "PASS - 可以发布" if passed else "FAIL - 存在回归,需要修复"
}
# --- 使用示例 ---
golden_dataset = [
GoldenCase("解释什么是 RAG", "应涵盖检索、增强、生成三个环节", ["核心功能"]),
GoldenCase("RAG 和微调的区别", "应说明各自适用场景和成本差异", ["概念辨析"]),
GoldenCase("", "应返回友好的错误提示", ["边界场景"]),
]
baseline = BaselineSnapshot(version="v1.2", scores={"accuracy": 0.85, "relevancy": 0.90})
new_scores = {"accuracy": 0.83, "relevancy": 0.91} # 准确率下降 2%,相关性提升 1%
result = run_regression_test(golden_dataset, baseline, new_scores, threshold=0.05)
print(result)
# {'passed': True, 'baseline_version': 'v1.2', 'regressions': [], 'verdict': 'PASS - 可以发布'}
# 准确率下降 2% < 阈值 5%,所以通过
代码展示了回归测试的核心判断逻辑:逐项对比新旧指标,任一指标下滑超过阈值就判定失败。实际生产中,new_scores 由评估框架(如 DeepEval、Evidently)在黄金数据集上自动计算得出,每条用例会多次运行取平均以消除随机性。
| 概念 | 与回归测试的区别 | 更适合关注的重点 |
|---|---|---|
| A/B 测试 | A/B 测试是在线上真实流量中对比两个版本的表现;回归测试是在离线的黄金数据集上对比 | 线上流量分配、用户行为指标、业务转化率 |
| 基准评测(Benchmark) | Benchmark 用公开标准数据集评估模型的通用能力;回归测试用业务自有数据集检测变更引入的退化 | 模型间横向对比、通用能力排名 |
| 冒烟测试(Smoke Testing) | 冒烟测试只跑最核心的少量用例,快速判断系统是否"能用";回归测试跑完整测试集,系统性地检测退化 | 部署后的快速健康检查 |
| 持续监控(Monitoring) | 监控在生产环境中持续追踪指标变化;回归测试在发布前的离线阶段拦截问题 | 线上漂移检测、实时告警 |
核心区别:
| 常见误区 | 正确理解 |
|---|---|
| 黄金数据集越大越好,先堆到几千条 | 质量比数量重要。200-500 条高质量、有代表性的用例比 5000 条质量参差不齐的样本更有价值。每条都要经过人工审核 |
| 通过回归测试就能放心发布 | 回归测试只能检测"已知场景的退化",是必要条件但不充分。还需要冒烟测试、安全审查、线上灰度验证等环节配合 |
| 回归测试只在发布前跑一次 | 即使已经发布上线,也应定期(如每周)在生产环境跑回归测试,检测模型供应商的静默更新是否引入了漂移 |
| 黄金数据集建好后就不用动了 | 黄金数据集需要持续维护:业务发展带来的新场景要加入,过时的场景要移出,模型能力提升后评分标准也要调整 |
| 用精确文本匹配来判断 LLM 输出的对错 | LLM 的输出天然有措辞差异,应该用语义相似度、LLM-as-Judge、契约检查等灵活的评估方式,而不是逐字匹配 |
参考答案:
功能测试验证"某个功能是否能正确工作",关注的是单个功能点的正确性。回归测试验证"修改之后,之前能正确工作的功能是否还能正确工作",关注的是变更引入的退化。
Agent 开发特别需要回归测试的原因有三个:一是 LLM 输出非确定性,同一个改动可能在不同场景上产生不同影响;二是 Prompt 修改有隐性副作用,改进一处可能悄悄削弱另一处;三是模型供应商会静默更新 API,即使代码没改,行为也可能变化。这三点导致 Agent 系统比传统软件更容易出现"改着改着就坏了"的情况。
参考答案:
波动大的可能原因:1)测试用例本身定义模糊,"期望行为"不够明确,导致不同输出都可能被认为正确或错误;2)LLM-as-Judge 的评分 Prompt 不够精确,评判标准有歧义;3)被测 Agent 的 temperature 设置过高,输出变化幅度大;4)测试用例恰好处于模型能力的边界区域。
处理方式:首先检查测试用例的评判标准是否足够清晰,不清晰就改写。其次检查 Judge Prompt 是否有歧义,必要时改为更具体的契约检查(如"输出必须包含 X、不能包含 Y")。还可以将 temperature 降低或固定 seed 以减少随机性。如果用例本身确实处于模型能力边界,考虑将其标记为"不稳定用例"单独追踪,不纳入核心门禁指标。
参考答案:
测试集构建:从现有客服对话日志中按场景分层抽样——产品咨询(40%)、投诉处理(20%)、退款流程(20%)、边界场景(10%,如脏话、无关问题)、历史 bug 回归(10%),共 300-500 条。每条标注期望行为和评判标准。
评估维度:1)事实准确率——回答是否包含正确的产品/政策信息;2)意图识别准确率——是否正确理解用户诉求;3)安全合规——是否遵守公司话术规范,不承诺超权限内容;4)用户满意度——用 LLM-as-Judge 模拟用户评分;5)响应延迟和成本。
阈值设定:事实准确率绝对阈值 >= 92%,相对下降不超过 3%;意图识别准确率下降不超过 2%;安全合规零容忍(不允许任何退化);满意度下降不超过 5%。
发布决策流程:先在全量黄金数据集上跑回归测试。核心指标全部通过后,进入灰度发布(5% 流量切到新模型),线上观察 3 天。灰度期间持续监控指标,无异常则逐步放量至 100%。如果回归测试阶段有指标未通过,分析失败用例,针对性调整 Prompt 后重新测试。
优先展示同分类且标签更接近的内容,方便继续串联学习。
Agent 应用开发中代码、Prompt、版本号与文档的标准化规范体系
从代码提交到生产部署的全流程自动化体系,覆盖传统 CI/CD 与 Agent 特有的 Prompt/模型评估流水线
Agent 项目的持续集成流水线,在传统 CI 基础上增加 LLM 输出评估环节,保障非确定性系统的质量。