跳到主要内容

182 篇博文 含有标签「reliability」

查看所有标签

回退路径萎缩:你的降级方案在三个月前就失效了

· 阅读需 11 分钟
Tian Pan
Software Engineer

你在九个月前编写的回退路径(fallback path)——那个用于捕获模型超时、切换到更便宜的供应商、并在两者都宕机时返回模板化消息的路径——实际上在过去的十二周里从未在生产环境中运行过。它仅在最初发布时被执行过一次,集成测试仍然能通过,操作指南(runbook)也仍在使用它。但这并不意味着它还能工作。第六周的一次重构改变了上游上下文对象的形状。第九周的一次依赖库升级悄悄移动了一个配置键。代码仍然可以编译。测试仍然能通过,因为它们是针对与代码相同的陈旧 Fixture 编写的。下次当你的主路径出现 504 错误时,你的“优雅降级”将会把一个 NullPointerException 甩在用户脸上,而复盘报告将会指出——这已经是今年第三次了——在上游契约变更后,回退路径从未被重新测试过。

这是 AI 系统韧性工程中一种隐性的失败模式。回退路径是你应用程序中专门为了被忽视而存在的部分。在一百天里,有九十九天生产流量都会绕过它。CI 从不执行它,因为没有任何测试与之关联。负责它的团队在两次事故之间会忘记它的存在。然后在第一百天,当主模型供应商出现区域性故障,你终于需要它时,这段代码却在付费客户面前发生了代码腐烂(bit-rots)。

隐藏的 SDK 重试机制:为什么你付了两倍的钱却浑然不知

· 阅读需 12 分钟
Tian Pan
Software Engineer

打开 OpenAI Python SDK 的源代码,你会发现一行安静的代码:DEFAULT_MAX_RETRIES = 2。Anthropic SDK 也采用了同样的默认设置。大多数 TypeScript SDK 也是如此。两次重试,指数级退避(exponential backoff),在连接错误、408、409、429 以及任何 5xx 错误时自动触发——这些都在你的代码看到失败之前就执行了。你没有配置它。你没有选择加入。你通常甚至不知道它的发生,因为你的应用记录的指标是 request_count(请求数),而不是 attempt_count(尝试数),并且你的追踪器(tracer)唯一能看到的 span 是 SDK 在最后一次尝试后关闭的最外层 span。

这在大多数情况下都没问题,直到出问题为止。如果在该 SDK 调用之上再添加一个应用级的重试装饰器——那种每个团队在遇到第一个 429 错误后都会写的代码——你就构建了一个 3x3 的风暴:SDK 尝试三次,你的包装层围绕 SDK 又尝试三次,在服务商降级期间,一个单一的用户请求会扇出为九次推理调用。服务商的账单会计算每一次尝试。而你的仪表盘只记录了一次。当最终有人进行账实对账时,那将是一场谁都不会喜欢的季度末谈话。

AI 功能依赖图:当多个服务共用同一个模型时的韧性工程

· 阅读需 12 分钟
Tian Pan
Software Engineer

你的 embedding 模型在周二下午 3 点宕机了。不到 30 秒,你的支持聊天机器人停止回答问题,个性化推荐引擎开始返回空结果,文档搜索一无所获,入职助手也停止工作了。你的值班工程师打开事件频道,看到来自 15 个彼此看不出联系的功能同时发出的告警。没有堆栈跟踪指向根本原因。这看起来像是分布式系统故障 —— 但其实不是。这是一个单一的共享依赖项失效了,而你之前并不知道有 15 个功能共享它。

这就是 AI 功能依赖问题:你的产品功能底层的基础设施层是深度互连的,但你的架构图却将每个功能显示为孤立的方框。当耦合是不可见的,故障传播也是不可见的 —— 直到问题爆发。

AI 输出波动性是你可能定价不足的业务风险

· 阅读需 11 分钟
Tian Pan
Software Engineer

当公司谈论 AI 风险时,对话通常集中在那些显而易见的失败上:幻觉事实、偏见输出、以及生成内容带来的法律责任。而较少受到关注的是一个更隐蔽的结构性问题:你已经在其输出本质上是概率性的系统之上,做出了商业承诺——定价层级、SLA(服务等级协议)、面向客户的准确性声明。每次模型生成响应时,它都是在从分布中采样。而合同中从未提及“分布”。

这是一个大多数团队发现较晚的业务风险,通常是在客户抱怨同一个文档审查工作流在周一和周五给出了完全不同的结果时,或者当监管机构要求提供系统在架构上无法提供的可复现性保证时。

API 文档即可靠性基础设施:文档如何决定智能体的成功率

· 阅读需 11 分钟
Tian Pan
Software Engineer

大多数工程团队将 API 文档视为开发者体验关注点——一种为了减少支持工单和入职时间而进行的改进。当你的主要消费者是在浏览器中阅读文档的人类时,这种思维方式是有道理的。但现在,这已经不再足够。

当 AI 智能体通过工具调用访问你的 API 时,你的文档就不再仅仅是指南,而是变成了运行时行为。模糊的参数描述不再是 UX 上的不便,而是对模型产生幻觉值的直接指令。缺失的错误代码不再是参考文档中的空白,而是一个模糊信号,可能导致智能体陷入没有退出条件的重试循环。你三年前为人类读者编写的文档,现在正被一个无状态的语言模型解析,无论它是否理解正确,都会自信地执行。

跨用户一致性问题:当你的 AI 对同一问题给出不同答案时

· 阅读需 11 分钟
Tian Pan
Software Engineer

同一家公司的两位分析师都问了你的 AI 助手同一个问题:"我们 Q3 的客户流失率是多少?"一个人得到的是 4.2%,另一个人得到的是 4.8%。两个答案都没有错——他们只是在不同的时间、不同的会话上下文中进行了查询,检索索引对略有不同的数据块进行了排名。AI 自信地回答了两个问题,没有任何保留,没有标记任何差异。两位分析师带着不同的数字走进了同一个会议,而你的工具刚刚变成了一个负担。

这就是跨用户一致性问题,也是企业 AI 部署悄然失去信任最常见的原因之一。这种失败并非经典意义上的幻觉——没有编造任何事实。失败在于:你的系统在规模上是非确定性的,而这种非确定性在两个用户互相对比结果之前是不可见的。

人工接管作为一等功能:设计能够优雅降级至人工控制的 AI 系统

· 阅读需 11 分钟
Tian Pan
Software Engineer

当一个 AI 驱动的客服智能体无法解决问题并将工单升级给人工时,接下来会发生什么?在大多数系统中:客户被冷转接,没有任何上下文,不得不从头开始重新解释所有情况。人工客服完全不知道 AI 尝试了什么、收集了哪些信息,以及为什么发生了交接。

这是人工接管失败最常见的形式——不是戏剧性的 AI 崩溃,而是自动化与人工处理衔接处悄然发生的 UX 崩塌。究其根本,是工程师精心设计了 AI 处理路径,却将人工接管作为事后补丁——一个出问题时的回退方案。结果是,接管体验像系统报错,而非经过设计的操作模式。

那些做得好的工程团队,从第一天起就将人工接管视为一等功能。以下是其在实践中的具体体现。

你的负载测试在撒谎:生产环境中的 LLM 供应商容量争用

· 阅读需 13 分钟
Tian Pan
Software Engineer

你运行了一个负载测试。你的 p95 延迟是 450ms。你对此感觉良好,上线了该功能,然后两周后你的轮值告警响了,因为用户在周二上午 9 点看到了 25 秒的响应时间。

你的代码没有发生任何变化。没有部署,没有配置更改。供应商的状态页面显示“正常运行 (operational)”。然而,你的应用在业务高峰时段持续 20 分钟无法使用。

这就是 LLM 容量争用问题,也是工程师在被坑之前最常忽视的故障模式之一。

SLA 的幻象:为什么 99.9% 的可用性对 AI 功能毫无意义

· 阅读需 11 分钟
Tian Pan
Software Engineer

你的仪表板显示全绿。延迟处于正常水平。错误率为 0.2%。本月正常运行时间为 99.97%。然而,你的 AI 助手正自信地向用户提供错误的信息,格式不对,长度是预期的两倍——而且这种情况已经持续了 11 天。

这就是 SLA 幻觉:基础设施合同保障的是管道,而不是其中流过的水。对于 AI 驱动的功能,“它是否有响应?”与“它的响应是否准确?”之间的差距,正是产品质量悄然崩塌的地方。

自动化悬崖:当部分 AI 自动化比完全不自动化更糟糕时

· 阅读需 12 分钟
Tian Pan
Software Engineer

当一个团队第一次将 70% 的手动流程自动化,却交付了比以前更差的结果时,诊断几乎总是从错误的地方开始。工程师们会检查自动化部分:也许是模型准确率不对,也许是流水线有 Bug。他们很少检查的是,自动化本身的存在——仅仅因为它的存在——是否使得剩余 30% 的人工工作在结构上变得无法做好。

这就是自动化悬崖。这不是自动化组件的失败,而是自动化与手动之间衔接处的失败。

当 AI 听起来正确但事实并非如此:技术与科学领域中的 LLM 虚构现象

· 阅读需 10 分钟
Tian Pan
Software Engineer

在技术领域,LLM 虚构(confabulation)的阴险之处不在于模型会给出明显的错误答案。而在于它会生成结构优美、语气自信、技术上看似合理的答案,但其中的细微错误只有领域专家才能发现——而且往往是在造成损失之后。

一个 Monte Carlo 物理模拟,它初始化正确,但在每一步都从头重新采样粒子位置,而不是进行增量更新。一个符合命名规范但氧化态错误的化学公式。一份引用了正确标准、参考了正确单位,但载荷系数完全错误的设计规范。每个输出看起来都是正确的。每个听起来都极具权威。但每一个都是错误的,且这些错误只有在有人运行实验、对组件进行压力测试或仔细阅读推导过程时才会浮现。

智能体记忆污染:一次错误工具响应如何毒害整个会话

· 阅读需 11 分钟
Tian Pan
Software Engineer

你的智能体正确完成了一项多步研究任务的 80%,然后自信地给出了一个完全错误的结论。你翻查日志,在第三步找到了罪魁祸首:一次工具调用返回了过时数据,智能体将其作为事实整合,之后的每个推理步骤都建立在这个被毒化的前提之上。到会话结束时,智能体对一切都是正确的——除了最关键的那件事。

这就是智能体记忆污染——它是生产智能体系统中最隐蔽的可靠性故障之一。与崩溃或超时不同,它产生的是自信的错误答案。可观测工具记录的是一次成功运行,用户带着错误信息离开。