核心思想

评估 AI 智能体没那么复杂:先想清楚你要的是”刷榜”(增强专家)还是”抬高下限”(取代人类)。对多数产品而言答案是后者——而抬高下限的本质就是错误分析:读真实轨迹、找出会要命的失败模式、修掉背后的系统问题,再用代码感知的离线评估锁住教训、用生产监控验证修复。一小撮高信号的黄金用例,胜过一大套空想的评估集。

前言

一年前,智能体还几乎不存在。如今它们无处不在:银行、工程、医疗,处处都有它们的身影。

有那么一阵子,我特别讨厌「智能体(agent)」这个词。不就是一次 LLM 调用吗?干嘛非要造个新词?但很快,我和所有人都意识到:这个新词确实有它存在的必要。

智能体是一种实体,几乎带着某种自我意识,在它所处的环境中穿行。它调用手头的各种工具,为创造者们做梦也想不到的问题找出富有创意的解法。

有时候,这些创意般的解法帮了大忙;有时候,它们造成了实打实的伤害。但有一点是确定的:我们已经远远走出了「预测下一个 token」的时代。

有意思的是,评估智能体可靠性与性能的方法,自上一个「聊天机器人」和 RAG 时代以来,基本上没怎么变过。

那些靠「评估智能体(也就是做 evals)」吃饭的公司,常常端出越来越荒诞、越来越过度复杂的方案。他们兜售的工具,与真正在优秀公司里行之有效的做法之间的鸿沟,从未如此之大。

我写这篇文章就是想说一句:评估这件事,其实没那么复杂。我之所以有底气,是因为我就在一家做智能体的公司工作。而我们,又服务于全世界最顶尖的一批 AI 公司:Framer、Clay、Vercel、GC.AI 等等。

这份指南力求中立。当然,我会聊到我创办的那家评估公司 Raindrop,因为我认为它是本文所述实践理念最好的具象化。即便它现在还不是,我们也会朝这个方向把它做成。我还会提到 Raindrop Workshop——一个免费、完全开源的本地测试工具。

读者请注意:这份指南讲的是智能体。评估分类器(classifier)、RAG 流水线以及许多其他 AI 系统的方式是不一样的——比如在那些场景下,采样多个结果、再用 Opus 来评判,往往要有用得多。但这些不是本文要讨论的内容。

你是「刷榜派」还是「抬高下限派」?

在动手做评估之前,你得先想清楚:你想取得的,究竟是哪一种进步?

对大多数产品来说,这归结为两个选择:你可以去刷榜(benchmark maxx),也可以去抬高下限。大多数团队从来没有明确地做过这个选择。他们照搬实验室那套评估话术,复制各种榜单的形态,最后追着一个根本不是为他们而设的目标跑。

来做个小测验吧。

第 1 题 / 共 7 题

你的智能体犯下的最严重错误,有没有可能上新闻?

想象一个理财智能体。如果它能交叉核对你所有的账户、预测你的开销、自动取消订阅,那当然很棒。但要是它有时连「我银行账户里还有多少钱?」这种最基础的问题都答不上来,你就会不再信任它了。

正因如此,大多数产品团队都应该从抬高下限的角度去思考:让智能体在「可靠性真正重要」的地方变得可靠——在用户真实会跑的工作流里,在错误代价高昂的关键时刻,在那些会让你「不敢上线」的场景里。

抬高下限,本质就是错误分析

这就是为什么抬高下限看起来不太像设计榜单,反倒更像错误分析(error analysis)——套用 Hamel Husain 的说法。你不是从一套抽象的测试集开始的,你做的是侦探工作:找出系统会「弯折」的那些地方,给它们分门别类,再判断哪些值得投入工程精力去修。

这个流程很简单,但并不轻松。逐一审查用户消息、智能体回复,以及它得出答案所走过的整条轨迹(trajectory)。尽可能用 AI 来放大你能查看的轨迹数量:过滤、聚类、归纳。但要问的问题始终如一:最后一步成功的操作是什么?第一处真正的失败又出现在哪里?检索是不是漏了?智能体是不是忽略了上下文?某次工具调用(tool call)是不是出了岔子?最终答案是不是夸大了系统其实掌握的信息?

然后,你要修的是这一类模式,而不仅仅是这一次个案。有时这意味着改进检索;有时意味着给智能体加上约束;有时意味着换掉某个工具、加一道护栏,或者教会系统在适当时候停下来,说一句「我不知道」。

到了这一步,你才开始添加评估。而且一旦动手,它们都是有的放矢的。你不是在测试想象出来的覆盖率,你是在把从真实失败里学到的教训固化下来。一套「抬高下限」式的评估集,本质上是一份「拒绝重蹈覆辙的 Bug 记忆库」。

这也是为什么动辄海量的评估集往往只是一种干扰。真正能伤到你的,通常不是某条提示词的第一千个合成变体,而是退款政策上的幻觉(hallucination)、那个停不下来的死循环、三次工具调用之后那段不易察觉的上下文丢失。抬高下限,就是你发现这些失败、理解它们,并让下一版智能体更难出丑的途径。

把这些产品放到「刷榜 ↔ 抬高下限」这条轴上

自动补全(Autocomplete) · Cursor · Claude Code · 客服聊天机器人(Support chatbot) · 银行智能体(Banking agent) · Devin · AI 医生(AI Doctor)

← 刷榜(Benchmark maxx)      抬高下限(Floor raise)→

如果上线时你可以选 90% 的通过率,也可以选 99% 的通过率,你会选哪个?如果你的本能反应是「那还用问,99% 啊」,那你还在用刷榜者的思路想问题。如果你脱口而出的第一个问题是「失败的那 1% 是哪些情况?」,那你才是在用抬高下限的思路在思考。

抬高下限里最唾手可得的技巧之一,恰恰也是最让用户抓狂的一招:教你的智能体学会拒答。置信度低于阈值,就说「我不知道」;问题超出你的领域范围,就说「我不知道」;检索到的上下文不足以支撑回答,就说「我不知道」。

刷榜派痛恨这一招,因为它会拉低通过率。但抬高下限派明白:一个自信满满的错误答案,比一句诚实的「我不知道」更糟糕。对于那些要去取代人类的产品而言,信任比「秀肌肉」式的能力展示重要得多。

上线之前,先摸透你的智能体

在你放心地把一个智能体推上生产环境之前,你得先跟它「混熟」:搞清楚它能干净利落地搞定什么、在哪里会犯迷糊,以及哪些失败是真正要命的。

黄金用例

挑出 5 到 10 个能代表你关键路径的用例,把它们记在某个地方。它们不需要什么文件格式,也不需要 harness。从最简单的版本开始:一个常见的、你的智能体理应永远答对的用户问题。试一下。日后你可以把它逐步做得更复杂,但起步就从这里开始。一旦你的智能体开始在黄金用例上翻车,那就别上线。

在本地摸透你的智能体

对于你的黄金用例,别只盯着最终输出看。要把整条轨迹都检视一遍:用户消息、工具调用、检索到的上下文、推理链条。路径和答案同样重要。Raindrop Workshop 在这里很有用:它能让你在本地捕获真实的智能体轨迹、检视每一次工具调用,并在这些场景冲进生产环境之前先回放(replay)一遍。

专业提示:直接问你的智能体

深入剖析智能体的最佳方式之一,就是直接向它提问。奇怪的是,我还没听过有谁谈起这一点。

把话说清楚:我说的不是让随便一个智能体去看那些轨迹、然后猜测原因。我说的是去跟你自己的那个智能体对话。把那一次运行原样复现出来——就像当初传给智能体的那样——连同它最近给出的回复一起喂回去,然后直接问它到底发生了什么。

这一点之所以重要,是因为推理轨迹往往是加密的,你未必能自己读懂那段思维链。把轨迹原样回传给同一个模型,是你能做到的、最接近「直接问智能体究竟发生了什么」的办法——因为它可以把手头可用的轨迹、上下文和先前的消息当作证据来支撑它的回答。

这往往能帮你发现:你的智能体究竟在哪里误读了、或者过度执着于你提示词里的某个特定部分。可以这样问它:「你答错了。正确答案是 X。我当初需要改动什么,你才能答对这道题?」当然,智能体给你的回答未必就是真相,把它当成一条线索来用就好。

离线评估

你需要的是「代码感知(code-aware)」的评估。一旦智能体与代码、工具、检索、权限、产品状态纠缠在一起,单独去测提示词就毫无意义了。行为是活在整个系统里的,而不是活在那串提示词字符串里。

正因如此,离线评估(offline evals)看起来不太像「给提示词打分」,反倒更像普通的软件测试。想想 Vitest、pytest 或者 jest。一个好的离线评估,是接收一个输入、跑通真实的智能体路径,然后对结果做断言:输出、工具调用、被改动的文件、结构化数据,或是最终状态。

Sentry 把这种做法称为「harness 支撑式(harness-backed)」,他们的 vitest-evals 示例用到了 describeEval(...)、一个应用本地(app-local)的 harness、一个显式的 run(...)、常规的 expect(...) 断言,以及对工具调用的检查。

OpenAI 在他们的智能体系统手册(agentic systems cookbook)里把同一个理念叫作「宏观评估(macro evals)」:在有代表性的输入上驱动真实的智能体循环,并对整条轨迹打分——包括工具调用、中间状态和最终答案。

叫它什么我都不在乎。重要的是:你评估的是智能体,而不是一次 LLM 调用。

// evals/refund_agent.eval.ts
 
import { expect } from 'vitest'
import { describeEval, toolCalls } from 'vitest-evals'
import { refundAgentHarness } from '../harness'
 
describeEval('refund agent', { harness: refundAgentHarness() }, (it) => {
  it('approves refundable invoice', async ({ run }) => {
    const result = await run('Refund invoice inv_123')
    expect(result.output.status).toBe('approved')
    expect(toolCalls(result.session).map((c) => c.name)).toEqual(['lookupInvoice', 'createRefund'])
  })
})

Raindrop Workshop 让创建代码感知评估变得非常简单:你可以保存轨迹,Codex / Claude 还能给运行结果做批注,告诉你它们是通过还是失败(并附上更具体的点评)。

你完全可以把评估直接存在一个 Markdown 文件里,然后让 Codex 跑一遍就行。

真心不建议你去用某个托管的评估仪表盘来跑智能体评估。Raindrop 之所以不提供这种东西是有原因的,而且原因绝不是「它很难做」(其实做起来非常简单)。

原因在于:报告 UI 恰恰是最容易做的那部分,同时也是本应与你的产品耦合得最紧密的那部分。要是我来做,我会先快速起一个本地的 HTML 查看器来看评估的通过 / 失败状态。

从生产环境中学习

智能体一旦走向真实世界,工作的性质就变了。上线之前,你是在它可能会在哪里出问题;上线之后,是用户在向你展示:产品究竟在哪里让人困惑、哪里脆弱、哪里语焉不详。

从原始日志开始

先去读那些原始的交互记录:用户消息、智能体回复、工具调用,以及那些「用户期待的是一回事、智能体却做了另一回事」的瞬间。一直读,读到饱和为止——读到同样的模式开始一遍又一遍地反复出现。

Quote

「错误分析是 AI 开发中唯一最有价值的活动,而且始终是投资回报率(ROI)最高的活动。」

这是一项枯燥乏味的工作,但它也是你为系统建立起真实心智模型的唯一途径。跳过它,你最终就会去自动化一堆错误的指标。

你需要什么,取决于你的体量

工作流应当随着你的流量一起扩展。每天 10 次智能体运行时,你能把每一条都读完;到了每天一万次,你就需要系统主动告诉你哪些值得关注了。常见的错误是:在你还没积累足够多的原始素材、还没搞清楚自己到底要找什么之前,就急着去上那套高流量的机器。

每天 1–100 次运行 — 磕绊(Stumbles)

把原始日志当作「消防水龙带」一样的信息洪流。从中寻找困惑、挫败、险些出错(near-miss)、反复发出的提示,以及那些「是你拿反了(you’re holding it wrong)」式的时刻。在这个阶段,目标是培养品味(taste)和建立分类法(taxonomy)。

每天 100–1,000 次运行 — 问题(Issues)

当同一个磕绊反复出现时,把它升格为一个 Issue:一个正在浮现的问题,团队可以围绕它讨论、复现,并决定要不要修。

每天 1,000+ 次运行 — 信号(Signals)

Signals 来追踪那些你想在长周期内持续监控的行为:审美方面的抱怨、拒答质量、被忽略的工具报错、上下文丢失、用户挫败感。

每天 5,000+ 次运行 — 实验(Experiments)

当你彻底搞懂某个 Issue 之后,把修复方案藏在功能开关(feature flag)后面发布出去,再对比相关的 Issues 和 Signals。该不该上这个改动,应该由生产环境来告诉你。

自我诊断

Raindrop 还能让智能体上报它自己的问题。其底层原理,是往智能体的运行过程里注入一个隐藏工具。当智能体觉得自己缺少上下文、撞上了某项能力的天花板、正在跟一个坏掉的工具较劲,或者干脆把任务彻底搞砸了的时候,它就可以调用这个工具,而 Raindrop 会把这份报告作为一条信号记录在同一个事件上。在 AI SDK 的集成里,这基本上就是包装器上的一行代码:

const { generateText } = raindrop.wrap(ai, { selfDiagnostics: { enabled: true } })

从概念上讲,那个隐藏工具大致长这样:

__raindrop_report({
  category: 'missing_context',
  summary: 'I could not find the refund policy for enterprise plans.',
  severity: 'medium',
})

但在实践中,我们发现它远没有表面上看起来那么有用。把自我诊断当成「磕绊」来对待就好:它是一股充满随机内容的信息洪流,你或许能从里头挑出一两件有意思的东西。要把它的灵敏度调校到位、让它成为一个真正通用且有用的信号,是需要下一番真功夫的。措辞上的细微差别,就足以左右智能体到底要不要上报。说到底,这是一个二分类(binary-classification)问题。

做修复、做改动

你发现了一个问题,现在得去修它。具体怎么修,取决于它是哪一类问题。

有时候,直接修就行

有些修复显而易见、立等可取:一次坏掉的工具调用、系统提示词里漏掉的一条指令、一个返回了陈旧数据的检索查询。修掉、上线、翻篇。

关键在于分清:这个修复到底是「真·直接修复」,还是只是糊在更深层问题上的一块创可贴。一个只治标、不治本的快速修复,日后只会冒出一个更诡异的 Bug。如果你发现自己开始针对特定的用户措辞去加各种特例处理,那你多半是在治标不治本。

先复现,再修复

对于那些没那么简单的问题,第一步永远是复现。你能不能让这次失败再次发生?如果不能,那说明你还没真正搞懂它。回到那条轨迹,再读一遍,再找一个例子。

一旦能稳定复现,就先把它添加为一个黄金用例,然后再动手修。这能保证你不会发生回归(regression)。这个套路是:在生产环境中发现 → 在本地复现 → 添加到评估里 → 修复 → 验证评估通过 → 上线。

「把每个 Bug 都加成评估用例」往往边际收益递减

这里有个陷阱:每发现一个 Bug,你就把它加进评估集。半年之后,你攒下了 500 个用例,其中 400 个都是生产环境里压根不会出现的诡异边缘情况。你的 CI 要跑 20 分钟。你的团队开始对评估失败视而不见,因为「反正它总归会挂个什么」。

不是每个 Bug 都配拥有一个评估用例。要问自己:这是不是关键路径?它会不会回归?它究竟是某一失败的代表,还是真的只是个一次性的孤例?对你的评估集要狠下心来剪枝。20 个高信号用例,胜过 200 个低信号用例。

一条好用的经验法则:如果一个评估用例 3 个月都没失败过,那它要么根本没在测什么重要的东西,要么就是你的智能体确实进步了。无论是哪种,都该掂量掂量它还有没有留在那儿的必要。

更多时候:在生产环境里做实验

对于很多改动来说,唯一能确认它们是否有效的办法,就是拿真实用户来测。对比模型、对比提示词、对比工具配置。在真实流量上跑 A/B 测试,度量真实的结果。

这正是生产环境监控(production monitoring)变得不可或缺的地方。你需要知道:新模型有没有减少幻觉?新提示词有没有提升用户满意度?这些问题你在离线状态下是答不出来的。评估集只会告诉你「黄金用例没被搞坏」,而生产环境才会告诉你「它到底有没有真的带来帮助」。

// A/B 测试:GPT-5.3 vs Claude 4.5 Sonnet
 
实验组(Treatment):88% 任务完成率(提升 12%)
对照组(Control):  76% 任务完成率
统计显著性:p < 0.001
 
将实验组提升至 100% 流量

周而复始,循环往复

这就是整个循环:上线、观察发生了什么、理解那些失败、修掉重要的那些,再把有用的教训作为回归测试(regression test)保留下来。

每一轮迭代,都应该让智能体出丑的概率小一点点,也让评估集更贴近现实一分。你的目标,不是把所有可能的测试用例一股脑全在前期堆出来,而是去构建一个能从生产环境中学习、同时又不会忘掉所学的系统。

评估工作是持续进行的,不是打个勾就完事的一锤子买卖。一旦这个循环停转,评估集就会过期失效,所谓的「信心」也会沦为一场表演。

请打算把智能体开发时间的 10% 到 20% 投入到评估和监控上。这不仅仅是写评估用例,还包括读轨迹、调信号、查问题。这就是构建可靠 AI 系统所要付出的成本。那些想跳过这一步的团队,最终都会在生产事故里加倍偿还。

展望未来

评估的格局正在飞速变化。以下是我们正在密切关注的几件事。

harness 的坍缩

当下「由智能体 SDK 去调用模型」这套模式,已经开始显露裂痕。随着模型变得愈发强大、愈发具备智能体特质,「模型」与「智能体」之间的界限正在变得模糊。我们已经在 Claude Code、Cursor CLI,以及正在崛起的 Cursor Agent SDK 身上看到了这种趋势。

当智能体仅仅就是「一段提示词加一个模型」时,评估会变成什么样?当根本没有框架代码可供插桩(instrument)、没有显式的工具循环可供追踪时,又会怎样?那个环绕在智能体周围的 harness、那套脚手架,会坍缩、融进模型本身。

这会改变监控的方式。今天我们追踪工具调用,是因为不得不这么做;而到了明天,我们或许只需记录「输入 / 输出」对,然后请模型自己解释它都干了些什么。中间步骤会变得不透明——就像去问一个人「你当时在想什么」一样。你能得到一个答案,但验证会变得更难。

由此推导出的结论是:端到端(end-to-end)评估会变得愈发重要。如果你无法检视内部,你就只能去信任(并验证)输出。黄金用例和生产环境监控——这两样本就是我们的建议——会成为唯一可玩的牌局。

从「应用」到「MCP」

敬请期待。

哪些东西始终不变

历经所有这些变化,有几件事依然成立:

  • 你需要与真实的用户行为保持接触。合成评估(synthetic evals)终会与现实渐行渐远。
  • 轨迹很重要。无论它是显式的(工具调用)还是隐式的(推理),智能体「如何走到那一步」,本身就极具诊断价值。
  • 黄金用例确实管用。一小撮高信号的测试,胜过一大堆低信号的测试。
  • 生产环境监控不可或缺。你不可能预先料到所有的失败模式。
  • 评估是一项持续进行的工作,而不是一次性搭好就完事的设置。

工具会变,框架会变,模型也会变。但那个最根本的挑战——验证一个自主系统确实在做你想让它做的事——始终如一。

浓缩版

如果别的你都记不住,那就记住这些:

  • 选对框架。 刷榜,是为了增强专家的能力;抬高下限,是为了那些取代人类、被放到一线去用的智能体。
  • 抬高下限的本质就是错误分析。 去读真实的交互记录,找出那些真正重要的模式,再去修掉它们背后的系统问题。
  • 使用代码感知的离线评估。 测试正在运行的智能体路径:工具、状态、文件、结构化输出,以及各种副作用。
  • 让生产环境的审查随体量一起扩展。 从「磕绊」起步,让反复出现的模式升格为「问题」,长期追踪「信号」,再用「实验」去验证你的修复。
  • 把循环保持得紧凑。 让真实的失败变成有的放矢的回归测试,而不是一套庞大而空想的评估集。

准备好认真评估你的智能体了吗?

Raindrop Workshop 为你提供本地轨迹捕获、轨迹检视和回放,专为智能体评估而生。从这里起步。等你准备好上生产环境监控时,Raindrop 会陪你一起扩展、一同成长。

相关笔记