跳到主要内容

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

查看所有标签

批次层推理之问:当 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)报警的形式出现。

你的黄金标签是从你的模型中学到的:通过生产环境泄漏导致的评估集污染

· 阅读需 12 分钟
Tian Pan
Software Engineer

你的评估套件通过了。质量仪表板显示为绿色。一周后,用户正在悄悄流失,没人能解释原因。评估集并没有通过犯错来撒谎——它的谎言在于它是一面镜子。你用来评分的标签,可以追溯到正是由你试图评估的那个模型家族生成或过滤的。通过这项评估并不是质量的证明。它证明了你的模型与其过去的输出是一致的。

这是成熟 LLM 流水线中一种隐蔽的失败模式:通过生产泄漏导致的评估集污染。这不同于著名的基准测试污染(即在 GSM8K 上训练的模型又在 GSM8K 上进行评分)——那个故事已经被讲烂了。更微妙的一种发生在下游。你的黄金标签来自用户反馈、来自先看到模型草稿的人类标注员、来自 RLHF 奖励追踪、来自 LLM-as-judge(模型即评委)的偏好数据。这些流水线中的每一个都将当前模型习语的指纹带回到了你的“基准真值”中。几个季度下来,测试集悄悄地记住了你模型的偏好,评估变成了一个自我表扬的循环。

首次触达工具损耗:为什么你的智能体在执行任务前要先读 12 个文件

· 阅读需 12 分钟
Tian Pan
Software Engineer

你的智能体刚刚花了 90 秒和几美元来修改一个只有三行代码的函数。在提交编辑之前,它列出了两个目录,打开了测试文件,运行了 grep 来查找调用者,读取了配置模块,检查了 CI 工作流,还调出了一个从未用过的类型定义。它产生的 diff 只有四行,而产生这个结果的 trace 却包含了 43 次工具调用。

这就是“首触工具损耗”(First-touch tool burn):一种当智能体被分配了一个范围明确的任务时,却表现得好像每个请求都是一个研究课题的模式。探索行为先行且力度极大 —— 在向文件写入单个字符之前,60% 到 80% 的 token 预算都花在了列出目录、grep 和读取上。团队在第一次查看 trace 时发现了这一点,并意识到智能体为一个两分钟的任务做了相当于两小时的入职培训。

这种行为并非某个特定模型的 bug。它是这些系统的训练和评估方式的必然产物,与生产环境发生了碰撞。而生产环境衡量的是训练从未衡量过的东西:这项工作是否便宜到值得去做的程度。