让 Claude 帮你建 eval、调 prompt,怎么不被分数骗

Anthropic 给 claude-api skill 加了 build-eval 和 hillclimb 两条命令:一条帮你出题打分,一条每轮只改一处、拿留出的题抓过拟合。客服案例里成本降到原来的五分之一,skill 自己从 66% 调到约 88%。

作者:Anthropic09-29 · 约 15 分钟

做 AI 应用的人迟早会碰到两件事:怎么知道它做得好不好,以及怎么让它变得更好。前一件靠 eval(评测,一批固定的题加一个打分办法),后一件靠 hillclimb(爬山,字面意思是每次改一点、看分数涨没涨、涨了就留下)。听起来简单,难在两头都很容易自己骗自己:题出得不对,分数就没意义;改得太贴着这批题,分数涨了线上却没变好。

Anthropic 的 Lance Martin 写了一篇长文,把这两件事的原则讲了一遍,然后说明 Claude Code 里的 claude-api skill 新增的两条命令怎么把这些原则变成流程:/claude-api build-eval 在你的代码库里建一套评测,/claude-api hillclimb 拿这套评测去改进你的应用,每次只改一处,还留一批从不给它看的题来抓过拟合。文章最后用两个实际案例收尾:一个把客服场景的成本压到原来的五分之一,一个把 claude-api skill 自己从 66% 调到约 88%。

下面按文章的顺序讲:先是好 eval 的样子,再是 build-eval 怎么建,然后是 hillclimb 怎么爬又怎么防过拟合,最后看两个案例。

一套好 eval 长什么样

文章给了四个特征(图 1)。

好 eval 的四个特征:更强的模型分数更高、更高的 effort 分数更高、离满分还有空隙、多次运行波动小
图 1:好 eval 的四个特征:更强的模型分数更高、更高的 effort 分数更高、离满分还有空隙、多次运行波动小

题要像生产环境里的题。 有人挑题是因为好生成、好打分,结果题目分布和真实用户遇到的完全不是一回事。评测要测的是你在乎的那类任务。

模型越强、想得越多,分数应该越高。 换更强的模型、把 effort(推理投入档位)调高,分数理应上升。如果不升,多半是题目有歧义,或者打分的 grader 校准得不对,把成绩拖住了。

最强模型也得留出空隙。 最强模型在最高 effort 下应该明显低于 100%,否则你改了什么都看不出差别。而且这个空隙不能是「不可能的题」造成的:一个常见的信号是,某道题不管重复跑多少次都全军覆没。好题的标准是,两个领域专家看了会给出同一个结论,而且 grader 检查的每一点,题目里都写明了。

每次跑的结果波动要小。 波动大,往往是题有歧义,或者 grader 对同一份输出前后判得不一样。波动也可能藏在配置里,比如 effort 其实没有被一致地应用;还有环境的影响,上一轮遗留的文件、git 历史,可能把答案直接递给了 Agent。

别只挑「今天的模型做不好」的题

文章专门警告了一种很自然的做法:把当前模型答错的题收集起来当评测。模型的能力是参差的,有的地方很强,有的地方莫名其妙地弱。你专挑它今天的弱点,量到的只是这个模型的「失败指纹」,而不是你的应用里真正难、真正有价值的部分。等下一代模型出来,这些谷底可能被整体抬平,你的评测就失去了意义(图 2)。

左:只在当前模型出错处取样,题目全落在能力曲线的谷底;右:由人判断哪些题难,题目分布在峰谷各处,还包含不应触发的用例
图 2:左:只在当前模型出错处取样,题目全落在能力曲线的谷底;右:由人判断哪些题难,题目分布在峰谷各处,还包含不应触发的用例

更好的做法是让人来判断哪些题难,并且能说出它为什么难,说不出就先别放进去。另外要放进从生产流量、bug 报告和工单里来的具体失败。但也不要只信用户流量:用户往往只会试他们预期能成的事,所以纯从流量里抽的题可能偏简单。图 2 右侧还画了一类「不应触发」的用例,也就是该不动作的场景,同样要有。

/claude-api build-eval:让 Claude 采访你,然后把评测建好

在 Claude Code 里运行这条命令,Claude 会先采访你,然后在你的代码库里把评测建出来,并且在几个关键点停下来等你批准。

先定题目:谁的数据优先

Claude 帮你找输入的顺序是这样的:

  1. 生产环境的对话记录,先问清楚数据保留和敏感信息的规矩;
  2. bug 报告和客服工单;
  3. 你自己手写的 5 到 10 条;
  4. 从代码库里合成的用例。

生产数据优先,但没有的话,它也能在你给的几个真实例子的基础上合成数据。建好之后,它会生成一个简单的页面,把每一条输入摊开给你看,等你确认。文章拿一个邮件路由应用当例子:24 封客户邮件,每封带标签,比如「账单、简单」「账单、有歧义」,Claude 在聊天里问你:这些能代表你的应用实际遇到的输入吗?有没有明显缺的,或者根本没必要放的?(图 3)

build-eval 生成的审阅页:邮件路由应用的 24 条输入,每条带 billing、easy、ambiguous 等标签,右侧是 Claude 在聊天里请你确认
图 3:build-eval 生成的审阅页:邮件路由应用的 24 条输入,每条带 billing、easy、ambiguous 等标签,右侧是 Claude 在聊天里请你确认

再定打分:先看能不能用代码,不行再请评委

输入定了,接着是 grader。Claude 会提议「够用的最便宜的那种」:

  • 程序校验:输出范围有限时用代码判,比如完全匹配、从固定标签里选一个、JSON 符合某个格式、测试通过。
  • LLM 当评委(LLM-as-judge):输出是开放式的,有很多种正确答案但质量标准明确时,默认用这种。评委是另一个模型,它读输入、输出和一份评分标准,返回分数和理由。评分标准要写成一条条可检查的陈述,而不是「1 到 5 分」这种量表。如果你手里有个基线可对比,评委就同时读两份输出,顺序随机,也不告诉它哪份是基线,让它选更好的。评委模型由你选,但不应该就是被测的那个模型。

Claude 会拿几条用例先打分,问你:有没有哪条你会打得不一样?文章特别强调,在相信一个评分器之前,一定要读一些打过分的记录,评分出错是评测配置失误里最常见的一种。

跑基线,得到什么

grader 验证过之后,skill 会告诉你评测集的规模(用例数 × 重复次数 × 模型,以及大约要跑多久),跑出基线,并给出带置信区间的分数。你拿到的东西是:用例、grader、运行器,每个用例一行 JSON 和一份完整的对话记录,还有一个朴素的页面,列出每个用例的分数并链接到它的记录(图 4)。想要图表之类更多的东西,直接跟 Claude 说,它会在旁边另建一个页面;默认这些附加页面都是静态文件,本地打开,不联网。

结果页示意:基线 0.681,每个用例有 3 次重复,点 rep 链接可看完整对话记录
图 4:结果页示意:基线 0.681,每个用例有 3 次重复,点 rep 链接可看完整对话记录

基线阶段的三项体检

跑基线的同时,Claude 会顺手检查三件事:

  • grader:对同一份输出评两次,看结论会不会变。
  • 管道:有没有超时、API 报错、答案被截断,避免把基础设施的噪声当成模型的波动。
  • 空间:基线如果已经在 95% 上下或更高,skill 会警告你,此时爬山的目标应该改成成本或延迟,而不是质量。

爬山:什么值得爬,怎么不爬歪

有了一个可靠的评分办法,就可以拿它来改进应用了。爬山特别适合调整那些在成本和效果之间做权衡的参数,比如 effort、提示词。文章给了三条选靶子的经验:

改起来便宜。 在时间、花费和精力上都便宜,改错了还能撤回。很多内部项目和客户把爬山对象放在文本上,比如 prompt 和 skill,好改好撤。相反,让它在爬山过程中随意改 Agent 的 harness(模型外面那层代码:提示词、工具、调用循环)代码,可能牵扯大量代码修改。

分数变化能归因。 分数的涨跌应该确实来自你在改的那个东西。文章举的例子是 skill 触发:好几个成功的爬山项目就盯着「skill 什么时候被触发」,评测指标(触发率)直接挂在被修改的 skill 描述上。

目标要划清。 一种常见的失败,是笼统地说「帮我提升性能」,而没有想过评测本身还有多少空间。评测已经接近饱和,或者改动范围太散(比如笼统地让它去改 harness),更容易原地打转。文章说,在各种项目里表现稳定的一个目标是成本:就算评测已经饱和,你也可以让 Claude 在保持分数不掉的前提下想办法降成本。

过拟合:评测是怎么泄漏进 harness 的

再好的评测也很少和你线上真正的任务分布完全一样,所以「过拟合」很常见:系统在评测上变好,在生产流量上没有。

文章的例子是:某个评测里有些任务用 OCR(文字识别)能做得更好,但你线上的任务基本用不上 OCR。评测里的 harness 于是给应用加了个 OCR 工具,分数上去了,对线上毫无帮助。更一般地说,爬山会往 harness 里加一些专门处理你评测例子里边角情况的功能,这些加进去的东西提高评测分,却带不到生产环境(图 5)。

评测泄漏进 harness 的五种方式:任务混合需要 OCR 就加 OCR 工具,任务都在 /app 就硬编码 cd /app,措辞独特就调 prompt 去贴措辞,读过的失败就逐个打补丁,评测题来自公开仓库就直接去取参考答案
图 5:评测泄漏进 harness 的五种方式:任务混合需要 OCR 就加 OCR 工具,任务都在 /app 就硬编码 cd /app,措辞独特就调 prompt 去贴措辞,读过的失败就逐个打补丁,评测题来自公开仓库就直接去取参考答案

图上的五行,前四行是渐进的贴合:任务需要 OCR 就加工具;任务都在 /app 目录就写死 cd /app 再跑 pytest;措辞独特就把 prompt 调成贴着这些措辞;失败看多了,就一个失败打一个补丁。最后一行是最直接的泄漏:题目来自公开仓库、仓库里有答案,那 harness 就学会了直接 curl 参考解答。

三道防线

  • 切分用例。 一部分是 train(训练集,爬山器可以读),另一部分是 test(测试集,从不给它看)。如果 train 分数涨了而 test 不动,那是过拟合最常见的警告信号。
  • 绝不把失败内容贴进 prompt。 爬山器读了失败的对话记录,也不能把失败的内容原样贴到提示词里。这正是图 5 第四行「一个失败打一个补丁」的做法:补丁越贴着那几条具体失败,越像是把评测题抄进了 prompt,分数涨的是这批题,不是能力。
  • 答案在结构上让模型拿不到。 模型有时会 reward hack(钻评测空子),直接把答案找出来。所以要让答案从结构上就在它够不着的地方。

/claude-api hillclimb:一轮一个改动,一直盯着 test

这条命令的入口是:你有一套评测,想让 Claude 沿着你的目标改进。你可以选 Claude 允许改什么:

  • 你的系统提示词;
  • skill 或指令文件;
  • 工具描述;
  • 模型选择、effort 档位和其他 API 参数;
  • 你的 harness 代码。

开始之前,Claude 会问你想优化什么(比如性能,或者「性能不掉的前提下压成本」),然后把评测集随机分成 test 和 train。如果目标是成本,它会考虑几个常见的成本来源,包括提示词缓存、检查 prompt 和所选模型是否兼容、以及选模型和 effort 档位。

第一轮之前,它先检查评测的噪声(分数纯靠运气能晃多远)是不是小于你愿意采取行动的最小提升。噪声是拿基线重复跑 N 次量出来的:同一个版本跑几遍,分数本来就会晃,晃的幅度就是「噪声底」,之后任何改动的提升,得高出这个底才算数(图 6 里标的「pre-flight」就是这一步)。如果噪声比你要的提升还大,它会直说,并建议加重复次数或加用例。

每一轮怎么走

每一轮,Claude 读上一轮 train 的对话记录,提一个改动,以补丁的形式提出。它的目标是这个改动的效果能在评测噪声之上显出来:所以要从根上修那个失败的行为(改写引起它的段落,或者补一条缺的规则),而不是换个说法改一行。然后拿补丁后的版本跑评测。

这时候有个检查:如果 train 涨了而 test 没动,Claude 就怀疑是过拟合,把补丁回退;如果有退步,回退;train 和 test 都涨,才保留(图 6)。

爬山循环:分析器只读 train 的失败并提出一处改动;test 每轮打分但从不给分析器看;train 和 test 都涨则保留,train 涨 test 不动则视为过拟合并回退,任一下降视为退步并回退
图 6:爬山循环:分析器只读 train 的失败并提出一处改动;test 每轮打分但从不给分析器看;train 和 test 都涨则保留,train 涨 test 不动则视为过拟合并回退,任一下降视为退步并回退

停滞了怎么办

分数连续两三轮没变,Claude 会去读剩下的每一个 train 失败,按原因分类。如果发现没有哪个单独的修复能超过评测的噪声,它也会提前这么做,并建议加重复或加用例,而不是把轮数浪费在小到测不出来的改动上。这一步能抓到有歧义的用例、harness 错误和不同次运行之间的波动。只有真正的失败才会被放进后续的爬山轮次。

结束时你拿到什么

爬山结束,Claude 把你的代码留在「对你的目标而言 test 上表现最好」的那个版本,并给出 test 结果与基线的对比,带置信区间(图 7)。如果提升在噪声范围之内,它会明说,并建议不要合并。

报告示意:基线 0.681;v1「给每个队列下定义并加平局规则」test 0.875,标为最佳;v2「加两个示范例子」train 0.917 但 test 没有跟上,被回退
图 7:报告示意:基线 0.681;v1「给每个队列下定义并加平局规则」test 0.875,标为最佳;v2「加两个示范例子」train 0.917 但 test 没有跟上,被回退

两个实际案例

案例一:降成本,同时提准确率

Anthropic 在一个内部客服基准上跑了 /claude-api hillclimb,目标是降成本,同时提升表现。基准共 44 张工单,30 张用来搜索,14 张留出。起点是 Opus 4.8,默认(高)effort,在搜索集上的决策准确率 74.4%,每张工单的 token 成本 4.6 美分。

爬山先审了一遍提示词,删掉了强制的工具调用「仪式」、一个草稿步骤,以及互相矛盾的规则。接着试了 Opus 5.5 的低 effort:准确率 87.8%,超过了基线,成本降到 1.9 美分,不到起点的一半。

这里面有一部分节省来自 Opus 5.5 的定价:输入和输出 token 比 Opus 4.8 便宜 20%,缓存读取便宜 60%。因为 Opus 5.5 过了线,爬山接着往下降一档,看更便宜的模型行不行:Sonnet 5 低 effort 得分差不多,88.9%,成本约一半,1 美分左右(图 8)。

成本导向的爬山:从 Opus 4.8 高 effort(74.4%,4.6 美分)到 Opus 5.5 低 effort,再到 Sonnet 5 低 effort,最后改提示词,图中读数均为 train 集
图 8:成本导向的爬山:从 Opus 4.8 高 effort(74.4%,4.6 美分)到 Opus 5.5 低 effort,再到 Sonnet 5 低 effort,最后改提示词,图中读数均为 train 集

最后,Claude 改进了提示词,加了路由规则和一条退款上限的交叉引用,让 Sonnet 5 提到 98.9%,成本基本不变。在从未参与搜索的 14 张留出工单上,最终配置得分 90.5%,原配置是 78.6%,而成本是原来的五分之一左右。

值得注意的是:图 8 和前面几个数字(74.4%、87.8%、88.9%、98.9%)都是在 30 张搜索工单上读的;对外可以拿来说话的,是留出集上的 90.5% 对 78.6%。留出集只有 14 张,这个差距有多稳,文章没有给置信区间。

案例二:提升 claude-api skill 自己

第二个例子是 claude-api skill 本身。它负责指导如何使用 Anthropic 的 API 和 Claude 的通用技巧(包括本文讲的这两条子命令)。团队想确认这个 skill 能写出正确调用 API 的代码,于是基于官方文档做了一套评测。

起点是 66%。他们给爬山器开了文档和 SDK 的访问权限,让 Claude 自己找错并纠正(图 9)。Claude 发现 skill 缺了八项功能的说明,补上后升到 74%;接着找到 C# 和 Java 类型表里的错误,改完到 77%。

性能导向的爬山:从 66.1% 到 87.9%,分为补缺章节与类型表、修改 skill 教 Claude 写代码的方式、修 grader 并继续改 skill 三段
图 9:性能导向的爬山:从 66.1% 到 87.9%,分为补缺章节与类型表、修改 skill 教 Claude 写代码的方式、修 grader 并继续改 skill 三段

这一路一共跑了 24 轮。中间分数停滞两轮后,Claude 把剩下的失败按根因分类。这一步很特别:普通的一轮是针对最常见的失败改一处,而这一步不改任何东西,只把所有剩下的失败按原因分类。这个「反思」步骤有几处价值:

发现 skill 里内容明明有,但 Claude 写的仍是老的 API 写法。 这是从训练时学到的先验里冒出来的。爬山器于是在 skill 靠前的位置加了一张对照表,把 Claude 记得的旧写法引到现在的写法:比如固定 token 预算的 extended thinking(扩展思考),现在的新 Opus 模型 API 已经拒收,要换成 adaptive thinking(自适应思考);旧版的 web search 和 web fetch 工具,要换成当前版本。它还把 C# 和 Java 里「不要用固定预算思考」的警告,挪到了自适应思考示例的前面。分数升到 80%。

有些任务怎么都不涨,是评测本身有毛病的信号。 补过明显的内容缺口还是不涨的任务,往往说明题目或 grader 有问题。一道题要求写一段捕获某一种错误的代码,而 grader 却要求至少三层的错误链;Claude 把题目改了。另一个 grader 的说明和文档矛盾,用真实 API 一测,是文档对,grader 错。处理完这些,再加上更多 skill 改动,分数到了约 88%。

怎么用

文章最后给的入口很直白:

  • 想为某个问题生成一套评测:运行 /claude-api build-eval。你可以给它样本(比如运行记录)来引导它。它会按文中的原则设计用例和 grader,并保证用例和 grader 都要你批准。
  • 已经有评测、想让 Claude 沿着你的目标改进:运行 /claude-api hillclimb,目标可以是提升表现,或者表现不掉的前提下压成本。它会在爬的过程中查过拟合,并在第一轮之前和分数停滞时,检查评测本身的毛病,比如把看起来正确的答案判错的 grader,或者 harness 错误。
来源
Automating eval design and hillclimbing with ClaudeLance Martin / Anthropic·查看主材料
↑ 正文结束
✓ 本篇全文免费开放

会员可复制、下载全文 Markdown,还能让你的 AI 订阅和提问。

阅读原文 ↗
📮 新解读第一时间进邮箱

读完觉得有用?留个邮箱,每篇新解读发布就送达,随时退订。