MLflow AI 网关 (实验性)
警告
MLflow AI Gateway 不支持 Windows。
MLflow AI 网关是一个强大的工具,旨在简化组织内各种大型语言模型(LLM)提供商(如 OpenAI 和 Anthropic)的使用和管理。它提供了一个高级接口,通过提供一个统一的端点来处理特定的 LLM 相关请求,从而简化了与这些服务的交互。
使用 MLflow AI Gateway 的一个主要优势是其对 API 密钥的集中管理。通过将这些密钥存储在一个安全的位置,组织可以通过最小化系统中敏感 API 密钥的暴露来显著增强其安全态势。它还有助于防止在代码中暴露这些密钥,或要求最终用户安全地管理密钥。
网关服务器设计为灵活且适应性强,能够通过更新配置文件轻松定义和管理端点。这使得无需更改与网关服务器接口的应用程序,即可轻松将新的LLM提供者或提供者LLM类型纳入系统。这种适应性使得MLflow AI网关服务在需要敏捷性和快速响应变化的环境中成为不可或缺的工具。
这种语言模型交互的简化和集中化,加上API密钥管理的安全性增强,使得MLflow AI网关成为经常使用LLM的组织的理想选择。
教程和指南
如果你对直接进入一个逐步指南感兴趣,该指南将帮助你尽快启动并运行 MLflow AI 网关,那么下面的指南将是你的最佳起点。
View the gateway server Getting Started Guide快速入门
以下指南将帮助您启动并运行,使用3个端点配置来访问OpenAI服务的聊天、补全和嵌入功能。
步骤 1:安装 MLflow AI 网关
首先,你需要在你的机器上安装 MLflow AI 网关。你可以使用 pip 从 PyPI 或从 MLflow 仓库中进行安装。
从 PyPI 安装
pip install 'mlflow[genai]'
步骤 2:为每个提供者设置 OpenAI API 密钥
网关服务器需要与 OpenAI API 通信。为此,它需要一个 API 密钥。您可以从 OpenAI 仪表板创建 API 密钥。
在这个例子中,我们只与 OpenAI 连接。如果在配置中有其他提供者,这些键也需要设置。
一旦你有了密钥,你可以在终端中将其设置为环境变量:
export OPENAI_API_KEY=your_api_key_here
这设置了一个基于会话的临时环境变量。对于生产用例,建议将此密钥存储在 .bashrc
或 .zshrc
文件中,以便在系统重启时不必重新输入密钥。
步骤 3:创建网关服务器配置文件
接下来,您需要创建一个网关服务器配置文件。这是一个 YAML 文件,您可以在其中指定 MLflow AI 网关应公开的端点。让我们创建一个包含三个使用 OpenAI 作为提供者的端点的文件:completions、chat 和 embeddings。
有关配置文件参数的详细信息(包括OpenAI以外的其他提供商的参数),请参见下面的 AI 网关服务器配置详情 部分。
endpoints:
- name: completions
endpoint_type: llm/v1/completions
model:
provider: openai
name: gpt-4o-mini
config:
openai_api_key: $OPENAI_API_KEY
limit:
renewal_period: minute
calls: 10
- name: chat
endpoint_type: llm/v1/chat
model:
provider: openai
name: gpt-4o-mini
config:
openai_api_key: $OPENAI_API_KEY
- name: embeddings
endpoint_type: llm/v1/embeddings
model:
provider: openai
name: text-embedding-ada-002
config:
openai_api_key: $OPENAI_API_KEY
将此文件保存到将要运行 MLflow AI 网关的系统上的某个位置。
步骤 4:启动网关服务器
你现在可以启动网关服务器了!
使用 MLflow AI Gateway 的 start-server
命令,并指定配置文件的路径:
mlflow gateway start --config-path config.yaml --port {port} --host {host} --workers {worker count}
配置文件也可以通过 MLFLOW_DEPLOYMENTS_CONFIG
环境变量来设置:
export MLFLOW_DEPLOYMENTS_CONFIG=/path/to/config.yaml
如果你没有指定主机,将会使用本地主机地址。
如果你没有指定端口,将使用端口 5000。
gunicorn 的 worker 数量默认设置为 2 个 worker。
步骤 5:访问交互式 API 文档
MLflow AI Gateway 提供了一个交互式的API文档端点,您可以使用它来探索和测试暴露的端点。在浏览器中导航到 http://{host}:{port}/
(或 http://{host}:{port}/docs
)以访问它。
文档端点允许直接与端点进行交互,并通过点击端点定义条目中的“立即尝试”选项,允许向提供者服务提交实际请求。
步骤 6:使用客户端 API 发送请求
有关更多信息,请参阅 客户端 API 部分。
步骤 7:通过 REST API 向端点发送请求
你现在可以向暴露的端点发送请求。有关请求格式的指导,请参阅 REST 示例。
步骤 8:比较提供者模型
以下是一个从提供者添加新模型的示例,以确定哪个模型实例更适合给定的用例。
首先,更新 MLflow AI Gateway 配置 YAML 文件,添加额外的端点定义以进行测试:
endpoints:
- name: completions
endpoint_type: llm/v1/completions
model:
provider: openai
name: gpt-4o-mini
config:
openai_api_key: $OPENAI_API_KEY
- name: completions-gpt4
endpoint_type: llm/v1/completions
model:
provider: openai
name: gpt-4
config:
openai_api_key: $OPENAI_API_KEY
此更新配置添加了一个新的补全端点 completions-gpt4
,同时仍然保留了使用 gpt-4o-mini
模型配置的原始 completions
端点。
一旦配置文件更新,只需保存您的更改。网关服务器将自动创建新的端点,且不会停机。
如果你不再需要一个端点,你可以从配置 YAML 中删除它并保存你的更改。网关服务器将自动移除该端点。
步骤9:使用网关服务器端点进行模型开发
既然你已经创建了几个网关服务器端点,你可以创建查询这些端点的 MLflow 模型,使用提示工程等技术构建特定于应用程序的逻辑。更多信息,请参阅 网关服务器和 MLflow 模型。
概念
在 MLflow AI Gateway API、配置定义、示例和文档中,有几个概念被提及。熟悉这些术语将有助于简化配置新端点和使用 MLflow AI Gateway API。
提供者
MLflow AI 网关旨在支持多种模型提供商。提供商代表机器学习模型的来源,例如 OpenAI、Anthropic 等。每个提供商都有其特定的特征和配置,这些特征和配置封装在 MLflow AI 网关中端点的模型部分。
支持的提供者模型
下表列出了 MLflow AI Gateway 中模型和相应端点类型的非详尽列表。随着 LLM 的快速发展,不能保证此列表始终是最新的。然而,当为任何新发布的模型类型配置端点时,以下列出的关联可以作为一个有用的指南,因为它们在给定的提供商处变得可用。N/A
表示提供商或 MLflow AI Gateway 实现当前不支持该端点类型。
提供者 |
端点 |
||
---|---|---|---|
llm/v1/completions |
llm/v1/聊天 |
llm/v1/嵌入 |
|
OpenAI § |
|
|
|
MosaicML |
|
|
|
Anthropic |
|
|
N/A |
Cohere |
|
|
|
Azure OpenAI |
|
|
|
PaLM |
|
|
|
MLflow |
|
|
|
HuggingFace TGI |
N/A |
|
N/A |
AI21 Labs |
|
N/A |
N/A |
亚马逊基础 |
|
N/A |
N/A |
Mistral |
|
N/A |
|
TogetherAI |
|
|
|
§ OpenAI
的完全兼容性参考,请参阅 OpenAI 模型兼容性矩阵。
† Llama 2 根据 LLAMA 2 社区许可证 授权,版权所有 © Meta Platforms, Inc. 保留所有权利。
在配置文件的每个模型块中,provider 字段用于指定该模型的提供者名称。这是一个字符串值,需要对应于 MLflow AI Gateway 支持的提供者。
备注
* MLflow 模型服务仅在输出返回为端点兼容格式时,才适用于聊天或补全。响应必须符合 {"predictions": str}
或 {"predictions": {"candidates": str}}
的输出格式。任何不符合这些结构的复杂返回类型,在查询时都会引发异常。
** 嵌入支持仅适用于响应签名符合 {"predictions": List[float]}
或 {"predictions": List[List[float]]}
结构化格式的模型。任何其他返回类型将在查询时引发异常。transformers
中的 FeatureExtractionPipeline
和使用 sentence_transformers
风格的模型将为嵌入端点返回正确的数据结构。
以下是一个端点内的提供者配置示例:
endpoints:
- name: chat
endpoint_type: llm/v1/chat
model:
provider: openai
name: gpt-4
config:
openai_api_key: $OPENAI_API_KEY
limit:
renewal_period: minute
calls: 10
在上面的配置中,openai
是模型的 提供者。
截至目前,MLflow AI 网关支持以下提供商:
mosaicml: 这是用于 MosaicML 提供的模型。
openai: 这用于 OpenAI 提供的模型以及 Azure 集成的 Azure OpenAI 和带有 AAD 的 Azure OpenAI。
anthropic: 这是用于 Anthropic 提供的模型。
cohere: 这是用于 Cohere 提供的模型。
palm: 这用于由 PaLM 提供的模型。
huggingface 文本生成推理: 这用于使用 Huggingface 文本生成推理 部署的模型。
ai21labs: 这是用于 AI21 Labs 提供的模型。
bedrock: 这是用于 Amazon Bedrock 提供的模型。
mistral: 这是用于 Mistral 提供的模型的。
togetherai: 这是用于 TogetherAI 提供的模型的。
更多提供者正在不断添加中。请查看最新版本的 MLflow AI Gateway 文档,以获取最新的支持提供者列表。
如果你想使用上述提供商未提供的LLM模型,或者你想集成一个私有的LLM模型,你可以创建一个 提供商插件 来与MLflow AI网关集成。
端点
Endpoints 是 MLflow AI Gateway 功能的核心。每个端点充当用户的代理端点,将请求转发到配置文件中指定的 模型 和 提供者。
MLflow AI Gateway 中的一个端点包含以下字段:
名称: 这是端点的唯一标识符。通过 MLflow AI Gateway 进行 API 调用时,这将成为 URL 的一部分。
类型: 端点的类型对应于您期望的语言模型交互类型。例如,
llm/v1/completions
用于文本补全操作,llm/v1/embeddings
用于文本嵌入,llm/v1/chat
用于聊天操作。模型:定义了此端点将转发请求的模型。该模型包含以下详细信息:
provider: 指定此模型的 提供者 名称。例如,
openai
用于 OpenAI 的GPT-4o
模型。名称: 要使用的模型的名称。例如,
gpt-4o-mini
用于 OpenAI 的GPT-4o-Mini
模型。配置:包含模型所需的任何额外配置细节。这包括指定API基础URL和API密钥。
限制:指定此端点将遵循的速率限制设置。限制字段包含以下字段:
renewal_period: 速率限制的时间单位,可选值为 [second|minute|hour|day|month|year]。
调用次数: 该端点在指定时间单位内将接受的调用次数。
以下是一个端点配置的示例:
endpoints:
- name: completions
endpoint_type: llm/v1/chat
model:
provider: openai
name: gpt-4o-mini
config:
openai_api_key: $OPENAI_API_KEY
limit:
renewal_period: minute
calls: 10
在上面的例子中,发送到 completions 端点的请求将被转发到由 openai
提供的 gpt-4o-mini
模型。
配置文件中的端点可以随时更新,MLflow AI 网关将自动更新其可用端点,而无需重启。此功能为您提供了根据需求变化添加、删除或修改端点的灵活性。它支持端点的’热插拔’,为与 MLflow AI 网关交互的任何应用程序或服务提供无缝体验。
在配置文件中定义端点时,确保每个名称都是唯一的,以防止冲突。重复的端点名称将引发 MlflowException
。
模型
在 endpoint
中的 model
部分指定了用于生成响应的模型。此配置块需要包含一个 name
字段,用于指定要使用的具体模型实例。此外,还需要指定一个 provider,您需要为其提供已认证的访问API密钥。
不同的端点类型通常与特定的模型相关联。例如,llm/v1/chat
和 llm/v1/completions
端点通常与对话模型相关联,而 llm/v1/embeddings
端点通常与嵌入或转换器模型相关联。您选择的模型应适合所指定的端点类型。
以下是一个端点内模型名称配置的示例:
endpoints:
- name: embeddings
endpoint_type: llm/v1/embeddings
model:
provider: openai
name: text-embedding-ada-002
config:
openai_api_key: $OPENAI_API_KEY
在上述配置中,text-embedding-ada-002
是用于嵌入端点的模型。
在指定模型时,确保提供者支持您请求的模型至关重要。例如,openai
作为提供者支持 text-embedding-ada-002
等模型,但其他提供者可能不支持。如果提供者不支持该模型,MLflow AI Gateway 在尝试将请求路由到该模型时将返回 HTTP 4xx 错误。
重要
始终检查指定提供商的最新文档,以确保您想要使用的模型支持您正在配置的端点类型。
记住,你选择的模型直接影响到你从API调用中得到的结果。因此,选择一个符合你使用场景需求的模型。例如,对于生成对话响应,你通常会选择一个聊天模型。相反,对于生成文本的嵌入,你会选择一个嵌入模型。
配置网关服务器
MLflow AI 网关依赖于用户提供的配置文件,该文件以 YAML 编写,定义了服务器可用的端点和提供者。配置文件决定了网关服务器如何与各种语言模型提供者交互,并确定了用户可以访问的端点。
AI 网关服务器配置
配置文件包含一系列部分,每个部分代表一个唯一的端点。每个端点部分都有一个名称、类型和模型规范,其中包括模型提供者、名称和配置细节。配置部分通常包含API的基本URL和一个用于API密钥的环境变量。
以下是一个单端点配置的示例:
endpoints:
- name: chat
endpoint_type: llm/v1/chat
model:
provider: openai
name: gpt-4o-mini
config:
openai_api_key: $OPENAI_API_KEY
limit:
renewal_period: minute
calls: 10
在这个例子中,我们定义了一个名为 chat
的端点,它对应于 llm/v1/chat
类型,将使用 OpenAI 的 gpt-4o-mini
模型从 OpenAI 服务返回查询响应,并每分钟最多接受 10 个请求。
MLflow AI Gateway 的配置非常容易更新。只需编辑配置文件并保存更改,MLflow AI Gateway 将自动更新端点,且不会造成任何中断或停机时间。这使您可以在保持应用程序稳定和可靠的同时,尝试新的提供者或模型类型。
为了为给定的提供者定义API密钥,有三种主要选项:
直接将其包含在 YAML 配置文件中。
使用环境变量来存储API密钥,并在YAML配置文件中引用它。
在文件中定义您的API密钥,并在YAML配置文件中引用该包含密钥的文件的位置。
如果你选择直接包含API密钥,请在YAML文件中将 $OPENAI_API_KEY
替换为你的实际API密钥。
警告
MLflow AI 网关提供对外部计费 LLM 服务的直接访问。强烈建议限制对该服务器的访问。请参阅 安全性 部分以获取指导。
如果你更喜欢使用环境变量(推荐),你可以在你的shell环境中定义它。例如:
export OPENAI_API_KEY="your_openai_api_key"
注意: 将 “your_openai_api_key” 替换为您的实际 OpenAI API 密钥。
AI 网关服务器配置详情
MLflow AI 网关依赖于用户提供的配置文件。它定义了网关服务器如何与各种语言模型提供者交互,并规定了用户可以访问的端点。
配置文件使用 YAML 编写,并包含一系列部分,每个部分代表一个唯一的端点。每个端点部分都有一个名称、类型和模型规范,其中包括提供者、模型名称和提供者特定的配置细节。
以下是每个配置参数的详细信息:
通用配置参数
端点:这是一个端点配置列表。每个端点代表一个映射到特定语言模型服务的唯一端点。
每个端点具有以下配置参数:
名称: 这是端点的名称。它需要是一个没有空格或任何非字母数字字符(除了连字符和下划线)的唯一名称。
endpoint_type:这指定了此端点提供的服务类型。这决定了端点的输入接口和返回的输出。当前支持的端点类型有:
“llm/v1/completions”
“llm/v1/chat”
llm/v1/embeddings
模型:这定义了语言模型的提供者特定细节。它包含以下字段:
provider:这表示AI模型的提供者。它接受以下值:
“openai”
马赛克ML
anthropic
连贯
“手掌”
“azure” / “azuread”
mlflow-模型-服务
huggingface-文本生成-推理
ai21labs
bedrock
“mistral”
togetherai
名称:这是一个可选字段,用于指定模型的名称。
config:这包含特定于提供者的配置细节。
特定于提供者的配置参数
OpenAI
配置参数 |
必需的 |
默认 |
描述 |
---|---|---|---|
openai_api_key |
是 |
这是OpenAI服务的API密钥。 |
|
openai_api_type |
不 |
这是一个可选字段,用于指定要使用的 OpenAI API 类型。 |
|
openai_api_base |
不 |
https://api.openai.com/v1 |
这是OpenAI API的基础URL。 |
openai_api_version |
不 |
这是一个可选字段,用于指定 OpenAI API 版本。 |
|
openai_organization |
不 |
这是一个可选字段,用于指定OpenAI中的组织。 |
MosaicML
配置参数 |
必需的 |
默认 |
描述 |
---|---|---|---|
mosaicml_api_key |
是 |
N/A |
这是MosaicML服务的API密钥。 |
Cohere
配置参数 |
必需的 |
默认 |
描述 |
---|---|---|---|
cohere_api_key |
是 |
N/A |
这是Cohere服务的API密钥。 |
HuggingFace 文本生成推理
配置参数 |
必需的 |
默认 |
描述 |
---|---|---|---|
hf_server_url |
是 |
N/A |
这是 Huggingface TGI 服务器的 URL。 |
PaLM
配置参数 |
必需的 |
默认 |
描述 |
---|---|---|---|
palm_api_key |
是 |
N/A |
这是PaLM服务的API密钥。 |
AI21 Labs
配置参数 |
必需的 |
默认 |
描述 |
---|---|---|---|
ai21labs_api_key |
是 |
N/A |
这是AI21 Labs服务的API密钥。 |
Anthropic
配置参数 |
必需的 |
默认 |
描述 |
---|---|---|---|
anthropic_api_key |
是 |
N/A |
这是Anthropic服务的API密钥。 |
亚马逊基础
Amazon Bedrock 端点的顶级模型配置必须是以下两种支持的认证模式之一:基于密钥 或 基于角色。
配置参数 |
必需的 |
默认 |
描述 |
---|---|---|---|
aws_config |
不 |
一个包含以下基于键或基于角色的模式的对象。 |
要使用基于密钥的身份验证,请使用以下必需字段定义一个 Amazon Bedrock 端点。 .. 注意:
If using a configured endpoint purely for development or testing, utilizing an IAM User role or a temporary short-lived standard IAM role are recommended; while for production deployments, a standard long-expiry IAM role is recommended to ensure that the endpoint is capable of handling authentication for a long period. If the authentication expires and a new set of keys need to be supplied, the endpoint must be recreated in order to persist the new keys.
配置参数 |
必需的 |
默认 |
描述 |
---|---|---|---|
aws_region |
不 |
AWS_REGION/AWS_DEFAULT_REGION |
用于访问 bedrock 的 AWS 区域。 |
aws_secret_access_key |
是 |
IAM 用户/角色的 AWS 秘密访问密钥,授权使用 bedrock |
|
aws_access_key_id |
是 |
用于授权使用 Bedrock 的 IAM 用户/角色的 AWS 访问密钥 ID |
|
aws_session_token |
不 |
无 |
可选的会话令牌,如果需要的话 |
或者,对于基于角色的认证,可以定义并初始化一个 Amazon Bedrock 端点,该端点使用一个有权访问 Bedrock 的 IAM 角色 ARN。MLflow AI 网关将尝试使用标准凭证提供链来承担此角色,并在角色凭证过期时更新它们。
配置参数 |
必需的 |
默认 |
描述 |
---|---|---|---|
aws_region |
不 |
AWS_REGION/AWS_DEFAULT_REGION |
用于访问 bedrock 的 AWS 区域。 |
aws_role_arn |
是 |
一个被授权使用 Bedrock 的 AWS 角色。标准的凭证提供链 必须 能够找到授权承担此角色的凭证。 |
|
session_length_seconds |
不 |
900 |
请求的会话时长。 |
MLflow 模型服务
配置参数 |
必需的 |
默认 |
描述 |
---|---|---|---|
model_server_url |
是 |
N/A |
这是MLflow模型服务器的URL。 |
请注意,在使用 MLflow 模型服务时,model
定义中的 name
参数不用于验证,仅用于参考目的。此别名对于理解特定版本或使用的端点定义非常有用,这些定义可以引用回已部署的模型。您可以选择任何您希望的名称,前提是它是 JSON 可序列化的。
Azure OpenAI
Azure 提供了两种不同的机制与 OpenAI 集成,每种机制对应不同类型的安全验证。一种依赖于访问令牌进行验证,称为 azure
,而另一种使用 Azure Active Directory (Azure AD) 集成进行身份验证,称为 azuread
。
为了匹配用户交互和安全访问需求,调整 openai_api_type
参数以表示首选的安全验证模型。这将确保您的 Azure-OpenAI 集成具有无缝交互和可靠的安全性。
配置参数 |
必需的 |
默认 |
描述 |
---|---|---|---|
openai_api_key |
是 |
这是Azure OpenAI服务的API密钥。 |
|
openai_api_type |
是 |
此字段必须为 |
|
openai_api_base |
是 |
这是由Azure提供的Azure OpenAI API服务的基URL。 |
|
openai_api_version |
是 |
要使用的 Azure OpenAI 服务的版本,由日期指定。 |
|
openai_deployment_name |
是 |
这是Azure OpenAI服务的部署资源名称。 |
|
openai_organization |
不 |
这是一个可选字段,用于指定OpenAI中的组织。 |
Mistral
配置参数 |
必需的 |
默认 |
描述 |
---|---|---|---|
mistral_api_key | 是 | 不适用 | 这是Mistral服务的API密钥。 |
TogetherAI
配置参数 | 必需 | 默认值 | 描述 |
|||
togetherai_api_key |
是 |
N/A |
这是 TogetherAI 服务的 API 密钥。 |
Azure OpenAI 的一个示例配置如下:
endpoints:
- name: completions
endpoint_type: llm/v1/completions
model:
provider: openai
name: gpt-35-turbo
config:
openai_api_type: "azuread"
openai_api_key: $AZURE_AAD_TOKEN
openai_deployment_name: "{your_deployment_name}"
openai_api_base: "https://{your_resource_name}-azureopenai.openai.azure.com/"
openai_api_version: "2023-05-15"
limit:
renewal_period: minute
calls: 10
备注
与直接的 OpenAI 服务相比,Azure OpenAI 具有独特的功能。如需概览,请参阅 比较文档。
指定 API 密钥有三种选项:
(推荐)使用环境变量来存储API密钥,并在YAML配置文件中引用它。这通过在环境变量名称前加上``$``符号来表示。
(首选)在文件中定义API密钥,并在YAML配置文件中引用该包含密钥的文件的位置。
直接将其包含在 YAML 配置文件中。
重要
建议使用环境变量或基于文件的密钥以提高安全性。如果API密钥直接包含在配置文件中,应确保文件安全存储并适当访问控制。请确保配置文件存储在安全位置,因为它包含敏感的API密钥。
查询 AI 网关服务器
一旦MLflow AI网关配置并启动后,它就可以接收来自用户的流量。
标准查询参数
MLflow AI 网关为聊天、补全和嵌入定义了标准参数,这些参数可以在查询任何端点时使用,无论其提供商是谁。每个参数都有一个标准的范围和默认值。当使用特定提供商查询端点时,MLflow AI 网关会根据该提供商对该参数的值范围自动调整参数值。
完成
类型为 llm/v1/completions
的补全端点的标准参数是:
查询参数 |
类型 |
必需的 |
默认 |
描述 |
---|---|---|---|---|
提示 |
字符串 |
是 |
N/A |
生成完成的提示。 |
n |
整数 |
不 |
|
为指定提示生成完成的数量,介于1到5之间。 |
温度 |
浮动 |
不 |
0.0 |
使用的采样温度,介于0和1之间。较高的值会使输出更随机,而较低的值会使输出更确定。 |
max_tokens |
整数 |
不 |
无 |
最大完成长度,介于1和无穷大(无限制)之间。 |
停止 |
array[string] |
不 |
无 |
模型应停止生成标记并返回完成的序列。 |
聊天
类型为 llm/v1/chat
的聊天端点的标准参数是:
查询参数 |
类型 |
必需的 |
默认 |
描述 |
---|---|---|---|---|
消息 |
数组[消息] |
是 |
N/A |
对话中的一组消息,用于生成新消息(聊天完成)。有关消息结构的详细信息,请参阅 消息。 |
n |
整数 |
不 |
|
为指定提示生成聊天补全的数量,介于1到5之间。 |
温度 |
浮动 |
不 |
0.0 |
使用的采样温度,介于0和1之间。较高的值会使输出更随机,而较低的值会使输出更确定。 |
max_tokens |
整数 |
不 |
无 |
最大完成长度,介于1和无穷大(无限制)之间。 |
停止 |
array[string] |
不 |
无 |
模型应停止生成令牌并返回聊天完成的序列。 |
消息
每个聊天消息是一个包含以下字段的字符串字典:
字段名称 |
必需的 |
默认 |
描述 |
---|---|---|---|
角色 |
是 |
N/A |
发送消息的对话参与者的角色。必须是以下之一: |
内容 |
是 |
N/A |
消息内容。 |
嵌入
类型为 llm/v1/embeddings
的补全端点的标准参数是:
查询参数 |
类型 |
必需的 |
默认 |
描述 |
---|---|---|---|---|
输入 |
字符串或数组[字符串] |
是 |
N/A |
要生成嵌入的字符串或字符串列表。 |
附加查询参数
除了 标准部署参数 之外,您还可以将端点提供商支持的任何额外参数作为查询的一部分传递。例如:
logit_bias
(由 OpenAI, Cohere 支持)top_k
(由 MosaicML、Anthropic、PaLM、Cohere 支持)frequency_penalty
(由 OpenAI、Cohere、AI21 Labs 支持)presence_penalty
(由 OpenAI、Cohere、AI21 Labs 支持)stream
(由 OpenAI, Cohere 支持)
以下是通过附加参数向 MLflow AI Gateway 端点提交查询请求的示例:
from mlflow.deployments import get_deploy_client
client = get_deploy_client("http://my.deployments:8888")
data = {
"prompt": (
"What would happen if an asteroid the size of "
"a basketball encountered the Earth traveling at 0.5c? "
"Please provide your answer in .rst format for the purposes of documentation."
),
"temperature": 0.5,
"max_tokens": 1000,
"n": 1,
"frequency_penalty": 0.2,
"presence_penalty": 0.2,
}
client.predict(endpoint="completions-gpt4", inputs=data)
查询的结果是:
{
"id": "chatcmpl-8Pr33fsCAtD2L4oZHlyfOkiYHLapc",
"object": "text_completion",
"created": 1701172809,
"model": "gpt-4-0613",
"choices": [
{
"index": 0,
"text": "If an asteroid the size of a basketball ...",
}
],
"usage": {
"prompt_tokens": 43,
"completion_tokens": 592,
"total_tokens": 635,
},
}
流式传输
一些提供商支持流式响应。流式响应在你希望在生成响应的同时接收响应,而不是等待整个响应生成完毕后再接收时非常有用。以下提供商支持流式响应:
提供者 |
端点 |
|
---|---|---|
llm/v1/completions |
llm/v1/聊天 |
|
OpenAI |
✓ |
✓ |
Cohere |
✓ |
✓ |
Anthropic |
✘ |
✓ |
要启用流式响应,请在请求中将 stream
参数设置为 true
。例如:
curl -X POST http://my.deployments:8888/endpoints/chat/invocations \
-H "Content-Type: application/json" \
-d '{"messages": [{"role": "user", "content": "hello"}], "stream": true}'
查询结果遵循 OpenAI 架构。
聊天
data: {"choices": [{"delta": {"content": null, "role": "assistant"}, "finish_reason": null, "index": 0}], "created": 1701161926, "id": "chatcmpl-8PoDWSiVE8MHNsUZF2awkW5gNGYs3", "model": "gpt-35-turbo", "object": "chat.completion.chunk"}
data: {"choices": [{"delta": {"content": "Hello", "role": null}, "finish_reason": null, "index": 0}], "created": 1701161926, "id": "chatcmpl-8PoDWSiVE8MHNsUZF2awkW5gNGYs3", "model": "gpt-35-turbo", "object": "chat.completion.chunk"}
data: {"choices": [{"delta": {"content": " there", "role": null}, "finish_reason": null, "index": 0}], "created": 1701161926, "id": "chatcmpl-8PoDWSiVE8MHNsUZF2awkW5gNGYs3", "model": "gpt-35-turbo", "object": "chat.completion.chunk"}
data: {"choices": [{"delta": {"content": null, "role": null}, "finish_reason": "stop", "index": 0}], "created": 1701161926, "id": "chatcmpl-8PoDWSiVE8MHNsUZF2awkW5gNGYs3", "model": "gpt-35-turbo", "object": "chat.completion.chunk"}
完成
data: {"choices": [{"delta": {"role": null, "content": null}, "finish_reason": null, "index": 0}], "created": 1701161629, "id": "chatcmpl-8Po8jVXzljc245k1Ah4UsAcm2zxQ2", "model": "gpt-35-turbo", "object": "text_completion_chunk"}
data: {"choices": [{"delta": {"role": null, "content": "If"}, "finish_reason": null, "index": 0}], "created": 1701161629, "id": "chatcmpl-8Po8jVXzljc245k1Ah4UsAcm2zxQ2", "model": "gpt-35-turbo", "object": "text_completion_chunk"}
data: {"choices": [{"delta": {"role": null, "content": " an"}, "finish_reason": null, "index": 0}], "created": 1701161629, "id": "chatcmpl-8Po8jVXzljc245k1Ah4UsAcm2zxQ2", "model": "gpt-35-turbo", "object": "text_completion_chunk"}
data: {"choices": [{"delta": {"role": null, "content": " asteroid"}, "finish_reason": null, "index": 0}], "created": 1701161629, "id": "chatcmpl-8Po8jVXzljc245k1Ah4UsAcm2zxQ2", "model": "gpt-35-turbo", "object": "text_completion_chunk"}
data: {"choices": [{"delta": {"role": null, "content": null}, "finish_reason": "length", "index": 0}], "created": 1701161629, "id": "chatcmpl-8Po8jVXzljc245k1Ah4UsAcm2zxQ2", "model": "gpt-35-turbo", "object": "text_completion_chunk"}
FastAPI 文档 (“/docs”)
FastAPI,用于构建 MLflow AI 网关的框架,提供了一个自动交互式 API 文档界面,可以通过“/docs”端点访问(例如,http://my.deployments:9000/docs
)。这个交互式界面对于探索和测试可用的 API 端点非常方便。
为了方便,访问根URL(例如,http://my.deployments:9000
)会重定向到这个“/docs”端点。
MLflow Python 客户端 API
MlflowDeploymentClient
是面向用户的客户端API,用于与MLflow AI网关进行交互。它通过一个简单易用的Python API,抽象了对网关服务器的HTTP请求。
客户端 API
要使用 MlflowDeploymentClient
API,请参阅以下示例以了解可用的 API 方法:
创建一个
MlflowDeploymentClient
from mlflow.deployments import get_deploy_client client = get_deploy_client("http://my.deployments:8888")
列出所有端点:
list_endpoints()
方法返回所有端点的列表。endpoint = client.list_endpoints() for endpoint in endpoints: print(endpoint)
查询一个端点:
The
predict()
method submits a query to a configured provider endpoint. The data structure you send in the query depends on the endpoint.response = client.predict( endpoint="chat", inputs={"messages": [{"role": "user", "content": "Tell me a joke about rabbits"}]}, ) print(response)
LangChain 集成
LangChain 支持 MLflow 部署的集成。此集成使用户能够在网关服务器中使用提示工程、检索增强生成和其他技术与大型语言模型(LLMs)结合。
import mlflow
from langchain import LLMChain, PromptTemplate
from langchain.llms import Mlflow
llm = Mlflow(target_uri="http://127.0.0.1:5000", endpoint="completions")
llm_chain = LLMChain(
llm=llm,
prompt=PromptTemplate(
input_variables=["adjective"],
template="Tell me a {adjective} joke",
),
)
result = llm_chain.run(adjective="funny")
print(result)
with mlflow.start_run():
model_info = mlflow.langchain.log_model(llm_chain, "model")
model = mlflow.pyfunc.load_model(model_info.model_uri)
print(model.predict([{"adjective": "funny"}]))
MLflow 模型
与 MLflow 模型的接口可以通过两种方式实现。使用自定义的 PyFunc 模型,可以直接向网关服务器端点发出查询,并在模型的更广泛上下文中使用。数据可以被增强、操作,或用于混合专家范式。另一种利用 MLflow AI 网关和 MLflow 模型的方法是直接将一个已服务的 MLflow 模型定义为网关服务器内的端点。
使用网关服务器查询已部署的MLflow模型
如需全面了解并查看使用 MLflow 服务集成通过 MLflow AI 网关直接查询模型的示例,请参阅 完整示例。在指南中,您将看到从不同服务器提供多个模型并配置 MLflow AI 网关实例以提供单一统一处理查询点的整个端到端过程。
使用 MLflow 模型查询网关服务器
您还可以构建和部署调用 MLflow AI 网关的 MLflow 模型。下面的示例演示了如何在自定义 pyfunc
模型中使用网关服务器。
备注
下面示例中展示的自定义 Model
正在利用环境变量作为网关服务器的 uri。这些值也可以在定义中手动设置,或者在 uri 设置后通过 mlflow.deployments.get_deployments_target()
应用。对于下面的示例,MLFLOW_DEPLOYMENTS_TARGET
的值为 http://127.0.0.1:5000/
。对于实际的部署用例,此值将设置为已配置的生产部署服务器。
import os
import pandas as pd
import mlflow
def predict(data):
from mlflow.deployments import get_deploy_client
client = get_deploy_client(os.environ["MLFLOW_DEPLOYMENTS_TARGET"])
payload = data.to_dict(orient="records")
return [
client.predict(endpoint="completions", inputs=query)["choices"][0]["text"]
for query in payload
]
input_example = pd.DataFrame.from_dict(
{"prompt": ["Where is the moon?", "What is a comet made of?"]}
)
signature = mlflow.models.infer_signature(
input_example, ["Above our heads.", "It's mostly ice and rocks."]
)
with mlflow.start_run():
model_info = mlflow.pyfunc.log_model(
python_model=predict,
registered_model_name="anthropic_completions",
artifact_path="anthropic_completions",
input_example=input_example,
signature=signature,
)
df = pd.DataFrame.from_dict(
{
"prompt": ["Tell me about Jupiter", "Tell me about Saturn"],
"temperature": 0.6,
"max_records": 500,
}
)
loaded_model = mlflow.pyfunc.load_model(model_info.model_uri)
print(loaded_model.predict(df))
这个自定义的 MLflow 模型可以像其他任何 MLflow 模型一样使用。它可以在 spark_udf
中使用,与 mlflow.evaluate()
一起使用,或者像其他模型一样 部署。
REST API
REST API 允许你直接向 MLflow AI Gateway 发送 HTTP 请求。如果你不使用 Python 或者你更喜欢直接通过 HTTP 与网关服务器交互,这会很有用。
以下是一些使用 curl 与 MLflow AI 网关交互的示例:
获取特定端点的信息:
GET /api/2.0/endpoints/{name}
此路由返回端点数据结构的序列化表示。这提供了关于名称和类型的信息,以及所请求端点的模型详细信息。
curl -X GET http://my.deployments:8888/api/2.0/endpoints/embeddings
列出所有端点:
GET /api/2.0/endpoints/
此路由返回所有端点的列表。
curl -X GET http://my.deployments:8888/api/2.0/endpoints/
查询一个端点:
POST /endpoints/{name}/invocations
此路由允许您向配置的提供者端点提交查询。您在查询中发送的数据结构取决于端点。以下是“completions”、“chat”和“embeddings”端点的示例:
Completions
curl -X POST http://my.deployments:8888/endpoints/completions/invocations \ -H "Content-Type: application/json" \ -d '{"prompt": "Describe the probability distribution of the decay chain of U-235"}'
Chat
curl -X POST http://my.deployments:8888/endpoints/chat/invocations \ -H "Content-Type: application/json" \ -d '{"messages": [{"role": "user", "content": "Can you write a limerick about orange flavored popsicles?"}]}'
Embeddings
curl -X POST http://my.deployments:8888/endpoints/embeddings/invocations \ -H "Content-Type: application/json" \ -d '{"input": ["I would like to return my shipment of beanie babies, please", "Can I please speak to a human now?"]}'
注意: 记得将 my.deployments:8888
替换为你的实际 MLflow AI 网关的 URL。
插件 LLM 提供者(实验性)
注意
此功能正在积极开发中,并标记为实验性。它可能在未来的版本中无警告地更改。
MLflow AI Gateway 支持通过插件使用自定义语言模型提供者。插件是一个提供语言模型提供者自定义实现的 Python 包。这允许用户将其自己的语言模型服务与 MLflow AI Gateway 集成。
要创建一个自定义插件,您需要实现一个继承自 mlflow.gateway.providers.BaseProvider
的提供者类,以及一个继承自 mlflow.gateway.base_models.ConfigModel
的配置类。
import os
from typing import AsyncIterable
from pydantic import validator
from mlflow.gateway.base_models import ConfigModel
from mlflow.gateway.config import RouteConfig
from mlflow.gateway.providers import BaseProvider
from mlflow.gateway.schemas import chat, completions, embeddings
class MyLLMConfig(ConfigModel):
# This model defines the configuration for the provider such as API keys
my_llm_api_key: str
@validator("my_llm_api_key", pre=True)
def validate_my_llm_api_key(cls, value):
return os.environ[value.lstrip("$")]
class MyLLMProvider(BaseProvider):
# Define the provider name. This will be displayed in log and error messages.
NAME = "my_llm"
# Define the config model for the provider.
# This must be a subclass of ConfigModel.
CONFIG_TYPE = MyLLMConfig
def __init__(self, config: RouteConfig) -> None:
super().__init__(config)
if config.model.config is None or not isinstance(
config.model.config, MyLLMConfig
):
raise TypeError(f"Unexpected config type {config.model.config}")
self.my_llm_config: MyLLMConfig = config.model.config
# You can implement one or more of the following methods
# depending on the capabilities of your provider.
# Implementing `completions`, `chat` and `embeddings` will enable the respective endpoints.
# Implementing `completions_stream` and `chat_stream` will enable the `stream=True`
# option for the respective endpoints.
# Unimplemented methods will return a 501 Not Implemented HTTP response upon invocation.
async def completions_stream(
self, payload: completions.RequestPayload
) -> AsyncIterable[completions.StreamResponsePayload]:
...
async def completions(
self, payload: completions.RequestPayload
) -> completions.ResponsePayload:
...
async def chat_stream(
self, payload: chat.RequestPayload
) -> AsyncIterable[chat.StreamResponsePayload]:
...
async def chat(self, payload: chat.RequestPayload) -> chat.ResponsePayload:
...
async def embeddings(
self, payload: embeddings.RequestPayload
) -> embeddings.ResponsePayload:
...
然后,您需要创建一个包含插件实现的Python包。您必须在 mlflow.gateway.providers
组下指定一个入口点,以便您的插件可以被MLflow检测到。入口点应采用 <名称> = <模块>:<类>
的格式。
[project]
name = "my_llm"
version = "1.0"
[project.entry-points."mlflow.gateway.providers"]
my_llm = "my_llm.providers:MyLLMProvider"
[tool.setuptools.packages.find]
include = ["my_llm*"]
namespaces = false
如果你有多个提供者,你可以在同一个包中指定多个入口点。注意,入口点名称必须是全局唯一的。如果两个插件指定了相同的入口点名称,MLflow 将在启动时引发错误。
MLflow 已经默认提供了许多提供者。你的插件名称不能与其中任何一个相同。查看 AI 网关服务器配置详情 以获取默认提供者的完整列表。
最后,您需要在MLflow AI Gateway的同一环境中安装插件包。
重要
仅从您信任的来源安装插件包。使用插件提供者启动服务器将执行插件包中定义的任何任意代码。
然后,您可以根据 MLflow AI Gateway 配置文件中的入口点名称指定插件提供者。
endpoints:
- name: chat
endpoint_type: llm/v1/chat
model:
provider: my_llm
name: my-model-0.1.2
config:
my_llm_api_key: $MY_LLM_API_KEY
示例
一个工作示例可以在 MLflow 仓库的 examples/deployments/deployments_server/plugin 中找到。
MLflow AI 网关 API 文档
OpenAI 兼容性
MLflow AI Gateway 兼容 OpenAI API,并支持 chat
、completions
和 embeddings
API。如以下示例所示,可以使用 OpenAI 客户端查询服务器:
创建一个配置文件:
endpoints:
- name: my-chat
endpoint_type: llm/v1/chat
model:
provider: openai
name: gpt-4o-mini
config:
openai_api_key: $OPENAI_API_KEY
使用配置文件启动服务器:
mlflow gateway start --config-path /path/to/config.yaml --port 7000
服务器启动并运行后,使用 OpenAI 客户端查询服务器:
from openai import OpenAI
client = OpenAI(base_url="http://localhost:7000/v1")
completion = client.chat.completions.create(
model="my-chat",
messages=[{"role": "user", "content": "Hello"}],
)
print(completion.choices[0].message.content)
Unity 目录集成
请参阅 Unity Catalog 集成 以了解如何将 MLflow AI Gateway 与 Unity Catalog 集成。
网关服务器安全考虑
请确保对运行 MLflow AI 网关的系统进行安全访问,以保护这些密钥的访问。
保护网关服务器的有效方法之一是将其置于反向代理之后。这将允许反向代理处理传入的请求并将其转发到 MLflow AI 网关。反向代理有效地保护您的应用程序免受直接的互联网流量暴露。
反向代理的一个流行选择是 Nginx。除了处理流向应用程序的流量外,Nginx 还可以提供静态文件服务,并在运行多个应用程序实例时对流量进行负载均衡。
此外,为了确保客户端和服务器之间数据的完整性和机密性,强烈建议在反向代理上启用HTTPS。
除了反向代理之外,还建议在请求到达 MLflow AI 网关之前添加一个认证层。这可以是 HTTP 基本认证、OAuth 或其他任何适合您需求的方法。
例如,这里是一个带有基本身份验证的Nginx简单配置:
http {
server {
listen 80;
location / {
auth_basic "Restricted Content";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://localhost:5000; # Replace with the MLflow AI Gateway port
}
}
}
在这个例子中,/etc/nginx/.htpasswd 是一个包含用于认证的用户名和密码的文件。
这些措施,连同适当的网络设置,可以显著提高您系统的安全性,并确保只有授权用户才能访问并提交请求到您的LLM服务。