vLLM 搭配 LiteLLM:用 OpenAI 兼容格式调用本地模型服务(Chat 与 Embedding 实战)
【免费下载链接】vllmA high-throughput and memory-efficient inference and serving engine for LLMs项目地址: https://gitcode.com/GitHub_Trending/vl/vllm
LiteLLM 是一个支持 OpenAI 统一格式调用各家 LLM API 的网关/适配层,它可以把请求翻译到各供应商的completion、embedding、image_generation端点,统一输出结构(文本响应始终位于['choices'][0]['message']['content']),并提供跨多个部署的 Router 重试/回退逻辑,以及按项目、API Key、模型粒度设置预算与限流的 Proxy Server(LLM Gateway)能力。由于 vLLM 提供标准 OpenAI 兼容 API,LiteLLM 原生支持 vLLM 上部署的全部模型——这意味着你可以把 vLLM 当作一个"自建模型供应商",用一套统一的代码同时对接 OpenAI、Azure、本地 vLLM 等多种后端。本文基于 docs/deployment/frameworks/litellm.md 讲解完整的部署与调用流程,并结合 vLLM 源码说明 LiteLLM 实际打到的服务端点实现。
环境准备
准备工作非常直接,在 Python 环境中同时安装 vLLM 与 litellm:
pip install vllm litellm安装后,本地即可启动 vLLM 服务(vllm serve),而客户端代码只需引入litellm库即可发起请求。
部署 vLLM 服务
Chat Completion:以 Qwen1.5 为例
第一步,用一个支持 chat completion 的模型启动 vLLM OpenAI 兼容 API 服务:
vllm serve qwen/Qwen1.5-0.5B-Chat从源码看,vllm serve命令的入口在 vllm/entrypoints/cli/serve.py,它最终调用 vllm/entrypoints/launchers/api_server/entry.py 中的setup_server/run_server拉起 FastAPI 应用;服务默认监听端口为 8000(见 vllm/entrypoints/launchers/cli_args.py 中port: int = 8000),可通过--port、--host调整。
启动后,服务暴露的聊天补全端点定义在 vllm/entrypoints/openai/chat_completion/api_router.py:
- 端点路径为
POST /v1/chat/completions; - 请求体由
ChatCompletionRequest协议解析,实际处理委托给OpenAIServingChat(见 vllm/entrypoints/openai/chat_completion/serving.py 的create_chat_completion); - 支持 JSON 一次性响应与 SSE 流式(
text/event-stream)两种返回形式,流式响应还带有可配置的sse_keep_alive_interval心跳机制。
这正是 LiteLLM 的completion接口所对接的端点。
Embeddings:以 BGE 为例
若需要向量嵌入能力,则改用支持 embedding 的模型启动服务:
vllm serve BAAI/bge-base-en-v1.5对应服务端点实现位于 vllm/entrypoints/pooling/embed/api_router.py,除 OpenAI 标准的/v1/embeddings外,还额外提供了/v2/embed(Cohere 风格)端点,请求经EmbeddingRequest协议校验后由embedding(raw_request)句柄分发给具体 serving 实现(vllm/entrypoints/pooling/embed/serving.py)。
使用 LiteLLM 调用
1. 调用 Chat Completion
关键点:模型名必须带hosted_vllm前缀(LiteLLM 用它识别"自建 vLLM 服务"这一供应商类型),并把api_base指向 vLLM 服务的/v1路径:
import litellm messages = [{"content": "Hello, how are you?", "role": "user"}] # hosted_vllm 是必需的前缀关键字 response = litellm.completion( model="hosted_vllm/qwen/Qwen1.5-0.5B-Chat", # 传 vLLM 中部署的模型名 messages=messages, api_base="http://{your-vllm-server-host}:{your-vllm-server-port}/v1", temperature=0.2, max_tokens=80, ) print(response)参数说明:
| 参数 | 说明 |
|---|---|
model | 必须形如hosted_vllm/{vLLM 部署的模型名},前缀不可省略 |
api_base | vLLM 服务的 base 地址,注意结尾带/v1;默认端口通常为 8000 |
messages | OpenAI 标准消息列表格式 |
temperature/max_tokens | 透传到 vLLM 的采样参数 |
由于 LiteLLM 负责把各家协议统一翻译为 OpenAI 格式,返回结果中response['choices'][0]['message']['content']始终可稳定取到文本内容,无需针对 vLLM 单独做响应解析。
2. 调用 Embeddings
Embedding 调用的写法与 completion 略有不同:api_base通过环境变量HOSTED_VLLM_API_BASE传入(而非函数参数),模型名同样需要hosted_vllm前缀:
from litellm import embedding import os os.environ["HOSTED_VLLM_API_BASE"] = "http://{your-vllm-server-host}:{your-vllm-server-port}/v1" # hosted_vllm 是必需的前缀关键字,传 vLLM 中部署的模型名 embedding = embedding(model="hosted_vllm/BAAI/bge-base-en-v1.5", input=["Hello world"]) print(embedding)这里model中的模型名要与vllm serve BAAI/bge-base-en-v1.5启动时的模型名一致,input为待嵌入的文本列表,返回结构与 OpenAI/v1/embeddings响应一致(data中携带向量)。
适用场景与小结
这套组合的价值在于:
- 统一接口:业务代码只用一套 LiteLLM 调用逻辑,即可在后端替换时(OpenAI 云端 ↔ 自建 vLLM)只改动
model前缀与api_base; - 多部署容错:借助 LiteLLM Router,可将多个 vLLM 部署(或多供应商)配置为同一路由目标,实现重试与 fallback;
- 网关级管控:通过 LiteLLM Proxy Server 可在网关层按项目、API Key、模型做预算与限流,适合多租户接入自建推理集群。
排查要点:调用失败时优先确认hosted_vllm前缀是否遗漏、api_base是否以/v1结尾、vLLM 服务端口(默认 8000)与模型名是否与vllm serve启动参数一致。更多 vLLM 部署框架集成可参考 docs/deployment/frameworks 目录下的其他文档(如 Open WebUI、AnythingLLM、BentoML 等)。
【免费下载链接】vllmA high-throughput and memory-efficient inference and serving engine for LLMs项目地址: https://gitcode.com/GitHub_Trending/vl/vllm
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考