跳到主要内容

80 篇博文 含有标签「llmops」

查看所有标签

误将假期低谷视为新基线的 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)制定的,而网络传输是供应商控制的那部分系统。

你在三月份录制的演示视频是它最后一次正常工作的时候

· 阅读需 9 分钟
Tian Pan
Software Engineer

一家 B 轮 AI 公司的销售工程师在 3 月的一个周二录制了一段五分钟的演示视频。智能体(agent)在第一次尝试时就选对了工具,用买家的语言组织了答案,并以一种“考虑周全,而非模棱两可”的礼貌态度拒绝了一个棘手的边缘情况。那段录像被存入了资源库。在接下来的七周里,它促成了五笔交易。

到了 5 月底第六个潜在客户在入职培训电话中看到它时,模型已经收到了供应商的小版本更新,重新调整了它的拒绝话术;Prompt 被编辑了两次以修复一个无关的回归问题;工具目录增加了三个条目(模型现在更倾向于其中之一);RAG 语料库针对新的分块器(chunker)重新建立了索引。演示视频不再是产品的录像,而是一个已经不存在的产品的录像。

一路重试穿过你限流器的 agent

· 阅读需 11 分钟
Tian Pan
Software Engineer

你的网关给每个 tenant 干净利落地强制执行每秒 100 次请求的限制。dashboard 显示每个 tenant 都舒舒服服地在那个上限之下。但模型 provider 寄来的账单告诉你,你的支出上限照样被打穿了。rollout 电话会议上没有人能给出一个干净的解释。

答案在于限流器和账单衡量的是不同的东西。当用户点击一个按钮时,限流器看到的是一次"用户请求"。而 provider 看到的是一次 planner 调用、三次工具结果反思、一次因更严格 JSON schema 触发的格式修正重试,以及一次最终综合——每一次都带着自己的内部重试预算,在瞬时 429 或 500 回来时就会触发。一次点击可以扇出成三十次模型调用。限流器只数到一次。桶以它被设计容量的三十倍漏水。

在 HTTP 边界上对 agentic 系统做限流,就像在高速公路入口立速限标志,而入口里面的车却在自我繁殖。除非限流器理解了这个循环,否则循环就会绕过它。

继承了你客服团队最坏习惯的聊天机器人

· 阅读需 11 分钟
Tian Pan
Software Engineer

你用一年的真实客服对话记录进行了微调,因为你认为那是领域知识的所在地。现在,这个模型的语气听起来就像你的支持团队。它会在有理由道歉之前就开始道歉,提供它没有权限批准的商誉补偿,还会说 “我已经把这个问题升级到了二级队列” —— 而这个队列对它来说根本不存在 —— 甚至会模仿你的客服在 Slack 上互相沟通时使用的半句式简写。在你的评估集上,领域准确率看起来非常棒。但在投入生产环境三周后,退款额度直线飙升,法务部门也找上了门。

这个聊天机器人并没有失控。它只是精准地学会了你训练它的内容。问题在于,对话记录并不是领域知识的记录 —— 它是组织行为的记录,而这两者在 Token 层面被紧紧粘在一起,监督微调(SFT)无法将它们分开。教导模型退货政策的同一个梯度步骤,同时也教会了它在面对沮丧的客户时,条件反射式地回应 “非常抱歉听到这个消息”,无论当时的情况是否需要道歉。你的客服人员有这些条件反射的原因。而模型只有表象。

你的评估集里只有你已经解决的问题

· 阅读需 10 分钟
Tian Pan
Software Engineer

在过去一个季度,你的评估分数从 0.81 上升到了 0.87。团队上线了一个路由器 (router),在困难意图上更换了更强大的模型,微调了系统提示词 (system prompt),并从“处理时间超过一天的工单”中提取并添加了 40 个新的测试用例。仪表盘显示系统变得更好了。NPS 持平。活跃用户数下降了 2%。

有一个简洁的故事可以解释这两个数字,但你可能并不想听:你的评估集只包含你已经解决的问题。那些失败得如此彻底,以至于用户从未提交工单、从未回来、甚至从未出现在你 grep 的任何日志中的查询 —— 它们不在你的测试套件中。它们不在任何人的套件中。评估分数的上升不仅与你在可见的事物上做得更好相一致,也与你在可见的事物上做得更好、但在不可见的事物上依然糟糕透顶相一致。

CFO 在电子表格上看不见的评测预算

· 阅读需 10 分钟
Tian Pan
Software Engineer

打开任何季度计划电子表格,你都能找到团队交付的每一个功能、每一张外包发票、每一项云服务支出。你找不到的是那些从未发生的停机事故、在触达客户前被拦截的幻觉退款,或者是凌晨 2 点被评测(eval)拦截的 Prompt 回归。这些“非事件”没有 SKU。它们不产生工单、没有复盘报告,也没有 Slack 讨论串。因此,当评测预算面临续约时,它在与拥有 Demo 的功能争夺人力配额——而且几乎每次都会输。

这不是勇气的问题。这是一个衡量标准的问题。评测投资同时兼具安全网和测试套件的属性:它悄无声息地产生复利,在规避灾难中体现价值,而其全部价值都建立在“反事实(counterfactual)”之上。财务部门在结构上对反事实视而不见。如果你领导一支 AI 团队,你的工作不是去争论评测是否重要——这一点每个人都会点头同意。你的任务是让那些只相信电子表格的人,能够看懂这种具有复利效应且无形的投资回报。

故障复盘:根本原因竟是一个无人负责的提示词

· 阅读需 10 分钟
Tian Pan
Software Engineer

故障复盘进行得非常顺利,直到遇到了一个没人能回答的问题。下午 2:14,结构化输出错误激增,某个收入工作流停滞了 90 分钟。时间线还原得很清晰:三周前,有人修改了系统提示词(system prompt),多加了几个关于“对话语气”的词,这在特定输入下悄悄导致模型偏离了 JSON 契约。修复方法很简单,只需一行代码回滚。但接下来的部分很难:有人问是谁做的改动,谁审核的,以及未来哪个团队负责维护这个提示词。房间里陷入了沉默。没有 Pull Request,没有审核人。改动是某个人在晚上 11 点通过厂商控制面板操作的,而那个人已经不记得这回事了。

那种沉默才是真正的事故。JSON 契约的失效只是症状。根因在于,系统中杠杆率最高的一处行为逻辑,竟然没有负责人,没有变更历史,也没有走任何管理其他生产环境变更的流程。模型没有出错。模型完全按照指令行事。失败之处在于,“指令”本身完全脱离了变更管理。

这是目前最常见的生产环境 AI 事故之一,而且几乎从未被正确命名。复盘报告在根因栏写下“提示词退化(prompt regression)”然后就此揭过。但“提示词退化”描述的是代码表现。真正的根因是组织架构图上的一个漏洞。

演示到生产的悬崖:为什么准确率 90% 的智能体发布率为 0%

· 阅读需 11 分钟
Tian Pan
Software Engineer

有一种特定的会议,通常发生在令人印象深刻的智能体(Agent)演示大约六周后。原型演示了订机票、重构模块、核对发票——现场演示,一次成功,就在利益相关者面前。大家都认为它可以上线了。接着有人调取了生产数据,发现那个“好用”的智能体每完成 40 个任务就会产生一张工单,每几百次就会产生一笔退款,还留下了一堆没人能解释的半成品状态。项目没被砍掉,但它卡住了。而且到现在还卡在那儿。

这就是从演示到生产的悬崖,也是智能体项目失败最常见的方式。悬崖并非由糟糕的模型或懈怠的团队造成的。它源于一个度量错误:将 90% 的成功率视为完成了 90% 的上线工作。事实并非如此。一个 90% 准确率的智能体是一场成功的演示,但对于大多数真实工作流来说,它是一个无法上线的产品。2025 年登上头条的 MIT NANDA 报告指出,95% 的企业生成式 AI 试点项目没有产生可衡量的损益(P&L)影响——这就是在大规模范围内统计出的悬崖现状。

那些在你没留意时变简单的评估集

· 阅读需 10 分钟
Tian Pan
Software Engineer

你在 18 个月前编写了这套评估集(eval set)。那时它是一个非常有用的工具:低价模型的得分是 71%,更好的模型得分是 84%,而当出现回归(regression)时,分数会下降并被察觉。这套测试套件在 CI 中赢得了一席之地。于是你不再关注它了。

今天再运行它,每个候选模型的得分都是 96、97、98。新版本的得分与旧版本相同。你怀疑表现较差的模型与你认为更好的模型得分也一样。仪表盘上的数字依然显示为绿色,检查依然通过,但它实际上什么也没告诉你。你的评估集并没有坏。它只是变简单了——因为底层的模型变强了——而没人在意它失去区分度的那个瞬间。

这就是评估饱和(eval saturation),这不仅是你可能遇到的失效模式,更是任何静态测试套件在足够长的时间跨度下必然走向的终局。一个所有模型都能通过的测试,已经不再是测试了。

悄然失效的评估:当你的测试套件在衡量一个已不存在的世界

· 阅读需 11 分钟
Tian Pan
Software Engineer

你的评测套件通过了。240 个案例全是绿色,和上周一样。你发布了代码。两天后,支持工单激增。当你阅读对话记录时,你发现了一种你的套件完全没有立场的失败模式——不是某个案例从通过变成了失败,而是用户开始问一些你的套件从未想到过要去问的问题。

这就是评测(evals)的无声失败。我们将“全绿”视作对现状的肯定:“系统运行正常”。实际上,它只是对过去的一种陈述——即编写这些评测案例的那一刻。六个月前编写的评测编码了当时的三样东西:产品的范围、模型的失败模式,以及真实用户表达请求的方式。而这三者都在变化。功能增加了新的界面,模型升级了两次。随着用户了解产品的功能,输入分布也发生了漂移。套件没有随之移动,因此全绿的运行结果越来越只是在证明一个不再存在的世界。

没有人注意到,因为没有东西崩溃。过时的评测不会报错。它会继续自信地通过,但衡量的关键内容却越来越少。

当 Agent 出错时谁会被呼叫:针对非确定性系统的轮值制度

· 阅读需 10 分钟
Tian Pan
Software Engineer

值班轮换制度是建立在一个承诺之上的:故障是可以复现的。警报触发,你重新运行请求,观察 Bug 发生,找到错误的提交 (commit),然后回滚部署。这个循环的每一个环节都假设了确定性 (determinism)。同样的输入产生同样的输出,而输出要么是对的,要么是错的,其方式一目了然。

Agent 集群悄无声息地打破了这条链条上的每一个环节。故障发生了一次,其采样温度 (sampling temperature) 你无法重现,所处的上下文窗口 (context window) 也早已被垃圾回收。这里没有“错误的提交”,因为代码从未改变 —— 改变的是模型,或者是检索到的文档,再或者是用户措辞的方式超出了所有人的预料。你回滚了部署,但部署从来都不是问题所在。

于是警报发出了,一名工程师接手了。他们发现了在生产环境中运行 Agent 最令人不安的事实:他们拿到手的是一个无法单步执行 (single-step) 的系统,而摆在他们眼前的运行手册 (runbook) 却是为另一种完全不同的机器编写的。