任何 eval 系统都在回答三个问题:评什么 · 拿什么对照 · 怎么打分
历史上的五种范式(沉淀下来的真共识)
| 范式 | 出现年代 | 原理 | 现在位置 |
|---|---|---|---|
| 1. 基于参照的客观指标 | NMT/摘要时代 | BLEU/ROUGE/F1:n-gram 或精确匹配 | 浅层任务还在用,开放问答弃用 |
| 2. 基于参照的语义指标 | 2019 | BERTScore:embedding 余弦 | RAG/QA 还用,但被 judge 蚕食 |
| 3. 人类标注 | 永远 | Likert / pairwise 打分 | 仍是真金标 |
| 4. LLM-as-Judge | 2023+ | 强模型代替人类打分 | 事实标准(MT-Bench / Chatbot Arena / Constitutional AI 验证过) |
| 5. 轨迹评估 | 2024+ | 看中间步骤(tool calls、reasoning trace) | agent 评估必备 |
agent 评估必备
LLM-judge 校准的标准做法:用小样本人类标注校准 judge,确保 judge 和人类一致率 ≥ 0.8(Cohen's kappa)。这是 OpenAI / Anthropic / Google 在论文里都报的标准动作,没这一步 judge 的分数没人会信。
Pairwise 偏差:position bias(先看到的更易选)、verbosity bias(更长的更易选)、self-preference(judge 偏好自己家模型)。修法:A/B 互换 + 至少两次结论一致才计。这不是 EvalView 的发明,是 LMSYS Arena 2023 的标准做法。
标准评估的 6 步 SOP
- 定边界 ------ 评 prompt / LLM call / agent / agent+skill / pipeline 中的哪一层
- 建数据集 ------ (input, optional_reference, metadata),N ≥ 50 才有统计意义
- 定 metrics ------ 每个 metric 都是 (run_output, reference?, metadata) -> score
- 跑评估 ------ 每 case 跑 K ≥ 3 次处理非确定性,case-level 汇总
- 校准 ------ LLM-judge 必须人工对齐
- 闭环 ------ CI 拦截退化、生产采样回灌
市面对标(2026 最值得参考的几个)
| 项目 | Stars 量级 | 模型 | 与本项目匹配度 | 关键亮点 |
|---|---|---|---|---|
| promptfoo | 21k | YAML 配置 + assertion 列表 | ⚠️ Prompt 中心,不是 agent trajectory | 模板成熟,judge 类型最齐 |
| DeepEval | 最热(Apache) | pytest 风格 + 14 metrics | ⚠️ Python 单元测试导向 | G-Eval 多准则 rubric |
| LangChain agentevals | 小(Apache) | trajectory match | ✅ 概念对路 | strict/unordered/subset/superset 4 种匹配模式 |
| awslabs/agent-evaluation | 中 | evaluator-agent 模式 | ✅✅ 和我提的 judge-as-agent 完全一致 | AWS 出品,思路验证 |
| EvalView | 新(Apache 2.0) | 快照回归 | ✅✅✅ 几乎正中靶心 | snapshot/check/diff 三段式,4 层评分 + 多跑聚类 |
| LangSmith | 商业平台 | 全家桶 | ❌ 闭源 + 绑 LangChain runtime | pairwise / 数据集托管 |
EvalView 细节(最值得抄的)
数据流就是 snapshot → check → diff。test case YAML:
yaml
name: refund-needs-order-number
turns:
- query: "I want a refund"
expected:
output: { contains: ["order number"] }
tools: ["lookup_order"]
forbidden_tools: ["delete_order"]
四层评分组合成 composite:
- tool calls & sequence(确定性,免费)
- code-based check(regex/json schema/contains,免费)
- embedding similarity(~$0.00004/test)
- LLM-as-judge(~$0.01/test)
最关键:evalview check --statistical 10 --auto-variant ------ 跑 N 次,自动把 tool-call 路径聚类,把不同但有效的轨迹都当 golden。这就是我设计里"洞 2"(LLM 非确定性)的标准答案,比 K-sample 均值更聪明。