先聊个很实际的场景。手里同时有几个AI项目在跑,每个项目接入的模型供应商还不一样,A项目用某主流厂商的接口,B项目接了另一家的模型,C项目可能还要切到本地模型。每次换一个供应商,代码里的SDK要换、鉴权方式要改、传参格式要调,还要重新跑一遍回归,光这些琐事就能吃掉大半天时间。后来接触了LiteLLM,思路一下打开了——它把“每个供应商各写一套适配”变成“一套接口对接所有供应商”,相当于在最上层加了一个翻译层和路由层,代码不用改,配置改一改就能切换模型。
这篇内容主要面向正在做AI应用开发的工程师、以及需要在团队里统一管理多个模型入口的技术负责人。LiteLLM的核心价值就一句话:用一套标准格式调用上百种模型,同时把密钥管理、成本追踪、故障回退这些脏活累活都收到网关层处理。你不用再为每个模型供应商单独维护一套对接代码,也不用担心换模型时把业务逻辑搞得一团糟。
下面我会从原理拆解到实操部署、再到踩坑经验,把LiteLLM怎么用、为什么这么用、以及团队落地时要想清楚什么,完整过一遍。
1. LiteLLM是什么:让“换模型”变成“改配置”
1.1 一个真实发生过的切换场景
前阵子帮某团队做技术选型,他们的业务是做一个智能客服助手,最初只接了一家模型供应商。后来发现模型在特定问题上的回复质量不如另一家,想切换过去对比效果。结果一看代码:原来用的是供应商自己的SDK,请求结构、错误码、流式响应格式都和另一家不一样,光是改鉴权头和参数映射就花了两个晚上,再加上联调和回归,整个切换花了一周。
这不是个例。大模型生态现在非常碎片化,每家供应商都有自己的API风格、鉴权方式、限流策略和错误定义。你写业务代码的时候,最不希望的就是被某个具体供应商绑定住。LiteLLM解决的正是这个问题:它定义了一套统一的请求参数和响应格式,背后再帮你分发到任意一个模型供应商。
1.2 两种使用模式:SDK嵌入与代理网关
LiteLLM有两种主要用法,理解这两者的区别是入门的第一步。
第一种是SDK模式,直接在Python代码里调用litellm.completion()。这种方式适合单个Python项目内部使用,代码量少,改造成本低。示例大概是这样:
from litellm import completion response = completion( model="vendor_a/chat-model-x", messages=[{"role": "user", "content": "你好"}], api_key="your_key_here" ) print(response.choices[0].message.content)第二种是代理网关模式(Proxy Server),这也是我更推荐团队使用的方式。你启动一个LiteLLM服务,它暴露一个标准的HTTP接口,业务系统只需要把请求发到这个网关,网关负责把请求转换成对应模型供应商的格式并转发出去。业务代码完全不需要关心后端是哪个模型,只需要修改网关配置就能完成切换。
litellm --model vendor_a/chat-model-x --port 4000请求代码甚至不需要引入LiteLLM的Python包,直接用常见的HTTP客户端就行。对于多语言团队(比如后端用Java、Go,算法用Python),代理网关模式明显更合适,因为它把模型接入能力变成了一个独立服务,语言无关。
2. 核心亮点拆解:它不只是一个“封装工具”
2.1 统一请求格式:一套参数走天下
模型供应商之间最大的差异在请求参数上。同样是“温度”这个参数,A厂商叫temperature,B厂商可能叫temperature_override或者有自己默认的范围;最大输出长度这个参数更是五花八门,有的叫max_tokens,有的叫max_output_tokens。如果每个厂商都适配一遍,长期维护成本非常吓人。
LiteLLM的做法是定义一套“标准参数”,和大多数主流厂商的命名保持一致,然后由它内部去做参数映射。你只需要按标准传参,剩下的交给代理。
response = completion( model="vendor_b/another-model-y", messages=[{"role": "user", "content": "写一份周报"}], temperature=0.7, max_tokens=2000 )这套标准化特别适合业务团队。产品经理说“今天想切换模型试试”,你不需要翻代码找参数差异,只需要在网关配置里把路由规则改一下。
2.2 路由策略:轮询、权重、回退
LiteLLM一个非常实用的能力是路由。网关层面可以配置多组模型,让请求按策略分发。常见策略包括:
- 成本优先:默认请求便宜的模型,贵模型作为兜底。
- 性能优先:优先请求快速模型,慢模型作为备胎。
- 权重轮询:两个模型按比例分担流量,方便做AB对比。
举个例子,配置里可以写:正常情况下80%的流量走A厂商模型,20%走B厂商模型。当A厂商限流或者返回错误时,自动把请求发到B厂商。这个回退机制对线上服务非常关键,避免因为某一供应商故障导致整个服务不可用。
回退的配置大概长这样:
model_list: - model_name: "main-chat" litellm_params: model: "vendor_a/chat-model-x" api_key: "key_a" - model_name: "backup-chat" litellm_params: model: "vendor_b/another-model-y" api_key: "key_b" router_settings: fallback_configs: "main-chat": ["backup-chat"]当main-chat连续返回错误或超出限流时,请求自动打到backup-chat。对上层业务完全透明。
2.3 缓存与成本管控:把预算变成可执行的规则
做AI应用,成本是绕不开的话题。很多团队上线后才发现,模型调用费用比预期高出一大截。LiteLLM提供了按密钥(API Key)维度的预算管理和用量追踪。你可以在网关里给不同团队或不同项目创建独立密钥,每个密钥设置月度预算上限,超过预算直接拒绝请求。这样财务和研发都能及时感知成本变化。
用法上,你启动代理时先创建一个主密钥,再用主密钥去创建子密钥,每个子密钥可以绑定不同的模型范围和预算配额。这些用量数据可以存到数据库里(支持PostgreSQL、Redis等),通过查询接口随时拉取统计结果。对老板来说,这时候它不只是一个技术工具,更是一个成本管理面板。
3. 实操过程:一小时搭起多模型接入网关
3.1 基础环境与会话初始化
建议用隔离环境安装,避免和项目内其他包产生冲突。
mkdir litellm-demo cd litellm-demo python -m venv venv source venv/bin/activate pip install 'litellm[proxy]'装完之后,先验证版本。
litellm --version如果你还需要查询用量和预算数据,建议一并把数据库配好。对于小团队,SQLite够用;规模上来之后建议切到PostgreSQL。配置在启动代理时通过环境变量或者配置文件传入。
3.2 用一个OpenAI兼容客户端对接代理
LiteLLM的核心设计理念是:对外提供一个与主流厂商兼容的接口(即OpenAI兼容格式),所以几乎所有对接过该格式的SDK都能直接指向它,这让迁移成本非常低。
先用curl发一个最简单的请求:
curl http://localhost:4000/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer your_master_key" \ -d '{ "model": "main-chat", "messages": [{"role": "user", "content": "介绍一下你自己"}], "temperature": 0.7 }'你会发现,除了地址变成了本地4000端口,其他部分和原本使用上游厂商SDK的直接调用几乎一模一样。
Python这边的写法也很直观:
from openai import OpenAI client = OpenAI( base_url="http://localhost:4000/v1", api_key="your_master_key" ) response = client.chat.completions.create( model="main-chat", messages=[{"role": "user", "content": "给我一个项目排期方案"}], temperature=0.5 ) print(response.choices[0].message.content)所谓模型名称main-chat,是你在网关配置里定义的路由名,它背后映射的是某个具体模型。业务代码只认识main-chat,后端模型怎么换、怎么回退,业务方完全不用关心。
3.3 接入多个供应商并设置自动回退
现在把两个供应商配置进同一个网关。
model_list: - model_name: "primary-chat" litellm_params: model: "vendor_a/chat-model-x" api_key: "your_vendor_a_key" - model_name: "secondary-chat" litellm_params: model: "vendor_b/another-model-y" api_key: "your_vendor_b_key"启动代理:
litellm --config config.yaml --port 4000此时你直接用primary-chat这个模型名请求,LiteLLM会转发给A厂商。
再启用回退:
router_settings: fallback_configs: "primary-chat": ["secondary-chat"]为了验证回退效果,我在实际测试时会把A厂商标记成必然失败的一个错误状态,然后观察网关是否把请求转给了B厂商。实测结果是,当A厂商返回401或429的时候,LiteLLM会自动重试到B厂商,业务端收到的仍然是有效响应。这个能力对线上稳定性非常关键。
3.4 参数选择与映射避坑
配置模型时,有几个细节需要留意:
max_tokens建议显式设置,不要依赖供应商默认值。不同供应商默认值差异很大,有的默认几百,有的默认几千,表现会很不一样。temperature虽然统一了,但不同模型最佳范围不同,需要针对业务场景调,不要盲目套用。- 供应商自有特殊参数,比如有的模型支持
response_format或tool_choice,LiteLLM允许在litellm_params里用additional_parameters传参,但要注意不同供应商对该参数格式要求不同,跨供应商兼容性有限,切换模型时最好重新验证。
4. 我踩过的坑:这些细节值得多说几句
4.1 上游密钥过期,牵一发动全身
这里先说一个很常见的问题。多模型网关接好之后,开发环境一切正常,但线上跑了一段时间后,某个供应商的密钥过期了,结果调用main-chat的请求全部返回异常。由于配置了回退,部分流量会转到B厂商,但日志里会出现大量重试和延迟上升。
我当时的排查流程是:先看业务侧请求耗时是否上升,确认是上游问题;再看LiteLLM的状态接口,发现某个上游返回401;最后去供应商后台一查,密钥过期。解决办法是在网关配置里引入“密钥池”,一个逻辑模型配多个密钥,LiteLLM在其中一个密钥失效时自动换下一个。
model_list: - model_name: "primary-chat" litellm_params: model: "vendor_a/chat-model-x" api_keys: ["key_a1", "key_a2"]这个配置把密钥轮换的复杂度吸到了网关层,运维体验提升不少。
4.2 本地模型和远端模型混用时,别把地址写错
团队里有人用本地部署的开源模型做实验,也想接入这套网关。最常见的问题是把本地模型的地址写成了localhost,而LiteLLM运行在容器里,容器里的localhost指向的是LiteLLM自己,不是本地模型。
解决办法是使用容器网络内可访问的地址,比如本地机器在局域网里的IP,或者让LiteLLM和本地模型跑在同一个网络命名空间下。这类问题排查起来非常有代表性:日志显示请求到了本地模型服务,但一直连接不上,最后发现是网络地址解析的问题。
4.3 限流与并发控制要提前定好
网关把所有请求集中转发,如果后端供应商限流比较严格,网关层必须做并发控制。LiteLLM提供了按密钥的速率限制配置,比如某个密钥每分钟最多100次请求,超过直接拒绝。这个能力在多人共用网关时特别重要,否则某个人写了个死循环,一下子把整条链路打挂。
我习惯的配置是给每个子密钥设置一个较低的默认速率,比如每分钟60次,结合预算上限双保险。后续有真实业务需求再调高。
4.4 日志与可观测性:没有监控就别上线
网关的日志能力直接决定排障效率。LiteLLM可以输出JSON格式日志,包含请求ID、模型名、耗时、token用量、上游返回状态。把这些日志接入现有的日志平台,再做几个简单的看板,就能看到每个模型每天的调用量、失败率、平均延迟。
我还建议在网关前面再套一层简单的健康检查,定期请求一个固定模型,确保网关和上游链路都是通的。这样能提前发现问题,而不是等业务方反馈“机器人不回话了”才去排查。
5. 团队落地的时候,还要想清楚三件事
5.1 模型路由策略由谁定:从“开发写死”到“平台配置”
很多团队一开始接入LiteLLM,只是把它当成一个“API转换器”。用了一段时间后会发现,真正有价值的是它把模型选择权从代码里抽离出来,变成了一个配置项。业务代码不再关心用哪个模型,只关心某个逻辑模型(比如“客服主力模型”)是否可用。谁来定义这个逻辑模型背后对应哪个实际模型?这个问题要从头想清楚。
建议的做法是:由负责模型评估的同事或小组来维护模型路由配置。业务方提需求和场景,运维或平台组负责配置下发,开发组不再直接改模型名称。这样权责清晰,切换模型不需要发版。
5.2 模型灰度切换的轻量做法
很多团队担心切换模型后效果变差。用LiteLLM做灰度其实很简单:同一时间让logic-model-a指向旧模型,logic-model-b指向新模型,业务侧把流量按比例分到这两个逻辑模型上。观察几天的线上数据,再逐步放大新模型流量。
比直接改代码更稳妥的是,你可以利用网关层的权重配置,让两个逻辑模型使用同一个路由名,在配置里调整流量比例。这样连业务侧都不用动,平台侧就能完成灰度。
5.3 密钥权限划分和数据合规
如果多个团队共用一个网关,密钥管理要严肃对待。不要把主密钥给到所有团队,每个团队单独创建子密钥,绑定指定模型范围和预算上限。如果某个团队用超了预算,只影响他们自己,不影响其他团队。
数据合规也是必须考虑的。有些数据不能出域,那网关就不能把请求转发到外部模型,只能在同域的模型服务上处理。LiteLLM支持配置多个模型列表,你可以把“外部模型”和“内网模型”分成两组,各自分配在不同逻辑名下,避免业务侧误用外部模型导致数据风险。
6. 回到实际出发:什么时候不需要LiteLLM
写到最后,也想说句实话。LiteLLM不是万能的,如果项目只接入一个模型、一个人维护、没有切换需求,那直接对接原厂SDK更简单,没必要引入额外组件。
一旦出现以下信号,就说明该引入了:第二家模型供应商出现在代码里、有人在群里问“我们的API密钥放在哪”、产品或运营说“想对比一下两家模型效果”、领导开始关注单个模型调用成本。这些信号出现任何一个,说明团队对模型接入的规范化和透明化有真实需求了。
我的经验是,最开始在自己负责的某个小工具上接入代理网关,跑上两周,看看日志和用量统计,感受一下“改配置不改代码”的切换方式,比看任何文档都直接。等确认这套模式对项目有帮助,再逐步推广到核心业务。大模型技术迭代快,与其每次都跟着上游变动改代码,不如把“换模型”这个动作本身也做成一个可配置、可管理、可观测的流程。