跳到主要内容
Agent Eval

第7章:自建领域 Benchmark

为什么公开 benchmark 不够,5 步法自建领域 benchmark,防老化、防 hacking、隐私合规、跨团队 leaderboard

Custom Benchmark Domain Eval Privacy Synthetic Data Leaderboard

公开 benchmark 是”行业标准考试”,自建 benchmark 是”你公司的内招面试”——前者通用,后者才能反映你业务真正需要的能力。本章给一份完整的 5 步法,带你为客服 / 代码 / 搜索三类业务设计领域 benchmark,讲清防老化、防 hacking、隐私合规、跨团队 leaderboard 的工程模式。读完这章,你能为团队建立一个”持续养护”的领域评测体系。

📑 目录


1. 为什么公开 benchmark 不够

1.1 三个根本问题

问题说明
Domain mismatch客服 agent 跑 GAIA,得分高也不代表客服好
Contamination模型训练时见过 benchmark 题,分数虚高
Reward hacking 风险UC Berkeley 大事件证明公开 benchmark 不可信

1.2 自建 benchmark 的三大价值

业务对齐:测的就是你业务真正需要的能力 ✅ 不会被 contamination(私有数据) ✅ 持续演进:跟你业务一起长

🌟 生产 agent 团队的共识:至少 50% 的 eval 资源投在自建 benchmark——公开 benchmark 跑跑就行,主战场是自家。


2. 自建 Benchmark 5 步法

2.1 Step 1:收集真实样本

来源:

来源备注
生产对话 log必须脱敏 / 合规审核
客服工单系统真实业务问题
用户调研主动收集 edge case
客户经理标注业务专家主导
Synthetic dataLLM 生成补充(注意防 collapse)

目标:200-2000 条真实样本,覆盖业务主要场景 + 长尾。

2.2 Step 2:设计评测维度

用模块八第 2 章的 5 维框架:

维度你业务的具体定义
Capability业务任务做对没?
Reliability同题反复跑稳吗?
Safety有没有违反业务规则?
Cost平均 $/任务
LatencyE2E P95

每条 benchmark 题应该至少测 2-3 个维度(不只 capability)。

2.3 Step 3:制定评分标准

按任务类型选合适 verifier:

任务评分
答案唯一(EM)rule-based verifier
答案多种正确reference-based + LLM Judge
开放回答LLM Judge 多 verifier 投票
Tool 调用对错检查 final state
Agent 行为trajectory 整体 LLM Judge

🍎 铁律(模块七、八多次强调):verifier 自己应该 ≥ 99% 准确率,否则评测噪声 > 真实 improvement。

2.4 Step 4:持续维护

每周:从生产 log 抽 5-10 条新 case 加入
每月:人工 spot check 模型在 benchmark 上的失败 case
每季度:删过期 / 不再有代表性的题,加新题

Benchmark 不是一次性产物,是持续养护的 living thing

2.5 Step 5:CI 自动化

把 benchmark 集成到 CI(下章详):

# .github/workflows/eval.yml
on: pull_request
jobs:
  custom_benchmark:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: |
          pip install -r eval/requirements.txt
          python eval/run_custom_benchmark.py
      - if: ${{ failure() }}
        run: echo "Custom benchmark regression > 5%, blocking PR"

3. 防老化:每季度 refresh

3.1 老化的表现

Q1: 模型 acc 65%
Q2: 模型 acc 75%(改了 prompt,看起来进步)
Q3: 模型 acc 85%(实际生产投诉率上升)

Benchmark 老化时,模型在 benchmark 上的进步不再反映真实业务

3.2 三种 refresh 策略

策略说明
Rolling refresh每季度淘汰 20% 老题,加 20% 新题
Holdout split70% 公开训练 + 30% 隐藏 holdout
Versioningbenchmark v1, v2, v3 各自存在,跟踪长期演进

3.3 标志:什么时候必须 refresh

  • 多个模型在 benchmark 上 saturated(都接近满分)
  • 业务场景有重大变化(新产品 / 新用户群)
  • 发现某些题被 hack
  • 距上次 refresh 超 6 个月

4. 防 reward hacking:对抗思维

4.1 设计时就考虑”会被怎么 hack”

每写一道 benchmark 题,问自己:

□ verifier 只看输出末尾吗?
□ 关键词匹配能被绕过吗?
□ 中间步骤评分了吗?
□ 多个 verifier 交叉验证吗?
□ 题目里是否有"暗示答案"的 metadata 模型可读到?

4.2 加入对抗 verifier

HACK_PATTERNS_FOR_THIS_BENCHMARK = [
    # 客服 benchmark 特定:不能直接复述用户问题
    re.compile(r"^.{0,100}\b" + re.escape(user_question[:50]) + r"\b"),
    # 不能简单转人工
    re.compile(r"已为您转接人工|稍等"),
    # 不能避而不答
    re.compile(r"我不太确定|建议您"),
]

def hack_score(response, user_question):
    return sum(p.search(response) is not None for p in HACK_PATTERNS_FOR_THIS_BENCHMARK)

# benchmark reward
final_score = capability_score - 0.2 * hack_score(response, user_question)

4.3 多版本 verifier

同一道题,设计多个独立 verifier:

verifier_a: 字符串匹配
verifier_b: LLM Judge
verifier_c: 业务规则 check(从订单系统拿真实状态)

通过 = 至少 2/3 verifier 同意

4.4 EvilGenie 风格 trap

故意在 benchmark 中埋一些”诱饵 hack 路径”——看模型会不会咬钩:

benchmark 设计:
  题 1-20 是正常题
  题 21-25 设计成"verifier 只看末尾数字,但解法应该思考"
  
如果模型在题 21-25 acc 高于题 1-20 → 有 hack 倾向

5. 隐私 / 合规

5.1 PII 处理

import presidio_analyzer
import presidio_anonymizer

def anonymize_for_benchmark(text):
    analyzer = presidio_analyzer.AnalyzerEngine()
    results = analyzer.analyze(
        text=text,
        entities=["PHONE_NUMBER", "EMAIL_ADDRESS", "PERSON", "CREDIT_CARD"],
        language="en",
    )
    anonymizer = presidio_anonymizer.AnonymizerEngine()
    return anonymizer.anonymize(text, results).text

所有从生产抽的 benchmark 数据必须过 PII detector

5.2 合成数据替代

PII 重的场景,直接用 LLM 合成 benchmark 数据:

prompt = """
生成 10 个客服对话场景,涵盖:
- 退款问题
- 物流查询
- 商品咨询
不要使用真实姓名、电话、身份证号——使用明显的假数据(如"张三"、"13800000000")。

输出 JSON 格式。
"""
synthetic_cases = llm.generate(prompt, n=20)

但要警惕模块七第 7 章讲的 synthetic data collapse——保留 10-30% 真实(脱敏)数据混合。

5.3 数据驻留

跨境业务:EU 用户数据只能用 EU 区域模型评 benchmark。否则 GDPR 风险。

5.4 Benchmark 数据访问控制

角色访问级别
Eval team全权
Engineer(写 agent 的)只能看分数,不能看具体题(防止”针对 benchmark 调 prompt”)
Product manager看 dashboard 摘要
外部 audit经审批的子集

6. 三类业务的实战设计

6.1 客服 Agent benchmark

benchmark: customer_service_v3
size: 500 cases
dimensions:
  - capability: 0.5    # 答案是否正确
  - reliability: 0.2   # pass^3 是否稳
  - safety: 0.2        # 是否违反 SOP
  - cost: 0.05         # token / 工具调用
  - latency: 0.05

cases:
  - id: cs_001
    type: refund_inquiry
    user_msg: "..."
    user_history: [...]   # 上下文
    expected_actions: ["check_order", "process_refund"]
    expected_response_traits: ["empathetic", "concise"]
    forbidden_actions: ["transfer_human"]   # 不能转人工
    sla:
      ttft: 1000  # ms
      e2e: 30     # s
    # 多 verifier
    verifiers:
      - rule_based: action_match
      - llm_judge: response_quality_rubric
      - business_rule: respects_sla

6.2 Code Agent benchmark

benchmark: code_agent_v2
size: 200 problems
based_on: real PRs from internal repos(脱敏)
dimensions:
  capability:
    - patch_applies: 0.3
    - tests_pass: 0.5
    - no_test_modification: 0.2  # 反 hack:不能改 test
  reliability:
    - pass^3: ...
  cost: $/PR
verifiers:
  - sandbox_pytest
  - lint_check
  - test_file_diff_check  # 检测 test 被修改

6.3 Search Agent benchmark

benchmark: search_agent_v1
size: 300 multi-hop queries
domain: 公司内部知识库
dimensions:
  capability:
    - answer_em: 0.6
    - cited_correct_doc: 0.3   # 引用对吗
    - hallucination_free: 0.1
  cost: tool_calls
verifiers:
  - exact_match_with_normalize
  - doc_id_match
  - llm_judge_grounding

7. 跨团队 leaderboard

7.1 内部 leaderboard 价值

Team A: agent v1.0  → benchmark 65%
Team A: agent v1.1  → benchmark 68%(+3%)
Team B: agent baseline → benchmark 58%
Team B: agent v2 → benchmark 72%(超越 A)

→ 良性竞争,共享 best practices

7.2 实现

# 用 Wandb 或自建 leaderboard
wandb.log({
    "team": "agent_team_a",
    "version": "v1.1",
    "benchmark_score": 0.68,
    "capability": 0.72,
    "reliability_pass3": 0.55,
    "cost_per_task": 0.18,
    "commit_sha": "abc123",
})

7.3 注意

  • 多团队共享 benchmark 必须严格控制访问(只看分数)
  • 定期人工抽审高分 trajectory 找 hack
  • 排行榜不是唯一衡量——业务 KPI 仍是终极

🍎 leaderboard 是工具,不是目的


✅ 自我检验清单

  • 公开 vs 自建:能列出公开 benchmark 不够的 3 个根本问题
  • 5 步法:能默写 收集 / 设计维度 / 评分 / 维护 / 自动化
  • 样本数量:能根据业务规模建议合理的 benchmark 大小(200-2000)
  • 5 维评分:能为客服 / 代码 / 搜索三类业务定义 5 维指标
  • 老化检测:能列出”必须 refresh”的 4 个标志
  • 三种 refresh:能解释 rolling / holdout / versioning 的差异
  • 对抗设计:能写一段 HACK_PATTERNS 用于业务 benchmark
  • 多版本 verifier:能解释”通过 = 2/3 verifier 同意”
  • EvilGenie 风格 trap:能给一个具体 trap 设计例子
  • PII 处理:能用 Presidio 写脱敏代码
  • 合成数据风险:能解释为什么”留 10-30% 真实数据”
  • 访问控制:能解释”engineer 只看分数不看题”的原因
  • Leaderboard:能为跨团队共享设计一份 wandb log schema

📚 参考资料

综述与方法论

  • Beyond Accuracy: Multi-Dimensional Framework:arXiv 2511.14136
  • Designing Benchmarks for Eval(Berkeley RDI 系列):博文

工具

  • Microsoft Presidio(PII detection):github.com/microsoft/presidio
  • Anthropic AI Safety Levels:对抗 benchmark 设计参考
  • Synthetic Data Generation:多个论文(模块七第 7 章)

工业实践

  • Anthropic Internal Eval Process:Anthropic 公开过部分 eval 实践
  • OpenAI Production Eval:OpenAI 各种 release post 中提到的方法