跳到主要内容

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

查看所有标签

隐形的交接:为什么生产环境中的 AI 故障集中在组件边界上

· 阅读需 10 分钟
Tian Pan
Software Engineer

当你的 AI 功能输出错误答案时,第一个问题总是:“是模型的问题吗?”大多数工程师会进行模型评估,运行几个测试提示词,并得出模型看起来没问题的结论。他们通常是对的。模型没问题。故障发生在其他地方——在你的组件相互通信的那些无形接缝处。

这一结论的证据是一致的。对生产环境 RAG 部署的分析显示,73% 的故障是检索故障,而不是生成故障。在多智能体系统中,最常见的故障模式是消息顺序冲突、状态同步间隙和 schema 不匹配——这些都不会出现在任何单组件健康检查中。GPT-4 在处理复杂的提取任务时,产生无效响应的比例接近 12%,这不是因为模型坏了,而是因为模型与下游解析器之间的输出格式契约从未被强制执行。

模型背了锅,边界才是元凶。

一致性鸿沟:为什么并行 LLM 调用会相互矛盾以及如何修复它

· 阅读需 13 分钟
Tian Pan
Software Engineer

想象一个处理用户支持工单的多智能体流水线。智能体 A 读取工单历史并认为用户是一个需要进阶回复的高级用户。智能体 B 在并行的调用中读取同样的工单历史,却认为用户是一个需要分步引导的初学者。两个智能体同时完成并将输出交给组合智能体——而现在,组合智能体必须调和这两个对同一个人的根本不兼容的心理模型。

这并非罕见的极端情况。分析生产环境多智能体故障的研究发现,36.9% 的失败是由智能体间的失调引起的:冲突的输出、移交过程中的上下文丢失,以及独立得出的不兼容结论。一致性鸿沟(consistency gap)——即并行 LLM 调用对共享实体产生相互矛盾的倾向——是智能体系统中被低估最多的失效模式之一。

Provider 行为指纹:模型切换中的隐性损耗

· 阅读需 9 分钟
Tian Pan
Software Engineer

当成本飙升、模型下线通知或竞争对手的基准测试迫使你更换 Provider 时,工程团队通常会在能力基准测试上评估候选模型,并将其视为迁移计划的全部。这个过程大约能捕获一半的问题。另一半并非能力问题,而是行为问题:那些不可见的格式习惯、拒绝模式、序列化怪癖以及输出约定——你的生产代码在数月迭代中已悄悄将其内化。

能力基准告诉你新模型能否完成任务。行为指纹告诉你你的代码库能否承受这次替换。

发布顺序问题:为什么同时部署模型与基础设施变更会破坏可观测性

· 阅读需 10 分钟
Tian Pan
Software Engineer

季度开始三周后,生产告警触发了。核心任务的准确率下降了八个百分点。你打开仪表盘,立即注意到同一个发布窗口内落地了三件事:上下文长度从 8k 增加到 32k token、模型版本从 gpt-4-turbo-preview 升级到 gpt-4o,以及基础设施团队为提升吞吐量推送的批处理大小变更。三项变更中没有一项单独被认为是高风险的。合在一起,它们制造了一个无法干净解决的调试难题。

欢迎来到发布顺序问题。

隐形算力税:为何你的 AI 推理账单远超用户实际所需

· 阅读需 11 分钟
Tian Pan
Software Engineer

你正在为用户从未阅读过的 Token 付费。这不是 Bug,也不是供应商的价格把戏,而是因为你的系统正按设计运行——在每次请求中触发后台推理任务。这些任务在白板上看起来很聪明,却在每次请求中烧掉了真实的预算。

这就是隐形算力税(Shadow Compute Tax):推理支出中用于推测性、过早触发或结构上保证永远不会到达用户的 AI 工作的那部分。在你的监控面板里,它几乎是隐形的——直到突然变得显眼为止,而那时它已经被默认为成本模型的一个前提假设。

200 Token 的系统提示词如何击败你的 4000 Token 提示词

· 阅读需 11 分钟
Tian Pan
Software Engineer

我合作过的一个团队花了六个月的时间,将一个系统提示词(system prompt)调整到大约 4000 个 token。这是他们的镇店之宝——通过不断累积边缘情况处理、格式规则、人设指令、回退行为以及十几个 few-shot 示例而精心打造。后来,一名初级工程师加入,问为什么提示词这么长,并用一个下午的时间重写了它。新版本只有 200 个 token。在他们现有的评估集上,它的得分高出了 4 分。运行成本也降低了 40 倍,而且速度明显变快。

这并不是一个关于神奇短提示词的轶事。这是我几乎在每次阅读运行超过一个季度的生产级系统提示词时都会看到的模式。长提示词是随意的累加,而非设计的结果。QA 中出现的每个失效模式都贡献了一个段落。观看演示的每位利益相关者都贡献了一条语气指令。每个“似乎有帮助”的例子都被固定在了底部。结果就是,提示词比它要引导的用户输入还要长,充斥着模型在推理时必须默默解决的内部矛盾,注意力被稀释在各种相互竞争的需求中。

智能体可识别性:当 Trace 无法分辨哪个智能体执行了哪些操作时

· 阅读需 12 分钟
Tian Pan
Software Engineer

用户报告说助手在上午 9:47 给了他们一个错误答案。你打开 Trace。这里有 340 个 Span。它们几乎都被命名为 agent.runllm.invoketool.call。有些有父节点,有些是兄弟节点。其中三个进行了重试,一个重试后被取消了。没有一个能告诉你错误的输出是来自 Planner、Worker、Critic、Reflection 过程,还是在 Critic 标记后 Worker 的第二次重试。

在接下来的一个小时里,你根据截图中的 UUID 前缀搜索日志行,比对 Slack 通知的时间戳,并根据 Trace 查看器中的缩进模式在脑海中重建 Agent 拓扑。最终,你猜想第三次 Worker 调用使用的模型别名在昨晚被静默切换到了另一个快照。但你无法仅凭 Trace 证明这一点。

Agent 正常运行,Trace 完整无缺。杂乱无章的 Trace 团(Hairball)本身就是 Bug。

AI 调试器的陷阱:当 Agent 的补丁速度超过你的诊断速度

· 阅读需 11 分钟
Tian Pan
Software Engineer

一位我上季度合作过的 Staff Engineer 发现了一个在过去六周内已经被“修复”过三次的 bug。由三位不同的工程师处理,涉及三个不同的文件。三次 CI 运行都顺利通过。三次都采用了由 Agent 生成并被接受的补丁。每一个补丁都让失败的测试通过了,也让用户报告的错误消失了。但每一个补丁都只是把 bug 转移到了别处,潜伏在那里,直到被另一个表现面再次触发。当它第四次出现时,它导致的数据损坏已经静默累积了 40 天。

这个 bug 只是分页游标中一个简单的“差一错误”(off-by-one)。Agent 对于“症状会消失”的判断是正确的,但它对“原因”的判断是错误的。而那些优秀的、资深的、动机良好的工程师们,在理解失败机制之前,就各自接受了一个通过测试的补丁。

这就是“智能代理调试陷阱”(agentic debugger's trap):你的 Agent 生成修复方案的速度,超过了你构建评估该方案正确性所需的心智模型(mental model)的速度。补丁速度超过了诊断速度。Bug 数量下降了,CI 面板变绿了,而你交付的代码库,其失败模式你却不再理解。

AI 旁观者效应:为什么五支团队协作发布却交付了无人问津的评估套件

· 阅读需 11 分钟
Tian Pan
Software Engineer

1964 年,三十八个人在皇后区的公寓楼外目睹了 Kitty Genovese 遭到袭击。直到为时已晚,才有人报警。Latané 和 Darley 在接下来的十年里一直在解释其中的原因:看到问题的人越多,其中任何一个人采取行动的可能性就越小。他们称之为“责任分散效应”。在他们著名的癫痫实验中,当参与者认为只有自己和受害者在一起时,85% 的人会介入。当他们相信另外四个人也能听到受害者发病时,只有 31% 的人采取了行动。

现在想象一下你最近一次 AI 功能的发布。产品团队编写了 Prompt。工程团队选择了模型并连接了网关。数据团队整理了检索语料库。安全团队加上了输入和输出过滤器。客服团队起草了升级方案。房间里有五个团队。每个团队都按时完成了各自的部分。三个月后,该功能的准确率悄悄从 89% 滑落到 71%,评估套件自发布周以来就没运行过,当你询问谁负责处理这一回归问题时,每个团队都能点出另外三个比自己更有责任负责的团队。

你的 AI 功能需要一个无需部署的紧急开关 (Kill Switch)

· 阅读需 14 分钟
Tian Pan
Software Engineer

想象一下这个场景:凌晨 2:14,值班工程师的手机嗡嗡作响,你旗舰产品中的 AI 功能正自信地告诉企业客户,他们的账号是“西红柿汤”。模型供应商推送了一个路由变更,你的提示词被静默升级的分词器截断了,或者是检索索引针对一个损坏的 Parquet 文件重新生成了——原因现在还不重要。重要的是,距离有人截图输出并发布到 LinkedIn 只剩 10 分钟。

如果你唯一的对策是“回滚部署并等待 CI”,那你已经输了。标准的流水线回滚从报警到恢复需要 20 到 40 分钟,而糟糕的输出不会在绿色对勾渲染时礼貌地暂停。等到新容器恢复健康时,截图已经在信息流里传开了,支持信箱里塞满了 50 个工单,而你花了 6 个月建立的信任正被那些从未使用过该产品的人审查。

那些能在 5 分钟而不是 5 小时内控制此类事件的团队并不是靠运气。他们在需要之前就构建了一个紧急开关(Kill Switch)——这是一个允许值班工程师在几秒钟内禁用 AI 路径的原语,无需部署,无需合并,也无需任何人触碰生产环境的二进制文件。这篇文章将探讨这种专门针对 AI 功能的原语是什么样的,为什么确定性软件的版本不足以应对,以及在事故发生前的一天必须具备什么条件,才能让响应在事故发生的当晚奏效。

AI 功能观察期:为什么两周的灰度发布会错过真正关键的问题

· 阅读需 14 分钟
Tian Pan
Software Engineer

为期两周的金丝雀发布(canary)是那种听起来足够自律,以至于让人可以跳过更难问题的实践之一。工程团队从微服务中引入了它——逐步放量 1% 几天,观察错误率,放量到 100%,宣布完成——并将它嫁接到 AI 功能上,却没问过 AI 特有的失效模式是否会在两周内显现。它们不会。扼杀该功能的账单在第六周才寄到。暴露出长尾意图的客户群体在第五周才开始使用。上线当天评分提升 3% 的评估偏移(eval drift)在第四周开始产生真金白银的损失,因为新 prompt 产生的更冗长的输出一直在累积 Token 开销,而由于仪表盘只盯着崩溃,没人注意到这一点。

一个围绕 p95 延迟和 HTTP 500 错误构建的金丝雀发布会告诉你 LLM 运行正常。它不会告诉你该功能是否有效。AI 功能失效的形式是部署仪式从未设计去捕捉的——用户行为的缓慢变化、缓存的逐渐侵蚀、检索质量的崩溃、拒绝率的攀升、以及走向错误的成本轨迹——而且几乎所有这些都需要两周以上的时间才能显现。按微服务时钟发版的团队,其发版节奏与失效发生的节奏并不匹配。

AI 功能的 Bug Bash:分布采样,而非猎捕缺陷

· 阅读需 12 分钟
Tian Pan
Software Engineer

经典的 Bug Bash 是一种为确定性软件量身定制的确定性仪式。十名工程师挤在一个 Slack 频道里两小时,对照着黄金路径流程清单疯狂测试,然后提交带有清晰复现步骤的工单:“点击 X,看到 Y,预期 Z。” 这套方法之所以奏效,是因为被测系统是可复现的——相同的输入,相同的输出,相同的 Bug,次次如此。

如果针对 AI 功能运行完全相同的仪式,你最终会得到 200 张工单,其中 180 张会因为“符合预期的随机波动”而被关闭,同时还会漏掉那 20 张预示着真正的群体性回归(cohort regression)的工单。这种形式不仅陈旧,而且完全错位了。针对基于 LLM 的功能进行 Bug Bash 并不是一场捕捉缺陷的会议。它是一场针对概率分布的抽样练习,如果团队像运行确定性测试那样运行它,就是在收集噪声并将其视为信号。

这篇文章讨论的是如何为随机系统重新设计 Bug Bash——包括流程形式、参与者、分级准则以及什么才算“完成”等方面需要做出哪些改变。