智能体的活干没干成,光看调用记录看不出来

做智能体开发的人,大多把评估当成拖后腿的杂活。

工具已经上线,演示也跑通了,活看着能干。

何必再搭一套正式的评估机制。

这么想,往往就走偏了。

越早把评估建起来的团队,后面迭代反倒越快。

模型换了,提示词改了,工具动了,效果都能被量出来。

不用靠感觉拍板。

省心得多。

这篇文章讲的,就是给自己的 MCP 服务端搭一套评估。

它不是一套必须照搬的方法,更像一个能直接参考的实践案例。

评估框架的代码,跟服务端代码一起放在开源仓库里。

作者做的这个平台,是个机器学习平台。

它盖住数据准备,训练,部署,预测,还有优化。

服务端把这一整套流程,开放给智能体使用。

先分清两种差别很大的服务端。

一种是简单的工具调用。

比如帮某人发一封邮件,或者给一批用户群发消息。

一两次调用就完事,成功条件清楚,结果也是确定的。

运行成功过一次,后面往往还能成功。

另一种是多步骤工作流。

智能体得按顺序调好几个工具,前一步的输出喂给后一步。

调用记录看着一点毛病没有,最后结果照样可能是错的。

作者的平台属于后一种。

一次“帮我建个客户流失模型”的请求,会走上十步。

探索,选标签,数据准备,特征工程,把流水线固定下来,训练,部署,预测,生成报告,最后还有一步优化。

最后一步可以不做。

这比发邮件复杂太多。

代价很高。

为什么这种活难测。

先看数据。

每一步都压在前一步上,错误会悄悄攒起来。

要是在第二步删掉一列,第五步编码时看到的数据就变了。

把两个步骤换个顺序,同样的配置也可能得出不同的数据。

依赖还会继续往下传。

预处理决定模型能看到哪些特征,特征影响模型学到什么,模型的结果又决定优化建议有没有意义。

第三步出错,并不会当场报错。

问题可能拖到第六步,才表现成模型效果差一点。

也可能拖到第十步,才生成一条离谱的建议。

这时候调用记录可能有四十次,每一次都返回了成功。

挺省事。

训练和推理对不对得上,也是老问题。

训练时用过的转换,推理时必须原样再来一遍。

要是智能体用加工过的特征训练,部署时却塞进原始数据,系统不会崩,预测结果却会悄悄错。

状态都存在服务端。

数据集,预处理器版本,模型版本,部署,都是平台上的产物。

智能体要在很长的上下文里建它,追它,还要把彼此的编号对上。

训练和生成报告是异步任务,得轮询看进度。

智能体从工具返回里,只能看到服务端状态的一小块。

它没法像工程师那样,直接把整条流水线翻一遍。

调用成功,也不等于任务成功。

模型可能训练过程没报错,却毫无用处。

预测概率可能全挤在 0.99。

优化器可能建议什么都不改,也可能擅自动了业务上不许碰的列。

把客户年龄改小来降低流失率,数学上可能成立,生意上却很离谱。

要是测试只查调用有没有成功,这些情况全会被判通过。

最难察觉的,是那些不出声的故障。

拿原始数据而不是加工特征去训练,部署出一个概率全饱和的模型,生成一条等于没做的优化建议。

看上去都像正常完成了任务,其实和什么都没做没区别。

问题就出在这。

介绍做法之前,先引一句评估说明里的提醒。

评估是一门还在成形的手艺。

它跟单元测试不一样,没有谁能拍胸脯说自己最懂。

谁要是声称知道你的评估该怎么定,他的建议可以直接无视。

下面只讲作者在这一类服务端上验证过的做法。

别人碰到的故障模式,可能完全不同。

麻烦但不难。

怎样做评估。

工程师们熟的那套发布流程是这样。

先暴露一个新能力,比如一个接口或者一个工具。

用选定的框架把它接进服务端那一层。

能力要是太复杂,就包成一个“工作流”工具。

把轮询之类的麻烦事藏进服务端,再把更新发到线上。

发布流程示意图

真正的难点在验证。

它要横跨三个代码仓库,经过接口,客户端封装,打包发布,依赖版本更新,服务端持续集成,部署,最后才轮到使用。

服务端运行时,按客户端的登记表生成工具集。

新版本的依赖装好,新工具就自动冒出来。

这一层唯一的防护,是一个只数工具数量的测试。

每一层的单元测试都可能过,可智能体真正拿工具干活的端到端行为,早就退化了。

评估该盯的,就是“每层测试都过”和“整个流程还能用”之间的那道缝。

所以有些事只能靠人盯。

看工具有没有出现在使用端,比如命令行,或者桌面客户端。

再拿平时的数据集和提示词,从头完整跑一遍。

跑通了就继续,好像流程真有那么确定。

跑不通就耗上几个小时去调,反复改提示词,硬把它掰过。

这活儿不轻松。

对话框截图

何况前沿实验室发新模型越来越勤,周期越缩越短。

知识的截止时间,任务能连续跑多久,工具调用的脾气,都在变。

靠几个模型路由工具,换模型现在很方便。

可每个模型对提示词的理解都不一样。

上一个还很好用,换到新模型可能就不行了。

前后对不上。

评估框架怎么搭。

作者挑的是一套代码优先的路子。

数据集,测试用例,评估器,统统写在代码里。

不靠点界面拖来拖去,改一个字都得翻半天菜单。

驱动智能体和给结果打分,各用一套现成的库。

它们出自同一门派,天生能拼到一起。

最早有人建议换另一个开源项目,说它什么模型什么服务端都能接。

作者最后没选它。

图的是让智能体,客户端,评估框架,待在同一片生态里。

同一套生态,类型定义能共用。

省下一堆来回转换的麻烦,也少了一层对不上的风险。

它天生就懂这种服务端,智能体直接用服务端真正暴露出来的工具。

不用造假数据,也不用把接口结构再声明一遍。

这一点听着不起眼,真用起来才知道省事。

框架还能连两个目标。

一个跑在本机进程里,用环境变量里的密钥鉴权。

它适合本地快速迭代,也适合塞进持续集成。

很省事。

另一个走网络,连已经在线的服务端,走真实用户那套授权流程。

测试场景和评估器完全一样,只换工具集的搭法。

早点把线上那套真实鉴权和评估打通,很值。

不然本机跑得好好的,一上线就翻车,白等一场。

每个场景对着一个真实任务,还有它该经过的几个阶段。

评估器把它当测试用例跑一遍,再交给打分器评分。

评估结果怎么看。

最有用的一个设计,是让评估器去看平台上到底发生了什么。

而不是看智能体调了哪些工具。

只查有没有调那步训练,太浅了。

工具调用能成功,整个流程照样可能失败。

所以每个用例都配一本台账。

智能体开跑之前,先给平台拍个快照。

已有的数据集,模型,部署,全都记下来。

跑完再拍一次,两下一减,多出来的就是这次新建的产物。

差异才是“它到底建了什么”的实打实证据。

每个用例跑完还得顺手清场,把这次新建的东西删干净。

不删的话,下一轮评估就踩在上一轮的垃圾上。

团队环境越跑越乱,后面谁也说不清哪个东西是谁弄出来的。

这里用的是真实平台,有真实状态,也吃真实配额。

它可不是干干净净的沙箱,东西是会留下来的。

账就是这么来的。

有了台账,评估器就能对着平台状态下判断。

它不用再盯着调用记录猜。

它可以直接问,那个模型到底存不存在。

也能问,训练时用的到底是不是加工过的数据。

这个检查,来自一次真实的回归。

智能体跳过了所有加工特征,直接拿原始数据去“训练”模型。

调用记录看着却一切正常,每一步都成功。

只数工具调用的评估,会把它稳稳误判成通过。

这很要命。

阶段检查之外,还得给已知的故障配上语义检测器。

这类检测器只认死理,专挑那些看着正常其实不对的形态。

比如无效处方,优化建议写得像模像样,其实什么都不改。

比如概率饱和,每条预测都贴着 1.0,一点区分度都没有。

再比如业务上声明不许改的列,被悄悄动过了。

每个检测器只回一个是或否。

碰上了,就说明又踩到了一种实际出现过的静默故障。

下面这条,来自一次线上优化任务。

优化器吐出了二十条“处方”,里面那个可调的变量,取值却完全一样。

二十条等于一条,上游所有步骤还都报告成功。

故障清单这个东西,别的团队照抄不了。

得拿自己的事故一条一条攒出来。

急不得。

攒着攒着,哪类故障最常来,心里就有数了。

让智能体看懂错误。

有件事跟评估本身一样重要,就是把错误结构化。

不要把一大段报错原样丢回去。

可以把带类型的错误封装好,一路传到工具的返回里。

错误不光要让人看得懂,还得让智能体能照着往下走。

模型收到一条清清楚楚的结构化错误,一般能自己正确重试。

只回一句含糊的服务器错误,它很容易陷进反复失败的循环。

框架也要记下这种情况。

失败之后又重试的调用,单独算进一个浪费调用的计数里。

这个数一涨,就说明工具在拿错误信息糊弄智能体。

数字最实在。

错误信息的质量,也从此有了能长期盯着的指标。

记录哪些指标。

每次运行都生成一个结果文件。

里面装着每个用例的阶段断言,检测器标志,跑了几步,浪费的调用数,运行时间,词元用量,美元成本。

还得配一份完整的工具调用记录。

成本这一栏,作者向模型路由服务要数据。

每次请求花多少,那边都会如实报出来。

单次跑下来多少钱,就这么自动记下了。

账算得清。

再配一个简单的报表工具,任意一组结果文件都能摆到一起比。

哪个模型贵,哪个模型快,一眼就看得出。

这才是重点。

模型对照表

场景,工具,提示词都一样,两个模型都跑完了整套机器学习流程。

其中一个多用了六成的步骤,还有七成半的实际运行时间。

成本那一列偶尔出现一道短横,表示数据来自成本采集上线之前。

老的结果文件,照样能拿来比。

数据不会说谎。

核心指标叫 pass@k,是从代码生成榜单借来的思路。

智能体的执行带着随机性。

模型,提示词,工具全都一样,有时成,有时败。

与其问这次成没成,不如问给它 k 次机会,至少有一次跑完的概率有多大。

单次成功率是一个数,五次里至少成一次又是一个数。

两个数的差距本身也有意义。

一个模型单次是 0.6,五次能到 1.0,说明它不稳,但有本事干完。

两个数都僵在 0.6,就说明有个重试也补不上的系统性盲点。

差距就在这。

逐阶段的结果,往往比一个总分有用得多。

看那行国产模型的成绩,总分 0.00,像是彻底没戏。

可各阶段的数据,说了另一回事。

这个模型在完整的十阶段场景里,跑了四次评分。

记录下来的成本是八块多美元。

十个阶段里有九个,它每次都过。

数据探索,数据准备,特征工程,训练,部署,预测,连优化都过了。

它每次都栽在同一个地方。

没能给出那份异步生成报告的链接。

总分只会告诉你,这个模型干不了这活。

阶段分析却说,它几乎都干完了,只是始终处理不好一个异步的时序交互。

前一种判断,让人想换模型。

后一种判断,让人去修那个查任务状态的工具。

对多步骤的服务端来说,故障出在哪,长什么样,才是真能帮上忙的线索。

工具调用日志,把这个问题摆得更直白。

四次运行一共调了二百四十次工具。

其中一百零三次,占了四成三,全砸在查报告状态那一个端点上。

就这么反复轮询异步报告的进度。

这一百零三次里,有五十七次直接报错。

别的工具都正常。

光一个端点,就吃掉了模型将近一半的调用精力。

太浪费了。

工具调用去向图

逐次调用排成时间线,每轮的失败过程也看得清。

开头都挺顺,智能体依次把数据准备,训练,部署,预测,优化走了一遍。

等报告任务一起步,剩下的调用就慢慢变成了没完没了的轮询和报错。

逐次调用时间线

换个模型试试。

评估框架在换模型的时候格外好使。

搭得好,小的模型也能跟前沿的模型掰手腕。

不同档位的输出价格,能差出二十五到四十倍。

便宜模型就算多烧些词元,算下来仍可能更划算。

等下一次模型发布,这种比较又过时。

应对的办法,是尽量压低衡量换模型效果的成本。

路由那一层交给框架,换新模型只加一个命令行参数。

接一个新的路由服务,不用改一行评估框架的代码。

这一周有一次实打实的对比,场景,工具,提示词全都一模一样。

评估运行闭环图

两个模型都跑完了整套机器学习流程。

一个多用了大约六成的步骤,还有大约七成半的运行时间。

发布新模型的时候,真正想知道的是三件事。

新模型的 pass@k 怎么样。

跑完整条流程要花多少钱,这直接关系到生意,能不能少花钱多办事。

在自家这份活上它到底行不行,内部的榜单能压一压大厂对公开榜单的过度优化。

这三点缺一不可。

对做 AI工具 的团队,这笔钱就是实打实的成本。

拿 AI对话 的产品来说,调用量一上来,账单涨得飞快。

AI编程 的场景更直接,接口每天都在被调。

接下来打算把评估接进持续集成。

每逢新模型发布,或者服务端有更新,就自动跑一遍评估矩阵,记下结果。

在改动上线之前,先把回归挑出来。

这跟平时处理依赖升级是一个路子。

顺理成章。

只要开发是由智能体驱动的,都会撞上同一个问题。

怎么确认一段多步骤的流程,真完成了当初想让它干的事。

评估也在反过来改接口。

看智能体在哪儿栽跟头,就能看出哪些错误该结构化,哪些工具缺了必要的操作入口,哪些活该挪到服务端去。

写这篇文章的时候又碰上一例。

评估框架的清理逻辑,删不掉测试跑出来的报告,因为以前压根没有程序需要删报告。

接口本身早就有删除端点,客户端却没做对应的封装。

为了把评估的清理流程补全,当天下午就发了一个新的客户端封装。

顺手在智能体能用的工具集里,补上了对应的工具。

面向智能体重构接口的开发方式,正在成形。

而评估,正好能检验这些改动到底有没有用。

评估跑起来,看故障出在哪一环,回头改工具接口,再跑一遍。

这个闭环就这么转起来了。

路子就这么简单。

最该盯的,其实是数据模型。

智能体需要的那些接口能力,能轮询的任务状态,能一路列出来的产物血缘,每个对象清楚归谁。

前提都是数据库得把这些信息存下来。

智能体在查状态那个端点上反复轮询时,正解不是接着调提示词。

而是让任务状态变成一个能直接查的一等数据对象。

面向智能体的接口设计,最后都绕不开数据库设计。

评估能指出,智能体到底被哪一块数据结构绊住了。