跳到主要内容

131 篇博文 含有标签「evaluation」

查看所有标签

内部评估集:一个无人审查的隐私边界

· 阅读需 12 分钟
Tian Pan
Software Engineer

你的 AI 团队所谓的“评估集”(eval set),在大多数发布 LLM 功能的公司中,其实是从生产日志中提取的真实客户对话集合。团队中没有人认为这是一个隐私事件。数据从未离开过集群。没有配置新系统。没有增加供应商。一名工程师写了一个查询,将几千条追踪记录(traces)导出到标注工具中,然后团队就开始根据这些记录对模型输出进行评分。法律团队从未听说过这件事,因为从内部来看,什么都没有改变——原本就存在于同一个数据库中的对话,现在只是被几名工程师和一个裁判模型(judge model)读取了而已。

这就是那个无人审查的隐私边界。客户向你发送消息是为了让你回答他们。他们并不是为了让你拿这些消息去衡量模型才把消息给你的。这两种用途在存储层看起来完全一样,在推理层感觉也一样,但在每一种现代隐私监管制度下,它们属于不同的处理目的——而两者之间的鸿沟,正是下一轮合规阵痛将要降临的地方。

重复问题检测:你的单轮评估无法察觉的会话级盲点

· 阅读需 12 分钟
Tian Pan
Software Engineer

用户打开你的聊天窗口,提了一个问题,得到一个评估套件打分为 4.6(满分 5 分)的回答。接着,他们换了一种说法问了同样的问题。同样的回答,同样的分数。他们又试了一次,这次用了人们在怀疑机器没在听时常用的套话——“我实际上想做的是……”——然后他们关闭了标签页。从模型的视角来看,这是三个干净的问答轮次。从仪表盘的视角来看,这是一个活跃的会话。但从用户的视角来看,这是一个连续三次失败的产品,而且以后再也不会打开了。

这就是“单轮评估”(per-turn evaluation)无法察觉的失效模式。孤立来看,每一轮对话似乎都是正确的。裁判(Judge)给了赞。幻觉检测器保持沉默。相关性评分很高。然而,整个对话作为整体并没有解决任何问题——而这正是用户真正评估你的单位。

过时的 Few-Shot 示例以及你的提示词仓库所忽略的半衰期

· 阅读需 11 分钟
Tian Pan
Software Engineer

打开任何已经上线超过九个月的 AI 功能的系统 Prompt。向下滚动,越过角色描述,越过格式规则,越过安全护栏。停在标题为 <examples>## Examples 的块,或者是你的团队在某人把前三个好用的 Slack 线程复制到代码块的那天给它起的任何名字。读一读它们。有 60% 的可能性,其中至少有一个引用了已经更名的功能、一个已不存在的按钮,或者产品经理在两个季度前悄悄砍掉的工作流。

这种衰退从评测(eval)仪表盘上是看不出来的。评测得分是绿色的。它们已经绿了好几个月了。它们之所以是绿色的,是因为评测集是针对 Few-shot 示例所引用的同一个产品界面编写的,两者已经同步老化。模型正在完美地模仿去年的产品,而在一个以此标准打分的测试集上,它是合格的,然而真实用户在与今年的产品互动,并默默忍受由此产生的幻觉(confabulations)。这就是没有人写进 LLMOps 路线图的半衰期。

AI 代码审查漂移:当你的 LLM 审查标准比代码演进得还快

· 阅读需 10 分钟
Tian Pan
Software Engineer

PR 审查仪表盘连续六周显示绿色。机器人捕获率、评论量、开发者的“点赞”反应——一切都很稳定。然后生产环境发生了一起安全事故,事后分析指向一个缺失的空值检查(null-check),而这个检查机器人以前是能捕获到的,大约在两个月前悄然停止了。没有人更改机器人。没有人降级模型。仪表盘从未变动。但标准变了。

这是自动化代码审查在任何产品演示中都不会出现的失效模式。团队采用 LLM 审查器是为了获得一致性——每个 PR 都遵循相同的检查清单,没有资深工程师因“心情不好”而产生的波动,初级贡献者的周转速度也很快——这种一致性在最初的一个季度确实存在。然后系统提示词(system prompt)演变了,模型升级了,few-shot 库积累了,机器人开始使用不同于团队验证时的模型,根据不同的准则来审查不同的代码库。团队对“机器人能捕获什么”的心理模型衰退成了“机器人上周捕获了什么”。

提示词组合:管理一组提示词,而非单一的最佳提示词

· 阅读需 12 分钟
Tian Pan
Software Engineer

大多数生产环境中的 AI 团队谈论提示词(prompt)的方式就像初级交易员谈论股票一样:总觉得存在一个“最好的”,而工作就是把它找出来。于是他们不断迭代——一个 Slack 线程,几行评估数据,产生一个新的赢家,推送到主分支,如此循环。其结果是一个承载了产品全部意图解析覆盖面的单一制品(artifact),针对一个固化的评估集进行了优化,而它距离 P1 级事故往往只差一次令人遗憾的修改。

错误在于“单一”这个词。提示词不是一种证券,而是一种配置(allocation)。同一个用户意图可以由几个变体很好地服务,每个变体都有自己的置信区间、各细分领域的性能以及对模型和语料库偏移的敏感度。正确的心理模型不是“找到最好的提示词”,而是“管理一篮子提示词,其构成本身就是产品”。量化金融在五十年前就弄明白了这一点,而其运营机制几乎可以直接无缝迁移。

升级率:离线测试遗漏的评估信号

· 阅读需 11 分钟
Tian Pan
Software Engineer

每个智能体(agent)功能都有一个“后门”。有的团队称之为“转人工支持”,有的称之为“路由至人工审核员”,还有的则使用模板化的回复:“我无法处理此事——让我为你联系能提供帮助的人。”无论标签是什么,每个生产环境中的智能体都有一条放弃用户请求并将其移交给人工的路径。而生产流量采取该路径的比例,是少数几个不依赖标注员、评审员或手动构建测试集的信号之一。这是系统在生产环境中告诉你,模型无法处理用户实际发送的请求。

这个信号几乎总是被错误的团队读取。在大多数公司中,转人工率(Escalation rate)是一个劳动力规划指标:它决定了下一季度排队系统需要多少人工客服。它存在于运营团队审查的仪表板上,其审查频率与 AI 团队读取评估分数(eval scores)的频率完全不同。30% 的周环比转人工增长在周一的运营审查中表现为一个人员配备问题,而 AI 团队的评估套件依然显示绿色,领导层的报告也显示功能状态良好。两个团队看着同一个生产系统,却得出了截然相反的结论:运营团队认为他们需要更多人手,而 AI 团队认为模型运行良好。

Agent 分支覆盖率:你的评测仅命中了 Happy Path,而非 Planner 的 If-Else 逻辑

· 阅读需 9 分钟
Tian Pan
Software Engineer

我上季度合作的一个团队针对其支持智能体(support agent)运行了一套包含 240 个案例的评估集。连续六个月,测试结果全线飘绿。接着,他们更换了规划器提示词(planner prompt)中的一个句子——仅仅是一次语气调整——结果第二天生产环境的人工接管请求激增了 3 倍。而评估分数却纹丝不动。人工接管分支仅仅是开始在以往能在线解决的临界案例上触发,而评估集中没有一个案例属于这种临界类型。该分支存在于提示词中,存在于生产环境中,唯独不存在于评估集中。

这就是我想命名的失败模式:智能体分支覆盖率 (agent branch coverage)。代码覆盖率工具在过去的 40 年里一直是调试的基础,但智能体系统具有运行时控制流——规划器分支会选择工具、限定回复条件、升级到人工、拒绝执行、或尝试不同的策略重试——而评估集仅触及团队想到的那些案例。规划器 80% 的决策分支从未在测试下执行,于是,一份“全绿”的评估报告就成了一场披着回归测试外衣的冒烟测试。

评估天花板:当你的黄金测试用例失去区分度时

· 阅读需 11 分钟
Tian Pan
Software Engineer

一年前,你的评估套件(eval suite)表现得非常出色。候选模型的得分分布在 60 到 80 分之间,排名结果能为你提供有效的参考。新的微调模型比基准模型高出 6 分;更廉价的模型则低了 3 分。决策依据这些数字而产生。而今天,在同样的评估套件下,每个候选模型的得分都是 95、96 或 97 分,得分差距已经缩小成了噪音。你的团队仍在运行评估,仍在阅读报告,仍在利用它为迁移亮绿灯——但这份报告已经不再包含任何有效信息。

这不是基准测试污染(benchmark contamination),也不是世界漂移引起的衰减(world-drift decay)。这是一个测量工具的问题:你的测试用例是针对平台已经超越的难度水平而校准的。尺子没有坏;而是你正在测量的东西已经超出了它的量程。那些没有意识到这一点的团队,仍然在使用一个辨别范围与所比较的候选模型不再重叠的工具来进行模型决策。

延迟预算博弈:如何告诉产品经理“实时性”是有能力代价的

· 阅读需 13 分钟
Tian Pan
Software Engineer

一位产品经理走进规划会议,提出了一个只有一行的需求:“响应时间低于两秒,就像 ChatGPT 那样。”讨论中的智能体 (agent) 需要调用六次工具,检索两个索引,运行一个带有思考预算 (thinking budget) 的推理模型,并由第二个评审模型验证其输出。目前端到端的 p50 延迟是 9 秒。工程团队有三个选择:答应下来并悄悄地把智能体削弱成更糟糕的东西;拒绝并眼睁睁看着产品经理去寻找那些在演示视频中吹得天花乱坠的供应商;或者做一件入职培训中没人教的事 —— 开启一场结构化谈判,将每一秒的延迟都转化为智能体放弃的一项能力。

大多数团队会选择第一种。智能体上线后延迟确实到了 2 秒,但准确率下降了 12 个百分点,发布会仍被视为成功,因为达到了标题上的延迟指标。三个月后,团队开始与质量退化作斗争,却没人能将其归因于某项改动,因为退化本身就是那次发布。延迟目标从未被定价,它仅仅是从一份将速度视为免费午餐的产品规格说明书中继承而来的。

多模态通道冲突:当模型在视觉与文本之间自我矛盾时

· 阅读需 12 分钟
Tian Pan
Software Engineer

这张图片是一张红色八角形停止标志的照片。有人在中间的单词上贴了一张小贴纸,上面写着“YIELD”(让行)。你问多模态模型:“这个标志写了什么?”模型回答:“该标志指示驾驶员在交叉路口让行给迎面而来的车辆。” 表现得既自信又流利,却既不忠实于视觉证据,也不忠实于文本证据。它是一个混合体,在产生分歧的真相通道之间采取了折中方案。

这种故障模式目前还没有一个统一的名称。研究多模态幻觉(multimodal hallucination)的研究人员将其称为“语义幻觉”(semantic hallucination)、“跨模态偏差”(cross-modal bias)或“模态主导”(modality dominance),具体取决于撰写论文的细分领域。交付文档 AI、截图智能体和缺陷检测系统的从业者每周都会遇到这种情况,并在事故复盘中将其描述为“模型只是在瞎编”。它不是瞎编的。这是一种在最终层融合了两个通道、却没有任何原语来表示通道意见不一情况的架构的可预测输出。

Prompt 卧推:对“快乐路径”之外的提示词进行压力测试

· 阅读需 11 分钟
Tian Pan
Software Engineer

一个在你的评估集(eval set)上得分 92%,但在真实生产流量中得分 60% 的提示词(prompt),并不是一个有 bug 的提示词。它是一个评估集在结构上无法发现 bug 的提示词。这种差距并非噪声,而是针对那些与提示词设计意图共享语域(register)、长度分布、语言和礼貌程度的示例进行优化的结果——而这些示例正是由编写评估案例的同一个意图所创作的。

真实用户不会配合你的设计意图。他们会发送三个词的片段、十二个段落的文章、作为问题粘贴的代码块、省略冠词的非正式语域、添加敬语的正式语域,以及你的 few-shot 示例从未涉及的语言查询。这些都不是攻击性的,这只是输入分布(input distribution)。如果你的评估集是由编写提示词的同一个人策划的,那么它几乎肯定与这种分布毫无相似之处。

缩小这一差距的学科不是“更多评估”,而是一种不同类型的评估——一个压力矩阵(stress matrix),它刻意改变你策划的集合中保持不变的维度,并对退化曲线(degradation curves)进行评分,而不是单一的准确率数字。称之为提示词卧推(prompt bench press):你不是在测试提示词能否完成工作,而是在测试随着输入变得更难,它是如何失败的。

采样漂移:当 Temperature 和 Top-P 变成团队内部的“口头传说”

· 阅读需 10 分钟
Tian Pan
Software Engineer

打开任何上线超过一年的 AI 功能的生产环境配置,你会发现一个考古挖掘现场。temperature: 0.7 是因为有人想让演示看起来不那么机械。top_p: 0.85 是因为一个客户抱怨输出太普通。frequency_penalty: 0.4 是因为 2024 年有那么糟糕的一周,一个现在已经退役的模型一直在重复自己。这些决定都没有记录。它们都没有针对当前的基座模型进行重新测试。它们在每一次请求、每一次评估、每一次 A/B 测试中运行,塑造着自原始工单关闭以来再也没有人会有意识选择的行为。

这就是采样漂移(Sampling Drift)。它是由于权宜之计而进行的采样器微调的缓慢积累,这些微调最初的理由已经消失,而其效果却在不断叠加。你配置中的数值并不是经过“调优”的——它们是过去事故的化石记录,被缩放到了你当前的流量规模。

它之所以不可见,是结构性原因造成的。你运行的每一次评估都是针对当前的采样配置进行评分的,所以头条数据看起来总是没问题。当 Temperature 值比基座模型落后两个版本时,不会触发报警。也没有日历邀请会提醒你“在本季度重新网格化采样参数”。这种衰减是无声的,直到有人运行了一个干净的实验,发现一个质量提升、Token 减少,或者两者兼而有之的机会,就摆在眼前,且不需要任何工程成本。