跳到主要内容

04 · 评测闭环

本章讲「怎么知道 agent 答得对不对」:多次采样 → 裁判模型判分 → Pass@k 统计。这是评测 agentic 能力的标准套路,细节在 run_multi_react.pyevaluation/

3.1 为什么要跑多次(rollout)

深度研究是随机的——temperature=0.6、搜索结果随时间变,同一道题跑两次可能一次对一次错。所以评测要跑多次取统计量。run_multi_react.py 默认 roll_out_count=3(run_multi_react.py:22),每道题独立跑 3 次,结果分别落 iter1.jsonl / iter2.jsonl / iter3.jsonl(run_multi_react.py:87-89)。

3.2 并发调度:线程池 + 粘性端口

run_multi_react.pyThreadPoolExecutor(默认 20 worker)把所有 (题, rollout) 任务并发跑(run_multi_react.py:174-181)。

巧妙处 —— 粘性端口分配(run_multi_react.py:117-140): 有 8 个 vLLM 端口(6001-6008)。同一道题的所有 rollout 固定分到同一个端口(question_to_ports 缓存),不同题用轮询(round-robin)均摊。好处:同题请求命中同一服务实例,可复用 KV cache、负载也均衡。

还有断点续跑:启动时扫已有 iterN.jsonl,把已成功(有 question、无 error)的题记进 processed_queries,跳过不重跑(run_multi_react.py:93-108134)。

3.3 打分:LLM-as-judge

模型输出的是自然语言答案,不能字符串精确匹配(「巴黎」vs「Paris, France」)。所以用一个裁判模型读「问题 + 参考答案 + 模型预测」,判等价与否。核心在 evaluate_deepsearch_official.py:76-144(call_llm_judge)。

巧妙处 —— 裁判模型按数据集切换(evaluate_deepsearch_official.py:461-476): 不同基准用不同裁判和不同提示词:

数据集裁判模型判分提示词
gaia / webwalkerqwen2.5-72b-instructJUDGE_PROMPT_GAIA
xbench-deepsearchgemini-2.0-flash-001JUDGE_PROMPT_XBENCH(中文,结论=正确/错误)
browsecomp_zh / _engpt-4o-2024-08-06JUDGE_PROMPT_BROWSECOMP_OFFICIAL

browsecomp 还用 OpenAI 的 structured output(response_format 强制 JSON schema,evaluate_deepsearch_official.py:33-51,107-118),让裁判必须吐出 {correct: yes/no, confidence, …},再据 correct 字段定对错——比让模型自由发挥更稳。

判定「算对」的逻辑很宽松(evaluate_deepsearch_official.py:72-73):裁判输出等于 "correct",或首字母是 a(对应 GAIA 提示词里的选项 A)即判对。

3.4 Pass@k 怎么算

有了 3 轮的对错,算三种指标(evaluate_deepsearch_official.py:405-445):

指标含义怎么算
Pass@33 次里任一次对就算这题解决calculate_pass_at_k(k=3)
Best Pass@1三轮各自 Pass@1 里最高的那轮calculate_best_pass_at_1
Avg Pass@3三轮 Pass@1 的平均calculate_avg_pass_at_3

Pass@3 衡量「能力上限」(多试几次能不能对),Avg Pass@1 衡量「单次稳定性」——两者一起看才不被单次运气误导。

3.5 顺带算的行为统计

评测脚本还从轨迹里挖了一堆行为指标(single_round_statistics, evaluate_deepsearch_official.py:209-325):平均动作数、平均 visit/search 次数、答案长度、思考(<think>)长度、每题 assistant token 数、终止原因分布……这些用来分析「答对的题通常调了几次工具」(calculate_enhanced_statistics, evaluate_deepsearch_official.py:328-379)——即效率画像,而不只是准确率。

3.6 另一条评测线:HLE

evaluation/evaluate_hle_official.py 是给 Humanity's Last Exam 单独准备的官方评测脚本(README 的 evaluation 段提到它走 eval_hle_old_react.py 入口)。它与 deepsearch 那条并列,针对 HLE 的判分口径。本文档聚焦主线 deepsearch 评测;HLE 细节按需读该文件。

代码地图

主题文件路径符号名
多 rollout 调度 + 粘性端口inference/run_multi_react.pyquestion_to_portsThreadPoolExecutor
断点续跑inference/run_multi_react.pyprocessed_queries_per_rollout
LLM 裁判判分evaluation/evaluate_deepsearch_official.pycall_llm_judge
按数据集选裁判evaluation/evaluate_deepsearch_official.pymain(judge_model 分支)
是否算对evaluation/evaluate_deepsearch_official.pyis_correct_judgement
Pass@k 指标evaluation/evaluate_deepsearch_official.pycalculate_pass_at_kcalculate_avg_pass_at_3
行为统计evaluation/evaluate_deepsearch_official.pysingle_round_statistics
判分提示词evaluation/prompt.pyJUDGE_PROMPT_GAIAJUDGE_PROMPT_BROWSECOMP_OFFICIALJUDGE_PROMPT_XBENCH