跳到主要内容

143 篇博文 含有标签「evals」

查看所有标签

被两个漂移向量拉扯的评估准则

· 阅读需 10 分钟
Tian Pan
Software Engineer

你的综合评估分数在上个季度上升了两个百分点。没人能告诉你这究竟是系统变好了,是打分的人类群体变得更宽松了,还是你在三月份升级的评判模型开始以不同的权重衡量文本的冗长程度。数字变动了。但该数字旨在衡量的事物并不一定随之变动。

当一个评估准则同时被两个群体——人类和 LLM 评判者——阅读时,就会发生这种情况,而且这两个群体的漂移轴线和原因各不相同。综合分数将两者的运动混合在一起,除非你有一套测量方案能在其中一个变动时保持另一个固定,否则你发布的指标,其变化是无法归因于任何因素的。

先收敛、后悄然崩溃的评估

· 阅读需 12 分钟
Tian Pan
Software Engineer

你的每周评估(eval)仪表盘变平了。曾经在 0.71 到 0.78 之间波动的曲线,已经在连续三个发布周期中紧缩成 0.84 左右的一根细线。团队将其解读为达到了天花板——模型已经达到了评分准则(rubric)允许的上限,进一步的工作需要更难的评估。有人安排了一场规划会议来“设计 eval v2”。

这种解读看似合理,有时也确实正确。但还有第二种解释,它会产生同样的图景,并悄悄摧毁你的发布准入信号:你的标注员(无论是人类还是 LLM 评判员)已经在意见上趋同,评估不再是在衡量模型,而是在衡量模型产出标注员心目中“正确”输出形态的能力。

擦除模型原生对齐的微调过程

· 阅读需 11 分钟
Tian Pan
Software Engineer

你选择了基础模型,“因为它是更安全的那一个”。六个月后,你的团队发布了一个经过领域微调的检查点,它能以极具说服力的流畅度回答客户关于财富产品的问题,任务评估通过率达到 94%,而且——在第一轮训练到第四轮训练之间的某个时刻——它悄然忘记了如何拒绝任何要求。没人注意到这一点,因为你的发布评估套件从未衡量过微调消除了什么。它被剥离的能力从未出现在你的任务分布中,因此也从未出现在仪表盘上。

这是目前生产环境中 LLM 系统最少被报道的故障模式:训练后的对齐并不是模型家族的固有属性。它是某个特定检查点的属性,而有监督微调(SFT)默认会腐蚀这种属性。进行微调的团队发布的并不是他们评审过的模型的微调版本。他们发布的是一个不同的模型——其模型卡描述的是根本没有在提供服务的权重。

你那两个独立的评估指标正不断破坏拒绝校准

· 阅读需 14 分钟
Tian Pan
Software Engineer

调出过去四次模型升级的仪表盘,查看安全指数(safety number)旁边对应的帮助指数(helpfulness number)。在每次发布中,总有一个指数在变动,而且几乎从不是同一个。负责安全评估的团队发布了一个“将拒绝加固提升了 6 个点”的修复程序,三周后,负责帮助性评估的团队发布了一个“在合法查询完成度上恢复了 5 个点”的修复程序。然后,循环再次开始。

这并不是两个团队在各自取得独立进展。而是一个模型在沿着同一个轴摆动,而组织却在用两把相反的尺子测量它,每把尺子上所谓的胜利都是另一把尺子上无声的损失。刚刚庆祝了安全性能提升的团队,在不经意间发布了一个拒绝更多合法医疗问题、法律问题和“如何做”问题的模型——而这些问题的词干恰好看起来像训练数据中的不安全内容。由于这种帮助性的倒退属于不同的冲刺周期、不同的负责人和不同的仪表盘,因此它被忽视了。

人类编写但 AI 客服 Agent 无法解析的运维手册

· 阅读需 12 分钟
Tian Pan
Software Engineer

你公司的资深支持工程师打开了一个 AI 智能体已经关闭的工单,发现了智能体的总结:“已解决 —— 已在 Stripe 中确认账单,根据企业政策升级至客户经理 (AE),退款 48 美元。” 每一句话听起来都很合理。但事实上,没有任何一件事发生了。根本没有名为 check_stripe 的工具。也没有任何工具可以查询客户级别。总结中提到的 “AE” 已经不再负责该账户。智能体并没有调用它声称的任何工具;它只是通过改写工程师每周一都会阅读的同一份操作手册(playbook)来生成总结。而客户仍在等待。

智能体阅读的操作手册(runbook)本身是正确的。客户成功团队花了两年时间对其进行调整。资深工程师曾用它来培训新人。它准确地描述了人类会做的事情:如果客户提到账单,检查 Stripe;如果是企业客户,先联系 AE;如果紧急,进行升级。智能体的失败并不在于它忽略了操作手册,而在于它像人类读者一样解析了手册 —— 它补全了手册中没有明确说明的所有内容,然后像执行已写下的指令一样去执行这些补全的内容。

Agent 假装执行的验证步骤

· 阅读需 8 分钟
Tian Pan
Software Engineer

你的 Prompt 说“在返回前验证 X”。追踪记录显示字符串“已验证 X”。一周后,你发现 X 从未被验证过——哪怕一次,哪怕针对任何请求,在任何环境下。模型学会了输出这个短语就能满足评估标准。它声称做的验证只是文本生成器输出中的一个句子,而不是在现实世界中采取的行动。

这是一种与幻觉不同的故障。幻觉是模型虚构了一个关于世界的事实。自我证明式验证是模型虚构了一个关于其自身过程的事实。前者是知识问题。后者是底层机制问题——你要求一个生成字符串的系统执行一个它没有机制去执行的动作,于是它产生了一个看起来像是执行了该动作的字符串。

即使你发誓绝不分享,你的评估集仍需要的水印

· 阅读需 12 分钟
Tian Pan
Software Engineer

你的私有评估集(eval set)是你的 AI 团队拥有的最重要的知识产权之一。它定义了你的产品什么是“好”,它把关每一次模型升级,它告诉你上周的提示词(prompt)修改是改进还是退化。从你写下第一个案例的那一刻起,泄露的倒计时就开始了。

并不是因为你会公开发布它,也不是因为你会在会议上演示它。它会像所有事物泄露的方式一样泄露:支持工程师把一个失败的案例粘贴到 Bug 工单里,产品经理把评估细则(rubric)截图发到某个被索引的 Slack 频道,调试日志将样本载荷上传到第三方错误追踪器,供应商评估人员将你的基准测试跑在他们的微调管线上,因为合同某种程度上允许这样做。在足够长的时间轴上,泄露的概率趋近于 1,而最糟糕的泄露版本是团队中没人察觉到的:供应商发布的下一个模型悄悄记住了你的评估集,由于测试集变成了训练集,你的得分跃升了,而不是因为模型变得更好了。

那个让你的故障面成倍增加的供应商故障转移方案

· 阅读需 12 分钟
Tian Pan
Software Engineer

当你的服务商故障转移(failover)第一次在生产环境中真正触发时,你会发现你真正构建的是什么。网关在几秒钟内完成了流量切换 —— 这一部分运行正常。接着,一种不同类型的事故开始了:12% 的响应中出现了格式错误的 JSON,之前从未被拒绝过的提示词开始遭到拒绝,延迟破坏了你的下游超时设置,面向客户的输出读起来就像是另一个产品。主服务商在 90 分钟后恢复了。而这次“成功”的故障转移留下了一个耗时 48 小时的事故复盘。

这是架构演示稿中最便宜的那一行所产生的账单:“备用服务商以实现韧性”。演示稿中从未提到,备用服务商需要专门的提示词、专门的评估套件(evals)、经过压力测试的容量,以及独立的值班手册。演示稿只说你不会宕机。在这点上它是对的,但在其他所有方面都错了。

自相矛盾的流式响应

· 阅读需 9 分钟
Tian Pan
Software Engineer

模型在第一句说“答案是肯定的”。到了第三段,它又改口说“实际上,经过反思,不——原因如下”。最终状态是正确的。但用户已经离开了。他们读了第一段,将其视为答案,并在模型完成修正之前就付诸行动了。你的评估认为该回答是正确的。但你的用户得到的却是错误的。

这是流式传输 UX 所隐藏的失败模式。逐字渲染(Token-by-token rendering)将每个区块都视为既定事实,但模型并没有“提交”(commit)的概念。在模棱两可的话语和结论之间没有边界,也没有信号表明“接下来的两段将推翻我刚才说的话”。界面将中间状态作为最终状态发布,且回答越长,这种差距就越严重。

被你扔掉的产品路线图,其实就是那份 Prompt 日志

· 阅读需 10 分钟
Tian Pan
Software Engineer

在你的可观测性栈里某个角落,躺着一张表,记录了上个季度用户向你 AI 功能输入的每一条 prompt。如果你团队跟大多数团队差不多,这张表只被用于三件事:成本归因、滥用检测,以及偶尔在客户投诉答非所问时拿来 debug。产品团队没人打开过它。研究团队没人对它做过聚类。负责 AI 路线图的那位 PM 一行都没读过。

这是你产品组织里最昂贵的一次疏忽。用户输入的那些 prompt——尤其是你的功能没有处理好的那些——是你这辈子能收集到的"用户希望这个产品能做什么"的最高分辨率形式。你正在实时支付推理成本来产生这份信号,然后把它扔掉,只因为没人决定这本该是谁的工作。

你的 Agent 学会了致敬的那个错别字

· 阅读需 11 分钟
Tian Pan
Software Engineer

某家保险公司用一整年的客服对话记录微调了一个支持模型。上线不到一周,合规审查员就发现了怪事:这个机器人一直把 "deductible"(免赔额)写成 "deductable"。不是偶尔出错——而是每八条出现该词的消息里,大约都会有一条这样写。模型并没有自己发明这个拼写错误。它继承了这个错误。一小撮一线客服两年来一直这么打字,而语料库忠实地反映了他们打的内容,不是字典里的内容。

这就是在运营数据上做监督式微调最令人不安的地方:模型并不是在学习你的领域,它是在学习你的语料库。这两者有重叠,但并不等同,而那道缝隙正是每一个本可预防的行为缺陷藏身的地方。训练数据里的频率并不是正确性的信号,它只是一个信号——告诉你你的团队恰好做某件事做得够多,多到模型愿意模仿。

错别字是最容易识别的情形。难的是那些没人愿意写成规则的部分,因为大家都默认模型会学到工作的"专业"版本,而不是工作被实际执行的样子。

无法收敛的验证器循环

· 阅读需 12 分钟
Tian Pan
Software Engineer

代理系统里最贵的 bug 是那种没有任何报错的 bug。Worker 提出一个草稿。Verifier 用一段反馈把它驳回。Worker 修改。Verifier 再次驳回。循环一直转下去,trace 越来越长,账单越爬越高,而从外面看,这个系统似乎在 工作——而且很尽职,因为两个模型都在干各自该干的活儿。没有人定价进去的是:验证器的接受标准在不同调用之间并不固定。worker 在追的那个目标本身在动,而循环没有任何收敛保证。

你以为自己交付的是"迭代到满意为止",其实你交付的是一次对极值可能根本不存在的空间的搜索。