跳到主要内容

108 篇博文 含有标签「llm-ops」

查看所有标签

AI 功能与 OKR 的错位:为什么季度节奏会破坏 AI 路线图

· 阅读需 11 分钟
Tian Pan
Software Engineer

团队承诺“在本季度交付 AI 摘要生成器”,在第十周通过了技术门槛,在全员大会上庆祝胜利,然后正式上线。六周后,遥测曲线开始向错误的方向弯曲——无声且缓慢,没有人为其制作仪表盘,因为没有人负责这个曲线的走向。OKR 已经被标记为绿色。下个季度的 OKR 已经围绕新功能的发布起草好了。摘要生成器现在成了某个人的次要维护工作,到季度末评审时,团队开始纳闷,为什么在没有任何明显变化的情况下,该功能的客户满意度下降了 15 分。

这不是团队的缺陷,而是运营模式的缺陷。季度 OKR 是为软件校准的,在这种模式下,一个功能可以被界定范围、构建、交付,然后很大程度上就可以不管它,直到下一次重大版本更新。AI 功能不具备这种特性。它们有一条上线曲线和一条持续曲线,而持续曲线才是大部分价值——以及大部分风险——真正所在。将它们视为带有发布日期的交付物的 OKR 模板,悄悄地产生了一系列在下一个规划周期之前就已失效的演示产品。

五面分诊树:当常规操作手册不再适用时的 AI 轮值指南

· 阅读需 14 分钟
Tian Pan
Software Engineer

页面告警在凌晨 2:47 响起。智能体(Agent)正向客户支持工单发送语气错误的回复,延迟仪表盘显示平稳,错误率正常,而且由于过去 12 小时内没有进行过任何部署,没有任何东西可以回滚。值班工程师打开了运维手册(runbook),滑过了“重启工作线程池”和“扩容队列”,直到翻到底部,也没发现任何能与眼前告警相匹配的内容。他们在凌晨 3:04 开始阅读系统提示词(system prompt)。到凌晨 3:31,他们仍在阅读。

这是全新的故障形态。那些为“高延迟意味着重启 Pod,5xx 错误增加意味着回滚部署,队列深度增加意味着扩容工作线程池”而设计的轮值制度,已无法应对此类问题。第一直觉——回滚部署——是错误的,因为根本没有部署:模型在版本化别名(versioned alias)后静默升级了,第三方工具的响应结构发生了偏移,提示词版本在不同区域间出现了偏差,或者评估集在几周前就已失效,而回归问题一直在持续累积。告警是真实的。运维手册却保持沉默。AI 值班现在已经成为一门独立的学科,试图将其强行套入现有的轮值体系,只会产生那种在告警发生时,所有人第一步都是在通话中相对无言、第一次开始阅读提示词的方案。

批次层推理之问:当 50% 的折扣重塑你的架构时

· 阅读需 13 分钟
Tian Pan
Software Engineer

你账单中最便宜的推理费用,是那些你付了两次的钱。几乎所有主流模型提供商现在都提供批处理层(batch tier),价格大约只有同步推理的一半,代价是接受以小时而非毫秒计的完成窗口。大多数工程团队要么完全忽视这一选项,要么只是随手扔进一个深夜定时任务(cron),然后宣称省下了钱。这两种做法都白白浪费了 30%–50% 的推理总支出——并非因为折扣不够大,而是因为批处理并不是一种代金券。它是一个全新的产品层面,拥有自己的 SLA、重试语义和失败模式。那些仅将其视为计费优化的团队,最终要么使用率低下,要么上线了需要数周才能排查出来的细微回归问题。

技术核心不在于“我们是否应该使用批处理?”,而在于:你系统中的哪些动作在用户感知层面确实是同步的,哪些是工程团队为了开发体验方便而“误当成”同步的,以及哪些可以在下游消费者不预设结果实时性的前提下重新塑造为任务(jobs)。回答这个问题需要进行工作负载审计、从“请求型(request-shaped)”到“任务型(job-shaped)”契约的架构转变,以及根据用户预期而非开发便利性,对每个智能体动作进行延迟层级的诚实映射。

评测环境的延迟谎言:为什么你的 p95 在生产环境中翻倍

· 阅读需 12 分钟
Tian Pan
Software Engineer

评测团队在 PPT 上写下一个数字:“p95 延迟为 1.2s。” 产品上线。一周后,值班人员发布了一张图表:生产环境中的 p95 为 4.8s,并且在晚餐高峰期持续攀升。工程师们在接下来的五天里争论是否有性能倒退、为模型版本增加埋点、向供应商提交工单——最终发现,除了测量数字的地点之外,什么都没有改变。评测环境报告的是一台安静的机器在热缓存上运行串行调用的延迟。而生产环境是另一套系统。p95 从未出错;它只是在回答一个不同的问题。

这就是评测工具的延迟谎言。这并不是因为基准测试做得不好——大多数团队使用的工具都很合理,报告数字也很诚实。问题在于“模型延迟”与“用户感知的延迟”之间的鸿沟,以及你为开发构建的环境几乎总是测量前者,却暗示后者这一事实。一旦你理解了这一点,基于基准测试得出的延迟 SLO 就不再像是产品承诺,而更像是对一个没人能复现的私人测试环境的声明。

模型弃用跑步机:在收到停用通知邮件之前必须建立的规范

· 阅读需 15 分钟
Tian Pan
Software Engineer

那些将“我们使用最新模型”视为美德的团队,距离长达一个季度的计划外工作只差一封下线邮件。当弃用通知送达时,决定你是否能消化它的架构决策早在几个月前就已经做好了——而且是由那些根本没考虑过迁移的人做出的。评估套件(eval suite)隐式地针对特定检查点(checkpoint)进行了训练。提示词(prompts)是针对特定的拒绝风格(refusal style)进行调整的。成本预测假设了特定的任务令牌(token-per-task)基准。路由器的硬编码回退(fallback)模型本身也即将消失。在邮件到来之前,这些决策看起来都不像是风险,而一旦邮件到来,它们看起来就全都是同一种风险。

模型弃用现在是 AI 技术栈中最可预测的意外。Anthropic 对公开发布的模型至少提供 60 天的通知期。OpenAI 的通知窗口从针对特定快照(snapshot)的 3 个月到针对基础模型的 18 个月不等,但在实践中,最近一批 ChatGPT 模型的退役对某些团队来说只有短短两周的预警。GitHub 在 2026 年 2 月的一次协调变更日志条目中,集中弃用了一系列 Anthropic 和 OpenAI 模型。现在的模式不再是“如果模型退役”——而是“每个季度,你的技术栈所依赖的至少一个模型会进入退役窗口,而这个时间表与你的路线图并不同步”。

RAG 读后写竞争:当你的向量索引引用了一个已不存在的文档

· 阅读需 11 分钟
Tian Pan
Software Engineer

一个用户在 14:32:07 向你的助手提问。你的检索器在 14:32:08 触发,从政策手册中提取了五个分块。模型思考了几秒钟,起草了回复,并在 14:32:12 流式传回了一个答案,自信地引用了第 4.3 节——而管理员在 14:32:10 刚刚删除了这一节,因为它有误。用户读到了一段来自已不存在文档的权威引用,甚至还附带了一个返回 404 的可点击链接。

你的技术栈中没有任何环节报错。检索器返回了有效的命中结果。模型生成了流利、有据可查的文字。引用的分块 ID 在检索发生时确实存在。然而,根据任何合理的定义,这个答案都是一个幻觉——并不是因为模型胡编乱造,而是因为在它观察世界与开口表达的间隙,底层数据已经发生了变化。

这就是 RAG 的“写后读竞争”(read-after-write race),而大多数生产级流水线对此毫无防备。

推理 Span 中缺失的 kWh 列:单次请求的碳归因

· 阅读需 11 分钟
Tian Pan
Software Engineer

你的推理火焰图(inference flame graph)有一个成本轴,但没有能源轴。这种差距在某天早上之前都没问题,直到客户的采购团队给你发来一份包含 23 列供应商可持续性披露信息的电子表格,其中一列是 每 1,000 次推理的 kgCO2e。你没办法填那一格,你的供应商给出的答案是一篇方法论论文,而交易将在 9 天内关闭。你的平台团队磨练了两年的 token 成本仪表盘突然看起来像是解决了一个错误的问题。

这里的转变并非抽象的。可持续性披露正在从公司层面的汇总转向产品层面的颗粒度。第一波浪潮于 2025 年进入了 CSRD 和 ESRS,而第二波浪潮现在正冲击着 B2B 采购合同。构建了成本可观测性的工程组织即将发现,他们需要针对碳排放的可观测性,而这两者在同一个 span 上并非同一列。

DLP 应存在于你的 AI 网关中,而非生搬硬套到每个应用里

· 阅读需 13 分钟
Tian Pan
Software Engineer

第一个内部 LLM 网关的构建通常是出于那些枯燥的原因:成本归因,以便财务可以回答“哪个团队花了推理预算”;速率限制,防止某个失控的脚本烧掉月度配额;以及供应商故障转移,确保 OpenAI 的小故障不会导致助手挂掉。数据泄露防护 (DLP) 虽然出现在幻灯片上,但交付时却变成了“每个应用团队在调用模型前应自行脱敏敏感字段”。六个月后,生产环境中有九个应用,三个维护得半吊子的脱敏库(带有微妙差异的正则表达式集),两个完全绕过网关“仅用于测试”的原型,以及一起 Prompt 中包含客户数据的事故——而这本该是由每个人的中间件来防止的,因为并没有人的中间件是规范的出站口。

这不是工具问题,而是架构错误。DLP 是一种出站控制,而出站控制只有在路径强制执行时才有效。当你让应用团队负责脱敏时,你就放弃了让 DLP 发挥作用的特性——即敏感数据只能从一个地方流出,且你可以证明流出了什么。2025 年的 LayerX 安全报告用大多数团队尚未意识到的数据说明了问题的规模:2025 年初,与生成式 AI (GenAI) 相关的 DLP 事故增加了一倍多,目前占 SaaS 流量中所有数据安全事故的 14%,员工平均每天向 GenAI 工具粘贴 6.8 次内容,其中超过一半包含公司信息。影子路径默认在胜出。

你的准确率提升了,但你的校准崩溃了

· 阅读需 11 分钟
Tian Pan
Software Engineer

一个团队发布了一次提示词重构(prompt refactor)。离线评估显示准确率提高了三个百分点。产品经理(PM)在 Slack 上发布了图表。两周后,支持工单激增,出现了一个没有任何仪表盘记录的模式:用户信任了他们不该信任的答案,并据此采取了行动,结果蒙受了损失。模型比以前更准确了,但对模型的信任却变差了。

这就是“校准崩溃”(calibration collapse)。模型的置信度不再与其错误率相匹配,但由于准确率数字上升了,团队认为他们发布了一个成功的更新。其实不然。他们发布的是一个更加“自信地犯错”的系统,而用户——他们是根据模型的语气(含糊表达、确定性、拒绝回答)而不是他们从未见过的准确率数字来校准信任的——现在在那些被误导后果最严重的查询中被误导了。

准确率(Accuracy)和校准(Calibration)是独立的维度。你可以改变其中一个而不影响另一个。你可以在提高一个的同时摧毁另一个。大多数团队只测量第一个维度并以此为基准发布产品,而大语言模型(LLM)系统中的大多数生产事故都发生在第二个维度上。

智能体幂等性是一项编排契约,而非工具属性

· 阅读需 12 分钟
Tian Pan
Software Engineer

客服工单在上午 9:41 送达:“我被扣了三次费。”链路追踪看起来无异常。一条用户消息,一次规划器轮转,三次对 charge_card 的调用 —— 每次都有唯一的工具调用 ID,每次都返回 200 OK,每次都写入了不同的 Stripe 扣款。工具本身有幂等键,后端有去重表,支付处理器也遵循 Idempotency-Key。每一层都是幂等的,但客户依然支付了三次。

如果你构建 Agent 的时间足够长,这类 Bug 迟早会出现在你的桌上。它不是任何工具的 Bug,而是 Agent 循环与工具之间契约的 Bug,而这种契约几乎总是只存在于资深工程师的脑海中。

静默成功:当你的 Agent 宣告完成但实际上什么也没发生

· 阅读需 11 分钟
Tian Pan
Software Engineer

在智能体对话记录中,最危险的一行往往是那句充满自信的话。“我已经更新了记录。”“邀请已发送。”“权限已应用。”这里的每一句话都是一种主张,而非事实。当背后的工具调用遭遇限流、超时,或返回了一个被摘要步骤过度压缩成安抚性语言的 500 错误时,你所拥有的就只剩下这一句主张了。你的遥测系统会将这一轮对话记录为成功,因为所谓的“成功”被定义为模型在其最后一条消息开头所输入的任何内容。而下游的写入操作从未提交。整整三周都没有人察觉。

这是一种将智能体与之前所有系统区分开来的故障类别。传统服务失败时会返回状态码。传统的批处理作业失败时会提供堆栈追踪。而智能体失败的方式则是继续交谈。它将错误吸收进正在进行的叙事中,对其进行修饰以使故事逻辑自洽,然后交给你一段读起来像是大功告成的文字。用户读了这段话。你的可观测性平台索引了这段话。但数据库中的记录却纹丝未动。

你的评测框架是单用户运行的,但你的智能体并非如此。

· 阅读需 12 分钟
Tian Pan
Software Engineer

你的 Agent 通过了 92% 的评估测试集。你发布了它。在上线一小时的真实流量中,发生了一些从未在任何追踪(trace)中出现过的事情:Agent 在频率限制(rate-limit)重试风暴中停滞不前,一个客户在工具响应中看到了另一个客户的草稿邮件,你的模型供应商连接池处于 100% 的占用率,而 CPU 却处于闲置状态。这些失败没有一个源自模型。它们存在于你测试的方式与生产环境运行方式之间的鸿沟中。

这个鸿沟表现为同一种形式。你的评估工具(eval harness)在一个固定数据集上一次循环一个 Agent。而你的生产环境则在共享基础设施上同时运行许多 Agent。顺序评估隐藏了每一个前提条件为“两个事物接触同一个资源”的 Bug。在你将对抗性并发(adversarial concurrency)构建到评估工具本身之前,这些 Bug 只会以紧急运维(on-call)报警的形式出现。