Model ServingからDatabricks Appsへのエージェントの移行
既存のAIエージェントをModel ServingエンドポイントからDatabricks Appsに移行します。
Databricks は、Model Serving よりも以下の利点があるため、Databricks Apps 上でエージェントをオーサリングすることを推奨しています。
- 迅速なイテレーション : ローカルデバッグとログおよびエージェントの動作を完全に可視化して、エージェントのコードとデプロイ設定を数秒で反復します。
- Gitベースのバージョン管理とCI/CD :モジュール式のPythonエージェントコードをGitでパッケージ化およびバージョン管理し、宣言型オートメーションバンドルでデプロイします。
- AIコーディングアシスタントのサポート :AIコーディングアシスタントを使用して、エージェントをローカルで開発および移行します。
- スケーラブルな非同期エージェント : ネイティブのPython非同期パターンで非同期エージェントを構築し、high concurrencyを実現します。
- 柔軟なサーバーのカスタマイズ : 任意のフレームワークまたはスタックを使用し、カスタムルートとミドルウェアを追加し、LLM エンドポイントとツールに対するユーザーおよびエージェント認証を構成します。
- MLflowトレース : MLflowのGitベースの記録済みモデルとリアルタイムトレースを使用して、エージェントの動作を監視します。
- 組み込みチャット UI :会話エージェントテンプレートには、ストリーミング、認証、永続的な履歴を備えたすぐに使えるチャットインターフェースが含まれています。
要件
- Model Serving エンドポイントにデプロイされた既存のエージェント。
- Databricks CLI がインストールされ、認証されました。Databricks CLI のインストールまたは更新を参照してください。
- Python 3.11以降。
uvパッケージマネージャー。uvのインストールを参照してください。- Databricks Appsはワークスペースで有効になっています。Databricks Appsワークスペースと開発環境をセットアップするを参照してください。
移行テンプレートを複製します
移行テンプレートは、Databricks Appsでエージェントを開発およびデプロイするための足場を、AIコーディングアシスタントに各移行**ステップ**の実行方法を教えるエージェントスキルファイルとともに提供します。
テンプレートをクローンして、フォルダに移動します。
git clone https://github.com/databricks/app-templates.git
cd app-templates/agent-migration-from-model-serving
テンプレートフォルダーには、次のものが含まれます。
AGENTS.md: 移行ワークフローを説明するAIコーディングアシスタント向けの手順skills/:移行の各ステップ用のスキルファイル。アシスタントによって順番に実行されます。agent_server/ターゲット Databricks Apps エージェントのスカフォールディング(@invoke()および@stream()ハンドラーのプレースホルダー コードを使用)です。databricks.yml:プレースホルダーのリソース宣言を含む宣言型オートメーションバンドル構成テンプレート。
AIアシスト付き移行 (推奨)
AI アシストによる移行は、このテンプレートを使用するための推奨される方法です。AI コーディング アシスタントは AGENTS.md とスキルファイルを読み取り、コードと構成の変更を自動的に処理します。
- Cursor、GitHub Copilot、またはClaudeなどのAIコーディングアシスタントでテンプレートフォルダーを開いてください。
- アシスタントに、エンドポイント名を提供して移行を実行してもらうよう依頼してください:
"Migrate my Model Serving endpoint `my-agent-endpoint` to a Databricks App"
- アシスタントは移行計画を生成し、各ステップを実行します:

手動移行
Databricks では、移行を実行するために AI コーディングアシスタントを使用することをお勧めします。AI コーディングアシスタントを使用せずに移行する場合は、次の高レベルのステップでそのプロセスを説明します。
これらのステップは概要であり、ステートフルエージェント、非同期と同期のトレードオフ、Unity Catalog アーティファクトアクセス、複雑なリソース設定など、すべての移行シナリオを網羅しているわけではありません。
AIコーディングアシスタントを使用して移行を支援するか、テンプレートのmigrate-from-model-servingスキルで詳細情報を参照してください。
ステップ1. エージェントアーティファクトをダウンロード
- エンドポイントからモデル名とバージョンを取得します。
databricks serving-endpoints get <endpoint-name> --output json
- 応答で
served_entities[0].entity_name(モデル名)とentity_versionを検索し、アーティファクトをダウンロードします。
DATABRICKS_CONFIG_PROFILE=<profile> uv run --no-project \
--with "mlflow[databricks]>=2.15.0" \
python3 << 'EOF'
import mlflow
mlflow.set_tracking_uri("databricks")
mlflow.artifacts.download_artifacts(
artifact_uri="models:/<model-name>/<version>",
dst_path="./original_mlflow_model"
)
EOF
ダウンロードされたフォルダーには、以下が含まれます:
MLmodel— 元のエージェントのリソース宣言code/— エージェントのPythonソースファイルartifacts/— オプションの構成ファイルとプロンプトinput_example.jsonテスト用のサンプルリクエスト
ステップ 2. エージェントコードを移行する
code/からagent_server/へすべてのPythonファイルをコピーし、artifacts/からagent_server/artifacts/へすべてのアーティファクトをコピーします。
ファイルの移動後、新しいフォルダ構造を反映するように、相対インポートとハードコードされたファイルパスを更新してください。次に、ステップ3で示されているパターンを使用するようにagent_server/agent.pyを書き換えます。
ステップ 3: エージェントコードを変換する
Model Serving では、エージェントは predict() および predict_stream() メソッドを持つクラスベースの ResponsesAgent を使用します。Databricks Apps では、MLflow AgentServer は @invoke() および @stream() で装飾されたモジュールレベルの関数を提供します。
移行時に、次のいずれかのパターンを選択します。
- **非同期 (推奨)**: Python
async defおよびawaitを使用して、複数のリクエストを同時に処理します。1つのリクエストがLLMの応答を待っている間、サーバーは他のリクエストを処理します。 - 同期 :Model Servingエージェントから同期Pythonパターンを維持します。最小限の移行の場合、またはコードが同期専用のライブラリに依存している場合は、こちらを選択してください。
- Model Serving (before)
- Apps — async (recommended)
- Apps — sync
元のクラスベースのエージェントの構造。
from mlflow.pyfunc import ResponsesAgent, ResponsesAgentRequest, ResponsesAgentResponse
class MyAgent(ResponsesAgent):
def predict(self, request: ResponsesAgentRequest, params=None) -> ResponsesAgentResponse:
# Synchronous implementation
...
return ResponsesAgentResponse(output=outputs)
def predict_stream(self, request: ResponsesAgentRequest, params=None):
# Synchronous generator
for chunk in ...:
yield ResponsesAgentStreamEvent(...)
主要なエージェントロジックは streaming() にあります。non_streaming() 関数は、その出力を収集し、それを単一の応答として返します。
from mlflow.genai.agent_server import invoke, stream
from mlflow.types.responses import (
ResponsesAgentRequest,
ResponsesAgentResponse,
ResponsesAgentStreamEvent,
)
@invoke()
async def non_streaming(request: ResponsesAgentRequest) -> ResponsesAgentResponse:
# Async implementation - typically calls streaming() and collects results
outputs = [
event.item
async for event in streaming(request)
if event.type == "response.output_item.done"
]
return ResponsesAgentResponse(output=outputs)
@stream()
async def streaming(request: ResponsesAgentRequest) -> AsyncGenerator[ResponsesAgentStreamEvent, None]:
# Async generator
async for event in ...:
yield event
クラスメソッドを、構造的な変更を最小限に抑えながら、デコレートされたモジュールレベル関数に抽出します。
from mlflow.genai.agent_server import invoke, stream
from mlflow.types.responses import (
ResponsesAgentRequest,
ResponsesAgentResponse,
ResponsesAgentStreamEvent,
)
@invoke()
def non_streaming(request: ResponsesAgentRequest) -> ResponsesAgentResponse:
# Same sync logic from original predict(), extracted from the class
...
return ResponsesAgentResponse(output=outputs)
@stream()
def streaming(request: ResponsesAgentRequest):
# Same sync generator from original predict_stream(), extracted from the class
for chunk in ...:
yield ResponsesAgentStreamEvent(...)
ステップ4. アプリをセットアップする
依存関係をインストールし、クイックスタートスクリプトを実行して、認証を設定し、MLflowエクスペリメントを作成し、.envファイルを生成します。
ステップ 5. ローカルでテストする
アプリサーバーを起動し、エージェントが正しく応答することを確認してからデプロイしてください。
元のinput_example.jsonを使用してcurlでテストし、エージェントが期待どおりに応答したらデプロイします。
ステップ 6: リソースを構成する
Model Servingエージェントは、MLmodel ファイルでリソースを宣言します。Databricks Appsエージェントは、Declarative Automation Bundlesを使用して、databricks.yml 構成ファイルでリソースを宣言します。
AIエージェントの認証を参照してください。
リソース宣言を同等の宣言型オートメーションバンドルの形式にマッピングします。
MLmodel リソースタイプ |
| 権限 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ステップ 7. 宣言型オートメーションバンドルを使用してエージェントをデプロイする
宣言型オートメーションバンドルを使用して、エージェントをDatabricks Appsにデプロイします。
デプロイする前に、フォルダ構造が次のようになっていることを確認してください:
<working-directory>/
├── original_mlflow_model/ # Downloaded artifacts from Model Serving
│ ├── MLmodel
│ ├── code/
│ │ └── agent.py
│ ├── input_example.json
│ └── requirements.txt
│
└── <app-name>/ # New Databricks App (ready to deploy)
├── agent_server/
│ ├── agent.py # Migrated agent code
│ └── ...
├── app.yaml
├── databricks.yml # Bundle config with resources
├── pyproject.toml
├── requirements.txt
└── ...
アプリに pyproject.toml と uv.lock の両方が含まれている場合、Databricks Apps は uv を使用して依存関係をインストールします。requirements.txt も存在する場合は、そちらが優先され、代わりに pip が使用されます。uvを使用したPythonの依存関係の定義を参照してください。
-
バンドル構成を検証:
Bashdatabricks bundle validate -
バンドルをワークスペースにデプロイします(
bundle deployはファイルをアップロードしますが、アプリは起動しません)。Bashdatabricks bundle deploy -
アプリを起動:
Bashdatabricks bundle run <app-resource-name>
追加のリソース
エージェントの移行後、以下を参照してください: