跳至内容
29/30第 29 章,共 30 章

LLM 评估:从公开 benchmark 到你的黄金集

同一个 agent、同一任务跑十次。七次成功看似 70%,直到你计算 pass^10,结果正好是零。

本页内容

这里做一个演示。第 23 章里的 agent——同一个循环,四个工具中的两个——被指向一个包含五个日志和配置文件的目录,并被问了一个问题。

TEXT
Q: What is the last line of errors.log about?
   turn 1  -> read_file({"path": "errors.log"})
   turn 2  -> "The last line of errors.log is:

               ERROR worker 7 timed out after 30000 ms."

答对了,但这完全不能作为任何证据——因为这段 transcript 是我运行的十次之一,而且我是看完全部十次之后才选出它的。

把完全相同的任务运行十次,除了采样 seed 什么都不改,这个 agent 七次答对。百分之七十,这就是会被放进幻灯片里的数字。现在问一个客户真正关心的问题——它每次都会成功吗?——答案就完全是另一个数字:

TEXT
t20  7/10 successes = 70 %   (95 % Wilson interval: 39.7 % to 89.2 %)
     pass^1  70.00 %      pass^5   8.33 %
     pass^2  46.67 %      pass^7   0.83 %
     pass^3  29.17 %      pass^8   0.00 %
     pass^4  16.67 %      pass^10  0.00 %

这个 agent 从未连续十次解决过这个任务,并且根据这些证据,也不应预期它能做到。这个数字——pass^10——才是诚实的数字;它几乎从不被发布。到本章结束时,你会知道如何计算它、计算它要花多少钱,以及为什么 70% 旁边的区间比 70% 本身更重要。

查看详情

本章需要前文提供什么。

  • 第 4 章 提供统计学:比例的 Wilson 区间、二十次里答对十七次为什么什么都区分不了,以及愚蠢基线作为第一要求。
  • 第 15 章 提供 bench:五十行 harness、在两个系统意见不一致的 case 上做配对符号检验,以及规则:prompt 是被测量的,不是被争论的。
  • 第 23 章 提供被测量的东西:循环、五种退出方式、成本核算,以及最后的观察:harness 让 agent 可治理,但不让它正确。

这里有两个面板。TypeScript 用于你自己的评估,因为它应该和代码一起放进持续集成。第二个面板用 Python,因为公开 benchmark 在那里,其中一个下面的测量还需要 logit。

几乎所有关于评估的争论,都是两个人在测量不同的东西。有三个项目,它们不共享同一种仪器。

你在评估什么问题仪器谁拥有它
model总体而言,这个 model 比那个更好吗?公开 benchmark、排行榜社区
你的应用我的 prompt、我的检索、我的 schema 在我的输入上有效吗?你的黄金集
你的 agent带工具和副作用的整个循环,能可靠地到达目标吗?任务成功率加 pass^k

混淆在一个方向上代价很高。排行榜会告诉你某个 model 在研究生级推理上很强;它无法告诉你它是否会路由你的客服工单。而一个对每个输入只评分一个答案的应用评估完全看不见 agent,因为 agent 有一组轨迹分布,而一个答案只是其中的一个样本。第 22 章给第三行命名,然后把它留空:性能度量,也就是 agent 规格中团队最晚写下、甚至从不写下的那一部分。

顺序也很重要,而且卖给你 model 的供应商也是这么说的。OpenAI 的 agent 指南把 model 选择归结为三步,并且顺序如下:“Set up evals to establish a performance baseline”、“Focus on meeting your accuracy target with the best models available”、“Optimize for cost and latency by replacing larger models with smaller ones where possible”。1 评估排在第一,因为没有数字,第二步和第三步都没有意义。

黄金集,以及二十个 case 实际买到了什么

链接到此部分:黄金集,以及二十个 case 实际买到了什么

黄金集是一组输入,每个输入都写下了答案,并配有一个 grader 来判断输出是否匹配。它很无聊,很小,也是本章里唯一属于你的 artefact。这里构建的黄金集包含针对五个文件目录的二十个任务——不是第 23 章的三个任务,所以答案也不是同一批答案——并且 grader 在 agent 运行之前写好:

golden.tsTS
export type Task = {
  id: string;
  prompt: string;
  answer: string;          // the fact, in words, for a human and for a judge
  must: RegExp[];          // ALL must match the final answer
  mustNot?: RegExp[];      // NONE may match
};

export const GOLDEN: Task[] = [
  { id: "t04", prompt: "Which file is the largest?", answer: "access.log",
    must: [/access\.log/i], mustNot: [/errors\.log/i, /notes\.txt/i] },       
  { id: "t12", prompt: "Which HTTP status codes appear in access.log? List all of them.",
    answer: "200, 429 and 500", must: [/200/, /429/, /500/] },                
  // ...eighteen more
];

有两个性质是承重结构。mustNot 列表之所以存在,是因为一个 model 如果说出三个文件名,其中包含正确文件,也并不算回答了问题。answer 既用散文写,也用模式写,因为后面人类和 judge 都会需要它——而把同一个事实用两种记号写两遍,正是你发现自己其实没有和自己就任务是什么达成一致的方法。

现在看决定结果的表。四个候选系统,同样二十个任务,accuracy 及其区间,还有两个单独的 accuracy 表总会隐藏的列:

systemcorrectaccuracy, 95 % Wilsoncost per solved taskmean latency
A — 无工具,greedy2/2010.0 % [2.8, 30.1]$0.004649663 ms
B — 有工具,简短 prompt5/2025.0 % [11.2, 46.9]$0.0055761,362 ms
C — 有工具,引导式 prompt2/2010.0 % [2.8, 30.1]$0.013071930 ms
D — C,T = 0.7 时 best of 31/205.0 % [0.9, 23.6]$0.0735322,628 ms

先读区间,再读赢家。B 臂从 11% 到 47%;A 臂从 3% 到 30%。它们在大部分长度上重叠,这正是第 4 章的发现如约抵达:二十个 case 无法给四个系统排序。第 15 章通过问配对问题把它磨得更锋利——在两个臂意见不一致的 case 中,分裂有多偏?——因为集合的共同难度被抵消了。下面是每一对:

TEXT
A vs B  +0 / -3   p = 0.2500       B vs C  +4 / -1   p = 0.3750
A vs C  +2 / -2   p = 1.0000       B vs D  +4 / -0   p = 0.1250
A vs D  +2 / -1   p = 1.0000       C vs D  +1 / -0   p = 1.0000

六次比较中没有一次成立。 最好的臂比完全没有工具的臂高十五个百分点,而这只建立在三个不一致 case 上。二十个 case 可以展示一种机制,但不能选择一个供应商;在会议上声称相反,就是坏 model 被买下来的方式。

这张表确实证明了一件事,而且是在没人放进去的那一列里。D 臂每个已解决任务的成本是 B 臂的 十三倍,因为采样三条轨迹并取众数答案,无论 accuracy 是否也翻三倍,账单都会翻三倍。省略成本的 accuracy 表会让这个取舍隐形。

现在来看一个会改变你阅读任何 benchmark 的发现。拿同样两百条 transcript——二十个任务、十次运行、没有重新生成任何一个 token——用三种方式评分:

gradercorrectaccuracy, 95 % Wilson
与书面答案 exact match0/2000.0 % [0.0, 1.9]
书面答案作为 substring 出现26/20013.0 % [9.0, 18.4]
上面的关键词 rubric52/20026.0 % [20.4, 32.5]

零、十三、二十六。系统没有变。grader 变了。exact match 返回零,不是因为 agent 没用,而是因为自由文本答案几乎永远不会和 reference 在字节上完全相同:它测量的是格式,却把结果报告成能力。

这不是奇闻,而是一种机制,而且它有名字。hard-cutoff metric 会在若干子事实上对任务做全有或全无的评分,因此会复合。任务 t12 一次要求三个状态码。十次运行中:

TEXT
per-code presence   200: 9/10    429: 6/10    500: 8/10    (mean 0.77 per fact)
all three at once   5/10

每个事实大约四分之三的时间是对的;要求三个同时正确会把分数砍半,而 0.773=0.4570.77^3 = 0.457 已经足够接近实测的 0.50,说明下降来自哪里。推广开来:

per-fact accuracy ppk=1k=1k=2k=2k=3k=3k=5k=5k=10k=10
0.6060.0 %36.0 %21.6 %7.8 %0.6 %
0.8080.0 %64.0 %51.2 %32.8 %10.7 %
0.9090.0 %81.0 %72.9 %59.0 %34.9 %
0.9595.0 %90.3 %85.7 %77.4 %59.9 %

k=10k = 10 处对照 0.90 行和 0.95 行:per-fact 提高五个百分点,在合取上变成二十五个百分点。model 并没有发生任何不连续变化。一条平滑曲线透过全有或全无的 metric 读起来会像跳变——这正是 Schaeffer、Miranda 和 Koyejo 关于涌现能力提出的论点,也是第 10 章推迟到这里处理的内容。2 他们的审计发现,在 BIG-Bench 的 39 个偏好 metric 中,最多只有 5 个显示出涌现,其中两个不连续 metric 解释了超过 92% 的声称案例。

所以纪律可以浓缩成一句话:图表里的跳变,在被证明不是之前,首先是关于 metric 的证据。 在相信某种能力出现之前,用一个给予部分分的 metric 绘制同样的运行,看看悬崖是否仍然存在。

还有一个二阶版本,Kalai 及其同事认为它正在上游造成伤害:按对错评分的 benchmark 奖励猜测,而不是说“我不知道”,所以针对它们优化的 model 学会了猜。他们提出的修复不是另一个幻觉 benchmark,而是“修改那些错位但主导排行榜的现有 benchmark 的评分方式”。3 你的黄金集也有同一个杠杆,而且只是一行:决定弃答是算失败,还是算作自己的类别。大多数人从不决定,于是它会悄悄算作失败,而他们发布的系统会猜。

到目前为止,所有内容都是每个任务只评分一次尝试。agent 不是一次尝试。第 17 章已经证明,即使在 temperature zero 下也没有 determinism,所以同一个输入会产生一组轨迹分布,而每个任务只运行一次的 benchmark 报告的只是其中一个样本。

τ-bench 的贡献就在于这个 metric。论文定义得很清楚:“we propose a new metric – pass^k (pass hat k), defined as the chance that all k i.i.d. task trials are successful, averaged across tasks.”4 对每个任务运行 nn 次,数出 cc 次成功,无偏估计量是:

passk=Etask ⁣[(ck)(nk)]pass@k=1Etask ⁣[(nck)(nk)]\text{pass}^k = \mathbb{E}_{\text{task}}\!\left[\frac{\binom{c}{k}}{\binom{n}{k}}\right] \qquad \text{pass@}k = 1 - \mathbb{E}_{\text{task}}\!\left[\frac{\binom{n-c}{k}}{\binom{n}{k}}\right]

第二个就是代码生成里熟悉的 pass@kkk 次尝试中至少一次成功的概率。把它们并排放在同一组实测计数上,它们朝相反方向移动:

kkpass@k — 至少一次pass^k — 全部成功
126.0 %26.0 %
237.0 %15.0 %
343.5 %10.5 %
551.2 %6.7 %
857.7 %5.1 %
1060.0 %5.0 %

同样的运行,同样的 grader,同样二十个任务。一列说系统会随着尝试次数增加而变好,另一列说它会变差,两者都正确,因为它们回答的是不同问题。当有人类过滤输出时——代码生成、草稿、头脑风暴——且额外尝试很便宜,pass@k 是正确的 metric。当 agent 在没有过滤器的情况下行动时,pass^k 才是正确的 metric,而这正是“agent”的含义。在应当使用第二个的地方发布第一个,是这个领域最常见的夸大;τ-bench 自己的标题数字就是诚实版本:gpt-4o 在 retail 上大约 61% pass^1,到 pass^8 时降到约 25%。4

现在看我自己数字里的刺。我的二十个任务上,pass^10 是 5.0%:正好二十个任务里只有一个在十次运行中全部解决。那个任务是 t19“Did deploy 42 succeed?”,下面是十个答案中被 rubric 评为正确的两个:

TEXT
run 2  "To check if 'deploy.log' succeeded in deploying 42, I will list the file
        names in the working directory using the list_files function..."
run 8  "Yes, deploy 42 has successfully deployed. Deploying was successful for 41
        as well."

第一个根本没有回答。第二个加了一个错误断言——deploy 41 被回滚了。两者都匹配了 /succe|yes/。唯一把 pass^10 托在零以上的任务是一个 grader artefact,所以真实数字是 ,而任何聚合指标都不会让我看到这一点。抽样检查你得分最高任务背后的 transcript,是 grader 死亡的地方。

还有一个数字,也是本节标题所指的那个。十次相同评估——同一系统、同样二十个任务、同样代码,除了 seed 什么都没变:

TEXT
per-run correct: 5 2 5 5 8 5 8 5 4 5   ->  10 % .. 40 %,  mean 26.0 %,  sd 8.8 points

一个没有变化的系统出现了三十个百分点的范围。如果你在发布前运行一次套件、发布后再运行一次,那么八个百分点的“提升”就在这个波动范围内,而你会以为是自己造成的,并把它发出去。这就是为什么上面合并后的区间——26.0% [20.4, 32.5]——单独引用时过窄:它把两百个相关 trial 当作两百个独立 trial。agent 评估的诚实摘要是平均值跨重复运行的离散度,而几乎没人发布第二个。

rubric 无法扩展到开放式答案,所以标准做法是让一个 model 给输出打分。在 frontier 规模上它足够有效,因而成为默认做法,而且它有三个有名字的失效模式:位置偏差、冗长偏差和自我增强偏差。5

先测量它,再信任它。同样六十个答案——十次运行中的三次——用三种方式标注。人类标签由我给出:我打开五个文件读完全部六十个答案,并应用一条书面规则:当且仅当答案陈述了问题所问的事实,并且不包含任何被文件反驳的内容时,才算通过。

gradersays passagrees with the humanfalse passfalse fail
关键词 rubric17/6050/60 = 83.3 % [72.0, 90.7]82
model as judge60/6011/60 = 18.3 % [10.6, 29.9]490

judge 六十次里六十次都说 PASS。在人类给出 18% 分数的集合上,它会把这个 agent 报告为 100% accuracy。一个没有判别能力的 judge 不是一个有噪声的仪器;它是一个常函数,而常函数会给你最好的系统和最差的系统同一个分数。

prompting 没有拯救它。四个变体,同样六十项:

judge promptsays passagreement with the human
“Reply PASS or FAIL.”60/6018.3 %
“Reply FAIL or PASS.” — 标签顺序交换56/6025.0 %
加上一份明确列表,说明什么算失败55/6026.7 %
加上一个 worked FAIL 示例和一个 PASS 示例56/6025.0 %

把指令中两个标签的顺序换一下,就移动了四个判决。这是一个可测量的效应,而且是错误类型的效应:judge 在响应 prompt 的形状,而不是眼前的答案。

干净的演示是成对比较。二十个问题,每个问题配一个明显正确和一个明显错误的候选答案,并以两种顺序呈现:

TEXT
picked the FIRST option              40/40 = 100.0 %
order-consistent (same winner both ways)   0/20 = 0.0 %   [Wilson 0.0, 16.1]
picked the CORRECT answer            20/40 = 50.0 %

它四十次里四十次都选位置 A。正确性上的 50% 不是部分能力——这是算术,因为正确答案恰好在一半 trial 中位于位置 A。这里的一致性沿用 MT-Bench 的定义:“the percentage of cases where a judge gives consistent results when swapping the order of two assistants”,这样比较就是 apples to apples:GPT-4 在该指标上得 65.0%,few-shot prompting 把它提升到 77.5%。5 我的得分是零。

标准缓解方法也来自那篇论文:“call a judge twice by swapping the order of two answers and only declare a win when an answer is preferred in both orders.”5 在这里应用它,judge 从二十对中产生 零个可用判决——这是正确结果,而且比二十个自信判决好无穷倍。

一个方法论备注比结果本身更有价值。我还跑了一个冗长性测试:同一个正确答案,一份拷贝加上一句 36 个词、没有添加任何信息的填充句。judge 在正好 50% 的 trial 中偏好更长版本——这看起来像没有冗长偏差,但完全不是,因为一个总是选择位置 A 的 judge 会在任何平衡配对上都得到 50%。在第一个偏差被控制之前,你无法测量第二个偏差。 交换位置不是以后再加的精修项;它是让其他所有测量可解释的前提。

judge 用来做什么。 没有可解析形式的开放式答案:语气、覆盖度、引用是否支持其句子、拒答是否合适。便宜、快速,并且大致和它的基础 model 一样好。

judge 不是什么。 它不是真值。它是一个有 accuracy、偏差画像和成本的系统;在它产出的任何数字有意义之前,它需要自己的、带人类标签的黄金集——包括已知失败。

诚实的 caveat:这个 judge 是一个五亿参数 model,没人应该用它打分。重点不是 judge 很糟。重点是,上面的数字只花了八分钟就能产出;如果没有它们,这个 judge 对一次上线决策给出的判决会是 100%。

第二个面板:Python,以及 contamination 探针

链接到此部分:第二个面板:Python,以及 contamination 探针

这是本课程第三个也是最后一个声明的 Python 面板,原因在于公开数字从哪里来。lm-evaluation-harness 覆盖了“over 60 standard academic benchmarks for LLMs, with hundreds of subtasks and variants implemented”,并且是“Hugging Face's popular Open LLM Leaderboard”的后端;HELM、SWE-bench 和 τ-bench 都是带 Python 入口点的 Python 包。让你的 model 对照一个已发布数字运行,意味着运行他们的代码;当你想和别人引用的数字比较时,你所在的生态就是这个:

terminalBASH
lm_eval --model hf \
    --model_args pretrained=EleutherAI/gpt-j-6B \
    --tasks hellaswag \
    --device cuda:0 \
    --batch_size 8

第二个原因是,本章有一个测量无法通过 HTTP 完成。Contamination——测试集泄漏进训练数据——会让公开 benchmark 悄悄变得无意义,而最锋利的探针需要 model 自己的 loss,这是任何 chat API 都不会返回的。它就是第 8 章的每 token cross-entropy,指向一个关于记忆的问题:

contamination.pyPYTHON
def nll(text: str) -> float:
    """Mean negative log-likelihood per token, in nats."""
    ids = tok(text, return_tensors="pt").input_ids.to(model.device)
    with torch.no_grad():
        out = model(ids, labels=ids)
    return float(out.loss)

十对句子:五句自 web 存在以来就出现在每一次 crawl 中,五句是今天早上为本章写的新句子;每句都配一个改写版本,内容相同。

setcanonical wordingrewordedgap
著名句子,5 个均值1.213.03+1.83
新写句子,5 个均值5.025.96+0.93

model 对今天早上写的句子的惊讶程度,是它见过一百万次的句子的四倍;而改写在著名句子上的成本是两倍——额外成本就是被记住而非被理解的部分。绝对 loss 会把记忆和普通自然度混在一起,所以 gap 是更好的统计量,continuation test 则更好。给它前六个词:

TEXT
famous  "Permission is hereby granted, free of"
     -> "charge, to any person obtaining a copy of this software and associated
         documentation files (the "
famous  "All human beings are born free"
     -> "and equal in dignity and rights. The right to life, liberty, and security"
fresh   "All evaluation harnesses are born tiny"
     -> ", and the most common way to measure their size is by using a ruler."

五个著名字符串中有三个能从六个词开始逐词无误地续写;五个新写字符串一个都不能。这是一个五亿参数 model 在背诵 MIT License。如果你的 benchmark 在公开 web 上,就假设它在权重里。 这也是整章的论点:一个用你自己的数据写成、并且不放进任何 crawler 会读取的 repository 的黄金集,是你唯一能确信从未被训练过的测试集。

它们仍然值得读,只要你读的是每个 benchmark 测量了什么,而不是挂在它身上的单个数字。

benchmark它测量什么论文中的一个数字
MMLU横跨 57 个学科的多项选择知识GPT-3 平均比随机机会高“almost 20 percentage points”6
HELM多 metric × 多场景,标准化核心场景覆盖率从 17.9% 到 96.0%7
Chatbot Arena众包成对人类偏好超过 240K 票;群众投票与专家“in good agreement”8
SWE-bench解决真实 GitHub issue,由 repo 的测试评分2,294 个问题;当时最佳 model 只解决了“a mere 1.96 %”9
τ-bench带模拟用户和领域策略的工具使用gpt-4o 在 retail 上 ≈ 61% pass^1,≈ 25% pass^84
WebArena在正常运行的网站上的长程任务最佳 GPT-4 agent 14.41%,人类 78.24%10
OSWorld跨应用的真实桌面和 OS 任务369 个任务;最佳 model 12.24%,人类 72.36%11
GAIA对人容易、对 assistant 困难的问题466 个问题;人类 92%,带插件的 GPT-4 15%12
AgentBench跨 8 个不同环境的 agent 推理商业 model 与开源 model 之间存在很大差距13
AgentHarmagent 是否会执行恶意多步骤任务11 个伤害类别下 110 个恶意任务14

读整张表,而不是任意一行。所有 agentic benchmark 都把人类放在 model 之上,这与知识 benchmark 相反,也是对这个领域现状最好的单句总结;它们的数字会在数月内变旧,所以引用时要附上你阅读它们的日期;而且每一个测量的任务都不是你的任务。

Accuracy 是你会争论的 metric。下面这些才决定东西能不能上线。四个都来自已经测量过的两百次运行。

按已解决任务计成本,而不是按调用计。 agent 每次尝试成本为 $0.001345,而每个实际解决的任务成本为 $0.005172——高出 3.85 倍,因为四分之三的尝试没有产出任何东西。Latency 也一样:每次尝试 1,213 ms,每个已解决任务 4,667 ms。每一次重试、每一次重新提问、每一条被放弃的轨迹都体现在第二个数字里,在第一个数字里则不可见。

一个胜过 accuracy 的诊断。 在 200 次尝试中,有 123 次 agent 没有调用任何工具就回答了——它是在猜,而不是查。按这个分割:

TEXT
answered without reading anything   8/123  =  6.5 %  [3.3, 12.3]
answered after reading something   44/77   = 57.1 %  [46.0, 67.6]

这些区间根本不接近相触。这比聚合的 26% 更有价值,因为它说出了要修的东西——model 不是推理失败,而是没有去看——修复点在 harness,不在 model。按照本章自己的标准,还欠一个 caveat:两组是不同任务,不是同一任务配对,所以这段差距的一部分可能是它正好在自己觉得困难的问题上跳过工具。这个分割是诊断,不是因果断言。

Human intervention rate 是买家最先问的 metric:有多大比例的运行停在 approval、guardrail 或 handoff。第 23 章的类型化中断让它可计数;按任务类型、按周统计,它区分的是一个正在学习自己工作的 agent,还是一个悄悄变成队列的 agent。

Abandonment 是离线套件看不到的那个:用户读了答案,关掉标签页,自己把任务做了。离线评估是一道门;生产评估是对真实流量的连续抽样,用同一个 grader 加上这四个指标评分。

还有一条继承自第 17 章的规则:永远不要对 exact output 做断言。 对性质做断言——有效 JSON、正确 schema、调用了正确工具、数字在容差内、存在必要 substring。本章开头的 exact-match 列,就是违反这条规则的结果。

评估供应商不只是关于 accuracy,这也是本课程伦理部分的另一半,因此它有自己的标题,而不是附录。

测量偏差,不要假设偏差。 无论你相信某个 model 在姓名、方言、性别或国籍上会有什么行为,它都是你的 pipeline 的一个可测量性质,而仪器就是你已经拥有的那个:拿你的黄金集,只改变属性,做配对比较。HELM 的存在,正是因为在 bias、toxicity、calibration 和 robustness 也可判定的地方,人们只报告 accuracy。7 供应商的 model card 是起点,不是关于你输入的证据。

Contamination 也是供应商问题。 上面的探针就是为什么要问已发布数字是在什么上测得的,以及 model 的数据截止时间是什么时候。

Retention、training 和 residency,按 2026 年 9 月 7 日阅读。 这些会变化,所以要把日期记录在答案旁边。Anthropic 的政策页写道:“By default, we will not use your inputs or outputs from our commercial products (e.g. Claude for Work, Anthropic API, Claude Gov, etc.) to train our models”,例外是你明确作为反馈提交的内容,其会被存储“for up to 5 years”。15 OpenAI 的数据控制文档写道:“data sent to the OpenAI API is not used to train or improve OpenAI models (unless you explicitly opt in to share data with us)”,描述了用于滥用监控日志的默认三十天保留期,并提供 Zero Data Retention,它会“excludes customer content from abuse monitoring logs”,以及覆盖一系列区域的可配置数据驻留。16

在第一次生产调用前,要把四个问题写下来,因为每一个都有不同的 owner:我的数据是否用于训练;它被保留多久、由谁保留;它在哪里处理和存储;如果我使用经销商、gateway 或 aggregator,而不是直接使用 provider,这一切会发生什么。最后一个问题里藏着最多意外,而任何 benchmark 都不会告诉你。

现在你已经有了仪器:你拥有的黄金集、每个数字上的区间、每次比较的配对检验、针对你没给任何人看的运行的 pass^k、一个测量过的 judge,以及一个探针,用来判断公开分数是否有意义。第 23 章的结论现在可以被检查,而不是被断言——harness 让 agent 可治理,而不是正确——而检查它花了两百次运行和八分钟。

agent 还有一个性质,上述所有东西都测不到,而它正是会让人丢工作的那个。

本章黄金集里的每个任务都是我写的,agent 读取的每个文件也是我写的。那个目录里没有任何东西试图做任何事。只要改动 agent 被告知要读取的某个文件中的一行——一行以写给下一个读取者的指令结尾的文字——那么这个得分 26% 的 agent 就会用同样的工具、同样的权限、同样干净的 trace 跟随它,而本章中的每一个数字都会停在原地。评估套件测量的是系统多常达到你的目标。它不测量别人把目标替换成自己的有多容易。

第 30 章就是这个:prompt injection、私有数据、不可信内容和外部通信的致命三联征,以及给 agent 真实权限要付出什么代价。它以本章一直回避的观察开头——同样的通过分数,可以和一个完全照着攻击者写在待读文件里的内容行动的 agent 同时成立。


上面的每个数字都在一台机器上产生,没有触碰任何付费 endpoint。agent 是第 23 章的循环,使用四个工具中的两个,作用于一个五文件目录;端口背后的 model 是 Qwen/Qwen2.5-0.5B-Instruct,通过一个小服务器暴露,形状与第 23 章中的 chat completions endpoint 完全相同,但运行在一块消费级 GPU 的半精度上,而不是那一章的 CPU。成本使用第 16 章的费率——每百万 input tokens $2.00、每百万 output $12.00——并应用到实测 token 计数上。重复运行使用 temperature 0.7 和固定 seed,因此整个集合可复现;四臂表使用 greedy。区间是 95% Wilson,配对比较是在不一致对上的双侧精确符号检验;Wilson 区间来自第 4 章,精确配对符号检验来自第 15 章,两者都原样复用。人类标签由我给出,按正文引用的书面规则应用于六十个答案。把这里的每个量级都读作一个五亿参数 model 的性质,把每种方法都读作可迁移的:更大的 model 会把所有数字往上推,但不会移动任何仪器。

  1. OpenAI, A practical guide to building agents (PDF), 第 8 页,阅读于 2026 年 9 月 7 日。上文引用的三步顺序以及配套建议“build your agent prototype with the most capable model for every task to establish a performance baseline. From there, try swapping in smaller models to see if they still achieve acceptable results.”的来源。第 22 章和第 25 章引用了它的定义和编排页面。

  2. Schaeffer, R., Miranda, B. and Koyejo, S. Are Emergent Abilities of Large Language Models a Mirage? arXiv:2304.15004 (2023). 论点是,不连续、全有或全无的 metric 会把底层平滑改进制造成看似跳变;第 10 章引用了其中的 BIG-Bench 审计。他们自己的警告值得重复:论文中没有任何内容声称大 model 不可能展示涌现能力。

  3. Kalai, A. T., Nachum, O., Vempala, S. S. and Zhang, E. Why Language Models Hallucinate. arXiv:2509.04664 (2025). 论点是按对错评分的 benchmark 会奖励猜测而不是弃答,提出的补救是“modifying the scoring of existing benchmarks that are misaligned but dominate leaderboards, rather than introducing additional hallucination evaluations”。第 19 章从检索侧引用它;这里是同一主张的评估侧。

  4. Yao, S., Shinn, N., Razavi, P. and Narasimhan, K. τ-bench: A Benchmark for Tool-Agent-User Interaction in Real-World Domains. arXiv:2406.12045 (2024). pass^k 的来源,如上文引用所定义,论文中并排打印了两个估计量;摘要的标题结论是最先进的 function-calling agents “succeed on <50 % of the tasks, and are quite inconsistent (pass^8 <25 % in retail)”,第 1 节给出了 gpt-4o 在 τ-retail 上 ≈61% pass^1 和 ≈25% pass^8 的数字。它对比的 pass@k 估计量来自 Chen, M. et al., Evaluating Large Language Models Trained on Code, arXiv:2107.03374 (2021)。 2 3

  5. Zheng, L. et al. Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena. arXiv:2306.05685 (2023). 三种具名偏差的来源、上文使用的一致性定义(“the percentage of cases where a judge gives consistent results when swapping the order of two assistants”)的来源、发现“only GPT-4 outputs consistent results in more than 60 % of cases”且 65.0% 经 few-shot 提升到 77.5% 的来源,以及逐字引用的交换并要求一致的缓解方法来源。它的正面结果同样重要:GPT-4 judge 与人类评估达到“an agreement rate exceeding 80 %”,“the same level of human-human agreement”——这就是为什么要使用 judge,也是为什么要测量你自己的 judge。 2 3

  6. Hendrycks, D., Burns, C., Basart, S., Zou, A., Mazeika, M., Song, D. and Steinhardt, J. Measuring Massive Multitask Language Understanding. arXiv:2009.03300 (2020). 57 个任务;摘要声称最大的 GPT-3 model “improves over random chance by almost 20 percentage points on average”,这很好地提醒我们这个 benchmark 的饱和是多么近期的事。

  7. Liang, P. et al. Holistic Evaluation of Language Models. arXiv:2211.09110 (2022). 七个 metric——accuracy、calibration、robustness、fairness、bias、toxicity 和 efficiency——覆盖 16 个核心场景和 30 个 model,并给出上文引用的覆盖率数字。阅读它的理由是其框架:你报告七个中的哪一个,本身就是一种选择。 2

  8. Chiang, W.-L. et al. Chatbot Arena: An Open Platform for Evaluating LLMs by Human Preference. arXiv:2403.04132 (2024). 写作时超过 240K 票、众包成对偏好,以及“the crowdsourced human votes are in good agreement with those of expert raters”的主张。

  9. Jimenez, C. E., Yang, J., Wettig, A., Yao, S., Pei, K., Press, O. and Narasimhan, K. SWE-bench: Can Language Models Resolve Real-World GitHub Issues? arXiv:2310.06770 (2023). 来自 12 个 Python repository 的 2,294 个问题,由 repository 自己的测试评分,当时最佳 model 只解决了“a mere 1.96 %”。第 23 章用它说明“harness”这个词的另一种含义。

  10. Zhou, S. et al. WebArena: A Realistic Web Environment for Building Autonomous Agents. arXiv:2307.13854 (2023). 横跨四个领域的正常运行网站,最佳 GPT-4 agent 为 14.41%,人类为 78.24%。

  11. Xie, T. et al. OSWorld: Benchmarking Multimodal Agents for Open-Ended Tasks in Real Computer Environments. arXiv:2404.07972 (2024). 真实操作系统上的 369 个任务;人类超过 72.36%,最佳 model 12.24%,并把 GUI grounding 列为主要差距。

  12. Mialon, G., Fourrier, C., Swift, C., Wolf, T., LeCun, Y. and Scialom, T. GAIA: A Benchmark for General AI Assistants. arXiv:2311.12983 (2023). 466 个问题,人类 92%,带插件的 GPT-4 15%——这是关于什么对人容易、什么对 assistant 容易之间差距的最干净公开表述。

  13. Liu, X. et al. AgentBench: Evaluating LLMs as Agents. arXiv:2308.03688 (2023). 八个不同环境,以及顶级商业 model 与同等规模开源 model 之间的显著差异。

  14. Andriushchenko, M. et al. AgentHarm: A Benchmark for Measuring Harmfulness of LLM Agents. arXiv:2410.09024 (2024). 11 个伤害类别下 110 个明确恶意的 agent 任务(加增强为 440 个),发现领先 model “surprisingly compliant with malicious agent requests without jailbreaking”,并且简单通用 jailbreak 模板会迁移到 agent,同时保留其能力。它是通往第 30 章的桥梁:一个能力 benchmark 和一个伤害 benchmark 测量同一个系统,却对它是否准备好给出相反结论。

  15. Anthropic, Is my data used for model training?, privacy.claude.com, 阅读于 2026 年 9 月 7 日。上文逐字引用,包括反馈例外以及已提交反馈的五年存储窗口。

  16. OpenAI, Your data(API 数据控制文档), developers.openai.com, 阅读于 2026 年 9 月 7 日。默认不训练声明、三十天滥用监控保留、Zero Data Retention 描述和合格 endpoint 列表,以及数据驻留区域的来源。


作者

David Vicente Campos

NeuraLIA Labs 创始人、MyRealFood 联合创始人

我是莱昂大学毕业的计算机工程师。我共同创立了 MyRealFood,并在那里作为 CTO 打造了一款数百万人用来吃得更健康的应用;我还创立了 NeuraLIA Labs,在这里我打造 AI 产品。我在本站写下一路走来所必须理解的内容,就像我希望当初有人向我讲解的那样。

了解作者更多信息

由 NeuraLIA Labs 发布。

新文章直达你的收件箱

AI 新闻、指南和产品更新——有值得你花时间阅读的内容时,我们会发一封简短邮件。

更喜欢用消息接收?同样的内容,也在这里:WhatsApp 社群 (在新标签页打开)Telegram 频道 (在新标签页打开)

课程目录

Abstract software decision engine with branching paths, probability nodes, and glowing gates.
jev10 分钟阅读

Jev AI 模型为决策而生,而非写作

TypeSafe AI 的 Jev 正受到关注,因为它把软件智能视为一个概率问题:选择正确分支,附上置信度,并避免在代码只需要决策时还花钱让 LLM 写文本。

Abstract agent runtime sorting documents, memory blocks and pointer nodes inside a bounded context frame.
context-engineering12 分钟阅读

Context engineering for long-horizon AI agents

Long-running agents do not fail only because the window is small. They fail when files, tool outputs and stale history crowd out the task the agent was supposed to finish.

准备好让 LIA 替你选模型了吗?

所有 AI 模型都在一处——今天就免费开始。