Evaluation / Eval
评估系统化衡量 Agent 表现,而不是"看着像好"。
详解
评估是用量化指标替代「感觉还不错」的系统化验收流程。没有评估,你无法区分一次 Prompt 改动是真的变好了还是碰巧遇到了简单用例。评估分离线和在线两条线:离线评估在上线前用黄金数据集跑通过率,每次改动后对比分数,分数下跌则阻断部署;在线评估在上线后采样真实流量,结合点赞/踩、任务完成率监控实际表现。Agent 常用指标有五类:任务完成率、工具调用正确率、答案忠实度(有无幻觉)、安全性、延迟与成本。核心难点是「正确答案不唯一」——开放式问题无法精确匹配,此时需要用 LLM-as-Judge 或人工标注代替。最小可行流程:整理 20–50 条代表性测试用例,写自动打分脚本,每次改动前跑一遍看分数有没有下跌。
一个类比
就像给餐厅出品做质检:不是厨师自己吃一口觉得「还行」就端出去,而是有一套固定菜单(测试用例),每道菜有标准(打分标准),专门有人盲测打分(评估脚本),分数低于基准就不上桌(回归测试)。一次改动配方后,重新跑一遍质检,看分数有没有跌。
举个例子
# 最小评估流程:一批测试用例 + 自动打分
import anthropic
client = anthropic.Anthropic()
# 黄金数据集:每条记录包含输入和期望输出关键词
test_cases = [
{"input": "Python 列表去重最简洁的写法?", "expected_keywords": ["set", "list"]},
{"input": "HTTP 状态码 404 是什么意思?", "expected_keywords": ["Not Found", "资源"]},
{"input": "什么是 REST API?", "expected_keywords": ["无状态", "HTTP"]},
]
def run_eval(cases: list) -> float:
passed = 0
for case in cases:
resp = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=128,
messages=[{"role": "user", "content": case["input"]}]
)
output = resp.content[0].text
# 简单关键词匹配(真实项目可用 LLM-as-Judge 代替)
if any(kw in output for kw in case["expected_keywords"]):
passed += 1
print(f"✓ {case['input'][:20]}...")
else:
print(f"✗ {case['input'][:20]}... → {output[:60]}")
return passed / len(cases)
score = run_eval(test_cases)
print(f"\n通过率:{score:.0%}")PYTHON 示例
相关概念
- → Golden Dataset· 黄金数据集
- → LLM-as-a-Judge· 大模型当裁判