跳转到主要内容

AI 原生 API 设计:当后端开始概率性思维,REST 为何失效

阅读需 2 分钟Tian PanTian Pan

大多数后端工程师能够背诵 REST 契约:客户端发送请求,服务器处理请求,服务器返回状态码和响应体。200 表示成功,4xx 表示客户端出了问题,5xx 表示服务器出了故障。响应是确定性的,超时是可预测的,幂等键保证了安全重试。

而 LLM 后端违背了上述所有假设。一个返回 200 OK 的请求,可能意味着模型对整个响应产生了幻觉。一次成功的请求可能需要十二分钟,而不是十二毫秒。两次参数完全相同的请求会返回不同的结果。如果服务器在推理过程中超时,你根本不知道模型究竟是否已完成。

把 LLM 硬塞进传统 REST API 的团队,最终往往面对一堆补丁:超时杀死了正在运行的 Agent 任务,客户端把带幻觉的 200 当成成功,重试逻辑因为幂等键没有针对概率性操作设计而三次扣了用户的信用卡。本文将梳理这些不匹配最致命的地方,以及真正在生产环境中能站得住脚的接口模式。

同步请求-响应模型是为速度而生的

REST 是为快速、无状态操作而设计的。数据库查询在毫秒内完成,文件上传最多几秒。HTTP 默认 30 秒的超时对于确定性工作负载来说绰绰有余。

LLM 推理从两个维度都不符合这一模型。首先,即使是简单的文本生成,按传统标准来看也很慢——以每秒 30 个 token 的速度生成 500 个 token 的响应需要 16 秒。其次,链式调用工具的 Agent 任务可能持续数分钟乃至数小时。一个需要搜索资料、编写代码、运行测试并对失败进行迭代的 Agent,可能需要 20 分钟的实际运行时间。

当客户端的 HTTP 超时在 30 秒触发时,它不知道任务究竟是被中止了,还是仍在服务器端运行。连接断开了,但模型还在继续。客户端重试,现在同一个 Agent 任务的两个实例在同时运行,可能同时向同一个数据库写入、调用同样的外部 API,并发送重复的邮件。

解决方案是异步任务模式,各大 LLM API 提供商已独立收敛到了这种模式:初始请求立即返回 202 Accepted 和一个任务 ID,客户端随后轮询状态端点或建立流式连接获取更新,任务无论客户端是否在线都会运行至完成。这种解耦是传统 REST API 与面向长时运行 AI 工作负载的 API 之间最重要的结构性差异。

状态码无法捕获语义失败

HTTP 状态码传递的是基础设施结果,而非语义结果。服务器返回 200 OK 意味着请求在传输层面处理成功,与内容是否正确无关。

对于确定性后端,这个区别无关紧要——API 返回用户数据,数据要么存在(200),要么不存在(404)。但 LLM 后端可能返回语法正确、却在语义上存在问题的响应,而 HTTP 对此没有任何表达能力。

以下所有失败模式都会返回 200 OK

  • 幻觉:模型虚构了 API 参数、方法名或并不存在的事实。JSON 解析正常,Schema 验证通过,但数据完全是捏造的。
  • 拒绝回答:模型拒绝作答,返回"我无法帮助处理这个问题"之类的礼貌提示,而不是应用程序期望的结构化输出。
  • Schema 漂移:模型返回了合法的 JSON,但使用了下划线命名而你的 Schema 期望驼峰命名,或者省略了它认为不重要的必填字段。
  • 截断:模型在响应中途耗尽了 token,你得到的是截断点之前的合法 JSON,然后是乱码或突然结束。

只检查 HTTP 状态码的客户端会错过所有这些问题。其下游影响是:应用程序将幻觉响应当作真相,尝试解析被截断的 JSON,并在字段缺失时崩溃——而这一切都不会在 API 错误统计中体现,因为每个请求都返回了 200。

解决这个问题的模式是:在 HTTP 状态码之外返回一个结构化错误信封。响应体携带一个语义状态字段,而不是仅依赖状态码:

{
  "status": "partial_success",
  "result": { ... },
  "errors": [
    {
      "type": "schema_violation",
      "message": "Field 'unit_price' missing from line_items[2]",
      "severity": "warning",
      "recovery_suggested": true
    }
  ]
}

HTTP 200 表示请求已处理,响应体中的 status 字段告诉你输出是否可用。这种模式让客户端能做出细粒度的决策:对轻微漂移记录警告,对 Schema 违规进行重试,对幻觉信号上报给人工处理。它也让你的 API 对自己能真正保证什么保持诚实:基础设施层面的交付,而非语义正确性。

流式传输不是可选项——但协议选择至关重要

对于文本生成,流式传输决定了应用程序是感觉流畅还是看起来卡住了。用户可以在 200 毫秒内开始阅读,而不是等待 16 秒拿到完整响应。对于长时 Agent 任务,流式状态更新是让用户了解进展的唯一方式,无需反复轮询。

业界已收敛到两种协议,各自适用于不同场景。

会员专享

余下内容仅对会员开放。

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

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

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

参考资料

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

阅读需 10 分钟

流式推理中的海勒姆定律:节奏、停顿和中间 Token 是未成文的契约

当更换模型虽然保留了结构化输出 schema,但改变了 Token 节奏、停顿模式和中间表述时,你实际上发布了一个破坏性变更,违反了一个你从未正式定义的契约。

insider
ai-engineering
阅读需 11 分钟

流式 JSON 解析器:Token 与类型化对象之间的鸿沟

JSON.parse 是全量或全无的,但 LLM 的 Token 流并非如此。为什么流式结构化输出是 API 和 SDK 必须共同解决的设计难题,以及一个真正的部分解析器必须具备哪些功能。

insider
llm
阅读需 11 分钟

延迟感知差距:为什么3秒的流式响应比1秒的批量响应感觉更快

3秒的流式响应往往比1秒的批量响应感觉更快。这是背后的心理学原理和利用它的工程模式。

insider
ai-engineering
阅读需 10 分钟

当你最大的客户端是 Prompt 时,如何弃用 API

AI 智能体不会阅读更新日志 —— 它们对你 API 的认知被冻结在 Prompt、工具 schema 和训练数据中。本文将探讨为什么关闭 v1 版本会导致重试风暴而非迁移,以及如何通过适配器、Sunset 响应头和智能体可读的错误信息来解决这一问题。

insider
api-design
阅读需 10 分钟

你的内部 API 在智能体调用的那一天起就变成了公共 API

只有当你能叫出每一个调用者的名字时,内部 API 才真正属于“内部”。一旦接入 LLM 智能体,那些从未白纸黑字写下的契约就会变成负担 —— 以下是你突然需要为之付出的公共 API 维护准则。

insider
ai-agents