跳到主要内容

720 篇博文 含有标签「llm」

查看所有标签

“换个更大的模型试试”这种直觉反应是一种重构异味

· 阅读需 12 分钟
Tian Pan
Software Engineer

晨会上出现了一个回归问题:支持代理昨晚回答错了三个客户问题。有人说:“我们试试在这个路径上用 Opus,看看能不能解决。”四十分钟后,评估通过率回升了,团队关闭了工单,而该路径上的推理账单悄然翻了三倍。六周后,同样形式的回归出现在另一个路径上,并采用了同样的修复方法。你的团队刚刚训练出了一种巴甫洛夫反射:质量回归 → 增加算力。更大的模型是你的技术栈中最昂贵的调试工具,而你现在却首先想到它。

问题不在于更大的模型没有帮助。它们确实有——有时甚至很大。问题在于,更大的模型是一种绝对占优的“掩盖”策略。当提示词指令冲突、检索返回了过时的块、工具描述被误读,或者评估集没有覆盖失效的分布时,更强大的模型会绕过这些故障而不修复其中的任何一个。下一次回归仍具有相同的根本原因,账单已经复加,而底层系统变得更加脆弱,而非更加稳健,因为升级带来的缓冲空间让所有人都不再去探究底层逻辑。

评估集也有季节性:为什么质量在报税季的第一个周一会下降

· 阅读需 13 分钟
Tian Pan
Software Engineer

在 1 月下旬的一个周一早上,仪表盘发出了第一次回归预警。支持助手的质量得分一夜之间下降了 3 分。周末没有发布 Prompt 变更。没有更换模型。评估套件——团队在 6 个月前构建的一个包含 800 行数据的精选黄金集 (gold set)——也没有任何变化。有人开了一个故障单 (incident)。

经过两天的二分定位 (bisecting) 之后,得到的答案平淡无奇且是结构性的。那是美国国税局 (IRS) 开启当年税务申报后的第一个工作周一。一半的入站查询已从“我的薪水到账了吗”变成了“我该如何申报来自支付 App 的 1099-K 表单”。在夏季采样的评估集对 1099-K 毫无头绪。模型并没有变差。是客户变了。评估标准是针对一个已经不存在的客户群进行校准的。

这种模式在每一个拥有季节性用户的产品中每季度都会重复出现——报税季的金融科技、季度末的销售工具、开学季的教育产品、退货季的电子商务、订票季的旅游产品、投保季的医疗保健。将“评估集视为固定资产”是一种舒适的抽象,但在一个无人更新的日程表上,这种做法是错误的。

你的 Gold 评估集已经发生偏移,而它的通过率正是你无法察觉的原因

· 阅读需 13 分钟
Tian Pan
Software Engineer

黄金评估集的通过率为 94%。模型在本季度已经升级了两次,提示词修改了 11 次,工具库增加了 4 个,仪表盘依然是一片绿色。然而,一名销售工程师转发了一份对话记录,显示智能体(Agent)自信地将客户引导至一个两个月前就已停用的工作流;与此同时,支持团队负责人悄悄开启了一个讨论组,询问为什么在评估流水线显示没有回归的情况下,满意度评分已经连续下滑了六周。黄金集并没有撒谎。它只是在用上个季度的产品标准来衡量这个季度的流量,而除此之外没人要求它做别的事。

这是评估系统最难察觉的一种失效模式,因为本该检测质量回归的工具本身就是误报的源头。通过率是针对集合中的项目计算的;集合中的项目是根据某个时间点的使用快照精心筛选的;用户的使用方式已经演进,但通过率依然保持“干净”。团队信任绿色的仪表盘,发布了另一个模型升级,几个月后才发现生产环境的分布与评估集所衡量的东西已经南辕北辙,而这种状态持续的时间超出了所有人的想象。

解决方法并不是提高黄金集的更新频率。更新频率是一个错误的调节旋钮;正确的旋钮是拥有第二个针对不同时间窗口校准的工具,以便在用户发现问题之前,通过两者之间的分歧来暴露漂移。这第二个工具就是影子评估(Shadow Eval)—— 一个从当前生产流量中持续重建的并行评估集,它与黄金集并行运行,其明确的任务就是与黄金集唱反调。

闲置智能体税:当用户在开会时,你的 AI 会话到底产生了多少成本

· 阅读需 13 分钟
Tian Pan
Software Engineer

一名开发者在 9:00 打开 IDE 的 Copilot,在早会前问了三个问题,然后一直开会到 11:30。聊天面板仍然打开着,对话依然可以滚动查看。模型在两个半小时内没有生成一个 token。然而,这个无人问津的会话整个上午都在悄悄地产生费用。KV 缓存被占用。提示词缓存(Prompt cache)通过定期 ping 保持活跃。对话状态保存在热存储(hot store)中。追踪流水线每跳动一次心跳就写入一行记录。模型提供商预留了并发槽位。乘以一万个席位,这笔账单是真实存在的。

这就是“闲置智能体税”(idle agent tax)。它是你推理预算的一部分,用于支付用户并未使用的容量。由于大多数工程仪表盘是为无状态 API 构建的,因此它在仪表盘上是不可见的。一个请求进来,一个响应出去,容器关闭。搞定。智能体产品在两年前就打破了这一模型,而大多数团队尚未根据这一变化重新调整其架构的成本模型。

LLM SDK 升级税:为什么补丁版本更新实际上是一次伪装的模型发布

· 阅读需 11 分钟
Tian Pan
Software Engineer

我上个季度合作的一个团队在周二凌晨 2:14 向生产环境推送了一个回归错误。值班警报触发了,因为其摘要代理(summarization agent)下游的 JSON 解析器以“尾随逗号错误”拒绝了二十分之一的响应。模型没变。提示词(prompt)没变。评估套件在前一天晚上的通过率为 96.4%,稳稳高于 95% 的准入门槛。改变的只是 package.json 中的一行:模型提供商的 SDK 从 4.6.2 升级到了 4.6.3。补丁更新(Patch bump)。由依赖机器人自动合并。发布说明里写着“内部清理”。

所谓的“内部清理”是一个收紧的 JSON 模式解析器,它删除了一个宽容的后备路径,而这个路径此前一直在默默修复模型工具调用输出中反复出现的尾随逗号怪癖。模型的行为没有改变。但 SDK 对该行为的解释改变了。团队的评估套件从未发现这个回归,因为评估套件运行的 SDK 版本与依赖机器人刚刚推送的版本不同。

这就是 LLM SDK 升级税,它是当今生产环境 AI 中最隐蔽、代价最昂贵的故障模式之一。SDK 不是被动的传输工具。它是你提示词行为的积极参与者,而那些在没有评估的情况下升级 SDK 的团队,实际上是在进行一场伪装的模型发布。

模型偏好分叉:为什么你的提示词库有三个版本且没人追踪漂移

· 阅读需 12 分钟
Tian Pan
Software Engineer

打开任何交付 LLM 功能超过一年的团队的提示词库,你都会发现同样的情况:每个提示词都有三个略有不同的版本。一个是喜欢 Sonnet 及其指令遵循能力的工程师调优的。一个是由于延迟预算而切换到 Haiku 的工程师重写的。还有一个属于那个只在 Opus 上运行且从未迁移过的原型。每个版本都有略微不同的系统消息、不同的工具目录描述方式、不同的格式引导 —— 而且没有人追踪它们是如何产生漂移的。

""

这不是卫生问题。而是一种在每次模型升级时都会累积的协作税,它正在悄悄破坏你的评估套件与线上流量之间的关系。词库本应是共享资源。而在实践中,每个功能交付时都使用了作者最后测试的版本,评估套件运行的是评估作者偏好的版本,而路由层则根据成本而不是根据哪个变体实际通过了线上评估来选择。

那些没有察觉到的团队,已经在付出代价了。

LLM 模型路由是伪装成成本优化的市场细分

· 阅读需 11 分钟
Tian Pan
Software Engineer

成本仪表盘本身就很有说服力。60% 的流量是“简单”的,快速评估显示较小模型在全局准确率指标上仅落后几个百分点,路由层在同一周内通过特性开关(feature flag)上线。成本曲线开始下行。财务部皆大欢喜。团队继续推进后续工作。

没有人注意到的是,周二下午走廉价路径、周三上午走昂贵路径的客户,现在实际上在使用两种不同的产品。这两个模型的失败方式不同。格式化方式不同。拒绝的内容不同。它们以不同的默认逻辑处理歧义、追问和部分输入。从客户的角度来看,助手一夜之间失忆了,而且没人能告诉他们原因——因为在公司内部,这次变更被归档为一次 FinOps 的胜利,而不是一次产品发布。

Prompt 缓存抖动:当最大租户上线导致所有人账单翻三倍时

· 阅读需 12 分钟
Tian Pan
Software Engineer

账单在月初寄到,金额是你电子表格预测的三倍。没有人推送过系统提示词(system prompt)的更改。仪表盘显示请求量持平。p95 延迟看起来很正常。每个正确任务消耗的 token 比例(token-per-correct-task ratio)也没有变化。然而,你却欠了推理供应商额外的四万美元,而可观测性技术栈中唯一暗示了原因的信号,是一个大多数团队从未设置过报警的指标:缓存命中率(cache hit rate)。它在计费周期的第二周,也就是某个周二的太平洋时间上午 9:47,从 71% 掉到了 18%。而那个时刻,正是你最大的租户的客户成功团队为两百名新用户启动了一场协调一致的入驻活动。

欢迎来到提示词缓存抖动(prompt cache thrashing)—— 这种多租户故障模式本该在十年前就被 SaaS 策略手册消除,如今却通过推理供应商的共享前缀缓存(shared prefix cache)从后门溜了回来。供应商的缓存是在你组织的流量中共享的。无论你是否愿意,你的租户都在共享这个缓存,而一个租户的前缀形态在夜间发生改变,就可能逐出(evict)所有其他租户的单位经济效益(unit economics)所依赖的前缀。对于那些没做任何改变的租户来说,账单也会激增。财务部呼叫工程部,工程部指着显示一切正常的仪表盘,因为仪表盘并没有测量出那个已经损坏的环节。

提示词位置即政策:当三个团队共同拥有一个系统提示词时发生的无声合并冲突

· 阅读需 13 分钟
Tian Pan
Software Engineer

你 Prompt 仓库中的 diff 显示有三行发生了变化。生产环境中的行为差异却显示一切都变了。安全团队将一条拒绝规则从第 14 行移动到了第 87 行,目的是为了“将其与相关的防护栏归类”;产品团队没有注意到这一点,因为措辞完全相同;一周后,评估套件显示在对抗性输入上的得分下降了 9 个百分点。没有人修改这条规则,只是有人移动了它。在一个拥有 2,400 token 的系统 Prompt 中,由于对防护栏存在首因效应(Primacy Bias),对指令遵循存在近因效应(Recency Bias),移动一条规则所带来的行为改变与重写它一样具有承重性——而你的工具对这两者都无法感知。

这是 AI 团队在回归评审结束时,而非开始时才会发现的合并冲突模式。系统 Prompt 在 2025 年底的某个时候增长到了 2K token 以上。安全团队负责顶部,产品团队负责中间,智能体(Agent)团队负责底部。三个月的“小幅编辑”在无声无息中重新排列了每个人的意图,因为原本适用于代码的基于行的 diff 工具无法告诉你一条指令已经跨越了区域边界。Bug 不在任何一次单一的编辑中。Bug 在于位置现在即策略,而你对位置却没有任何策略。

Reranker 是你 RAG 评估中从未衡量的“静默”第二个模型

· 阅读需 12 分钟
Tian Pan
Software Engineer

一个典型的 RAG 流水线包含两个模型,而不是一个。检索器从向量数据库中提取 50 到 100 个候选文档,而重排序器(reranker)——无论是交叉编码器(cross-encoder)、LLM-as-judge 提示词还是混合方案——都会对这些候选文档进行重新评分,并将前 5 个结果交给回答模型。你的评估套件测量端到端的回答质量,测量检索器的 recall@k,但它并不测量重排序器。因此,当重排序器发生隐性偏移(drift)时,仪表盘上显示的“回答质量下降了 4 个点”却没有任何因果线索,团队会花费三天时间去调试一个根本不是问题的提示词。

重排序器是那个隐性的第二个模型。它介于检索器和生成器之间,拥有自己的评分分布、自己的提示词(如果是基于 LLM)或自己的权重(如果是交叉编码器),并且它可以独立于其他任何组件发生性能退化(regress)。大多数团队从未单独对它进行评分。他们编写的评估套件将流水线视为一个具有长上下文窗口的单一模型,而实际上它是两个串联的模型,且其中间接口并不属于任何一个团队。

重试并非免费:大模型重试策略的 FinOps 数学逻辑

· 阅读需 12 分钟
Tian Pan
Software Engineer

我在上季度接触的一个团队在他们的推理账单上发现了一笔 4200 美元的条目,没人能解释其来源。控制面板显示的流量正常,延迟图表也很平稳。原因最终被发现是一个 Agent 陷入了长达 6 小时的“礼貌”重试循环中,它不断地通过指数退避(最高限制为 30 秒后重启)来重放一个包含 4 万个 Token 的工具链。这套重试策略是直接从 2019 年为基于 HTTP 的 JSON 服务编写的内部 SRE 手册中照搬过来的。它运行得非常完美——只是用错了系统。

这就是那种不会出现在容量规划表中的账单。行业标准化的无状态 REST API 重试策略模式默认了三个前提,而 LLM 工作负载在悄无声息中违背了这些前提:故障是瞬时的、单次额外尝试的成本是有限的,以及重试有合理的成功机会。每一个前提曾是关键的支撑,而现在每一个都是错的。这种成本模型从未捕获的偏差,正潜伏在每一份月度账单的底部。

那些还没有根据 Token 经济学重建重试策略的团队,正在缴纳一种隐形税。这种税收随着你本就最担心的查询难度而增加——那些长文本、Agent 类以及带有深层工具链的查询。在 LLM 技术栈中,经典韧性工程提供给你的安全网,反而成了勒紧脖子的绞索。

结构化输出重试循环:你被忽视的算力浪费

· 阅读需 13 分钟
Tian Pan
Software Engineer

打开你的结构化输出仪表盘。它自豪地显示着类似 “98.4% 的 Schema 合规率” 这样的数字。这就是成功率——即第一次尝试就生成有效 JSON 对象的请求比例。团队为剩下的 1.6% 构建了一个重试封装器(retry wrapper),发布上线,然后就没再管了。两个季度后,推理费用增长了 15%,而请求量仅增长了 4%。首席财务官(CFO)想要个解释。工程师们给不出解释,因为跟踪结构化输出成功率的仪表盘并不跟踪结构化输出的成本。

仪表盘隐藏的部分在于:失败路径并非只有一次重试。第一次重新提示(re-prompt)修复了缺失的 enum 字段,但引入了一个格式错误的嵌套数组。第二次重新提示修复了数组,但丢掉了一个必填键。第三次尝试终于通过了验证,但到那时,该请求已经消耗了四次完整的推理调用加上最初的生成过程,而你的单次请求 Token 计数器显示的是 总和,而不是循环过程。从计数器的角度来看,这是一个昂贵的请求。从成本线的角度来看,这是一个你从未定价的随机循环。

这篇文章将探讨该循环究竟对你的算力预算产生了什么影响,为什么你现有的观测能力(observability)无法察觉到它,以及哪些规范可以使其变得可见且可控。