vLLM 部署嵌入与重排模型:搭建 RAG 管道
用 vLLM 分别部署嵌入与重排模型,接入 RAG 的索引生成、候选召回、重排和服务联调流程,并说明模型选择、端点配置、验证方法与常见错误。
vLLM 可以分别部署嵌入模型和重排模型:嵌入端点包括 Cohere 风格的 /v2/embed 和 OpenAI 兼容的 /v1/embeddings,见 Pooling Models 文档。重排端点为 /rerank、/v1/rerank 和 /v2/rerank;按照 Scoring Usages 文档,它只承担嵌入生成和重排推理,索引、召回及流程编排仍由应用负责。单个服务进程一次只托管一个模型,因此嵌入与重排应拆成独立进程,并分配不同端口。
安装 vLLM 与准备运行环境
按 Quickstart 文档,运行前提是 Linux 和 Python 3.10 至 3.13。Windows 不受原生支持,GPU 安装文档给出的路径是在兼容 Linux 发行版中使用 WSL;使用 NVIDIA GPU 时,其计算能力须达到 7.5 或更高。
建议使用全新环境安装。Quickstart 给出的 uv 命令会创建 Python 3.12 虚拟环境,--torch-backend=auto 可根据已安装的 CUDA 驱动版本选择 PyTorch 索引:
uv venv --python 3.12 --seed
source .venv/bin/activate
uv pip install vllm --torch-backend=auto
部署嵌入模型
按 Embedding Usages 文档,虽然可以用 --convert embed 自动转换模型,但若要取得更好的嵌入结果,应优先选择专门按嵌入任务训练的模型。下面是文档提供的 Matryoshka 启动示例:
vllm serve Snowflake/snowflake-arctic-embed-m-v1.5 --hf-overrides '{"matryoshka_dimensions":[256]}'
这里的 --hf-overrides 手动允许 256 维输出。索引程序随后通过选定的嵌入端点生成向量,并把向量与文档标识、来源等元数据写入你自己的索引或向量存储。
部署重排模型
Scoring Usages 文档列出的 scoring 模型类型包括 cross-encoder、late-interaction 和 bi-encoder;重排接口采用 Jina AI 与 Cohere 的 API 形态。启动前先按项目当前兼容列表确认模型,不要假定任意生成模型都能作为重排模型加载。
如需明确指定 pooling 模式,可加入 --runner pooling;Pooling Models 文档同时说明,自动检测通常使这个参数并非必需。可使用下面的占位模板:
vllm serve YOUR_VALUE --runner pooling --port YOUR_VALUE
第一个 YOUR_VALUE 填模型 ID,第二个填与嵌入服务不同的端口。不要固定照抄示例模型名称,应以当前项目文档为准。
搭建 RAG 管道
应用侧可以按下面的职责拆分:
- 建立索引:切分文档,通过
/v1/embeddings或/v2/embed生成向量,保存向量及定位原文所需的元数据。 - 召回候选:从自有索引中检索相关片段。向量数据库、过滤规则和候选数量由你的应用控制。
- 重排候选:把查询和召回片段提交给
/rerank、/v1/rerank或/v2/rerank,再按返回顺序整理结果。 - 组织生成:把重排后的上下文交给下游生成应用。这里描述的是管道结构,不代表这些编排能力由模型服务自动完成。
验证服务是否联通
先检查已启动的模型:
curl http://localhost:8000/v1/models
输出中应能找到当前进程实际加载的模型 ID。随后按照所选嵌入或重排 API 的当前请求结构发送一条最小请求:嵌入客户端应取得用于写入索引的向量,重排客户端应取得能够继续传给下游的排序结果。
检查重排服务时,要把客户端基础地址改为它的独立端口。若模型列表正常但业务请求失败,优先核对路径、请求结构和模型任务是否匹配。
常见故障
重排服务无法访问
单进程不能同时托管嵌入和重排模型。为两种角色分别启动进程,并确认端口没有冲突;客户端也应指向对应服务,而不是继续请求嵌入服务的端口。
修改嵌入维度时报错
根据 Embedding Usages 文档,不支持 Matryoshka Embeddings 的模型在请求改变输出维度时会返回错误。只有模型具备相应支持时,才能通过 --hf-overrides 手动开放目标维度。
显存参数没有按预期生效
vllm serve 参数参考说明,--max-model-len 覆盖提示词与输出 token 的总上下文长度;不设置时会从模型配置推导。另一个参数 --gpu-memory-utilization 未指定时默认使用 0.92,而且它是单实例限制。
同一 vllm serve 参数参考还说明,设置 --kv-cache-memory-bytes 后会覆盖 gpu_memory_utilization 的作用。同一 GPU 上的实例可以分别设置内存比例,但具体数值必须结合模型与实际运行状态判断,不能把参数示例当成容量保证。
本文步骤依据正文链接的官方文档整理,未运行或测量任何模型;使用前请按当前版本核对。