06
评估体系 Evals
模块 06 · 评估体系 Evals
本章目标:客户质疑"你这个 AI 到底准不准、稳不稳、值不值"时,你能用数据回答,而不只是说"我们调过了"。Evals = 构建评估集 + 自动/人工评测 + 量化指标 + A/B 验证。这是把 AI 项目从"demo"推向"生产交付"的分水岭。
6.1 为什么 FDE 必须会做评估
没有评估,你会陷入三个死循环:
- 客户说"不准",你却不知道是哪不准、差多少,只能瞎调。
- 你改了一个 Prompt,不知道整体是变好还是变差(只顾眼前那个样例)。
- 上线拍脑袋,出问题无据可查。
有了一套评估:你能说"我们这个合同审单,在 200 条真实样例上准确率 96%,超额我们的 95% 目标;其中 3 条误判全部来自扫描 PDF",客户一听就服气。
6.2 评估集(Dataset)怎么建
6.2.1 三大来源(从靠谱到省事)
| 来源 | 优点 | 注意 |
|---|---|---|
| 真实生产数据 | 最贴合客户 | 要脱敏(模块 07),别泄露隐私 |
| 业务专家标注 | 质量高、有"标准答案" | 贵、慢,请客户业务专家参与 |
| 合成/自动生成 | 快、量大 | 可能不符合真实分布,只作补充 |
6.2.2 一份评估样例长这样
{
"id": "case-001",
"query": "这笔合同违约金比例是否符合公司标准?",
"context": "合同第5条:违约金XX?公司标准文件...",
"expected": "违约金比例超出标准,存在合规风险,建议人工复核",
"tags": ["合规", "违约金", "扫描PDF"]
}
好评估集的标准:覆盖常规 + 边界 + 错误输入;每类问题够多(几十条起);答案由懂业务的人把关。
6.3 评测怎么做:自动评测 + 人工评测
6.3.1 自动评测(快,先跑全量)
- 规则/字符串匹配:回答是否为指定 JSON、是否含关键字段、是否引用来源。
- LLM-as-Judge(用另一个模型打分):适合主观的"忠实度、相关性、含金量"。
def judge_faithfulness(generated, context):
# 用更稳的模型判断: 生成内容是否都能从 context 中找到依据
prompt = (
"判断回答是否完全基于给定资料(不能编造资料外信息)。只输出 1(忠实)/0(不忠实)。\n"
f"资料:{context}\n回答:{generated}"
)
... # 调用评审模型,解析 0/1
6.3.2 人工评测(贵,抽样精评)
- 谁来看:客户业务专家 + FDE 一起看,尤其重要业务(合同、法务、医疗)。
- 看什么:准确率之外,看语气、逻辑、可解释性、行业习惯——机器打分看不全。
- 做法:抽样(如每类 10 条),人打"对/错/存疑",FDE 汇总成指标。
推荐闭环:自动评测全量跑 → 异常/低分样本 → 人工精评 → 汇总成报告给客户。
6.4 评估维度(指标背下来)
FDE 交付要同时覆盖"技术维度"和"业务维度":
| 类别 | 指标 | 人话 |
|---|---|---|
| 准确性 | 准确率、精确率、召回率、F1 | 对几个 |
| 幻觉 | 忠实度、幻觉率 | 有没有编造资料外内容 |
| 召回 | Recall@K、命中率 | RAG 该查到的查到了没 |
| 合规 | 合规率、越权率 | 有没有碰不该碰的/说不该说的 |
| 业务 | 业务指标(如审单耗时、通过率) | 客户最终关心的数字 |
| 稳定性 | 相同输入多次答一致吗 | 会不会这次过、下次判拒 |
关键提醒:客户最终看的是业务指标。技术指标(准确率)要通过业务指标说话——"准确率 96% = 每月少 800 次人工复核、省 X 小时"。
补一段:精确率 vs 召回率,以及 F1 为什么用"调和平均"
先说清混淆矩阵的四格(以"审单找风险条款"为例):
TP 真阳:真是风险、也判对了。
FP 假阳:不是风险、却误报成风险(浪费人工复核)。
FN 假阴:真是风险、却漏判了(最危险)。
TN 真阴:不是风险、也判对了。
精确率 Precision = TP / (TP + FP):报出来的"风险"里,有多少是真的。假阳多 → 精确率低。
召回率 Recall = TP / (TP + FN):真正的风险里,被揪出来多少。假阴多 → 召回率低。
这俩常打架:想不漏(高召回)就得报得宽、宁错杀(精确率掉);想别误报(高精确)就可能漏掉(召回率掉)。F1 = 2·P·R / (P+R) 用"调和平均"而不是算术平均,原因是它对"短腿"更敏感:只要 P 或 R 里有一个特别低,F1 就被狠狠拉低。比如 P=0.9、R=0.1,算术平均是 0.5 的"假及格",调和平均只有约 0.18——逼你两条腿都得硬。
小示例(按混淆矩阵换算,纯手算思路):
TP, FP, FN, TN = 80, 10, 20, 890 # 1000 个条款审出来的四格
precision = TP / (TP + FP) # 80 / 90 ≈ 0.89
recall = TP / (TP + FN) # 80 / 100 = 0.80
f1 = 2 * precision * recall / (precision + recall)
print(round(precision, 2), round(recall, 2), round(f1, 2)) # 0.89 0.8 0.84
完整的混淆矩阵、类别不平衡陷阱(99 正常 + 1 欺诈时准确率会骗人)和 sklearn 一键算 F1,去 Python 机器学习与深度学习 页补。算法与 AI 讲模型评估与调优的整体思路,也值得串着看。
6.5 用指标体系驱动"调优→回归"流程
建评估集 → 跑基线评估 → 优化(改Prompt/调RAG/换模型)
→ 全量回归 → 对比前后指标 → 通过才上生产
- 回归:每次改动(哪怕只改一句话)都重跑评估集,防止"改了这里、崩了那里"。这是 FDE 的肌肉记忆。
- 只调优不动评估集:评估集是"标准答案",不能为了好看偷偷改标准(那是自欺欺人)。
6.6 A/B 实验:用数据选方案
客户换个模型、换个 Prompt 策略时,别拍脑袋,用 A/B:
- 分流:把用户请求按比例分到 A(旧方案)/B(新方案)。
- 看两组业务指标:准确率、满意度、耗时、成本。
- 下结论:B 显著更好才切;数据不足就再跑样本量。
# 简单分流示意
def split(user_id):
return "B" if (hash(user_id) % 100) < 20 else "A" # 20% 到 B
A/B 的意义:用"同一份用户流量"对比,能排除时间差异,结论可信。别为了炫技做 A/B,客户真要的是"上线更稳更省"。
6.7 把评估结果"翻译"给客户听(软技能结合)
客户不在意你用了多少 token,在意结果和风险。现场汇报可以这样给:
- "我们建了 200 条真实合同样例的评估集(已脱敏)。"
- "当前审单准确率 96%,常见误判集中在扫描 PDF 识别,我们已把这类单独标注。"
- "不改不失衡:全程忠实度 100%,没有编造资料外结论。人工抽查 20 条 100% 达标。"
- "上线后我们继续监控业务指标 + 每周回归 + 重训/调优同步跟进。"
6.8 模块练习
- 每个收集 20 条"真实/边界/错误输入"三类问题,建一个 JSON 评估集文件。
- 实现一个规则自动评测(校验是否输出合法 JSON + 关键字段),跑通你的评估集。
- 实现一个 LLM-as-Judge(忠实度),对比 5 条正常 + 5 条故意编造的,验证评审判别力。
- 定义一套 6 维度指标表,给自己上一个 RAG 项目打个分(含业务指标换算)。
- 设计一次 A/B:新旧两版 Prompt 各 100 请求,写清楚怎么分流、看什么指标、怎么下结论。
6.9 本章面试题
- "你怎么证明你的 AI 系统是可靠的?" → 答:三步——建覆盖常规/边界/错误输入的评估集 → 自动+人工双重评测 → 用准确率/忠实度/召回/合规/业务指标量化,并持续回归 + A/B。用数据说话,而非"我们调过"。
- "LLM-as-Judge 可靠吗?有什么坑?" → 答:适合主观维度且速度快,但可能偏袒更长/更自信的输出、受评分辞令干扰;要用稳定的评审模型、给清晰判分标准、抽样人工校准,别只依赖它。
- "改了个 Prompt,你如何确认整体没变差?" → 答:改前跑基线评估集,改后全量跑同一个评估集,逐维度对比;只调优不动评估集。若出现回退,回滚或继续调。
- "技术指标好但客户不满意,可能为什么?" → 答:很可能技术指标的"准"没转成客户在意的业务结果(如审单通过率、出错影响、耗时、可解释性);要回到业务指标去对齐,而不是埋头堆准确率。
- "评估集会不会做成测好不做好?怎么防止?" → 答:会,叫"过拟合评估集"。要定期用生产新数据扩充、业务专家复核标准答案、分层抽样、人工抽样查漏,避免只针对老样例调优。
6.10 小结
- Evals = 评估集 + 自动/人工评测 + 指标 + A/B,是"别只说调过,上数据"的手段。
- 业务指标 > 技术指标:客户要的是订单提速、省钱、少出错,不是准确率百分比本身。
- 只调优不动评估集;每次改动全量回归。
- A/B 用同一份流量对比方案,结论可信。
- 评估结果要能翻译成客户听得懂的结论和风险。下一章:安全、隐私与合规——金融/政务客户的门槛。
延伸阅读 · 去本站教学页补齐基础
- 算法与 AI——模型评估与调优的整体思路,理解评估为什么要分层、分维度。
- Python 机器学习与深度学习——准确率、精确率、召回率、F1、混淆矩阵的完整定义与 sklearn 实现。