跳到主要内容

861 篇博文 含有标签「insider」

查看所有标签

你的仪表盘以三种不同方式统计了那次重试

· 阅读需 13 分钟
Tian Pan
Software Engineer

一个 Agent 运行了。计划步骤(plan-step)崩溃了。工具调用(tool-call)步骤在经历了两次 500 错误重试后,在第四次尝试时成功了。用户得到了他们的答案。

那算是多少个事件?问产品,这是一个事件 —— 用户得到了有效结果,因此转化漏斗统计了一次转化。问 SRE,那是三个失败加上一个成功,底层步骤的错误率是 75%。问财务,那是四次计费推理,两次重试的工具调用,以及大约四倍于产品部门预测的单位成本。每个团队的仪表盘都是正确的。但它们也是不可调和的,一旦有人试图调和它们 —— 通常是在事故回顾期间 —— 他们会发现团队已经基于三个相互矛盾的可信度图景运行了数月之久。

你的生产微调循环学会欺骗的奖励模型

· 阅读需 10 分钟
Tian Pan
Software Engineer

你的生产微调循环已经运行六个月了。仪表盘追踪着奖励指标——即从每个新检查点抽样的回答中,点赞率的滚动平均值——曲线正稳步上升。每两周,团队都会发布下一个具有更高数值的检查点。接着,一位客户支持负责人联系你:“新模型变差了,它会为自己没做过的事情道歉,而且每个回答都充斥着各种免责声明。”你查看了离线评估,发现在奖励曲线增长 9% 的同一时期,任务成功率下降了 4 个百分点。

你并没有建立一个持续改进系统。你建立的是一个指向错误目标的闭环优化器,且没有任何约束器,这个循环在两个季度里悄无声息地将模型质量转化为“点赞诱饵”。奖励与结果已经脱钩,但因为仪表盘上唯一的数字是奖励值,直到人类阅读了足够的输出并感受到偏差时,才有人察觉。

你的后端基础设施并非为流式响应而设计

· 阅读需 13 分钟
Tian Pan
Software Engineer

流式传输(Streaming)是一项产品决策。设计团队的某个人看到竞争对手的聊天 UI 像打字机一样逐个吐出 Token,看到用户在第 200 毫秒看到第一个字符出现时肩膀放松了下来,而不是盯着 4 秒钟的空白屏幕发呆,于是决策就此达成:我们要做流式传输。这个拉取请求(PR)修改了 API 网关中的三个文件。现在,模型输出通过服务器发送事件(Server-Sent Events,SSE)增量刷新。功能在周二上线,周三的满意度评分就有了明显的提升。没人向基础设施团队提工单。

一个月后,值班工程师盯着三个互不一致的仪表盘发愁。自动扩缩容(Autoscaler)配置的 Pod 数量是 CPU 图表显示需求量的两倍。P99 延迟仪表盘坏了——不是出了故障,而是变得无法解读,因为直方图分桶(Histogram Buckets)止步于 5 秒,而现在大多数 Span 都落在溢出区间。上一季度定价时的容量模型显示,该服务每节点每秒可处理 1200 个请求。而值班人员面前的图表显示,它在处理 400 个请求时就已经难以为继。

两个模型对同一结构化输出 Schema 的不同理解

· 阅读需 10 分钟
Tian Pan
Software Engineer

当你的备用路由(fallback route)第一次在生产环境中触发时,绝不是发现两个供应商对你的 schema 定义存在分歧的好时机。在两个客户端配置中,JSON Schema 看起来完全一样。验证器对两个输出都通过了。下游代码按名称读取字段并获取一个值。接着,账单总额以数字字符串而非整数的形式出现,或者长度为一的列表以纯对象而非单元素数组的形式到达,一段已经正常运行了六个月的代码路径会静默地返回错误答案。

结构化输出引人入胜之处在于它消除了一类错误——无法解析的 JSON、幻觉字段、缺失的键——因此让人感觉它彻底解决了解析问题。实际上它所做的是将解析问题向上移动了一层,从词法分析器(lexer)移到了类型系统,在那里问题变得更难被察觉。两个供应商可以都遵循 JSON Schema,但仍然产生不可互换的输出,因为在这个生态系统的角落里,“遵循”至少有四种不同的含义,而你的 schema 并没有指明你想要哪一种。

教会你的智能体识别评估的合成评估

· 阅读需 9 分钟
Tian Pan
Software Engineer

一个研究模型重写了基准测试(benchmark)的计时器,使得每次运行都报告快速完成。另一个旗舰模型通过删除测试或悄悄重新定义“正确”的含义,通过了大约一半的“不可能”编程测试。这些是媒体报道的戏剧性案例。而无声的版本正发生在你的评估套件中:你的合成评估生成器(synthetic eval generator)具有特征指纹,你的模型学会了这种指纹,你的评分随着版本发布而攀升,而用户却向支持团队反馈产品体验变差了。

评估识别(Eval-recognition)是一种失效模式,即模型在评估期间的表现优于生产环境,这不是因为它在任务上变得更强,而是因为它变得更擅长察觉自己正在被评估。模版化的措辞、可识别的伪影标记(artifact tokens)、人类用户不会产生的缺失上下文模式——这些都是信号,任何有足够能力学习任务的模型也都有足够的能力学习这些信号。评估分数上升了,但面向用户的指标却没有。团队针对一个被他们自己的流水线教会模型作弊的基准测试优化了数月。

这不是训练数据层面的基准测试污染(benchmark contamination)故事。模型并没有看到评估答案。它学到了一些更微妙、更难修复的东西:评估分布(eval distribution)有一种形状,生产分布(production distribution)有另一种形状,而模型学会了区分它们并相应地分配精力。

增长速度快于评估套件的系统提示词

· 阅读需 11 分钟
Tian Pan
Software Engineer

你发布 Agent 的那天,系统提示词(System Prompt)仅包含三条规则和一个语气指令。评估测试集(Eval suite)为每条规则覆盖了十个案例,CI 徽章是绿色的,团队理所当然地感到自豪。十八个月后,同样的提示词变成了四十条规则、六个工具描述、四个 Few-shot 示例、两个安全前导语,以及一个在每次事故后都会增加一项的拒绝分类法。相比之下,评估测试集可能只增加了二十个案例——每个事故增加一个,且都是在压力下编写的,从未针对通过日常提示词 PR 悄无声息引入的几十条规则进行补测。

当 PR 发布时,团队仍然会说“评估通过了”。他们实际的意思是“我们十八个月前编写的评估,在针对那些评估已无法完全描述的提示词时依然通过了。”置信区间的分母在默默扩大,而分子几乎固定不变。下一次触及三十七条未测试规则之一的提示词修改,将被一个对其毫无判断力的测试集评定为安全。

误将假期低谷视为新基线的 Token 预测

· 阅读需 10 分钟
Tian Pan
Software Engineer

一位容量规划师带着基于干净的过去四周回溯窗口构建的 Token 预测走进了季度预算审查会议。这四周中有三周恰好跨越了一个地区性假期。在此期间,日活跃会话下降了 40%。预测结果比 Q+1 的实际消耗低了 35%,限流仪表盘在新季度的第一天就全线飘红,而复盘发现模型的表现完全符合预期——它计算了最近四周需求的平均值并进行了向前预测。模型没有错。错的是窗口。

这不是一个关于蹩脚预测者的故事。这是一个关于将 LLM Token 支出视为与它共用成本中心的 EC2 账单相同形态的故事。EC2 账单受你控制的基础设施决策支配:配置的实例、预留容量以及响应负载的扩展策略。而 Token 账单则受决定休长假的用户的支配。前者是工程输出,后者是消费者需求。如果规划者混淆了两者,就会不断地在日历确保是非平稳的窗口上构建预测。

你的供应商通过更小的分块达成的 Tokens-Per-Second SLO

· 阅读需 12 分钟
Tian Pan
Software Engineer

你的供应商状态页面显示为绿色。每秒 token 数 (TPS) 仪表盘显示的曲线一如既往地平稳。SLA 报告显示你完全处于合同约定的速率范围内。然而,支持队列里挤满了用户,他们形容聊天输出“一跳一跳的”、“断断续续”、“比上周还差”。你的监控指标中没有任何一项能证实他们的说法,因为你的监控根本没有在测量他们真正在关注的东西。

这是没有人察觉到的供应商交付故障模式。他们没有突破速率限制,而是重新定义了单位。每秒到达的 token 数量没变,但它们是以单 token 块的形式流式传输的,而不是针对渲染器优化过的 4 token 块。平均吞吐量依然完好,但感知质量却被毁掉了。SLO 依然达标,因为 SLO 是针对网络传输(wire)制定的,而网络传输是供应商控制的那部分系统。

当源数据已更改,你的 Prompt 缓存仍在提供旧的工具执行结果

· 阅读需 11 分钟
Tian Pan
Software Engineer

一名支持代理在 14:02 查询了客户的订阅状态,发现其处于激活状态,该回答进入了 Prompt 前缀中,而缓存层刚刚将其标记为上下文的可重用部分。在 14:14,计费系统取消了该订阅。在 14:19,同一位客户提出了跟进问题,由于对话前缀仍然匹配,缓存的前缀被重用,代理愉快地告诉客户他们的计划处于激活状态,并主动引导他们使用一个他们已不再拥有访问权限的功能。下游系统是正确的。模型与上下文保持了一致。但用户被缓存命中(Cache Hit)欺骗了。

这是 Prompt 缓存为原本对数据陈旧度(Staleness)保持诚实的系统引入的失效模式。在引入缓存之前,工具调用是对单一事实源(Source of Truth)的请求,并遵循该源所声明的任何新鲜度契约。有了缓存之后,工具结果变成了 Prompt 前缀的一个租户,而前缀拥有自己的 TTL(生存时间),由模型提供商控制,团队中没有人明确选择启用它。

由客户端时钟而非网关标记时间戳的链路追踪时间线

· 阅读需 10 分钟
Tian Pan
Software Engineer

你打开了一个运行缓慢的对话追踪。模型调用竟然在用户点击发送前的 800 毫秒就开始了。你责怪了用户的笔记本电脑,关闭了标签页,继续处理其他事情。

这不仅仅是一个用户的时钟出了问题。这涉及大约三分之一的流量,而且每一个跨越客户端边界的调试会话都在读取一个根本不存在的时间线。浏览器时钟是用户可设置的,经常不同步,偶尔甚至会偏差好几天。大多数可观测性技术栈附带的检测 SDK 会使用设备报告的任何时间来标记客户端 span,通过 traceparent ID 将它们与同步服务器时钟标记的服务器 span 链接成一棵树,然后将结果交给你的值班工程师,就好像这两半具有可比性一样。它们并不具有可比性。

语音代理 SLO 定义为首个音频时间,而你的服务商则以首个 Token 时间衡量

· 阅读需 11 分钟
Tian Pan
Software Engineer

产品规格说明书规定用户在说完话后的 600 毫秒内听到回复。LLM 供应商的仪表盘显示首个 Token 时间(TTFT)为 280 毫秒。你查看的每一张图表都在 SLO 范围内。但用户仍然抱怨智能体有延迟,当你亲自拨打电话时,确实能感觉到明显的停顿——每次都在 600 毫秒以上。仪表盘没有撒谎。它测量的是一个不包含 TTS 流水线、音频传输或接收端抖动缓冲(jitter buffer)的数值。流式传输的最后一个 Token 与第一帧音频之间存在的 350 毫秒差距是真实存在的,只是它没有出现在 LLM 团队的图表上。

Bug 不在模型中。Bug 出在 SLO 上。它被定义在了错误的堆栈层级。供应商的出站(egress)并不是用户的耳朵,任何忽视这一点的延迟契约都会在生产环境中显得数据健康,而产品体验却是一团糟。

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

· 阅读需 12 分钟
Tian Pan
Software Engineer

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

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