カスタムコードエージェントをデバッグします
このページでは、Databricksにデプロイされたカスタムコードエージェントで発生する一般的な問題のデバッグ方法について説明します。
移動先:
このページのほとんどのデバッグ セクションはDatabricks Appsにデプロイされたエージェントに適用されます。 ただし、タブ セレクターを使用して、モデルサービング (レガシー) にデプロイされたエージェントのデバッグ情報を見つけることもできます。
ベストプラクティスを活用したエージェントの開発
エージェント作成時には、次のベストプラクティスに従ってください。
-
**MLflow トレースの有効化**:AIエージェントを作成してDatabricks Appsにデプロイする のベストプラクティスに従ってください。エージェントのデバッグを容易にするために、MLflow トレースの自動ログ記録を有効にしてください。
-
ツールを明確に文書化する : ツールとパラメーターの説明を明確にすることで、エージェントがツールを理解し、適切に使用できるようになります。明確なドキュメントによるツール呼び出しの改善を参照してください。
-
LLM呼び出しにタイムアウトとトークン制限を追加する :長時間実行されるステップによって引き起こされる遅延を避けるために、コード内のLLM呼び出しにタイムアウトとトークン制限を追加してください。
- エージェントがOpenAIクライアントを使用してDatabricks LLMサービングエンドポイントをクエリする場合、必要に応じてサービングエンドポイント呼び出しにカスタムタイムアウトを設定してください。
-
デプロイ前の構成の検証 :YAML構成の問題を早期に検出するために、デプロイする前に
databricks bundle validateを実行してください。これにより、不一致のリソース参照、無効な権限、および構文エラーの特定に役立ちます。 -
まずローカルでテスト :ローカルでの開発を使用して、デプロイ前に問題を検出します。エージェント サーバーをローカルで起動し、サンプル リクエストでテストして、Databricks Apps にデプロイする前に MLflow のトレースが正しく表示されることを確認します。
ローカル開発の問題をデバッグする
エージェントをデプロイ前にローカルでテストして問題を特定します。
エージェントをローカルで実行する前に、環境が正しく設定されていることを確認してください:
-
Databricks CLI のバージョンを確認してください:
databricks -vを実行して、バージョン 0.283.0 以降があることを確認します。 -
CLI プロファイルの検証 :設定済みの認証プロファイルを表示するには、
databricks auth profilesを実行します。 -
環境構成を検証する :
.envファイルに必須の変数が含まれていることを確認します。特に、CLI プロファイルを含めるためにdatabricks://PROFILE_NAMEの形式を使用する必要があるMLFLOW_TRACKING_URIを確認してください。
一般的なローカル開発エラー
エラー | 原因 | ソリューション |
|---|---|---|
| 追跡URIの形式が間違っているか、エクスペリメントが削除されました。 |
|
| 依存関係がインストールされていません | 依存関係をインストールするために |
| 別のプロセスがポートを使用しています。 |
|
ローカル実行時の認証エラー | 環境が設定されていません。 | クイックスタートスクリプトを実行するか、 |
エージェントをローカルでテストする
エージェントをデプロイ前にテストするには:
-
エージェントサーバーをローカルで起動します。
Bashuv run start-app -
別のターミナルで、テストリクエストを送信します。
Bashcurl -X POST http://localhost:8000/invocations \
-H "Content-Type: application/json" \
-d '{"input": [{"role": "user", "content": "hello"}]}' -
Databricks UIでMLflowトレースを表示して、エージェントがトレースを正しくログに記録していることを確認します。
構成に関する問題のデバッグ
databricks.ymlとapp.yamlの構成エラーは、デプロイメントの失敗の一般的な原因です。
宣言型オートメーションバンドルの構成を検証します
アプリをデプロイする前に、宣言型オートメーションバンドルの設定を検証します:
databricks bundle validate
このコマンドは、構成をチェックします:
- YAML構文エラー
- 必須フィールドがありません
- 有効なリソース参照ではありません
- 権限構成の問題
一般的な構成の不一致
構成ポイント | ルール | デバッグ方法 |
|---|---|---|
| リソース | 両方のファイルで正確な文字列を検索して、一致することを確認します。 |
アプリ名 |
| 〜にある |
Genie Space ID | Genie URLからの32文字の16進文字列である必要があります | URLパスから抽出: |
Unity Catalog 関数リファレンス | 形式を使用する必要があります | 関数が存在することを確認するには、以下を使用します。 |
Lakebase インスタンス リファレンス |
| インスタンス名はリテラル文字列であり、リソース参照ではありません。 |
デプロイメントの問題をデバッグする
- Agents deployed to Apps
- Agents on Model Serving (legacy)
アプリはすでに存在します
アプリはすでに存在しています
Error: failed to create app - An app with the same name already exists と表示された場合は、次の2つのオプションがあります。
オプション1:既存のアプリにバインド(推奨)
# Get existing app configuration
databricks apps get <app-name> --output json
# Sync the configuration to your databricks.yml, then bind
databricks bundle deployment bind <bundle-name> <app-name> --auto-approve
# Deploy
databricks bundle deploy
databricks bundle run <bundle-name>
オプション2:削除して再作成
databricks apps delete <app-name>
databricks bundle deploy
databricks bundle run <bundle-name>
デプロイ後にアプリが更新されない
デプロイ後にアプリが更新されません。
databricks bundle deploy ファイルのみをワークスペースにアップロードします。新しいコードでアプリを再起動するには、databricks bundle run <bundle-name>も実行する必要があります。
両方のコマンドを使用して常にデプロイしてください:
databricks bundle deploy && databricks bundle run <bundle-name>
デプロイメントステータスとログを表示する
デプロイメントステータスとログを表示する
アプリのデプロイメント状況を確認するには:
databricks apps get <app-name>
リアルタイムでアプリログを表示するには:
databricks apps logs <app-name> --follow
agents.deploy()を使用して Model Serving エンドポイントにエージェントをデプロイした場合は、デプロイ固有の問題についてModel Serving のデバッグガイドを確認してください。
遅いリクエストや失敗するリクエストなどのランタイムの問題をデバッグするには、 ランタイム エラーのデバッグを参照してください。
ランタイムエラーをデバッグする
- Agents deployed to Apps
- Agents on Model Serving (legacy)
アプリ ログとリクエスト テストを使用して、デプロイされたエージェントの問題を特定します。
アプリログの分析
デプロイ済みアプリからのリアルタイムログを表示:
databricks apps logs <app-name> --follow
検索:
- コードエラーを示すスタックトレース
- リソースに対する権限拒否メッセージ
- 外部サービスへの接続エラー
- タイムアウトメッセージ
よくあるランタイムエラー
エラー | 原因 | ソリューション |
|---|---|---|
アプリをクエリする際の302リダイレクト | OAuthの代わりに個人アクセストークンを使用する | OAuthトークンを〜で取得する |
エージェントが利用可能なツールを使用していません | MCPクライアントからツールが返されませんでした。 | MCPサーバーURLが正しいこと、およびリソースに適切なアクセス許可があることを確認してください。 |
ストリーミング応答が応答中に中断します。 | 接続タイムアウト |
|
「Memory not available」を返すエージェント | リクエストで | リクエストペイロードで |
200ステータスにもかかわらず、空またはエラー応答 | ストリームされたレスポンス内でエラーが発生しました | HTTPステータスコードだけでなく、実際のストリームコンテンツとアプリログを確認してください。 |
推論テーブルとMLflowトレースを使用して、モデルサービングエンドポイントにデプロイされたエージェントの問題を特定します。
問題のあるリクエストを特定する
エージェントの作成中に MLflow トレースの自動ログ記録を有効にした場合、トレースは推論テーブルに自動的に記録されます。これらのトレースを使用して、遅延または障害が発生しているエージェントコンポーネントを特定します。
-
ワークスペースで、 サービング タブに移動し、デプロイ名を選択します。
-
推論テーブル セクションで、推論テーブルの完全修飾名を見つけます。例えば、
my-catalog.my-schema.my-table。 -
Databricksノートブックで以下を実行します:
Python%sql
SELECT * FROM my-catalog.my-schema.my-table -
レスポンス 列で詳細なトレース情報を確認します。
-
request_time、databricks_request_id、またはstatus_codeでフィルタリングして、結果を絞り込みます。Python%sql
SELECT * FROM my-catalog.my-schema.my-table
WHERE status_code != 200
根本原因の問題を分析します
失敗した要求や低速な要求を特定したら、mlflow.models.validate_serving_inputを使用します。失敗した入力要求に対してエージェントを呼び出すための API。結果のトレースを表示し、失敗したレスポンスに対して根本原因分析を実行します。
開発ループを高速化するには、エージェントコードを直接更新し、失敗した入力例に対してエージェントを呼び出すことで反復します。
認証エラーをデバッグする
- Agents deployed to Apps
- Agents on Model Serving (legacy)
OAuthトークン認証が必要です。
OAuthトークン認証が必要です
アプリにデプロイされたエージェントをクエリするには、Databricks OAuth トークンを使用する必要があります。パーソナル アクセストークン (PAT) を使用すると、302 リダイレクト エラーが発生します。
OAuthトークンを取得するには:
databricks auth token
デプロイされたアプリへのリクエストでトークンを使用します:
TOKEN=$(databricks auth token | jq -r '.access_token')
curl -X POST <app-url>/invocations \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"input": [{"role": "user", "content": "hello"}]}'
リソース権限エラー
リソースアクセス許可エラー
エージェントがワークスペースリソースにアクセスできない場合は、リソースがdatabricks.ymlで適切に構成されていることを確認してください。各リソースの種類には特定の権限が必要です:
Error | Cause | Solution |
|---|---|---|
Permission denied on Genie Space | Missing | Add a |
AI Search index not accessible | Missing | Add a |
Unity Catalog function execution denied | Missing | Add a |
Serving endpoint access denied | Missing | Add a |
SQL warehouse access denied | Missing | Add a |
databricks.ymlでのリソース構成の例:
resources:
apps:
my_agent:
name: 'agent-my-app'
resources:
- name: 'my_genie_space'
genie_space:
space_id: '01234567890abcdef01234567890abcd'
permission: 'CAN_RUN'
- name: 'my_vector_index'
uc_securable:
securable_full_name: 'catalog.schema.index_name'
securable_type: 'TABLE'
permission: 'SELECT'
カスタムMCPサーバーの権限
カスタムMCPサーバー権限
エージェントがDatabricksアプリとして実行されているカスタムMCPサーバーに接続する場合、アプリはdatabricks.ymlでリソース依存関係としてまだサポートされていないため、手動で権限を付与する必要があります。
# Get your agent app's service principal
AGENT_SP=$(databricks apps get <agent-app-name> --output json | jq -r '.service_principal_name')
# Grant permission on the MCP server app
databricks apps update-permissions <mcp-server-app-name> \
--json "{\"access_control_list\": [{\"service_principal_name\": \"$AGENT_SP\", \"permission_level\": \"CAN_USE\"}]}"
デプロイされたエージェントがAI SearchインデックスやLLMエンドポイントなどのリソースにアクセスしたときに認証エラーが発生した場合は、自動認証パススルーに必要なリソースと共にログに記録されたことを確認してください。自動認証パススルーを参照してください。
ログに記録されたリソースを検査するには、ノートブックで次を実行します。
%pip install -U mlflow[databricks]==2.20.2
%restart_python
import mlflow
mlflow.set_registry_uri("databricks-uc")
# Replace with the model name and version of your deployed agent
agent_registered_model_name = ...
agent_model_version = ...
model_uri = f"models:/{agent_registered_model_name}/{agent_model_version}"
agent_info = mlflow.models.Model.load(model_uri)
print(f"Resources logged for agent model {model_uri}:", agent_info.resources)
不足している、または誤っているリソースを再追加するには、エージェントをログに記録して再度デプロイします。
リソースに対して手動認証を使用する場合は、環境変数が正しく設定されていることを確認してください。手動設定は自動認証構成よりも優先されます。手動認証を参照してください。
メモリとストレージの問題をデバッグする
Lakebase をメモリストレージに使用するエージェントでは、次の問題がよく発生します:
エラー | 原因 | ソリューション |
|---|---|---|
| メモリテーブルが初期化されていません | 必要なテーブルを作成するために、デプロイする前に |
| インスタンス名が間違っているか、設定が正しくありません。 |
|
| Lakebaseの権限がありません |
|
会話をまたがってメモリは保持されません。 | リクエストごとに異なる | 各ユーザーについて、 |
Lakebaseリソース構成例:
resources:
apps:
my_agent:
resources:
- name: 'memory_database'
database:
instance_name: '<lakebase-instance-name>'
database_name: 'postgres'
permission: 'CAN_CONNECT_AND_CREATE'
メモリを持つエージェントをデプロイする前に、テーブルをローカルで初期化してください:
import asyncio
from databricks_langchain import AsyncDatabricksStore
async def setup_memory():
async with AsyncDatabricksStore(
instance_name='your-lakebase-instance',
embedding_endpoint='databricks-gte-large-en',
embedding_dims=1024,
) as store:
await store.setup()
asyncio.run(setup_memory())