量到的会修好,没量的幻觉还在|AI Engineer × Laurie Voss
- 原始标题
- How to Know If Your AI Agent Is Any Good: Evals With Phoenix & Claude — Laurie Voss, Arize AI
- 节目 / 来源
- AI Engineer
- 嘉宾
- Laurie Voss
- 原始发布日期
- 2026-10-18
- 时长
- 约 116 分钟
- 内容类型
- 会议工坊 / 智能体评测与可观测工程
- 原始内容
- 前往原始来源 ↗
Laurie Voss 是 Arize AI 的开发者关系负责人,以前在 npm 做 JavaScript。字幕把 Arize 听成 Arise、ARIS,名字听成 Lauri。下文按节目标题的拼写。
他假定房间里的人已经有一个带模型的应用。试了几次,看着不错,就上线了。然后有人用了一种没预料的方式,它坏了。或者改系统提示把语气修好了,机器人开始编造产品功能,要等客户撞上才发现。每改一次提示,用户会送来的每一种输入都可能受影响,手测不完。修好一处,另一处坏。评测要交出一个能跟踪、能比较、能据此行动的数。
演示是一个故意写简单的金融分析智能体。你给股票代码和关注点,它先上网搜,再写报告。后半场的对照可以核对:可执行性从 16 次里的 5 次及格,改提示之后到 48 次全过;忠实性从 16 次里的 2 次,到 48 次里的 3 次。提示写明只用研究里出现过的数字,编造还在。量到的那一项会修好。没单独量住的幻觉不会跟着满分。
原始来源:How to Know If Your AI Agent Is Any Good: Evals With Phoenix & Claude — Laurie Voss, Arize AI。中文深度整理,非逐字翻译。本文依据 YouTube 自动生成的英文字幕,专有名词和数字可能有识别误差。
同一句提示,没有可断言的字符串
他对做过工程的人把评测说成一句:轨迹基本上是日志,评测基本上是测试,评测是在轨迹上跑测试。和单元测试的差别是,模型的输出两次不会逐字相同。两份完全不同的回答可以都对,一千份也可以都对,只是对法不同。没有一条期望字符串可以断言。人退回去看「这看着还行」。这抓不住回归,也跑不进没有人盯着的持续集成。持续集成是每次改动自动跑检查的流水线。
三次试运行不是测试套件。每个一两周有人发新模型,想换的时候,没有一套评测就不知道哪几项更好、哪几项更差。工坊后半用同一套评测比较 Haiku 4.5 和 Haiku 5.5。开场幻灯片说从 Claude 4.5 升到 Haiku 5.5,他称 Haiku 5.5 大约一周前刚发布。代码里真正当基线的是 Haiku 4.5,理由是快、便宜,错得可预期。前沿模型也会错,但要更复杂的任务,不适合这场演示。
评测有三种,同时用。代码评测快、免费、脆,就是普通函数。输出是不是合法 JSON,是不是少于 500 词,有没有提到你问的东西。毫秒级,不花钱。很多合法回答,字符串对不上。
第二种让另一个模型当裁判,按量表打分。量表是从机器学习借来的词,他说就是规则。裁判懂意思:准不准,有没有贴着来源,语气对不对客户。裁判自己也是模型,所以两次不一样,会错,会花钱,还会自信地错。要检查裁判。
第三种是懂这个领域的人来读、来打分。人是质量的金标准,也慢,也贵,还会烦,开始扫读。
答案确定时用代码:格式、长度、必填字段、禁用说法。需要理解时用裁判:准不准、有没有依据、有没有用。人用来看还没见过的失败,也用来检查裁判判得对不对。
智能体把很多步串在一起,更难。很早的一步错了,后面每一步更偏。自信地错,比明显地错更麻烦。你要特斯拉的报告,它搜到的是 18 世纪那位发明家,写成一篇格式漂亮、语气好、语法对的报告,主题完全错。格式检查一项都不会失败。
反方向也会发生。他说 Anthropic 跑过一个基准,字幕听成 Ta2 bench,模拟客服对话。本文不改成另一个基准名。用户要改航班座位。按测试,对方坐经济舱,经济舱不能换座,智能体应该失败。Claude 发现可以先升到头等舱,头等舱可以换座,换完再降回去。用户要的事做成了,测试说失败,因为规则里这件事不该做成。智能体会走出你没写进规则的解法。测试得留出这种余地。
一条评测结果一般有分数和标签,裁判再加解释。分数通常就是 0 或 1。标签是人能读的词:通过、失败,可执行、不可执行。解释最值钱。它说缺了什么、错在哪,常常指向提示该改的那一句。规模上来之后,可以把几十条、上百条、上千条解释再交给一个模型,看是不是同一种系统性失败,再把这批轨迹交给智能体去改。
他要搭的环是:记下轨迹,读它做了什么,为要紧的事写评测,检查这些评测可不可信,改智能体,证明改动有效,放进持续集成锁住。
父级 span 罩住两个回合
记轨迹用 Phoenix。它是 Arize 的开源可观测平台,从你用的框架里收集轨迹,把评测存在轨迹旁边,也做数据集和实验。可以只跑在自己的笔记本上,也可以放到服务器给团队看。
埋点大多落在 OpenTelemetry 上。上面还有一层叫 OpenInference,他说法是 Arize 在维护。框架里往往已经埋好。调用 register,把已经埋好的点打开,指到 Phoenix。不必为每一次调用手写一行日志。
仓库是 TypeScript。他说 Phoenix 的 Python SDK 同样完整。脚本不多:instrumentation.ts 负责埋点,agent.ts 是智能体,prompts.ts 是要改的提示,评测在 evals,测试输入是 queries.json。每一步尽量是一条能单独跑的 npm 命令。落后了可以用他放进仓库的种子数据跳到下一步。
智能体用 Claude Agent SDK,底下和 Claude Code 是同一台引擎。两套 Claude 会互相配合,把评测绕过去:SDK 容易捡走你这台 Claude Code 里的工具、技能和密钥。他在选项里把笔记本隔开。这是 SDK 和 Claude Code 同时开的风险,不是 Phoenix 的问题。工具、网页搜索、跨回合对话都有。别的框架他点了 Vercel AI SDK、Mastra、LangChain、OpenAI 的智能体 SDK,说 Phoenix 都有适配。演示只能挑一个。
TypeScript 有一个坑。Claude Agent SDK 是 ES 模块,导出是只读的。Python 里可以换掉对象再记日志,这里不行。要用手动埋点交回来的那份拷贝。不用那份,不会崩,只是什么都不记。仓库里一律从 instrumentation 文件引入这个 SDK。
起点模型字幕有一处听成 Haiku F 4.5,下文按 Haiku 4.5。允许的工具是网页搜索。权限模式是不要询问:无人值守,不能停下来等人说可以。这个选项后面变成一种失败。
SDK 里一个回合是一次 query。结束时的结果消息带最终文本和会话编号。把编号当作 resume 传回去,下一回合记得上一回合看见的东西。研究做完,再让它就这份研究写报告,靠的是同一个会话。
两个回合包进一次 trace agent,是为了有一个父级 span 罩住全部。span 是轨迹里的一步。不包的话,Phoenix 里是两个并列 span,能读,只是费劲。
prompts.ts 里的提示是故意写坏的。研究一句,写作一句。跑起来的路径按设计不确定:搜几次、用什么词,由它自己决定。跑两次,两篇都可能行,也可能一篇好一篇错。不能从输入预测输出。
他当场那次把含糊暴露出来。告诉它写报告,没告诉它写到哪里。它假定要写成文件,然后来要写文件的权限。不要询问的模式下它不能问,于是失败。有时它又能自己想通,把报告打到命令行。
Phoenix 里不用额外打日志。网页搜索的输入输出、它试图写进本机路径然后失败,都在 span 里。span 的种类会标明这是智能体、工具调用,还是一次模型调用。工具调用的输入是 JSON,后面第一条代码评测就靠这种结构。另外还有耗时、token 数,也常常有花费。token 是计量模型用量的单位。命令行上只剩一句含糊的出错时,轨迹里仍能看见失败的工具调用,以及它在做没被授权的事。
一条轨迹不够下结论。npm run batch 连续跑 15 条查询,一次 5 条。失败可以用种子项目 Phoenix 101 golden,里面是他事先跑的 16 次。
查询里有苹果、英伟达、亚马逊,也有故意的边缘。比较苹果和微软,比单家公司难。Rivian:字幕说它不是上市公司,所以数据少。公开记录里,Rivian 以代码 RIVN 自 2021 年 11 月起上市。这句不采用,只保留他把它放进边缘案例。可口可乐和科技公司不是一类生意。假代码前半字幕写成 ZZQ,智能体的回答和后面的回归集写成 ZZZQ。他希望智能体说这个代码不存在,而不是编一家公司,或猜你指的是谁。还有一条特斯拉,关注点写成「yo,现在该买吗」。真人就用这种说法问。
量之前要先写下好是什么。没定义能工作,就不能说它不工作。对他这个分析师:用真实的、当前的数据;写对公司;贴着它实际找到的东西;还要说出买入、持有或卖出。写下来之后这些要求听着显然。写下来之前,团队里的人可以各有一套。定义好要和非技术的干系人一起做,他们是领域专家。工程师对好输出有自己的猜测,和专家不一定一致。
没有用户时可以先造问法,让模型故意变着问:研究特斯拉的财务表现,特斯拉股票怎么了,yo 现在该买吗。人再看一遍清单。合成问法适合起头,偏保守。他举的远法是,对方不来要金融分析,而来问孩子的健康。智能体对这种输入也得有一个做法。有了真实流量,真实流量是测试的金标准,要尽快进数据集。
他手走埋点,是为了让人知道它在做什么。Phoenix 的命令行有 setup,会让编程智能体把埋点加到应用上,直到装上为止。Claude Code 有插件。Cursor 和 Codex 也有。别的编程智能体用一份技能文件。Phoenix 还会交一份错误分析技能,说明分析要怎么做才算做对。
先写笔记,再归类
写任何一条评测之前,先把轨迹读完。至少十来条:输入是什么,输出是什么,具体错在哪。造智能体时要亲手看,才能碰到没预料的未知。他说 Anthropic 的团队会定期手读评测抄本,内部还做了工具。先自动化、后理解失败,量到的会是容易量的。
16 条自己读,没问题。1600 条会拿走一周。编程智能体可以读轨迹、找奇怪的地方、把类别写回去,不会总找到你预期的东西。手工抽读仍然值得。
做法是归纳失败类别,计数,再把每个类别作为注释写回对应轨迹。注释是附在轨迹上的一段人能读的字。
类别不要先猜。先用人类语言记下看见的:这条坏是因为这个,这条好是因为那个。他借用的词是开放编码。笔记够了,再收成类别,那是主轴编码。一开始就想好类别再往里填,类别会太窄、太宽,或者根本不是实际发生的失败。
他的编程智能体给出一个类别,叫 harness leakage。harness 是包住模型、让它能调用工具的运行环境。这个类别指它反复请求自己并没有的权限。各人的智能体不同,类别也会不同。
种子数据里几条可以对上。ZZQ 那条,输出说这个代码不像有效或仍在交易的金融代码。这是他希望的做法。回答里写的是 ZZZQ。
可口可乐先道歉,说受限模式不能直接写文件。然后结论是高质量、低风险的分红投资,KO 对风险厌恶的投资者是长期收入工具。它没有说买入、卖出或持有。他把可执行性收成一条硬标准:必须说出该买、该卖,还是该拿着。
Rivian 那条满是表情符号,开头问要不要创建报告文件。前面已经告诉它不许问。
特斯拉那条是「yo,现在该买吗」。它写分析师共识是买入:50% 说买,52.6% 说持有,13.1% 说卖。加总大约 116%。字幕在 52.6% 后面又叠了一个 6%,加法按这三个数能对上 116%,下文用 52.6%。它没发现算术是错的。两次网页搜索,一次大约 50%,一次大约 13%,两份不是同一个数据集,被捏在一起,然后写成 116% 的分析师这么说。每次搜索结果本身是好的,所以是推理错误。完全编出数字,才是幻觉。答了一个没被问的问题,是范围问题。原因不同,修法不同。答案错了只是症状。
最常见的失败是先看的地方,不一定是先修的地方。优先级是频率乘严重程度。他的例子:40% 的时候在幻觉,这是问题;1% 的时候教用户怎么造炸弹,金融分析师不该做这件事,哪怕只有 1% 也先修。
每一层检查都有洞。他借安全领域的瑞士奶酪:代码评测抓住格式,漏掉意思;模型裁判抓住推理缺口,漏掉一些细的幻觉;人常常抓住细的,看不了每一条。洞不在同一个位置,叠起来才难穿透。所以做好几条小评测。刚开始的人容易把能想到的失败全塞进一个模型裁判。这种做法又不可靠,又复杂。这一条后面叫做 God evaluator。
代码能判的,不要叫模型
代码评测没有模型,没有 API。他选的第一条:报告有没有提到被问的那只股票。问特斯拉、写成微软,这种事至少发生过一次。代码在不在,是二元的。为这件事再叫一个模型,过头了。
从 Phoenix 取 parent ID 为空的 span,也就是顶层那一层。助手叫 get agent runs,交回 span 编号、输入、输出,以及研究回合的输出。后面忠实性要用研究回合。
检查用 Phoenix evals 里的 create evaluator。给一个普通函数,标明是代码评测。函数拆出被问到的代码,看每一个是否出现在报告里,返回标签和分数。缺了谁,失败信息里写上谁。输入已经是 JSON,代码和「报告该写什么」分开。输入如果不是结构的,就得再叫一个模型抽出字段。
跑完用 log span annotations 挂回 span。今天每条评测都是:取出运行,评测,记回去。命令字幕念成 npm run eval code,后面工具那条念成 npm run eval tools。冒号如果被听成空格,本文不改写成另一种脚本名。代码评测几乎瞬间完成。
字幕说 15 次通过、2 次失败。种子集是 16 次,这两个数对不齐,下文不把 15 加 2 当成 16 的分法。点名的两次:特斯拉的报告里没有特斯拉;亚马逊的报告里没有亚马逊。亚马逊那次问的是 AWS 的盈利,报告只写 AWS,没写作为零售公司的亚马逊。
最笨的检查已经能抓到写错对象,而且不花钱。代码评测也可以查数据库里的状态,或再调一个 API,核对它相信的股价是不是真的股价。条件只有一条:同样的输入,每次同样的答案。禁用说法也可以放进来,比如 “as an AI language model”。
要防的是去评路径。很容易去查它是不是先搜索、再调另一个工具。他说 Anthropic 的建议是这种要求太死。智能体可以走出你没想到的步骤。评的是结果。代码检查不关心数据怎么来的,只关心报告里是不是这家公司。轨迹级评测才评路径。今天没做那一类。
正确性全是零,问错了
代码能检查代码在不在,不能判断分析好不好。数字准不准,建议的推理站不站得住,这是意思。
模型裁判有三块,Phoenix 把它们分开:打分的模型,告诉它好长什么样的量表,被打分的例子。同一套规则可以换模型,同一个裁判可以换规则。
自带的有正确性、忠实性、完整性、幻觉、拒绝、个人敏感信息、毒性。智能体还要看工具:选对了没有,参数对不对,结果用得是不是像样。这些是已经写过的提示。
TypeScript 这边通过 Vercel AI SDK 调模型。他用 Claude Sonnet 5.5 当裁判,智能体跑在 Haiku 上。裁判要强过被评的那一个,所以给 Sonnet 或 Opus。更好的是换一家来评,因为 Claude 有同模型偏向,更喜欢别的 Claude 写出来的东西。还有一行关掉裁判自己的轨迹。他的测试数据里忘了关,轨迹里塞满裁判在评自己。
正确性看起来是显然的第一问。16 份报告全是 0。裁判只能用它自己知道的东西判断对错。他说 Claude 当时的知识截止大约在一月,报告在谈十月的股价。哪一年的一月,字幕没说。本期是 2026-10-18。裁判把十月的价格当成未来,当成幻觉。全场 0 分说明这条问法不合适。
16 条解释里有 7 条抱怨核对不了新鲜数据,这是评测在错。不少解释也指出真问题:数字加不齐,日期互相矛盾。一个铺满的 0 分,分不开这两件事。
忠实性问的是:给定它拿到的数据,报告是否站在这些数据上。要三样:用户问了什么,报告是什么,上下文是什么。上下文已经在轨迹里,每次网页搜索是自己的 span,研究回合的输出是它自己的笔记。
他的第一版只把笔记给裁判。解释里,一些数字被标成编造,因为评测没交出网页搜索的原文。现在这版同时取出原始搜索结果和笔记。
他的忠实性有很多 0,但不是全部。微软那条:回答加了上下文支持不了的说法。Azure 是第二大云厂商,积压订单给了三年可见度,还有暗示出来的财年目标。字幕先听成 FY202,后面又说 2027 的目标是编的,因为任何搜索结果里都没有。下文记成他后来说的 2027。英伟达那条:两个不同的数据点被捏在一起,裁判把这抓成推理错误。16 份里 14 份被标成不忠实。解释比一个光秃秃的 0 有用。
工具调用发生在任何人读报告之前。工具选择问它有没有选对,或者在不必搜索时搜了。工具调用问参数像不像样。工具结果处理问它拿到结果之后做得像不像样。轨迹记下它调用了哪些,没记下它本来可以调用哪些。这份清单得自己写,文件名字幕连成 tool selection.ts。
16 次写作回合里,13 次试图存文件。试了两次的,裁判判失败的有 6 次。只试一次的 7 次里,过了 6 次。字幕把这两句挤在一起,数字只保留能对上的。这些解释里只有一条说:用户从没要求把文件存下来。
写作提示是:根据上面的研究,写一份简洁的财务报告。没说写到哪里,没说写给谁。有的解释认为,write 存在而且安全,写到文件说得通,只是又多了一次多余的 bash。评测站在智能体一边。你告诉智能体的话,和你告诉评测的话,会互相顶上。
评测结果挂在它打分的 span 上。可执行性和正确性挂在根上。工具选择挂在做出那次调用的回合上。可以按分数排序,从失败点进导致它的那一步。
选对评测,胜过把一条评测调细。正确性只告诉你一片都错。忠实性告诉了你不少。
量表有五块,神级裁判没有
内置评测盖不住「给我买入、卖出或持有」。他自己写。他说好用的评测提示有五块。
第一块,角色和上下文。「你是专家」这种句子在并排比较里有一点差别。要紧的是上下文:这是财务报告,关心的是人能不能按它行动。
第二块,标准要能做是或否。「有帮助、准确」做不到。可执行在他这里是:给出具体建议,点出具体风险,向前看。标准来自前面的错误分析。只罗列数据、不做解释,是读轨迹时看见的,所以写进量表。
第三块,数据各自包进 XML 标签。Claude 在大量 XML 上训练过。成对花括号是模板变量,Phoenix 用每个 span 的输入和输出填。指示、输入、输出的边界要清楚。这挡提示注入,也免得模型把自己搞混。例子要标成例子,否则例子会被当成待评的数据。
第四块,带标签的例子。他喜欢放,也说评测圈子里有争议。标准用抽象的话讲意思,例子把意思做成能看见的样子。要有例子跑一次、没例子跑一次。例子有时有帮助,有时过拟合:不像例子就不算,或者每份输出都往例子上靠。
他做了对照。带着例子,三次运行里和他的一致都是 16 次中的 15 次。扔掉例子,两次 16 次全中,一次 15 次。有一份微软报告说了买入,没写风险。他标成可执行。例子写必须包含风险,裁判就标成不可执行。他说这里开放:人的黄金标签更对,还是更严的裁判更对。他承认自己标的时候比较松。
他给现场看的可执行例子有具体数字、收入增长、相对行业的估值、一个具体风险,以及一条你能照做的建议,包括什么情况下改主意。不可执行的例子可以句句为真。「投资者应考虑各种因素」仍然只是一句空话。
第五块,约束回答。以前得要求输出必须是某两个词之一。现在用工具调用交输出,选项定义在工具上:可执行 1 分,不可执行 0 分。接线是 classification evaluator。文件名字幕连成 evalactionability.ts,五块都在里面。
他的 16 份里,5 份可执行,11 份不可执行。全对和全错都帮不上忙。切开的才是一座能爬的坡。Rivian 从未给出买入、持有、卖出,或等价的下一步。英伟达的结尾是风险水平中等,他当成含糊的评级。Meta 的裁决只是仓位扎实。同一件事反复出现:它不肯给出具体的买、卖、持有。一条解释写着,JPM 的利率敞口和贷款增长都分析了,仍然没有这三种建议。
评测提示要当代码。措辞改一处,判断会翻。这句有一次演示撑着。例子一开始是纯文本,结果是一串不可执行,裁判分不清数据和例子。包上 XML 之后,同样的数据、指示、输入和输出,变成可执行。没有别的改动。所以要版本化,要检查,要测试。
God evaluator 把准确性、语气、完整性、格式、政策塞进一条提示。失败时不知道是哪一项。再给 15 个标签,更难追踪。按维度拆开:忠实性一条,正确性一条,可执行性一条。
还要分开护栏和北极星。护栏挡住发布。编出来的股价该停运。北极星是在瞄准的东西。顺便再建议几只股票,评测可以去找,不必用它卡住发布。
把裁判当成分类器
裁判说有些报告不可执行。裁判本身还没被标定。它是分类器:看着报告,预测可执行或不可执行。拿预测去对人类专家的标签。这次的专家是他自己。他说这不一定是你想要的那位,只是演示。
轨迹上有铅笔按钮。他事先建了 human actionable,16 份按给裁判的同一套标准标完,放在种子项目里。这就是黄金数据集:以人类目前所知,答案是对的那些例子。给自己的标准要和给裁判的一样具体。微软那次,规则里有风险,他却放过了没有风险的买入。于是两边不一致。他后来觉得更严的那一边更对。
疲劳会把标签做坏。一百条看到后面,人会扫。五十条标仔细,好过一百条点过去。生产里遇见棘手的例子,弄清本该的答案,继续加进去。
任务要是人能通过的。智能体每次都失败,几乎总是任务坏了。每道任务要有一个已知的好答案,证明做得成。两个方向都要测。只检查它在该搜索时搜索了,会把它推成永远搜索。不要在测试集上调参。常见切分是 75% 用来调,25% 用来验。16 条时,测试大约只剩 4 条。到 100 条才比较能看。Phoenix 的数据集自带切分。
脚本找出有人类标签的报告,按 span 编号排序,每四个里的一个进测试,其余进开发。先排序,同一份报告每次都落在同一个切分。span 编号可以点回原始运行。
然后做一次实验。实验是数据集、任务、评测器。这里的任务是裁判,评测器是一条很小的代码:裁判的标签是否和人的一致。只跑开发切分。命令是 npm run meta。他的 12 份开发报告,每次都一致。他说这只说明还没有看见问题的迹象。
最难标的两份是可口可乐和微软。可口可乐在加上 XML 之后翻过。报告说 KO 对保守的、以收入为导向的组合是理想选择,听着像建议。他来回改,最后判定不算。裁判也在这句上来回。
微软说买入,给了理由和时间范围,没有风险。量表写了要指出具体风险。他判定没问题。裁判说风险很弱、没有风险一节。字幕紧接着又说它跨过了可执行性的门槛,但跨得不多,而且和人的判断一致,包括这份含糊。这几句互相挤。能留下的是:有买入,没有风险一节;两边没有用同一松紧去用这条标准;解释里同时出现「不行」和「勉强过线」。
他加了一句:四条标准全都满足,报告才可执行。先前只是说应该包含。开发集从 12/12 变成 11/12,坏在微软。测试切分上苹果也坏了,裁判认为风险一节不够大。写得更死,评测可以变得更不像人。
脚本打印精确率和召回率。精确率:裁判说不可执行时,有多经常是对的。召回率:所有不可执行的报告里,抓住了多少。他优先召回。误报是花一两分钟看一份其实没问题的报告。漏报是坏报告到达客户。召回上去,精确率会下来。应用得自己选哪边更不能接受。
裁判有偏向。位置偏向:有的模型偏向先出现的选项,有的偏向后出现的,所以要换位。长度偏向:喜欢长回答。信心偏向:喜欢听着流利、自信的回答。自我偏好:评自己的输出时打分偏高。所以用 Sonnet 评 Haiku,理想是再换一家。
人彼此也经常不同意。两个专家、同样的输出、同样的量表,一致程度有一个分数叫 Cohen's kappa。他说这种任务常常低到 0.2 或 0.3,比碰运气好得不多。字幕写成 02 or .3,下文按 0.2 和 0.3。标杆是另一个人的表现。不需要、也不会有一个和你百分之百一致的裁判。它的优势是可以跑过几千个例子。
失败应该看起来公平。你看着失败说这其实没问题,问题大概在评测。他举的例子,字幕说 Claude Opus 4.5 最初在一个叫 Corebench 的基准上拿到 42%。这个基准测智能体能不能复现科学论文。本文不改成另一个基准名。一位研究者去读抄本,发现有的题是用另一种方式做对的。字幕把精度要求听乱了,六位、四位、两位挤在一起。能核对的是后面的判断:任务描述有含糊,有些任务复现不了。测试改完,他给出的分数是 95%。SWE-bench 一类基准会出第二版、第三版、第四版,也是因为标准本身在被手工改。评测集要不断再评。
没量过的改动只是感觉
知道有些报告不可执行,也知道原因,然后改提示。拿几个例子眼睛看,就回到感觉。实验是同样的输入、同样的评测、改前和改后。
Phoenix 里可以把评测滤到不可执行,收成数据集,实验只跑这一截。修的是评测找出来的东西,每一处改动对应一条发现。裁判说没有建议,就要求明确建议。提到风险但没有证据,就要求风险带上数据。忠实性发现编出来的数字,就写只用研究里出现过的数字。轨迹里老在存文件,就告诉它用回复交出报告。
实验的任务这次跑整个智能体,也可以只跑一个子任务。任务交回报告和研究。忠实性把研究当成上下文。他跑了三次。单次运行会把你带偏,两个方向都有。
多次运行他分成两种。pass at K:K 次里至少成功一次。pass to the K:K 次里每一次都通过。K 变大,至少成功一次更容易,每一次都通过更难。编程助手第二次做对就行,前一种够用。客服每五次错一次,或金融分析师给出不准的建议,要的是后一种。
改进的顺序按一次改动有多有用排。先是数据质量。数据难读,后面怎么调都没用。然后是提示,今天大部分时间在这里。然后是模型。杠杆大,同时改掉一大片,换成更大的模型通常更贵。最后是超参数,比如温度。他说现代的 Claude 模型已经不让你传温度。这是最没用的一个旋钮。
例子数:10 到 20 个能给出方向。生产要几百个。误差要变窄,例子数得乘四。从 25 到 100 是还费得起的一跳。再到 400,就进了人们懒得做的地带。生产失败丢进数据集越多越好。
改进之后,可执行性从 16 次里的 5 次到 48 次全过。字幕同一句里还有一项从「15 或 16 次里的十几次」到 48 次全过,哪一项没说清,下文不给它安名字。忠实性从 16 次里的 2 次到 48 次里的 3 次。原先通过的那 5 份,改进之后仍然通过。可执行性到了满分。忠实性仍然差,尽管提示写着只用研究里出现的数字。
一行提示,把量到的那一项修到满分,没有修好编造。各次运行仍会给出不同的建议。他没有再点开看。
16 份里 5 对 11 这种分布,他称为能力评测。量的是还不会的事,用来看自己往上爬。稳定通过之后不要扔掉,转成回归评测,放进持续集成:曾经每次都过,忽然不过,就停止发布。
爬坡的另一条路是换模型。实验传入 Haiku 5.5,三次重复他没有在现场等完,直接给了结果。忠实性好了三倍多,仍然很糟,编造还在。前后一致的判断变好了。花费大约四倍。值不值,是生产里的决定。
它变一致的办法是更保守。字幕说 45 次调用里 41 次是持有,各次运行之间一致;同一句里又冒出 41%。下文采用 45 次里的 41 次。一致性检查变好,是因为每次挑同一个答案。他觉得这大概更差,接下来要迭代的是 Haiku 5.5 过于保守。至少知道变的是什么。
价值在这一圈,不在某一次分数。跑,读失败和解释,看见模式,改提示或工具或数据,再跑。可以从「我觉得它能工作」走到「我可以拿给你看」。
爬完的坡,门装在持续集成上
发得快的团队会在功能之前写评测。他称为评测驱动开发。比如支持智能体在退款之前必须先核对客户是谁。先写这条评测,「做完」就有了能爬的定义。
放进持续集成时,字幕把测试运行器听成 VEST。JavaScript 里和这句对得上的是 Vitest。下文按 Vitest 写。Phoenix 可以直接接进去。agent.eval.ts 就是普通测试文件。回归集里每条查询一个测试:可口可乐,苹果对微软,Rivian,假的 ZZZQ。每个测试跑智能体,记报告,再跑前面那套代码检查和可执行性裁判。不必为持续集成新写评测。
接受标准卡住构建。提到股票代码是护栏,必须在谈对的公司。可执行性是目标,平均值要维持在 0.8 或更好。字幕说的是 08。裁判对单份报告有噪声,所以卡平均值。
失败时长这样:四个测试都跑了,每份都提到自己的代码,Rivian 不可执行,平均值出来是 75。字幕没说小数点。四份里三份过,对应 0.75。它报告的是没达到。全过的那次是绿的。失败时有解释,说明为什么错。同一套可以在 GitHub Actions 里跑,Phoenix 作为服务容器拉起来。
知道好长什么样的人可以写评测。产品、支持、销售不必写 TypeScript,他们描述好回答长什么样,编程智能体把评测写出来。
不要在每次提交上都跑整个智能体,时间和花费都扛不住。上线之后对真实流量抽样。分数掉下去并且停在下面,再报警。单次失败是噪声。今天没来得及把这一段做成演示,他把它留在闭环的最后。
整圈是:记下来,读,评,核对,改进,用持续集成锁住。周一可以只加埋点,只读 12 条轨迹。最终输出上看不见的东西,在轨迹里看得到。Phoenix 开源,文档和仓库都在这场的材料里。字幕没有念出仓库地址,本文不补。