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 示例
相关概念