生成 AI アプリケーション用のエージェントをデプロイする
重要
この機能はパブリック プレビュー段階にあります。
この記事では、Agent Framework Python API の関数を使用してdeploy()
AI エージェントをデプロイする方法について説明します。
要件
deploy()
のdatabricks.agents
API を使用してエージェントをデプロイするには、MLflow 2.13.1 以降が必要です。AI エージェントを Unity Catalog に登録します。 「エージェントを Unity カタログに登録する」を参照してください。
Databricks ノートブックの外部からエージェントをデプロイするには、
databricks-agents
SDK バージョン 0.12.0 以降が必要です。databricks-agents
SDK をインストールする。%pip install databricks-agents dbutils.library.restartPython()
deploy()
を使用してエージェントをデプロイする
deploy()関数は次の処理を行います。
- ユーザー向けアプリケーションに統合できる、エージェントの CPU モデル サービング エンドポイントを作成します。
- アイドル状態のエンドポイントのコストを削減するために (初期クエリの処理にかかる時間の増加を犠牲にして)、
scale_to_zero_enabled=True
をdeploy()
に渡すことで、サービス エンドポイントのスケールをゼロにできます。 エンドポイントのスケーリングの期待を参照してください。 - 推論テーブルは、これらのモデル サービス エンドポイントで有効になっています。 「モデルの監視とデバッグのための推論テーブル」を参照してください。
- Databricks は、エンドポイントで実行されているエージェント コードに、有効期間の短いサービス プリンシパル資格情報を自動的に提供します。 モデルのログ記録時に定義されたように、資格情報には Databricks が管理するリソースにアクセスするための最小限のアクセス許可があります
。 これらの資格情報を生成する前に、Databricks は、エンドポイント所有者が特権エスカレーションと未承認のアクセスを防ぐための適切なアクセス許可を持っていることを確認します。 「依存リソースの認証」を参照してください。 - たとえば、Pinecone を使用して Databricks で管理されていないリソース依存関係がある場合は、シークレットを含む環境変数を
deploy()
API に渡すことができます。 「モデル提供エンドポイントからリソースへのアクセスを構成する」を参照してください。
- たとえば、Pinecone を使用して Databricks で管理されていないリソース依存関係がある場合は、シークレットを含む環境変数を
- アイドル状態のエンドポイントのコストを削減するために (初期クエリの処理にかかる時間の増加を犠牲にして)、
- エージェントのレビュー アプリを有効にします。 レビュー アプリを使用すると、関係者はエージェントとチャットし、レビュー アプリ UI を使用してフィードバックを提供できます。
- レビュー アプリまたは REST API に対するすべての要求を推論テーブルにログします。 ログされるデータには、クエリ要求、応答、および MLflow Tracing からの中間トレース データが含まれます。
- デプロイしようとしているエージェントと同じカタログとスキーマを持つフィードバック モデルを作成します。 このフィードバック モデルは、レビュー アプリからのフィードバックを受け取り、それを推論テーブルにログすることを可能にするメカニズムです。 このモデルは、デプロイされたエージェントと同じ CPU モデル提供エンドポイント内で提供されます。 この提供エンドポイントでは推論テーブルが有効になっているため、レビュー アプリからのフィードバックを推論テーブルへログすることが可能です。
Note
デプロイの完了までに最大で 15 分かかる場合があります。 未加工の JSON ペイロードの到着には 10 - 30 分かかり、フォーマット化されたログは約 1 時間ごとに未加工のペイロードから処理されます。
from databricks.agents import deploy
from mlflow.utils import databricks_utils as du
deployment = deploy(model_fqn, uc_model_info.version)
# query_endpoint is the URL that can be used to make queries to the app
deployment.query_endpoint
# Copy deployment.rag_app_url to browser and start interacting with your RAG application.
deployment.rag_app_url
エージェント拡張推論テーブル
deploy()
では、エージェント サービス エンドポイントとの間で要求と応答をログするために、デプロイごとに 3 つの推論テーブルが作成されます。 ユーザーは、デプロイを操作してから 1 時間以内にデータがペイロード テーブルに反映されます。
ペイロード要求ログと評価ログの設定には時間がかかる場合がありますが、最終的には生のペイロード テーブルから派生します。 ペイロード テーブルから要求と評価のログを自分で抽出できます。 ペイロード テーブルの削除と更新は、ペイロード要求ログまたはペイロード評価ログには反映されません。
Note
Azure Storage ファイアウォールを有効にしている場合は、Databricks アカウント チームに連絡して、エンドポイントの推論テーブルを有効にします。
テーブル | Unity Catalog テーブル名の例 | 各テーブルの内容 |
---|---|---|
Payload | {catalog_name}.{schema_name}.{model_name}_payload |
生の JSON 要求と応答のペイロード |
ペイロード要求ログ | {catalog_name}.{schema_name}.{model_name}_payload_request_logs |
フォーマット化された要求と応答、MLflow トレース |
ペイロード評価ログ | {catalog_name}.{schema_name}.{model_name}_payload_assessment_logs |
レビュー アプリで提供されているフォーマット化されたフィードバック (要求ごと) |
以下は、要求ログ テーブルのスキーマです。
列名 | 種類 | 説明 |
---|---|---|
client_request_id |
String | クライアント要求 ID (通常は null )。 |
databricks_request_id |
String | Databricks 要求 ID。 |
date |
日 | 要求の日付。 |
timestamp_ms |
Long | ミリ秒で表されたタイムスタンプ。 |
timestamp |
タイムスタンプ | 要求のタイムスタンプ。 |
status_code |
Integer | エンドポイントの状態コード。 |
execution_time_ms |
Long | 合計実行時間 (ミリ秒)。 |
conversation_id |
String | 要求ログから抽出された会話 ID。 |
request |
String | ユーザーの会話からの最後のユーザー クエリ。 これは RAG 要求から抽出されます。 |
response |
String | ユーザーへの最後の応答。 これは RAG 要求から抽出されます。 |
request_raw |
String | 要求の文字列表現。 |
response_raw |
String | 応答の文字列表現。 |
trace |
String | 応答構造体の databricks_options から抽出されたトレースの文字列表現。 |
sampling_fraction |
倍精度浮動小数点型 | サンプリングの割合。 |
request_metadata |
Map[String, String] | 要求に関連付けられたモデル サービス エンドポイントに関連するメタデータのマップ。 このマップには、エンドポイントに使用されるエンドポイント名、モデル名、およびモデル バージョンが含まれています。 |
schema_version |
String | スキーマ バージョンを示す整数。 |
以下は、評価ログ テーブルのスキーマです。
列名 | 種類 | 説明 |
---|---|---|
request_id |
String | Databricks 要求 ID。 |
step_id |
String | 取得評価から派生します。 |
source |
構造体 | 評価を作成したユーザーに関する情報を含む構造体フィールド。 |
timestamp |
タイムスタンプ | 要求のタイムスタンプ。 |
text_assessment |
構造体 | レビュー アプリからのエージェントの応答に関するフィードバックのデータを含む構造体フィールド。 |
retrieval_assessment |
構造体 | 応答用に取得されたドキュメントに関するフィードバックのデータを含む構造体フィールド。 |
依存リソースの認証
多くの場合、AI エージェントは、タスクを完了するために他のリソースに対して認証を行う必要があります。 たとえば、エージェントは、非構造化データのクエリを実行するために Vector Search インデックスにアクセスする必要がある場合があります。
エージェントは、次のいずれかの方法を使用して、モデル サービス エンドポイントの背後で依存リソースを処理するときに、依存リソースに対して認証を行うことができます。
- 自動認証パススルー: ログ記録中にエージェントの Databricks リソースの依存関係を宣言します。 Databricks では、エージェントをデプロイしてリソースに安全にアクセスするときに、有効期間の短い資格情報を自動的にプロビジョニング、ローテーション、管理できます。 Databricks では、可能な場合は自動認証パススルーを使用することをお勧めします。
- 手動認証: エージェントのデプロイ時に有効期間の長い資格情報を手動で指定します。 自動認証パススルーをサポートしていない Databricks リソースまたは外部 API アクセスには、手動認証を使用します。
自動認証パススルー
Model Serving では、エージェントによって使用される最も一般的な種類の Databricks リソースに対する自動認証パススルーがサポートされます。
自動認証パススルーを有効にするには、エージェントのログ記録中に依存関係を指定
その後、エンドポイントの背後でエージェントにサービスを提供すると、Databricks は次の手順を実行します。
アクセス許可の検証: Databricks は、エンドポイント作成者がエージェントのログ記録中に指定されたすべての依存関係にアクセスできることを確認します。
サービス プリンシパルの作成との付与: エージェント モデル バージョン用にサービス プリンシパルが作成され、エージェント リソースへの読み取りアクセスが自動的に付与されます。
Note
システムによって生成されたサービス プリンシパルは、API または UI の一覧には表示されません。 エージェント モデルのバージョンがエンドポイントから削除されると、サービス プリンシパルも削除されます。
資格情報のプロビジョニングとローテーションの: サービス プリンシパルの有効期間が短い資格情報 (M2M OAuth トークン) がエンドポイントに挿入され、エージェント コードが Databricks リソースにアクセスできるようになります。 また、Databricks によって資格情報がローテーションされ、エージェントが依存リソースへの安全なアクセスを継続していることを確認します。
この認証動作は、Databricks ダッシュボードの "所有者として実行" 動作に似ています。Unity カタログ テーブルなどのダウンストリーム リソースには、依存リソースへの最小特権アクセス権を持つサービス プリンシパルの資格情報を使用してアクセスされます。
次の表に、自動認証パススルーをサポートする Databricks リソースと、エージェントのデプロイ時にエンドポイント作成者が持つ必要があるアクセス許可を示します。
Note
Unity カタログ リソースでは、親スキーマに USE SCHEMA
が、親カタログに USE CATALOG
が必要です。
リソースの種類 | 権限 |
---|---|
SQL Warehouse | エンドポイントの使用 |
モデルの提供のエンドポイント | クエリ可能 |
Unity カタログ関数 | EXECUTE |
Genie スペース | 実行可能 |
ベクター検索インデックス | 使用可能 |
Unity カタログ テーブル | SELECT |
手動認証
シークレットベースの環境変数を使用して、手動で資格情報を指定することもできます。 手動認証は、次のシナリオで役立ちます。
- 依存リソースは、自動認証パススルーをサポートしていません。
- エージェントが外部リソースまたは API にアクセスしています。
- エージェントは、エージェント デプロイツール以外の資格情報を使用する必要があります。
たとえば、エージェントで Databricks SDK を使用して他の依存リソースにアクセスするには、「Databricks クライアント統合認証
デプロイされたアプリケーションを取得する
デプロイされたエージェントを取得する方法は、次のとおりです。
from databricks.agents import list_deployments, get_deployments
# Get the deployment for specific model_fqn and version
deployment = get_deployments(model_name=model_fqn, model_version=model_version.version)
deployments = list_deployments()
# Print all the current deployments
deployments
デプロイされたエージェントに関するフィードバックを提供する (試験段階)
agents.deploy()
を使用してエージェントをデプロイすると、エージェント フレームワークは同じエンドポイント内に "フィードバック" モデル バージョンを作成してデプロイします。このバージョンでは、クエリを実行してエージェント アプリケーションに関するフィードバックを提供できます。 フィードバック エントリは、エージェント サービス エンドポイントに関連付けられている inference テーブル 内の要求行として表示されます。
この動作は experimental: Databricks は、将来デプロイされたエージェントに関するフィードバックを提供するためのファースト クラスの API を提供する可能性があり、今後の機能では、この API への移行が必要になる可能性があります。
この API の制限事項は次のとおりです。
- フィードバック API には入力検証がありません。無効な入力が渡された場合でも、常に正常に応答します。
- フィードバック API では、フィードバックを提供するエージェント エンドポイント要求の Databricks によって生成された
request_id
を渡す必要があります。databricks_request_id
を取得するには、エージェント サービス エンドポイントへの元の要求に{"databricks_options": {"return_trace": True}}
を含めます。 エージェント エンドポイントの応答には、要求に関連付けられているdatabricks_request_id
が含まれるので、エージェントの応答に関するフィードバックを提供するときに、その要求 ID をフィードバック API に渡すことができます。 - フィードバックは推論テーブルを使用して収集されます。 テーブル 制限事項を参照してください。
次の要求例は、"your-agent-endpoint-name" という名前のエージェント エンドポイントに関するフィードバックを提供し、 DATABRICKS_TOKEN
環境変数が Databricks REST API トークンに設定されていることを前提としています。
curl \
-u token:$DATABRICKS_TOKEN \
-X POST \
-H "Content-Type: application/json" \
-d '
{
"dataframe_records": [
{
"source": {
"id": "user@company.com",
"type": "human"
},
"request_id": "573d4a61-4adb-41bd-96db-0ec8cebc3744",
"text_assessments": [
{
"ratings": {
"answer_correct": {
"value": "positive"
},
"accurate": {
"value": "positive"
}
},
"free_text_comment": "The answer used the provided context to talk about Delta Live Tables"
}
],
"retrieval_assessments": [
{
"ratings": {
"groundedness": {
"value": "positive"
}
}
}
]
}
]
}' \
https://<workspace-host>.databricks.com/serving-endpoints/<your-agent-endpoint-name>/served-models/feedback/invocations
text_assessments.ratings
フィールドとretrieval_assessments.ratings
フィールドに追加または異なるキーと値のペアを渡して、さまざまな種類のフィードバックを提供できます。 この例では、フィードバック ペイロードは、ID 573d4a61-4adb-41bd-96db-0ec8cebc3744
を持つ要求に対するエージェントの応答が、取得ツールによってフェッチされたコンテキストで正しく、正確で、接地されていることを示しています。