教程:创建外部模型终结点以查询 OpenAI 模型

本页提供了有关如何配置和查询提供 OpenAI 模型补全、聊天和嵌入功能的外部模型端点的分步说明。 使用 MLflow 部署 SDK 创建终结点,并使用 OpenAI 客户端对其进行查询。 有关详细信息,请参阅 外部模型

创建终结点后,Databricks 建议在它上配置 Unity AI 网关,以添加治理功能,例如使用情况跟踪、有效负载日志记录、防护栏和速率限制。 通过模型服务提供的所有外部模型都使用与 OpenAI 兼容的 API 查询,因此可以在提供程序之间使用单个客户端。 请参阅 Unity AI 网关

如果想要使用服务 UI 来完成此任务,请参阅创建外部模型服务终结点

要求

  • Databricks Runtime 13.0 ML 或更高版本。
  • MLflow 2.9 或更高版本。
  • OpenAI API 密钥。
  • 安装 Databricks CLI 版本 0.205 或更高版本。

(可选)步骤 0:使用 Databricks 机密 CLI 存储 OpenAI API 密钥

可在步骤 3 中以纯文本字符串的形式提供 API 密钥,也可使用 Azure Databricks 机密提供该密钥。

若要将 OpenAI API 密钥存储为机密,可使用 Databricks 机密 CLI(版本 0.205 及更高版本)。 你还可以使用用于机密的 REST API

以下操作创建名为 my_openai_secret_scope 的机密范围,然后在该范围中创建机密 openai_api_key

databricks secrets create-scope my_openai_secret_scope
databricks secrets put-secret my_openai_secret_scope openai_api_key

步骤 1:安装支持外部模型的 MLflow

使用以下命令安装支持外部模型的 MLflow 版本:

%pip install mlflow[genai]>=2.9.0

步骤 2:创建和管理外部模型终结点

重要

本节中的代码示例演示如何使用公共预览版 MLflow 部署 CRUD SDK。

要为大型语言模型 (LLM) 创建外部模型终结点,请使用 MLflow 部署 SDK 中的 create_endpoint() 方法。 还可以在服务 UI 中创建外部模型终结点

以下代码片段按照配置的 gpt-3.5-turbo-instruct 部分中指定的内容为 OpenAI served_entities 创建完成终结点。 对于终结点,请务必为每个字段用唯一值填充 nameopenai_api_key

import mlflow.deployments

client = mlflow.deployments.get_deploy_client("databricks")
client.create_endpoint(
    name="openai-completions-endpoint",
    config={
        "served_entities": [{
            "name": "openai-completions",
            "external_model": {
                "name": "gpt-3.5-turbo-instruct",
                "provider": "openai",
                "task": "llm/v1/completions",
                "openai_config": {
                    "openai_api_key": "{{secrets/my_openai_secret_scope/openai_api_key}}"
                }
            }
        }]
    }
)

以下代码片段演示如何以纯文本字符串的形式提供 OpenAI API 密钥,以另一种方式创建与上文相同的补全终结点。

import mlflow.deployments

client = mlflow.deployments.get_deploy_client("databricks")
client.create_endpoint(
    name="openai-completions-endpoint",
    config={
        "served_entities": [{
            "name": "openai-completions",
            "external_model": {
                "name": "gpt-3.5-turbo-instruct",
                "provider": "openai",
                "task": "llm/v1/completions",
                "openai_config": {
                    "openai_api_key_plaintext": "sk-yourApiKey"
                }
            }
        }]
    }
)

如果使用 Azure OpenAI,还可以在配置的 openai_config 部分中指定 Azure OpenAI 部署名称、终结点 URL 和 API 版本。

client.create_endpoint(
    name="openai-completions-endpoint",
    config={
        "served_entities": [
          {
            "name": "openai-completions",
            "external_model": {
                "name": "gpt-3.5-turbo-instruct",
                "provider": "openai",
                "task": "llm/v1/completions",
                "openai_config": {
                    "openai_api_type": "azure",
                    "openai_api_key": "{{secrets/my_openai_secret_scope/openai_api_key}}",
                    "openai_api_base": "https://my-azure-openai-endpoint.openai.azure.com",
                    "openai_deployment_name": "my-gpt-35-turbo-deployment",
                    "openai_api_version": "2023-05-15"
                },
            },
          }
        ],
    },
)

若要在终结点上配置速率限制、使用情况跟踪、有效负载日志记录或防护措施,请使用 Unity AI 网关。 通过 Unity AI 网关配置速率限制时,支持按请求次数计的(QPM)和按令牌数计的(TPM)限制,并且可以设置按用户、按组以及整个端点的限制。

有关通过更新端点来添加速率限制及其他 Unity AI Gateway 功能的编程示例,请参阅 在模型服务端点上配置 Unity AI Gateway

注释

以前记录的具有顶级client.update_endpoint()字段的rate_limits模式已弃用。 请改用端点上的 Unity AI Gateway 配置。

步骤 3:将请求发送到外部模型终结点

Databricks 建议使用 OpenAI 客户端查询外部模型终结点。 模型服务跨提供程序公开与 OpenAI 兼容的统一 API,因此,相同的客户端代码适用于基础模型来自 OpenAI、Anthropic、Cohere、Amazon Bedrock、Google Cloud Vertex AI 或自定义提供程序。

在计算上安装 OpenAI 客户端:

%pip install openai

下面向提供 OpenAI 聊天模型的终结点发送聊天完成请求。 将 base_url 的值替换为 Azure Databricks 工作区 URL,并为 api_key 提供 Azure Databricks 个人访问令牌。 将 model 参数设置为模型服务终结点的名称。

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ.get("DATABRICKS_TOKEN"),
    base_url="https://<workspace-name>.cloud.databricks.com/serving-endpoints"
)

response = client.chat.completions.create(
    model="openai-chat-endpoint",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "What is the capital of France?"}
    ],
    max_tokens=128,
    temperature=0.1,
)
print(response.choices[0].message.content)

若要将完成请求发送到为 llm/v1/completions 任务配置的终结点,请使用 client.completions.create()

response = client.completions.create(
    model="openai-completions-endpoint",
    prompt="What is the capital of France?",
    max_tokens=10,
    temperature=0.1,
    n=2,
)
print(response)

若要将嵌入请求发送到为 llm/v1/embeddings 任务配置的端点,请使用 client.embeddings.create()

response = client.embeddings.create(
    model="openai-embeddings-endpoint",
    input="Databricks is a unified analytics platform.",
)
print(response.data[0].embedding)

如果从Azure Databricks笔记本内部运行 OpenAI 客户端,则可以使用 databricks-openai 帮助程序,该帮助程序会自动配置身份验证和工作区基 URL。 有关详细信息,请参阅 “使用基础模型 ”。

步骤 4:比较来自不同提供程序的模型

模型服务支持众多外部模型提供商,包括 OpenAI、Anthropic、Cohere、Amazon Bedrock、Google Cloud Vertex AI 等。 可以跨提供商比较 LLM,帮助你使用 AI Playground 优化应用程序的准确性、速度和成本。

以下示例为 Anthropic claude-2 创建一个终结点,并将其响应与使用 OpenAI gpt-3.5-turbo-instruct 的问题进行比较。 这两个响应都具有相同的标准格式,这使得它们易于比较。

为 Anthropic claude-2 创建终结点

import mlflow.deployments

client = mlflow.deployments.get_deploy_client("databricks")

client.create_endpoint(
    name="anthropic-completions-endpoint",
    config={
        "served_entities": [
            {
                "name": "claude-completions",
                "external_model": {
                    "name": "claude-2",
                    "provider": "anthropic",
                    "task": "llm/v1/completions",
                    "anthropic_config": {
                        "anthropic_api_key": "{{secrets/my_anthropic_secret_scope/anthropic_api_key}}"
                    },
                },
            }
        ],
    },
)

比较每个终结点的响应

由于所有外部模型端点都提供与 OpenAI 兼容的 API,因此只需将 model 参数切换为相应的端点名称,就可以使用同一个 OpenAI 客户端查询这两个端点。

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ.get("DATABRICKS_TOKEN"),
    base_url="https://<workspace-name>.cloud.databricks.com/serving-endpoints"
)

prompt = "How is Pi calculated? Be very concise."

openai_response = client.completions.create(
    model="openai-completions-endpoint",
    prompt=prompt,
)
anthropic_response = client.completions.create(
    model="anthropic-completions-endpoint",
    prompt=prompt,
)

print("OpenAI:", openai_response.choices[0].text)
print("Anthropic:", anthropic_response.choices[0].text)

其他资源