如何设计一套 AI 评测体系?告别「体感上线」,拥抱 Golden Set 与 LLM-as-Judge 前言“我改了下 Prompt感觉回答变好了。”“换了新模型好像没之前准”——这是很多 AI 应用团队上线前的真实对话。问题不在于人靠不靠谱而在于没有量化基线所有判断都是体感。本文带你搭建一套可复用的 AI 评测体系用 Golden Set黄金测试集把变好变坏变成数字用 LLM-as-Judge 做自动评委并规避它的三大偏差讲清 RAG 与 Agent 的分段评测指标最后把评测接进 CI实现改一次跑一次的回归护栏。附可运行 Python 评测脚本。背景或问题为什么体感上线迟早翻车样本偏差你随手测的 3 个例子恰好都是简单题上线后真实分布里全是难例。无基线没有历史分数无法判断这次改动是变好还是变坏只能靠主观。回归无感知上周 90 分的效果被这周一个 Prompt 改动悄悄拖到 60 分没人发现。公开 Benchmark 不顶用MMLU、GSM8K 测的是通用能力和你业务里的工单分类准不准几乎无关。评测体系要解决的就是把上述四件事变成可重复、可量化、可回归的流程。核心思路一套最小可用的评测体系分四层第 1 层 Golden Set从真实流量里抽样的标准答案库是评测的尺子。第 2 层 指标检索层看召回生成层看忠实度与正确性Agent 看任务完成率。第 3 层 评委人工太慢用 LLM-as-Judge 自动打分但要治好它的偏见。第 4 层 CI 门禁评测脚本化提交即跑分数低于阈值就拦截。整体链路如下实现步骤1. 构建 Golden Set别用脑子编用真实流量从真实用户问题里抽样标注参考答案存成golden_set.jsonl{id:q1,question:如何重置 MySQL root 密码,reference:用 --skip-grant-tables 启动后执行 ALTER USER 重置,category:db}{id:q2,question:Python 怎么读大文件不爆内存,reference:用迭代器逐行读或分块读不要一次性 read(),category:python}{id:q3,question:RAG 检索不到错误码 E1027 怎么办,reference:纯向量检索不懂精确匹配应加 BM25 混合检索,category:rag}构建要点真实抽样优先从线上日志/工单里取而不是自己脑补用户可能会问。难例挖掘专门收一批之前答错的作为回归重点。版本化Golden Set 会随业务演化用 git 管理改动留痕。防泄漏Golden Set 绝不能进训练集或系统 Prompt 的 few-shot否则分数虚高。2. 写最小评测脚本importjsonfromopenaiimportOpenAI clientOpenAI()# 直连或走你的模型网关defload_golden(path):withopen(path)asf:return[json.loads(l)forlinfifl.strip()]defyour_system(question:str)-str:你的被测系统RAG / Agent / 普通对话返回最终回答。 第一遍可先保留占位字符串验证评测链路能跑通、能看到非满分结果再替换成真实调用。# TODO: 替换成真实系统调用RAG / Agent / 对话接口returnf[占位回答] 这是被测系统对「{question}」的默认返回请替换。JUDGE_SYS你是严格的 AI 评测评委只输出 JSON不要多余文字。JUDGE_USR根据【参考回答】判断【待评测回答】。 - correct: 答案是否正确true/false - faithful: 是否含有幻觉/与参考矛盾true/false - reason: 一句话说明 输出 JSON{correct: bool, faithful: bool, reason: str}defllm_as_judge(question,answer,reference):respclient.chat.completions.create(modelgpt-4o,response_format{type:json_object},# 需模型支持 JSON 模式如 gpt-4o / gpt-4o-mini否则评委输出解析会失败messages[{role:system,content:JUDGE_SYS},{role:user,content:f{JUDGE_USR}\n问题{question}\n参考回答{reference}\n待评测回答{answer}},],)returnjson.loads(resp.choices[0].message.content)defmain():casesload_golden(golden_set.jsonl)correctfaithful0forcincases:ansyour_system(c[question])sllm_as_judge(c[question],ans,c[reference])corrects[correct];faithfuls[faithful]print(c[id],s)nlen(cases)print(f正确率{correct/n:.0%}可信率{faithful/n:.0%})if__name____main__:main()3. 治好 LLM-as-Judge 的三大偏差LLM 当评委并不客观三个经典坑位置偏差Position Bias把待评测回答放前面还是后面分数会飘。缓解正反各评一次取一致或固定顺序并报告。冗长偏差Verbosity Bias越长越像认真回答分数偏高。缓解在评委 Prompt 里明确以内容正确性为准不因篇幅给分。自我偏好Self-Preference用 A 模型生成、又用 A 模型评它会偏爱自己的风格。缓解评委模型与被测模型解耦例如被测用业务模型评委用另一个强模型。4. RAG 与 Agent 的分段指标不要只问最终对不对要分层看层级核心指标衡量什么指标掉了去调哪RAG 检索层Recallk、Hit Rate该召回的文档进没进来向量库 / 切块 / 混合检索RAG 生成层Faithfulness、Answer Correctness有没有编造、答案对不对Prompt / 模型Agent 层任务完成率、工具调用正确性、轨迹合理性目标达成没、工具调对没、步骤绕不绕工具定义 / 规划 Prompt一句话对照检索层看召回率生成层看忠实度与答案正确性Agent 看任务完成率与工具调用正确性。分段的意义检索层掉了你去调向量库生成层掉了你去调 Prompt——定位快一倍。5. 接进 CI做回归护栏用 pytest 包一层分数低于阈值就红deftest_rag_quality():casesload_golden(golden_set.jsonl)scores[llm_as_judge(c[question],your_system(c[question]),c[reference])forcincases]correct_ratesum(s[correct]forsinscores)/len(scores)assertcorrect_rate0.8,f正确率{correct_rate:.0%}低于阈值 80%把它挂到 CI每次改 Prompt / 换模型 / 动检索逻辑自动跑一遍分数掉了直接拦在合并前。代码示例上文 1–5 步已给出可直接复制运行的golden_set.jsonl样例、评测脚本、评委偏差处理与 pytest 门禁。实际接入时只需把your_system()换成你的 RAG/Agent 调用。运行结果或效果说明跑通后你会得到一个分数每次改动都有可对比的基线如正确率 82% → 79%。一份定位检索层 / 生成层分数分开问题一眼定位。一道门禁坏改动在合并前就被拦下不再上线才发现问题。一套资产Golden Set 随业务积累越用越准。常见问题与避坑Golden Set 自己编编出来的例子太简单分数虚高、线上翻车。务必来自真实流量。漏标难例只收答得好的当标准等于没评测。难例才是回归价值所在。评委即生成模型自我偏好会让分数失真评委与生成模型务必解耦。只看总分不看分段总分掉了却不知道是检索还是生成的问题定位慢。Golden Set 进了训练/few-shot泄漏会让评测失去意义严格隔离。一次性评测评测不是上线前跑一次就完要常驻 CI 持续回归。总结AI 应用上线不能靠感觉准了。一套最小评测体系 Golden Set尺子 分段指标定位 LLM-as-Judge自动评委治好三大偏差 CI 门禁回归护栏。它把变好变坏变成可对比的数字把质量风险拦在合并前让每次改 Prompt、换模型都有据可依、可回归。