跳到主要内容

842 篇博文 含有标签「ai-engineering」

查看所有标签

思维的 p99:当模型决定你的请求耗时多久

· 阅读需 12 分钟
Tian Pan
Software Engineer

你拥有的每一份延迟优化手册(latency playbook)都是为那些单次请求工作量大致恒定的系统编写的。数据库查询耗时相对固定。图像缩放随像素数变化,而这是预先可知的。甚至经典的 LLM 补全也有可预测的成本范畴:输入多少 token,输出有限的 token。推理模型悄无声息地打破了这一假设。当模型在运行时自行决定思考多久——且它是基于问题难度来决定时——响应时间便不再是基础设施的属性,而变成了问题本身的属性。

后果首先体现在你的分位数指标上。在生产环境中运行推理模型的团队报告称,p99 延迟会激增到 p50 的三到五倍,这不是因为主机变慢或缓存失效,而是因为百分之一的请求恰好真的很难。你的自动扩缩容策略、超时策略和 SLO 仪表板都是针对一个“这种差异意味着系统出现故障”的世界而调整的。而现在,这却意味着系统正按设计运行——你用来管理尾部延迟的所有工具都指向了错误的原因。

你的智能体幻觉出的软件包现在已存在 —— 而且它是恶意的

· 阅读需 12 分钟
Tian Pan
Software Engineer

每个安全团队对拼写抢注 (typosquatting) 都有一个心智模型:攻击者注册 requets 并等待有人误输入 requests。这行得通,但它是对人类粗心大意的一种随机押注。Slopsquatting 则更糟糕,因为这种“拼写错误”并非随机。语言模型会以可预测、可重复的模式虚构出看似合理但并不存在的包名——攻击者可以查询你使用的相同模型,收集它们虚构的名字,并准确地在 PyPI 和 npm 上注册这些包。幻觉变成了预购单。你的编码智能体 (coding agent) 在拥有自主安装权限的情况下运行,就是那个取走包裹的顾客。

这并非假设。关于这一现象的最大规模研究对 16 个模型生成了 223 万个代码样本,发现 19.7% 的推荐包并不存在——涉及 205,474 个独特的虚构名称。当一位安全研究员将其中一个最常被幻觉出的 Python 包注册为一个无害的空壳时,它在三个月内被下载了超过 30,000 次,并最终出现在一家大型科技公司开源仓库的安装说明中。由“氛围编程” (vibe coding) 带来的供应链攻击已经完成了它的概念验证。

脚手架审计:每一次模型发布都让你的部分开发框架变成累赘

· 阅读需 11 分钟
Tian Pan
Software Engineer

当依赖项损坏时,你的构建会失败。当临时规避方案变得不再必要时,什么都不会发生。这种不对称性正是为什么每一个运行超过一年的生产级 LLM 系统都带有它不再需要的脚手架——重试编排、输出修复解析器、强制思维链、复杂的任务分解、分块启发式方法——每一个都是为了弥补特定模型的特定弱点而构建的,而且每一个都在无声无息中比它所补偿的弱点活得更久。

令人不安的是,这不仅仅是一个像过期的特性标志(feature flags)那样的卫生问题。过时的脚手架不仅仅是消耗你的延迟和 Token。在最坏的情况下,它会主动将新模型限制在旧模型的上限内:你的分解逻辑将一个任务切分为六个步骤,是因为 2024 年的模型无法处理整个任务,而 2026 年的模型本可以一次性完成,现在却继承了六个在你构建的缝隙中丢失上下文的机会。

不存在的单一质量指标

· 阅读需 13 分钟
Tian Pan
Software Engineer

在你公司的某个地方,有一张幻灯片上写着一个数字。“AI 质量:87”。上个季度这个数字是 85,所以幻灯片是绿色的。与此同时,你的值班频道里塞满了截图,显示助手正在自信地为你的最大企业客户捏造退款政策。这两件事同时发生,而撒谎的是那张幻灯片。

这张幻灯片背后的管理层需求完全合情合理:给我一个可以追踪的分数,让我知道这玩意儿是在变好还是变坏。这在收入和可用性上行得通,但在 AI 功能上行不通。因为 AI 功能的质量不是一个标量 —— 它是在输入、用户和时间维度上的分布。将这种分布平均成一个数字并不能起到总结作用,反而精准地破坏了决策者所需的信息。

这篇文章讨论的是这两个事实之间的差距:为什么你的评估套件(eval suite)的平均值隐藏了那些真正伤害你的回归(regressions),你应该汇报什么,以及如何向董事会报告的受众展示一个本质上存在波动的指标,且不会在指标下降的第一周就毁掉你的信誉。

万档代码转换:在机械式代码迁移中运行智能体集群

· 阅读需 12 分钟
Tian Pan
Software Engineer

每一个框架迁移的模式都大同小异。你编写一个 codemod,在代码库中运行它,它能干净利落地转换 80% 的文件 —— 也就是那些符合 codemod 作者预期的模式的文件。然后你会遇到长尾问题:某些测试文件中有人对渲染器进行了猴子补丁(monkey-patched),某些组件触及了框架内部机制,或者某个模块是 2017 年由一位早已离职的工程师编写的,使用的是没人再采用的惯用法。Codemod 可以正常解析这些文件,只是没有适用的规则。因此,最后 20% 的迁移工作消耗了 80% 的日程,只能由那些宁愿做任何其他事情也不愿干这活的工程师们手工逐个文件完成。

编程 Agent 颠覆了这种经济效益。难倒确定性 AST 转换的手写怪癖,恰恰是模型擅长处理的 —— 它阅读文件,理解意图,并像人类一样重写代码,而不需要为每种变体制定明确的规则。Airbnb 在大规模实践中证明了这一点:在短短六周内,将近 3,500 个 Enzyme 测试文件迁移到了 React Testing Library,而最初估计的人工工作量是 1.5 年。但头条新闻中被忽略的一点是:难点并不在于提示词(prompting)。一旦你让 Agent 集群处理一万个文件,工程问题就不再是 AI 问题,而变成了批处理操作问题 —— 分片、验证、隔离和合并策略。正确的心理模型是一个 Mapper 具有随机性的 MapReduce 作业。

429 错误背后的惊群效应:速率限制是一个分布式系统问题

· 阅读需 13 分钟
Tian Pan
Software Engineer

调出你上次遇到持续 429 错误时的请求日志。你可能会发现一些奇怪的现象:错误并不是以稳定的流形式出现的。它们成波浪式出现——一波 429 爆发,接着是一段安静的间隔,然后是更大的爆发,再接着是另一个间隔。服务商的配额在波动期间并没有改变。你的流量也没有激增。你所看到的其实是你自己的重试逻辑在自我同步。每个在第 0 秒失败的客户端都计算了相同的退避(backoff)延迟,睡眠了相同的时长,并在同一瞬间醒来,然后再次共同失败。

这就是“惊群效应”(thundering herd),而最讽刺的是,标准的修复方案——指数退避(exponential backoff)——并不能阻止它。确定性的指数退避“组织”了惊群。它将一群几乎在同一时刻失败的客户端聚集起来,并让他们步调一致地前进:所有人都在 1 秒后重试,然后所有人都在 2 秒后,再然后是 4 秒。负载峰值的间隔变得更远了,但每个峰值的高度依然和第一个一样。如果正是这个峰值触发了你的速率限制,那么你实际上构建了一个永远重新触发它的节拍器。

Tokenizer 税:除了英语,你的 AI 功能在所有其他语言中成本更高且表现更差

· 阅读需 12 分钟
Tian Pan
Software Engineer

你的定价页面显示每个用户支付的费用相同。但你的成本仪表板却给出了不同的答案。同样的 AI 功能 —— 同样的提示词模板、同样的模型、同样的特性标志(feature flag) —— 为西班牙语用户提供服务的成本要高出 55%,日语用户大约翻倍,而阿拉伯语或孟加拉语用户则超过 3 倍。与此同时,这些用户获得的质量也明显更差:在翻译成不同语言的相同基准测试问题上,当前沿模型脱离英语分布时,其表现会下降 13 到 24 个百分点。

大多数在全球范围内发布 AI 功能的团队从未衡量过这两项数据。他们拥有分地区的定价、分地区的支持 SLA、分地区的法律审查 —— 却只用一套英语评估测试集来代表全球每个用户的体验。

这就是分词器税(tokenizer tax),它与仅靠规模无法弥补的质量差距相互叠加。在你按语言维度拆分数据之前,这两者在仪表板上都是不可见的。而且这两者早在你写下第一个提示词的几年前,就由你无法控制的分词器训练语料库决定了。

在构建下一层 AI 技术栈之前,请先绘制 Wardley 地图

· 阅读需 10 分钟
Tian Pan
Software Engineer

AI 工程中的大多数“自研还是购买”之争都是逐个组件展开的。我们应该构建自己的模型网关还是使用 OpenRouter?编写自己的智能体循环还是采用框架?微调还是提示词?每一次争论都有专门的会议、电子表格和嗓门最大的人。而每一次争论都悄悄地假设,格局会保持足够长的时间,让决策能够产生回报。

事实并非如此。你 AI 技术栈下的根基正以史无前例的速度移动。在固定的能力水平下,推理价格每年下降 9 倍到 900 倍不等 —— 具体取决于你追踪的能力阈值。2021 年底每百万 token 耗资 60 美元的 GPT-3 级输出,现在只需几分钱。智能体框架在三年内经历了多次颠覆性的重写。网关层从“我们应该建一个”到充满托管和私有化选项的竞争激烈的红海市场,仅用了大约 18 个月。在这样的格局中逐个组件进行决策,就像是盯着脚尖去划船。

有一个诞生了 60 年的工具正是为了解决这个问题:沃德利地图。它不会告诉你该构建什么。它会告诉你一些更有用的东西 —— 你的哪些组件即将变成别人的廉价产品,而哪些组件正在向相反的方向移动。

谁在为 Token 买单?内部 LLM 平台的费用分摊与结算设计

· 阅读需 12 分钟
Tian Pan
Software Engineer

每一个内部 LLM 平台都会经历同样的曲线。在第一个月,推理是免费的:平台团队买单,产品团队疯狂实验,每个人都在为增长曲线欢呼。到了第六个月,账单增长了 10 倍,财务部门开始提出尖锐的问题,平台团队发现 80% 的支出由三个团队产生——其中一个团队还在运行一个没人记得批准过的夜间批处理作业。本能的反应是安装计量器并开始收费。这种本能如果应用得过于幼稚,正是你毁掉平台的方式。

这是一个令人不安的事实:按 Token 计费的分摊机制(Chargeback)恰恰惩罚了你构建平台所鼓励的行为。正在原型化可能改变支持流程的智能体(Agent)团队消耗 Token 就像熔炉一样——智能体工作负载每个任务消耗的 Token 是简单聊天补全(Chat Completion)的 5 到 30 倍。如果从第一天起就按原价向他们收费,他们就会停止原型开发。与此同时,运行成熟且经过优化的功能的团队只需支付微薄的费用,看起来非常“节俭”。你构建了一个对学习征税、对停滞奖励的定价系统。

你的智能体内存需要垃圾回收机制

· 阅读需 11 分钟
Tian Pan
Software Engineer

持久化记忆是每个人都会给自己的智能体添加、但几乎没人维护的功能。这个提议令人无法抗拒:智能体会记住你的模式、你的偏好、上周二的决定,并且每一次会话都比上一次更聪明。而失败模式则更加隐蔽:默认情况下,记忆呈单调增长,而一个关于不断变化的世界的“仅追加”事实存储库,无异于一种缓慢的投毒。被迁移的 API、被重组的团队、被推翻的架构决策 —— 所有这些都与新鲜事实并排存在于存储库中,以同样的权威性被检索,并以同样的自信心被注入到上下文中。

无状态的智能体会犯下孤立的错误。而配备了记忆的智能体可以将一个错误变成重复性的错误,因为它存储了该错误,随后又将其作为证据检索出来。一个被自信写下的错误记忆 —— “支付服务拥有退款逻辑” —— 会污染未来每一个召回它的运行过程,而每一个基于它执行的运行过程又可能写下源自它的新记忆。这不仅仅是一个存储问题。这是一个垃圾回收问题,而大多数智能体记忆系统在发布时都没有配备回收器。

你的 AI 工作负载也有“夜晚”:批处理折扣是对架构的考验

· 阅读需 11 分钟
Tian Pan
Software Engineer

每一个主流模型提供商都在以半价向你出售同样的 Token。OpenAI、Anthropic 和 Google 都提供 Batch API,其收费仅为同步请求费率的 50% —— 模型相同、提示词相同、输出也相同 —— 唯一需要你做出的让步是:接受 24 小时的完成窗口,而不是在几秒钟内获得答案。对于一个每月在推理上花费 50,000 美元的团队来说,这意味着有 25,000 美元摆在桌面上,无需更改任何一行提示词即可领取。

大多数团队从未领取过这笔钱。并不是因为折扣被隐藏了 —— 它就在每一个定价页面上 —— 而是因为领取它需要回答一个组织内从未有人问过的问题:我们的推理调用中,哪些真正需要立即得到答案? 事实证明,这是一个架构问题,而大多数公司的诚实回答是:“我们从未对它们进行过分类,所以默认情况下所有任务都运行在交互式通道中。” Batch 折扣并不是一个定价脚注。它是一场测试,考验你的系统是否了解自身的延迟需求 —— 而大多数系统都未能通过测试。

你的上下文流水线需要一份新鲜度 SLA

· 阅读需 11 分钟
Tian Pan
Software Engineer

你的智能体(agent)用上个季度的价格回答了客户的计费问题,复盘报告会将此归咎于模型。但不应该如此。Prompt 组装正确,检索评分很高,模型对所给的所有信息进行了合理的推理——而所给的一切在三天前都是真实的。在 CRM 导出、文档同步和向量索引重建之间的某个环节,“世界的当前状态”悄然变成了“截至周二的世界状态”,而你的技术栈中没有任何环节在衡量这种差异。

数据工程师在几年前就解决了这类问题。一个消费十张上游表的下游仪表板拥有血缘关系(lineage)、新鲜度检查以及一个在夜间任务出错时进行呼叫的轮值机制。你的智能体所消费的上下文窗口也是同样的东西——一个由文档、工单、代码、CRM 和记忆连接而成的物化视图(materialized view)——只不过没有人负责这个连接(join),没有任何东西衡量它的陈旧度,当它提供昨天的真相时,失败却被归类为“模型幻觉”。