OpenAI 兼容服务器#

vLLM 提供一个 HTTP 服务器,该服务器实现了 OpenAI 的 CompletionsChat API。

你可以使用 Python 或 Docker 启动服务器:

vllm serve NousResearch/Meta-Llama-3-8B-Instruct --dtype auto --api-key token-abc123

要调用服务器,你可以使用官方 OpenAI Python 客户端库或任何其他 HTTP 客户端。

from openai import OpenAI
client = OpenAI(
    base_url="http://localhost:8000/v1",
    api_key="token-abc123",
)

completion = client.chat.completions.create(
  model="NousResearch/Meta-Llama-3-8B-Instruct",
  messages=[
    {"role": "user", "content": "Hello!"}
  ]
)

print(completion.choices[0].message)

API 参考#

有关 API 的更多信息,请参阅 OpenAI API 参考。我们支持所有参数,除了:

  • 聊天:toolstool_choice

  • 完成:suffix

vLLM 还提供对 OpenAI Vision API 兼容推理的实验性支持。有关更多详细信息,请参阅 使用 VLM

额外参数#

vLLM 支持一组不属于 OpenAI API 的参数。为了使用它们,你可以将它们作为额外参数传递给 OpenAI 客户端。或者,如果你直接使用 HTTP 调用,则直接将它们合并到 JSON 负载中。

completion = client.chat.completions.create(
  model="NousResearch/Meta-Llama-3-8B-Instruct",
  messages=[
    {"role": "user", "content": "Classify this sentiment: vLLM is wonderful!"}
  ],
  extra_body={
    "guided_choice": ["positive", "negative"]
  }
)

聊天 API 的额外参数#

支持以下 采样参数(点击查看文档)

支持以下额外参数:

完成 API 的额外参数#

支持以下 采样参数(点击查看文档)

支持以下额外参数:

聊天模板#

为了使语言模型支持聊天协议,vLLM 要求模型在其分词器配置中包含一个聊天模板。聊天模板是一个 Jinja2 模板,它指定了角色、消息和其他聊天特定令牌如何在输入中编码。

NousResearch/Meta-Llama-3-8B-Instruct 的示例聊天模板可以在 此处 找到。

有些模型即使经过指令/聊天微调,也不提供聊天模板。对于这些模型,你可以在 --chat-template 参数中手动指定它们的聊天模板,并提供聊天模板的文件路径或模板的字符串形式。如果没有聊天模板,服务器将无法处理聊天,所有聊天请求都会出错。

vllm serve <model> --chat-template ./path-to-chat-template.jinja

vLLM 社区为流行模型提供了一组聊天模板。你可以在示例目录 此处 找到它们。

服务器的命令行参数#

聊天完成 API 中的工具调用#

命名函数调用#

默认情况下,vLLM 仅在聊天完成 API 中支持命名函数调用。它使用 Outlines 来实现这一点,因此默认情况下已启用,并且可以与任何支持的模型一起使用。你将获得一个可解析的函数调用,但并非高质量的函数调用。

要使用命名函数,你需要在聊天完成请求的 tools 参数中定义函数,并在聊天完成请求的 tool_choice 参数中指定其中一个工具的 name

配置文件#

serve 模块还可以从 yaml 格式的配置文件中接受参数。yaml 中的参数必须使用此处概述的 参数长格式 指定:

例如:

# config.yaml

host: "127.0.0.1"
port: 6379
uvicorn-log-level: "info"
$ vllm serve SOME_MODEL --config config.yaml

注意 如果使用命令行和配置文件提供参数,则命令行中的值将优先。优先级顺序为 命令行 > 配置文件值 > 默认值


聊天完成 API 中的工具调用#

vLLM 仅在聊天完成 API 中支持命名函数调用。tool_choice 选项 autorequired 尚未支持,但已列入路线图。

调用者有责任向模型提供工具信息,vLLM 不会自动操作提示。

vLLM 将使用引导解码来确保响应与 tools 参数中 JSON 模式定义的工具参数对象匹配。

自动函数调用#

要启用此功能,你应该设置以下标志:

  • --enable-auto-tool-choice必选 自动工具选择。告诉 vLLM 你希望启用模型在认为合适时生成自己的工具调用。

  • --tool-call-parser – 选择要使用的工具解析器 - 目前为 hermesmistral。将来会继续添加其他工具解析器。

  • --chat-template可选 用于自动工具选择。处理包含先前生成的工具调用的 tool 角色消息和 assistant 角色消息的聊天模板路径。Hermes 和 Mistral 模型在其 tokenizer_config.json 文件中具有与工具兼容的聊天模板,但你可以指定自定义模板。如果你的模型在 tokenizer_config.json 中配置了特定于工具使用的聊天模板,则可以将此参数设置为 tool_use。在这种情况下,它将根据 transformers 规范使用。更多信息请参见 此处 来自 HuggingFace;你可以在 tokenizer_config.json 中找到一个示例 此处

如果你的最喜欢的工具调用模型不受支持,请随时贡献解析器和工具使用聊天模板!

Hermes 模型#

所有 Nous Research Hermes 系列模型,比 Hermes 2 Pro 更新的模型都应该受支持。

  • NousResearch/Hermes-2-Pro-*

  • NousResearch/Hermes-2-Theta-*

  • NousResearch/Hermes-3-*

请注意,由于在创建过程中合并步骤,Hermes 2 Theta 模型的工具调用质量和功能已知会下降

标志:--tool-call-parser hermes

Mistral 模型#

支持的模型:

  • mistralai/Mistral-7B-Instruct-v0.3(已确认)

  • 其他 Mistral 函数调用模型也兼容。

已知问题:

  1. Mistral 7B 难以正确生成并行工具调用。

  2. Mistral 的 tokenizer_config.json 聊天模板要求工具调用 ID 恰好为 9 位数字,这远小于 vLLM 生成的数字。由于在不满足此条件时会抛出异常,因此提供了以下附加聊天模板:

  • examples/tool_chat_template_mistral.jinja - 这是 “官方” Mistral 聊天模板,但经过调整,使其适用于 vLLM 的工具调用 ID(前提是 tool_call_id 字段被截断为最后 9 位数字)

  • examples/tool_chat_template_mistral_parallel.jinja - 这是一个 “更好” 的版本,它在提供工具时添加了一个工具使用系统提示,这在使用并行工具调用时可以显著提高可靠性。

推荐标志:--tool-call-parser mistral --chat-template examples/tool_chat_template_mistral_parallel.jinja