Pooling 模型#
vLLM 也支持 pooling 模型,包括嵌入、重排序和奖励模型。
在 vLLM 中,pooling 模型实现了 VllmModelForPooling
接口。这些模型使用 Pooler
来提取输入的最终隐藏状态,然后再返回它们。
注意
我们目前主要为了方便起见而支持 pooling 模型。如 兼容性矩阵 所示,大多数 vLLM 功能不适用于 pooling 模型,因为它们仅在生成或解码阶段工作,因此性能可能不会有太大提升。
对于 pooling 模型,我们支持以下 --task
选项。选择的选项设置用于提取最终隐藏状态的默认 pooler
任务 |
Pooling 类型 |
归一化 |
Softmax |
---|---|---|---|
嵌入 ( |
|
✅︎ |
❌ |
分类 ( |
|
❌ |
✅︎ |
句子对评分 ( |
* |
* |
* |
奖励建模 ( |
|
❌ |
❌ |
*默认 pooler 始终由模型定义。
注意
如果模型在 vLLM 中的实现定义了自己的 pooler,则默认 pooler 将设置为该 pooler,而不是此表中指定的 pooler。
加载 Sentence Transformers 模型时,我们会尝试根据其 Sentence Transformers 配置文件 (modules.json
) 覆盖默认 pooler。
提示
您可以通过 --override-pooler-config
选项自定义模型的 pooling 方法,该选项的优先级高于模型和 Sentence Transformers 的默认设置。
离线推理#
LLM
类提供了各种离线推理方法。有关初始化模型时的选项列表,请参阅 引擎参数。
LLM.encode
#
encode
方法适用于 vLLM 中的所有 pooling 模型。它直接返回提取的隐藏状态,这对于奖励模型非常有用。
llm = LLM(model="Qwen/Qwen2.5-Math-RM-72B", task="reward")
(output,) = llm.encode("Hello, my name is")
data = output.outputs.data
print(f"Data: {data!r}")
LLM.embed
#
embed
方法为每个提示输出一个嵌入向量。它主要为嵌入模型而设计。
llm = LLM(model="intfloat/e5-mistral-7b-instruct", task="embed")
(output,) = llm.embed("Hello, my name is")
embeds = output.outputs.embedding
print(f"Embeddings: {embeds!r} (size={len(embeds)})")
代码示例可以在这里找到:examples/offline_inference/basic/embed.py
LLM.classify
#
classify
方法为每个提示输出一个概率向量。它主要为分类模型而设计。
llm = LLM(model="jason9693/Qwen2.5-1.5B-apeach", task="classify")
(output,) = llm.classify("Hello, my name is")
probs = output.outputs.probs
print(f"Class Probabilities: {probs!r} (size={len(probs)})")
代码示例可以在这里找到:examples/offline_inference/basic/classify.py
LLM.score
#
score
方法输出句子对之间的相似度分数。它专为嵌入模型和交叉编码器模型而设计。嵌入模型使用余弦相似度,而 交叉编码器模型 在 RAG 系统中充当候选查询-文档对的重排序器。
注意
vLLM 只能执行 RAG 的模型推理组件(例如,嵌入、重排序)。要在更高级别处理 RAG,您应该使用集成框架,例如 LangChain。
llm = LLM(model="BAAI/bge-reranker-v2-m3", task="score")
(output,) = llm.score("What is the capital of France?",
"The capital of Brazil is Brasilia.")
score = output.outputs.score
print(f"Score: {score}")
代码示例可以在这里找到:examples/offline_inference/basic/score.py
在线服务#
我们的 OpenAI 兼容服务器 提供了与离线 API 相对应的端点
Pooling API 类似于
LLM.encode
,适用于所有类型的 pooling 模型。Embeddings API 类似于
LLM.embed
,接受文本和 多模态输入 用于嵌入模型。Score API 类似于交叉编码器模型的
LLM.score
。