跳到正文

LLM 网关架构:路由、缓存、回退与成本控制

分阶段讲解 LLM 网关的工作方式:虚拟密钥、脱敏、缓存、路由与回退、按 token 限流以及按团队计费。

· 创始人兼开发者

发布于

两个带虚拟密钥的应用调用一个分五个阶段的网关框架:Auth、Policy、Cache、Router、Adapters。Adapters 调用作为主选的 OpenAI、在 429 或 5xx 时回退的 Anthropic,以及处理敏感数据的自托管 vLLM 模型。下方是 Postgres、Redis 和用量日志。

假设公司里有十几个功能在调用三家模型提供商。每个团队各自保管 API 密钥,没人知道上个月哪个团队花了多少钱,主提供商连续一小时返回 429 错误时,每个应用的失败方式都不一样。其中一个应用换了模型,结果 JSON 输出坏了。

LLM 网关也叫 AI 网关或 LLM 代理,它让每一次模型调用都经过同一个服务,由这个服务掌管密钥、路由和计量。本文按阶段走一遍请求路径,然后讲路由、缓存、token 限制、指标、安全,以及可以直接采用的网关。

为什么要在模型提供商前面放一个网关

提供商的限额和账单并不遵循你的组织架构。OpenAI 按组织和项目设置速率限制,而不是按用户;Anthropic 按组织设置,另有可选的工作区限制。如果夜间批处理任务和客户聊天在同一个项目里,它可能把聊天每分钟的 token 用光。网关为密钥、路由、按团队限流和成本归属提供了统一的位置。

它不能取代你的 API 网关。API 网关统计请求数;LLM 网关统计 token 和美元,理解流式响应,并把提供商返回的 429 当作改试另一个模型的理由。

请求路径,分阶段说明

开销小的检查先运行:请求被允许且尚未有答案之前,任何东西都不会到达提供商。

  1. 认证。 把虚拟密钥映射到应用、团队及其允许使用的模型,否则返回 401。
  2. 检查限额。 在 Redis 中比对团队的 token 计数器和预算。超出限额就返回 429,并带上 Retry-After。
  3. 应用策略。 强制执行模型白名单和 max_tokens 上限,并对电子邮件地址等个人数据做掩码。
  4. 检查缓存。 命中时直接返回已保存的回答,不调用提供商。
  5. 路由。 选择一个模型和一条有序的回退链。
  6. 调用适配器。 把请求转换成提供商的 API 格式,附上提供商的密钥,并启动首个 token 的超时计时。
  7. 重试或回退,触发条件是 429、5xx、Anthropic 的 529 过载错误或超时,但只限于第一个 token 到达应用之前。提供商可能在 200 已开启流之后再发送错误,而在回答中途切换模型会把两段回复拼在一起。
  8. 流式传输并计量。 透传 server-sent events,并异步写入一条用量事件。OpenAI 的 Chat Completions API 只有设置了 stream_options.include_usage 才会在最后一个数据块里发送用量,而流被切断就会丢失它,所以客户端断开后也要继续读取。

第 1 到 4 步应当只是内存或 Redis 查询;日志和评估要放在请求路径之外。

路由策略

策略 选择方式 注意事项
成本 通过你的 eval 的最便宜模型 每个功能都需要 eval
延迟 最近首个 token 耗时最低 不做平滑会有噪声
能力 上下文长度、视觉、工具调用 回退模型可能不具备
数据分类 带标记的数据只发给获批模型 分类错误的请求会泄露数据
回退链 出错和超时时换下一个模型 各模型的回答不同
A/B 分流 90/10,按会话固定 用 eval 评判,而不是看错误率

最安全的回退是同一个模型换一个主机,比如 Anthropic API 和 Amazon Bedrock 上的 Claude 模型。换成另一个模型家族需要它自己的 eval,因为工具调用和 JSON 输出最先出问题,而且每个回退都需要有富余的配额。

只在一层做重试:OpenAI Python SDK 默认重试两次,LiteLLM 的文档警告说,叠加的重试会把一个请求变成 (1 + N)² 次上游调用。要让出故障的部署歇一会儿,而不是不停地冲击它,LiteLLM 默认在 429 之后歇 5 秒;断路器模式把这一做法推广开来。

缓存:精确匹配、语义和提供商侧

精确匹配 语义 提供商提示缓存
运行位置 网关,通常是 Redis 网关加向量索引 提供商
键 完整请求的哈希 嵌入相似度 相同的提示前缀
节省 整次调用 整次调用 一部分输入成本和延迟
风险 聊天场景命中率低 对相近的问题给出错误回答 开头的任何改动都会使其失效

精确匹配缓存安全,但覆盖面窄:Cloudflare AI Gateway 会对提供商、端点、模型、认证头和完整请求体做哈希,所以任何改动都会产生新的条目。要把租户放进缓存键,否则一个客户的回答可能传到另一个客户那里。语义缓存还能匹配同义改写,但「取消我的订单」和「取消我的订阅」可能落得很近,所以只在差一点也无害的场景里使用。

提供商缓存往往省得最多。Anthropic 会缓存用 cache_control 标记的前缀,保留 5 分钟,每次命中都会刷新;在大多数模型上,缓存读取的价格是基础输入价格的 0.1 倍。OpenAI 在受支持的模型上默认开启缓存,缓存的输入最多便宜 95%(截至撰写时,2026 年 11 月)。要让系统提示逐字节保持一致,开头不放时间戳,脱敏要保持确定性,并把一个会话固定在同一个部署上,因为每个提供商账户都有自己的缓存。

假设每百万输入 token 收费 $3,一个 6,000 token 的系统提示加一个 500 token 的问题,成本是 $0.0195。如果前缀从缓存读取,则 6,000 × $0.30/M + 500 × $3/M = $0.0033,每次命中约便宜 83%。缓存策略一文讲了失效问题。

token 限流与团队预算

每分钟请求数不适合作为 LLM 流量的限制:一个请求可能带 50 个 token,也可能带 200,000 个。要按团队限制每分钟 token 数,给 max_tokens 设上限,并设置以美元计的月度预算。请求的大小要到结束才知道,所以要选一种做法:

  • 先预留,再对账。 预先计入估算的输入加 max_tokens,之后再校正。OpenAI 在自己的限额中,取 max_tokens 和基于字符数的估算两者中较大的那个来计数。
  • 边生成边计数。 Anthropic 在输出 token 生成时就计数,而在大多数模型上,缓存读取不计入每分钟输入 token 数。
  • 事后计数。 简单,但突发流量会超出限额。Cloudflare 表示,并发请求可能会短暂超过它的支出上限。

把计数器放在 Redis 里,由所有网关实例共享;限流器系统设计讲了相关算法和 Redis 故障。用带版本的价格表给用量计价,预算用到 80% 时告警,并决定到 100% 是直接停止还是改用更便宜的模型。

要衡量什么

要跟踪每个提供商和模型的首个 token 耗时、每个团队的输入、输出和缓存 token、每个团队和功能的成本、按类型划分的错误,以及回退率和缓存命中率。OpenTelemetry 的生成式 AI 规范定义了 gen_ai.usage.input_tokens 之类的属性,但仍在开发中,所以要固定你输出的版本。可观测性架构图展示了这些信号的去向。

安全:网关解决不了什么

网关保存着所有提供商的密钥,也能看到每一个提示,所以管理员要少,配置变更要经过审计,日志要保留每次调用的元数据,但提示只做抽样、脱敏并短期保存。

它能应对 OWASP Top 10 for LLM applications 所说的无限制消耗:限额和预算能阻止陷入循环的智能体或泄露的密钥把账单刷高。它解决不了提示注入;OWASP 表示,是否存在万无一失的防范办法尚不清楚,而藏在检索文档里的指令在网关看来就是数据。防御手段是最小权限的工具、审批和严格的输出处理,就像 AI 智能体架构图里那样。

自建还是采用

网关 它是什么 许可证与托管方式
LiteLLM 支持 100 多个提供商的 Python 代理:虚拟密钥、预算、回退 MIT 加商业企业版;自托管
Agent Router 前身是 Envoy AI Gateway,基于 Envoy Gateway 构建 Apache 2.0;自托管
Portkey AI Gateway 重试、回退、负载均衡、护栏 MIT;语义缓存仅限托管版或企业版
Kong AI Gateway 面向 Kong Gateway 的 AI 策略 Konnect 或自托管;语义缓存和 token 限制需要企业许可证
Cloudflare AI Gateway 缓存、速率限制、回退、日志 托管
Azure API Management token 限制、语义缓存、token 指标 托管

Envoy AI Gateway 于 2026 年 9 月以 Agent Router 的名字加入了 Agentic AI Foundation。只自建属于你自己的部分,比如按数据分类路由;成本高的是让提供商适配器保持最新。托管网关会让第三方出现在每个提示的路径上;自托管则让 Redis、Postgres 和升级都成了你的工作。

LLM 网关图

两个带虚拟密钥的应用调用一个分五个阶段的网关框架:Auth、Policy、Cache、Router、Adapters。Adapters 调用作为主选的 OpenAI、在 429 或 5xx 时回退的 Anthropic,以及处理敏感数据的自托管 vLLM 模型。下方是 Postgres、Redis 和用量日志。

23 个组件 · 13 个连接

在 Archboard 中打开
图表内容
  • LLM gateway
  • Support chat
  • Doc summarizer
  • 1 Auth
  • 2 Policy
  • 3 Cache
  • 4 Router
  • 5 Adapters
  • Postgres: keys, budgets
  • Redis: counters, cache
  • Self-hosted model
  • OpenAI API
  • Anthropic API
  • Usage and cost log
  • virtual key A
  • virtual key B
  • miss
  • sensitive data
  • primary
  • fallback on 429/5xx
  • key → team, limits
  • token counters
  • lookup by hash
  • usage events (async)
一个请求穿过 LLM 网关:认证与限流、策略与脱敏、缓存、路由器和提供商适配器。Redis 保存计数器和缓存的回答,回退只发生在第一个 token 之前,每次调用都会计量到团队。

这张图的读法如下:

  • 两个应用使用各自的虚拟密钥调用同一个 OpenAI 格式的端点,自己没有任何提供商密钥。
  • 五个阶段按顺序运行,每个阶段上方有一条说明它做什么决定的注释。请求可能在 Auth(401、429)或缓存命中处停下。
  • 三个目标:作为主选的 OpenAI,在 429 或 5xx 时走虚线的 Anthropic 回退,以及处理敏感数据的自托管 vLLM 模型。
  • 阶段下方:保存密钥和预算的 Postgres,保存计数器和缓存回答的 Redis,以及异步写入的用量日志。
  • Markdown 块列出了一个团队的示例设置。

清晰地绘制 LLM 网关图

  • 画出各个阶段,而不是一个方框。 只画一个网关矩形,就看不出脱敏是否发生在缓存之前。
  • 把条件写在边上:「fallback on 429/5xx」、「sensitive data」、「miss」。
  • 标出数据离开你网络的位置,让外部提供商和自托管模型看起来不同。
  • 用虚线表示异步路径,比如计量和日志。
  • 不要画模型目录;它属于配置。

在 Archboard 中构建

  1. 用 Google 或 GitHub 登录并创建一个图表。
  2. 从基础包添加一个名为 LLM gateway 的框架。
  3. 在框架里,从 C4 Model 包横向添加五个组件节点:1 Auth、2 Policy、3 Cache、4 Router 和 5 Adapters,并在每个节点上方放一个基础包的文本注释。
  4. 在它们下方,从数据包添加 Postgres 和 Redis,再添加一个数据仓库用于用量和成本日志。
  5. 在框架左侧,从 C4 Model 包添加两个容器节点代表应用;右侧添加两个外部系统节点代表 OpenAI API 和 Anthropic API,再从 ML 包添加一个端点代表自托管模型。
  6. 画出带标签的边;回退和用量事件用虚线。
  7. 从基础包添加一个 Markdown 块,写上示例设置。

如果你把这条路径保存为 Mermaid 流程图,Mermaid 转换器可以把它转换成可编辑的初稿。这个示例共用 15 个图表节点,在 Free 套餐的限制之内。

常见问题

什么是 LLM 网关? 一个所有模型调用都要经过的服务。它保管提供商密钥,在模型之间路由和回退,做缓存,执行 token 限制和预算,并按团队记录用量。

AI 网关和 API 网关有什么区别? API 网关限制 HTTP 请求。AI 网关还理解 token、流式传输和提供商错误,所以可以按 token 限流、归属成本,并回退到另一个模型。

语义缓存和提示缓存有什么区别? 语义缓存运行在你的网关里,对相近的问题返回已保存的回答。提示缓存运行在提供商那里,复用已处理过的提示前缀;回答仍由模型重新生成。

如何按 token 对 LLM 请求限流? 在 Redis 里为每个团队维护一个令牌桶,每次调用前预留估算的输入加 max_tokens,事后再校正,到达限额时返回 429 并带上 Retry-After。

LLM 网关能防止提示注入吗? 不能。它可以过滤明显的攻击,并用预算限制损失,但文档中注入的指令看起来就是数据。要在应用里用最小权限的工具和审批来防御。

免费开始 — 1 个席位,无需信用卡。

相关文章

← 返回博客

一分钟打开画布

使用 Google 或 GitHub 登录。单席位免费,团队加入后再升级。