チュートリアル: OpenAI モデルに対してクエリを実行するための外部モデル エンドポイントを作成する
このページでは、補完機能、チャット、埋め込み機能などにOpenAIモデルを提供する外部モデルエンドポイントの設定とクエリの手順を段階的に説明します。MLflow Deployments SDKを使用してエンドポイントを作成し、OpenAIクライアントでそのエンドポイントにクエリを実行します。詳細については、 「外部モデル」を参照してください。
エンドポイントを作成したら、Databricksは、使用状況の追跡、ペイロードのログ記録、ガードレール、レート制限などのガバナンス機能を追加するために、そのエンドポイントにUnity AI Gatewayを設定することを推奨しています。モデルサービングを通じて提供されるすべての外部モデルは、OpenAI互換のAPIを使用してクエリされるため、複数のプロバイダー間で単一のクライアントを使用できます。Unity AI Gateway を参照してください。
サービング UI を使用してこのタスクを実行する場合は、「 外部モデルサービングエンドポイントを作成する」を参照してください。
必要条件
- Databricks Runtime 13.0 ML以降 。
- MLflow 2.9 以降。
- OpenAI API キー。
- Databricks CLI バージョン 0.205 以降をインストールします。
(オプション)手順 0: Databricks シークレット CLI を使用して OpenAI API キーを保存する
API キーは、手順 3 でプレーンテキスト文字列として指定することも、Databricks シークレットを使用して指定することもできます。
OpenAI API キーをシークレットとして保存するには、Databricks Secrets 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 Deployments SDK の create_endpoint() メソッドを使用します。 また、Serving UI で外部モデルエンドポイントを作成することもできます。
次のコードスニペットは、設定の served_entities セクションで指定されているように、OpenAI gpt-3.5-turbo-instructの入力完了エンドポイントを作成します。エンドポイントについては、各フィールドの一意の値を name と openai_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 を使用している場合は、Azure OpenAI デプロイ名、エンドポイント URL、API バージョンを
openai_config セクション。
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 Gatewayを使用します。Unity AI Gateway を介したレート制限の設定では、クエリベース (QPM) とトークンベース (TPM) の両方の制限がサポートされており、ユーザーごと、グループごと、エンドポイント全体にわたる制限を設定できます。
エンドポイントを更新してレート制限やその他のUnity AI Gateway 機能を追加するプログラムの例については、「モデルサービング エンドポイントで Unity AI Gateway を構成する」を参照してください。
以前に文書化されていた、トップレベルのrate_limitsフィールドを持つclient.update_endpoint()パターンは非推奨です。代わりにエンドポイントでUnity AI Gatewayの設定を使用してください。
ステップ 3: 外部モデルエンドポイントにリクエストを送信する
Databricksは、OpenAIクライアントを使用して外部モデルのエンドポイントにクエリを実行することを推奨しています。モデルサービングは、プロバイダー全体で統一されたOpenAI互換APIを公開するため、基になるモデルがOpenAI 、 Anthropic 、 Cohere 、 Amazon Bedrock 、 Google クラウドVertex AI 、またはカスタム プロバイダーのものであっても、同じクライアント コードが機能します。
OpenAIクライアントをコンピュートにインストールします。
%pip install openai
以下は、OpenAIのチャットモデルを提供するエンドポイントにチャット完了リクエストを送信するものです。base_url値をDatabricksワークスペースの URL に置き換え、 api_keyに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)
Databricksノートブック内からOpenAIクライアントを実行する場合は、認証とワークスペースのベース URL を自動的に構成するdatabricks-openaiヘルパーを使用できます。 詳細については、 「プラットフォーム モデルの使用」を参照してください。
ステップ 4: 別のプロバイダーのモデルを比較する
モデルサービングは、Open AI 、Anthropic、Cohere、 Amazon Bedrock、Google Cloud Vertex AIなどを含む多くの外部モデル プロバイダーをサポートしています。
次の例では、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)