跳转到主要内容

LLM 请求生命周期是一个状态机 —— 像对待状态机一样对待它

阅读需 2 分钟Tian PanTian Pan

大多数团队将 LLM 请求处理视为一个线性函数:调用 API,检查异常,可能重试一次,然后返回结果。但在实践中,情况完全不是这样。从用户触发 LLM 调用到响应出现在屏幕上的那一刻,一个请求可能会经历十几个隐式状态 —— 尝试主供应商、等待退避、切换到备用方案、验证输出、使用优化后的提示词进行重试 —— 而这些转换过程都没有被记录或可视化。

其结果是,调试变成了在分散于各个服务的日志中进行事后追溯,对于 “这个请求实际上做了什么?” 这一问题,没有一个权威的答案。将 LLM 请求生命周期视为一个显式的有限状态机,是一种架构上的演进,它让你无需进行考古式的工作就能回答这个问题。

为什么隐式状态是生产环境中的隐患

考虑一个典型的生产环境中的 LLM 调用封装。它可能包含:

  • 一个带有指数退避(exponential backoff)的重试循环,用于处理瞬时错误
  • 当主模型返回 503 或达到速率限制时,回退到备用模型
  • 一个验证步骤,检查输出是否符合预期的模式(schema)
  • 当验证失败时,重写请求并重新提示的路径

其中每一个都是一种状态。它们之间的每一次转换都是一个事件。但大多数实现将所有这些逻辑编码为单个函数内部嵌套的 if-else 逻辑,并使用捕捉到部分转换却遗漏其他的临时日志记录。

实际的后果体现在三种反复出现的失败模式中:

静默回退(Silent fallbacks)。 主模型失败,系统路由到备用模型,用户得到了响应 —— 但响应的质量略微下降,或者延迟、成本比平时更高。由于没有人显式记录回退转换,这种模式在仪表盘中是不可见的,直到下游有人发现异常。

伪装的重试风暴(Retry storms in disguise)。 当供应商经历性能下降而非硬性错误时,重试可能在第三或第四次尝试时成功,表现为 “慢请求” 而非 “失败”。从外部看系统运行良好。但累积的重试成本在增加,而 P90 延迟在数周内默默爬升。

被误归类为成功的验证失败(Validation failures misclassified as successes)。 API 返回 HTTP 200,但响应未能通过模式验证。封装器重新提示一次,获得了有效的响应并将其返回。调用方看到的是成功。而该请求需要两次 LLM 调用而非一次、耗时两倍、成本也是两倍的事实,却未被记录。

这三种失败的根源相同:中间状态是不可见的。

映射实际状态

一个实用的模型为任何 LLM 请求定义了八种状态:

  1. PENDING —— 请求已排队但尚未发出
  2. DISPATCHED —— 请求已发送至特定的供应商/模型
  3. AWAITING_RESPONSE —— 等待流式输出开始或响应到达
  4. VALIDATING —— 响应已到达;正在检查输出
  5. RETRYING —— 上一次尝试失败;退避定时器正在运行
  6. FALLING_BACK —— 主路径被视为不可用;正在路由到备用方案
  7. CIRCUIT_OPEN —— 熔断器已触发;请求直接失败而不尝试联系供应商
  8. TERMINAL —— 请求达到最终结果(SUCCESS、VALIDATION_FAILURE、EXHAUSTED 或 DEGRADED)

这些状态之间的转换是事件,而不是日志消息。每次转换都有原因(触发因素)、目标状态(去向)和成本(增加的延迟、消耗的 Token、供应商的变更)。

使这个状态机显式而非隐式的关键在于,将每一次进入和退出状态记录为结构化事件,而不是散落在重试循环中的 log.info 副作用。

区分三类不同的故障

隐式实现变得复杂的另一个原因是,工程师将实际上需要不同处理方式的三种故障类型混为一谈:

瞬时基础设施故障(Transient infrastructure failures) 是短暂且可自我修复的:429 速率限制、短暂的 503 错误、网络超时、负载下的 TLS 握手超时。正确的应对措施是等待并重试同一个供应商。等待时间应从 1 到 2 秒开始,每次尝试翻倍,并包含随机抖动以避免惊群效应。在升级处理之前,合理的上限是 3 到 5 次重试。

会员专享

余下内容仅对会员开放。

会员可读完整内容 —— 每一个公开发布的观点背后,那些框架、决策与推理的全貌。

  • 完整文章,包含未公开存档的部分
  • 可落地的工作框架,附带权衡与决策依据
  • 新文章抢先看,先于公开发布

随时取消 · 一次订阅,畅读全部

参考资料

保持联系,关注我获取更多内容

阅读需 10 分钟

你的 try/catch 漏掉的 LLM 请求生命周期

将 LLM 调用封装在 try/catch 中只能捕获简单的失败。采用状态机方法可以将重试、降级、校验和升级路径变为一等可观测状态 —— 并揭示那些返回 HTTP 200 的失败模式。

insider
llm
阅读需 9 分钟

模型升级陷阱:基础模型更新如何静默破坏生产系统

基础模型更新通过行为漂移、拒绝模式改变以及 JSON 序列化不一致,静默地破坏了生产系统 —— 本文为你提供一份关于检测和安全迁移的实用指南。

insider
llm
阅读需 9 分钟

LLM系统中的数据质量税:劣质输入为何带来截然不同的代价

传统机器学习在噪声数据上会优雅地退化。LLM则会自信地幻觉,污染向量库,并以看似权威的方式向下游传播错误。本文介绍如何度量和缓解数据质量税。

insider
llm
阅读需 10 分钟

凌晨三点调试 AI:LLM 驱动系统的故障响应指南

500 错误有堆栈跟踪,而糟糕的生成结果有概率分布。本文介绍如何在 AI 事故毁掉你的一周之前,对其进行分类、调试和事后复盘。

insider
observability
阅读需 10 分钟

模型指纹识别:在后端模型静默切换破坏你的评估系统前发现它

当你的 LLM 供应商在稳定的 API 端点背后静默更新模型时,你的评估测试可能依然通过,但用户却能感觉到差异。本文介绍一套指纹识别和漂移检测技术栈,帮助你第一时间捕获这类变动。

insider
llm