LiteLLM:大模型API网关,统一多模型调用与切换
发布时间:2026/10/21 18:29:02 锦皓数字建站

1. 这个项目到底解决什么问题先说我第一次遇到 LiteLLM 的场景。当时手头做一个业务需要在几个不同厂商的大模型接口之间来回切换。今天用A厂的模型跑语义理解明天可能换成B厂的模型跑生成后天还要对比C厂的性价比。结果代码里全是各个厂商各自的SDK、各自的请求格式、各自的鉴权方式。每次切换模型都要改一坨代码调了半天终于通了又发现不同厂商的错误码还长得不一样用一个就踩一个坑。LiteLLM 解决的就是这类问题。它本质上是一个大模型API网关或者说是一个统一代理层。它把几十家主流模型服务商的接口全部封装成同一套协议你只需要按照一套标准的方式去调用剩下的事情——路由、切换、重试、负载均衡、密钥管理、成本统计——全部交给它来干。这不是一个玩具项目很多团队已经把它放在生产环境里当作大模型基础设施在用。你可能会问我自己封装一层不就行了当然可以手写一个类把所有厂商的请求都转一遍也不是不行。但问题在于这件事的边界比你想象的要大。不只是“发个请求收个响应”这么简单。你还需要处理限流、熔断、超时、重试、模型白名单、预算管控、日志审计、异常报警。这些东西如果每个团队都自己造一套那就是重复造轮子而且大概率造的还没有人家专门做这个的团队造得好。所以 LiteLLM 适合谁适合正在做LLM应用开发但不想被某一家模型厂商绑死的团队。也适合需要把大模型能力开放给内部多个业务线、又不想直接把各厂商API Key散出去的平台组成员。还适合一个人做独立开发、想在几个模型之间做横向对比的开发者。2. 整体设计与核心设计思路2.1 它的定位不是另一个SDK而是一个网关很多人第一次接触 LiteLLM 会误以为它只是一个 Python 封装库教你用一套代码调用各家大模型。但看它的文档和源码你就会发现它的设计重心其实是一个代理服务器。你可以通过一行命令litellm --config config.yaml --port 4000启动一个本地服务然后所有请求都发往这个服务由它再转发给真正的模型厂商。这种“网关式”设计的好处非常大。你想想如果你的模型调用逻辑只是打在代码里的一个库那么当你想给多个服务共用同一个模型配置时怎么办每个服务都要配一份自己的厂商API Key每个服务都要自己统计Token消耗每个服务都要自己实现重试逻辑。而如果把它做成网关团队里所有服务只要往网关发HTTP请求就能统一完成鉴权、配额、路由和计量。这个思路有点像数据库中间的连接池代理。业务方不用关心背后连的是哪台数据库、连接串怎么配、密码是多少你只需要连上代理由代理统一管理后端的连接资源。2.2 它的核心协议统一以 OpenAI 兼容接口为基准LiteLLM 最关键的选型决策是把接口统一到 OpenAI 兼容协议上。也就是说不管后端是哪个厂商在 LiteLLM 这一层你全部用 OpenAI 的 Chat Completions 格式去请求。这带来了三个具体的好处。第一接入成本低。现在市面上几乎所有的模型厂商都主动提供 OpenAI 兼容的接入方式因为这已经是事实上的行业标准。LiteLLM 只是把这件事做到极致把那些不天然兼容的厂商也翻译成这套格式。第二生态复用价值极高。OpenAI 兼容意味着你现有的所有基于 OpenAI SDK 写的代码、基于 LangChain 的调用链、很多开源应用内置的模型接入配置都可以直接指到 LiteLLM 网关。改个 base_url 就行不用改业务代码。第三切换成本被压到最低。你今天用的是 A 厂商的模型明天想换成 B 厂商的在 LiteLLM 里只需要改配置文件甚至可以在不改配置的情况下通过请求参数指定模型。你在代码里写的modelgpt-4o通过网关的模型映射功能可以被路由到实际的某个后端模型上业务代码完全无感知。这个选型很聪明。它没有另起炉灶发明一套新协议而是站在行业标准的肩膀上做一层适配这让它的传导阻力小很多。2.3 为什么选择配置文件驱动而不是代码驱动LiteLLM 的另一个设计特点是配置与代码分离。模型列表、密钥配置、路由策略、预算限额全都在config.yaml里写好。这一点在生产环境太重要了。你可以想象这个场景算法团队想上线一个新模型如果是代码驱动的方式需要开发人员改代码、走发布流程、重新部署。但在 LiteLLM 这种配置驱动的方式下运维同事只需要在 YAML 文件里加一个模型条目然后让网关热加载配置新的模型就立刻可用了。而且配置文件天然适合版本管理。你可以在 Git 里看到每一次配置变更的历史记录这比在生产服务器上手动改环境变量要正规得多。出了事故回滚也特别快直接把配置切回上一个版本就行。3. 核心功能拆解与实操要点3.1 多模型统一接入LiteLLM 支持接入的模型服务商数量上百家涵盖主流的中外厂商。在配置文件里你只需要把每个模型声明白并关联到对应的环境变量密钥。配置文件大致长这样model_list: - model_name: gpt-4o litellm_params: model: openai/gpt-4o api_key: os.environ/OPENAI_API_KEY - model_name: claude-3-5-sonnet litellm_params: model: anthropic/claude-3-5-sonnet api_key: os.environ/ANTHROPIC_API_KEY这个配置里有两个关键字段。model_name是暴露给调用方的对外名称你用这个名称发请求。litellm_params里的model是真正后端的模型标识前缀openai/、anthropic/这些是 LiteLLM 判断应该用哪个供应商 SDK 去调用的标记。我实际用下来这种“对外名 对内名”的映射机制极其好用。假设你对外一直暴露gpt-4o这个模型名内部把后端从官方渠道换成了第三方渠道或者换成某个开源模型的托管服务调用方完全无感知。3.2 负载均衡与多Key轮询大模型 API 是有速率限制的而且按 Key 计费。如果你的业务量比较大单一个 API Key 很容易打满速率上限或者触发每日配额限制。LiteLLM 支持为同一个模型配置多个 Key并在它们之间做负载均衡。看这个配置model_list: - model_name: gpt-4o litellm_params: model: openai/gpt-4o api_key: os.environ/OPENAI_API_KEY_1 model_info: timeout: 30 - model_name: gpt-4o litellm_params: model: openai/gpt-4o api_key: os.environ/OPENAI_API_KEY_2当gpt-4o的请求进来时LiteLLM 会轮询或者按健康状态自动选择 Key。这样可以最大化多个 Key 的利用率也不会轻易被限流。一个小细节是你可以在同一个model_name下配置多个不同的后端模型比如同一个对外名指向两个厂商的模型然后配合权重参数做流量分配。这个场景经常用于模型灰度替换。比如新模型效果不错但你还不敢把所有流量都切过去可以先让 10% 的流量走新模型观察一下再逐步调高权重。LiteLLM 的配置model_list: - model_name: gpt-4o litellm_params: model: openai/gpt-4o api_key: os.environ/OPENAI_API_KEY weights: 0.9 - model_name: gpt-4o litellm_params: model: azure/gpt-4o-new api_key: os.environ/AZURE_API_KEY weights: 0.1基于权重的流量分配可以用来做灰度发布这在生产环境里属于刚需。3.3 Fallback 机制调用大模型的过程中网络抖动、服务商故障、限流导致的报错都是家常便饭。LiteLLM 的 fallback 机制允许你在模型调用失败后自动切换到备用模型。用法很简单请求参数里带上fallbacksfrom litellm import completion response completion( modelgpt-4o, messages[{role: user, content: 你好}], fallbacks[claude-3-5-sonnet, gpt-3.5-turbo] )第一个模型失败了自动尝试第二个再失败尝试第三个。这个对于追求高可用性的业务场景太关键了。但这里有一个坑后文会讲fallback 不会自动处理“业务层面错误”它主要处理的是连接错误、限流、超时、5xx 这类服务异常。3.4 预算控制与速率限制面向团队内部使用的时候预算控制几乎是必需的功能。你不想让哪个业务线把整个月的 Token 预算一周就烧光了。LiteLLM 提供了多层级的预算控制按 Key 设置最大消费额度按用户设置最大消费额度按团队设置最大消费额度设置每分钟/每小时/每天的请求速率限制举个例子你可以在配置里给某个内部项目设置每天最多消费 100 美元超过额度直接返回 429 错误。这样就不需要靠人工盯账单系统自动就把钱控制住了。预算配置支持在请求里通过user字段区分调用者然后在后台为每个用户设置max_budget。对于做 SaaS 产品、要给不同客户分配不同额度的场景这个能力特别实用。3.5 模型缓存重复的 Prompt 和响应其实是很大的浪费。LiteLLM 支持语义缓存也就是内容完全一样的请求直接走缓存不再实际调用模型。官方还支持类似 Redis 缓存、本地缓存等。配置方式litellm_settings: cache: true cache_params: type: redis host: localhost port: 6379我实测下来如果请求里有大量完全相同的静态 Prompt这个缓存能省下相当可观的成本。比如某些固定模板的解释类请求或者内部知识库问答里的高频问题命中率很高。但要注意一个问题缓存是有副作用风险的。如果模型本身在升级更新而你的缓存还没过期那么用户拿到的还是旧模型的输出。所以生产环境里要么对敏感业务关闭缓存要么设置合理的TTL。4. 部署与实操过程4.1 快速启动一个代理网关LiteLLM 的安装非常简单就是一个 pip 包pip install litellm[proxy]注意这里我加了[proxy]扩展它会把网关服务相关的依赖一并安装。如果你只打算在代码里用litellm.completion()这种方式来调用不启动代理服务器可以只装pip install litellm。安装完之后你可以用 Python 直接验证最核心的功能import litellm response litellm.completion( modelopenai/gpt-4o, messages[{role: user, content: 讲个冷笑话}] ) print(response.choices[0].message.content)第一次跑通这个意味着你已经被“统一接口”的魅力打动了。上面的代码里openai/gpt-4o的意思是用 OpenAI 的后端协议去调用 gpt-4o。如果你换成anthropic/claude-3-5-sonnet其他代码完全不用变就能调到另一个厂商的模型。然后启动代理服务litellm --config config.yaml --port 4000启动后本地就有了一个监听在 4000 端口的 HTTP 服务。你可以直接用 curl 验证curl http://localhost:4000/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer sk-your-litellm-key \ -d { model: gpt-4o, messages: [{role: user, content: 你好}] }注意这个接口路径/v1/chat/completions就是 OpenAI 的接口路径。意思是网关对外完全模拟了一个 OpenAI 服务的形态。4.2 环境变量与密钥管理LiteLLM 本身不负责存储各厂商的原始 Key而是通过环境变量引用。这样有个好处厂商 Key 不会直接出现在配置文件里你不用担心 YAML 文件泄露导致所有 Key 一起泄露。export OPENAI_API_KEYsk-xxxx export ANTHROPIC_API_KEYsk-ant-xxxx配置文件里通过os.environ/OPENAI_API_KEY这样的写法来引用环境变量。这个设计比直接把密钥写死在配置里要安全得多毕竟config.yaml经常会被提交进 Git 仓库而环境变量存放在部署平台的密钥管理服务中。那调用方传给 LiteLLM 网关的 Key 是什么那是 LiteLLM 自己的虚拟 Key你可以为不同的业务线创建不同的虚拟 Key也可以为同一个业务线创建多个 Key 分配到不同用户头上。这种二次鉴权的能力保证了各家厂商的原始 Key 永远不会暴露给实际调用方。4.3 业务代码接入如果你已经有基于 OpenAI SDK 写的代码接入 LiteLLM 基本就是改两行的事。原来这样写from openai import OpenAI client OpenAI( api_keysk-original-key, base_urlhttps://api.openai.com/v1 ) response client.chat.completions.create( modelgpt-4o, messages[{role: user, content: 你好}] )接入 LiteLLM 后from openai import OpenAI client OpenAI( api_keysk-litellm-virtual-key, base_urlhttp://localhost:4000/v1 ) response client.chat.completions.create( modelgpt-4o, messages[{role: user, content: 你好}] )业务代码里真正需要改的只有base_url和api_key。模型名、消息格式、返回结构全部不变。这就是为什么我说它的接入成本低到惊人现有代码几近零改动。4.4 LangChain 集成很多做 LLM 应用的人在用 LangChain。LiteLLM 和 LangChain 的集成方式也非常直接LangChain 里有专门为 LiteLLM 做的封装。from langchain_community.chat_models import ChatLiteLLM from langchain_core.messages import HumanMessage chat ChatLiteLLM(modelgpt-4o, api_keysk-litellm-virtual-key, base_urlhttp://localhost:4000/v1) response chat.invoke([HumanMessage(content你好)])底层逻辑还是那句话LangChain 只是把你的请求发到base_url指定的地址而 LiteLLM 在背后帮你处理所有厂商适配。4.5 生产环境架构里的位置在实际的生产部署中LiteLLM 通常是作为一层独立的服务部署在 Kubernetes 集群里或者以容器方式跑在一台专用服务器上。上游是各种业务服务下游是各大模型厂商的 API。整个链路是业务服务 → LiteLLM 网关 → 模型厂商 API。这层网关在架构上是无状态的如果你不启用本地缓存的话所以可以很方便地水平扩展。多副本部署时加上负载均衡器就能扛住较高的并发量。Redis 缓存是共享的所有副本可以共用同一个缓存节点。5. 常见问题与排查技巧实录5.1 Fallback 没有触发怎么回事这是我被问过最多的问题。很多人配置了fallbacks参数但遇到限流的时候请求还是报了 429没有切到备用模型。排查思路是这样的LiteLLM 的 fallback 触发条件默认只包含连接错误、超时、HTTP 5xx、以及 429 限流。但如果你在请求里指定了某个厂商的max_retries参数LiteLLM 会先自己重试几次重试完了还是失败再考虑 fallback。如果你的模型名写错了它抛出的错误是NotFoundError这种 404 错误不会触发 fallback。我之前踩过一个具体的坑某个模型因为账号欠费返回 401我当时以为 fallback 会自动兜底结果没有。原因是 401 鉴权错误被 LiteLLM 判定为“配置层面问题”不属于“服务临时故障”所以不会触发 fallback。这个设计是合理的毕竟如果 Key 本身是坏的切到备用模型也大概率是坏的。5.2 模型名映射导致的神秘 404LiteLLM 的模型名映射是个好东西但也容易产生认知偏差。你在业务代码里写的modelgpt-4o本质上只是一个别名真正生效的是config.yaml里的映射关系。有一次我配置了一个别名指向了一个还没有开通访问权限的模型。结果调用时返回 404排查了很久甚至一度怀疑是 LiteLLM 的 bug。最后发现问题出在映射关系的目标模型名称写错了。以后遇到 404先确认配置文件里的实际模型名、渠道类型、以及该渠道是否真的能访问这个模型。5.3 预算统计的延迟问题LiteLLM 的预算控制是基于 Token 计费加异步任务更新的。它的计费数据最终会写到数据库或 Redis 里更新会有一定的延迟。如果你的业务对预算非常敏感比如单次请求预算为 0或者要求做到精确到分的实时控制LiteLLM 默认的异步统计不能满足要求。我在一个项目里就遇到过这种问题。客户的额度是 100 美元但他连续发了好几个并发请求因为统计是异步的实际额度超了才反应过来。解决方案是在 LiteLLM 前面再做一层基于用户维度的本地计数或者把账号额度的硬校验放到业务侧LiteLLM 只做软控制。5.4 超时设置大模型接口的响应时间波动很大。模型在高峰期可能 10 秒才返回第一个 Token也可能 60 秒都不返回。LiteLLM 默认的连接超时可能不够用你需要根据业务场景和模型服务商的实际表现合理设置超时。配置参数在model_info里设置model_list: - model_name: gpt-4o litellm_params: model: openai/gpt-4o api_key: os.environ/OPENAI_API_KEY model_info: timeout: 60也可以在请求参数里临时指定response litellm.completion( modelgpt-4o, messages[{role: user, content: 你好}], timeout60 )超时设置是有讲究的。设得太短慢模型会频繁失败设得太长用户体验很差一个请求卡住几十秒。我的习惯是区分场景对交互式聊天设 30 秒对后台离线任务可以放到 120 秒甚至更长。5.5 缓存命中率低有人反馈配置了 Redis 缓存但命中率很低。通常原因是请求里带了随机参数或者动态时间戳导致请求内容每次都不一样。也有可能是请求的messages里包含了系统提示词而系统提示词每次都在变。解决办法是检查你要缓存的请求里面有没有容易变化的部分。纯语义缓存对完全相同的请求效果最好。如果你希望类似内容也命中缓存LiteLLM 还支持语义相似度缓存但那个配置起来更复杂而且有准确性风险一般场景用完全匹配缓存就够了。5.6 密钥管理与安全很多团队直接把各厂商的 Key 放在 LiteLLM 的环境变量里这没问题。但容易忽略的是虚拟 Key 的管理。LiteLLM 支持通过管理接口创建 virtual key并且可以给不同的虚拟 Key 设置不同的预算、速率限制、模型白名单。我在实际使用中至少会给三个角色分别建虚拟 Key开发环境、测试环境、生产环境。开发环境的 Key 可以放开所有模型但预算很低生产环境的 Key 限制模型白名单防止不小心调用了还没上线的模型。5.7 常见错误速查表现象常见原因排查方向401 Unauthorized环境变量中厂商原始 Key 有误检查 export 的 Key 是否有效检查是否缺少os.environ/前缀404 Model Not Found配置文件中模型映射错误检查model_list里的实际模型名是否拼写正确429 Rate Limit触发上游限流或被预算限制检查 Key 配额、虚拟 Key 的速率限制设置500 Internal Server Error厂商服务端故障查看 LiteLLM 日志确认后端具体错误信息请求超时网络问题或模型响应慢调大timeout参数检查上游服务状态Fallback 未生效错误类型不在触发条件内查阅官方文档的 fallback 触发错误类型列表响应内容为空模型返回空内容或内容被过滤查看完整响应对象确认finish_reason是否为 content_filter6. 适合的应用场景总结6.1 多模型切换与横向对比如果你是一个 AI 应用的开发者正在对比不同模型在业务数据上的表现LiteLLM 是最省事的工具。你不用为每个厂商写一套调用代码只需要配置好模型列表然后统一用一套代码去跑评测集。响应速度和成本数据也能从 LiteLLM 的日志里拿到。我认识的一个朋友就是专门做模型评测的他把十几个模型接入到 LiteLLM 里写了一个自动评测脚本跑不同模型在同一测试集上的回答然后对比质量。这种场景下LiteLLM 省掉了大量的接入成本。6.2 团队模型网关如果一个团队里有多条业务线都要用大模型统一走一个网关的好处非常明显。首先是 Key 不用分散管理安全风险降低。其次是成本可以分摊到各业务线。再就是模型可以统一升级比如你从旧模型切换到新模型只需要改网关配置所有业务线自动切换。6.3 灰度发布与模型替换这就是前面说的权重分发场景。你总有一个时刻会觉得“当前模型效果不够好想换个模型试试”。但直接全量切换风险太大。LiteLLM 的权重分发可以做到极致的平滑替换从 5% 流量开始逐步加量全程业务方无感知。6.4 成本管控与配额管理给不同客户、不同项目、不同用户设置不同的模型访问范围和预算上限这简直是为 SaaS 产品定制的能力。配合虚拟 Key你可以在产品后台为每个租户生成独立的 API Key并设置消费上限。7. 我的经验和建议根据我自己的实际使用体会LiteLLM 在项目初期是“锦上添花”但当你的业务真的跑起来模型调用量上来之后它就是“必需品”。做 LLM 应用最怕的就是被单个模型服务商锁死。LiteLLM 用一层网关把你和具体厂商解耦了这比在代码里写死某个厂商的 SDK 要灵活得多。最后再分享一个小技巧LiteLLM 支持在启动代理的时候指定--detailed_debug它会打印每个请求的详细信息包括走了哪个后端模型、耗了多少 Token、响应耗时是多少。排查问题的时候开这个模式能省下大量翻日志的时间。但生产环境别开日志量太大了。我自己通常是在测试环境把各种日志开满排干净了再切到生产模式。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。