サービスポリシーの例
ベータ版
この機能はベータ版です。アカウント管理者は、アカウント コンソールの [プレビュー] ページからこの機能へのアクセスを制御できます。 Databricksのプレビューを管理するを参照してください。
これらのカスタムサービスポリシーの例は、AIモデルおよびMCPサービスにおける一般的なガバナンスシナリオを網羅しています。これらは、次の2種類のカスタムポリシーに分類されます。
- 決定論的SQLポリシー : 正確でルールに基づいた決定(ツール名、引数値、キーワード、長さ)を行うSQL関数。ルールが正確で再現可能な場合、これらを使用します。
- LLMジャッジポリシー :評価モデルがリクエストまたは応答に適用する自然言語分類器。チェックがセマンティック(意図、トピック、トーン)であり、正確なルールで捉えられない場合に使用します。
ポリシーの作成からアタッチまでのエンドツーエンドの手順については、「サービスポリシーの作成とアタッチ」を参照してください。eventフィールド、戻り値、およびサポートされているSQLサブセットについては、「サービスポリシー関数リファレンス」を参照してください。カスタムコードなしでPII、危険なコンテンツ、ジェイルブレイク、および幻覚をカバーする組み込みガードレールについては、「組み込みサービスポリシー」を参照してください。
確定的 SQL ポリシーの例
各例は、Unity Catalog に登録し、サービスにアタッチする SQL ユーザー定義関数 (UDF) です。このポリシーは両方の評価ポイントで実行されるため、各関数は event:type::string で Branch し ('request' は入力フェーズ用、ON CALL; 'response' は出力フェーズ用、ON RESULT)、ブロックしないすべてのパスに対して明示的な ALLOW を返します。
サービスポリシーは fail-closed です。フィールドの欠落、サポートされていない関数、または評価エラーが発生した場合、結果は DENY になります。VARIANT パスをリテラル(例:event:type::string = 'request')と比較する前に必ずキャストし、各関数の最後を明示的な ALLOW Branch で終了してください。ポリシー本文は、SQLの制限されたサブセットのみをサポートします。サポートされているSQLを参照してください。
特定のキーワードを含むリクエストをブロックします。
このポリシーは、メッセージに内部プロジェクトのコードネームなどのブロックリスト上の用語が含まれている モデルサービス または モデルプロバイダーサービス へのリクエストをブロックします。LOWERを使用してメッセージを小文字に変換するため、一致判定では大文字と小文字が区別されません。
CREATE OR REPLACE FUNCTION main.governance.block_codenames(
event VARIANT
)
RETURNS VARIANT
LANGUAGE SQL
RETURN
CASE
WHEN event:type::string = 'request'
AND (
CONTAINS(LOWER(event:context.message::string), 'projectfalcon')
OR CONTAINS(LOWER(event:context.message::string), 'bluewidget')
OR CONTAINS(LOWER(event:context.message::string), 'codename-atlas')
)
THEN to_variant_object(named_struct('result', 'DENY', 'reason', 'Your request references a restricted internal or competitor codename.'))
ELSE to_variant_object(named_struct('result', 'ALLOW', 'reason', ''))
END;
制限されたトピックに関するリクエストをブロック
このポリシーは、キーワードによって一致する、アシスタントが関与すべきではないトピックに言及した Model サービス または Model Provider サービス へのリクエストをブロックします。これはトピックブロックの確定的形式です。トピックが微妙でキーワードリストでは不十分な場合は、代わりに LLMをジャッジとするポリシーを使用してください。
CREATE OR REPLACE FUNCTION main.governance.deny_restricted_topics(
event VARIANT
)
RETURNS VARIANT
LANGUAGE SQL
RETURN
CASE
WHEN event:type::string = 'request'
AND (
CONTAINS(LOWER(event:context.message::string), 'lawsuit')
OR CONTAINS(LOWER(event:context.message::string), 'legal advice')
OR CONTAINS(LOWER(event:context.message::string), 'investment advice')
)
THEN to_variant_object(named_struct('result', 'DENY', 'reason', 'This assistant does not handle legal or investment topics.'))
ELSE to_variant_object(named_struct('result', 'ALLOW', 'reason', ''))
END;
ポリシーSQLサブセットは、CONTAINS、LIKE、STARTSWITH、およびENDSWITHを使用した部分文字列で一致しますが、正規表現(regexp_*)はサポートされていません。部分文字列の一致では、マイナンバーやアカウント番号のように、構造やチェックサムに依存する形式を検証することはできません。これらのチェックについては、該当する場合は組み込みガードレールを使用してください。サポートされているSQLを参照してください。
プロンプトの長さを制限する
このポリシーは、メッセージが文字数制限を超える Model サービス または Model Provider サービス へのリクエストを拒否します。非常に長いプロンプトは、多くの場合、貼り付けられたダンプやプロンプトスタッフィングの試みであり、レイテンシーとコストを増加させます。
CREATE OR REPLACE FUNCTION main.governance.deny_oversized_prompt(
event VARIANT
)
RETURNS VARIANT
LANGUAGE SQL
RETURN
CASE
WHEN event:type::string = 'request'
AND LENGTH(event:context.message::string) > 8000
THEN to_variant_object(named_struct('result', 'DENY', 'reason', 'Your prompt exceeds the 8000-character limit for this service.'))
ELSE to_variant_object(named_struct('result', 'ALLOW', 'reason', ''))
END;
エージェントがユーザーの代理として行動する場合の承認を必須にする
このポリシーは、人ではなくエージェントが MCPサービス 上で機密ツールを呼び出す際に、代理(OBO)アクターコンテキストを使用して書き込みアクションを保持し、人の承認を待ちます。ASKの結果は、人が承認するまで呼び出しを一時停止します。
CREATE OR REPLACE FUNCTION main.governance.ask_when_agent_writes(
event VARIANT
)
RETURNS VARIANT
LANGUAGE SQL
RETURN
CASE
WHEN event:type::string = 'request'
AND event:context.actor.context.is_on_behalf_of::boolean = true
AND event:context.tool.name::string IN ('create_issue', 'push_files', 'merge_pull_request')
THEN to_variant_object(named_struct('result', 'ASK', 'reason', 'An agent is attempting a write action on your behalf. Please confirm.'))
ELSE to_variant_object(named_struct('result', 'ALLOW', 'reason', ''))
END;
DatabricksがどのようにしてASKの承認プロンプトを外部エージェントに配信するかについては、「決定ポリシーの作成」を参照してください。
内部URLを公開する応答をブロックする
このポリシーは出力フェーズ(ON RESULT)で実行されます。 モデルサービス または モデルプロバイダーサービス 上のモデルの応答を検査し、内部専用ホストを参照する回答をブロックします。event:type::string = 'response' で分岐するため、リクエストではなくレスポンスを評価します。
CREATE OR REPLACE FUNCTION main.governance.block_internal_links_in_response(
event VARIANT
)
RETURNS VARIANT
LANGUAGE SQL
RETURN
CASE
WHEN event:type::string = 'response'
AND (
CONTAINS(LOWER(event:context.message::string), 'wiki.internal.example.com')
OR CONTAINS(LOWER(event:context.message::string), 'admin.example.com')
)
THEN to_variant_object(named_struct('result', 'DENY', 'reason', 'The response was blocked because it referenced an internal-only URL.'))
ELSE to_variant_object(named_struct('result', 'ALLOW', 'reason', ''))
END;
引数によるツール呼び出しのブロック
このポリシーはツールの引数を検査し、保護されたリソースを対象とする呼び出しをブロックする一方で、それ以外のすべての呼び出しを許可します。これは MCPサービス に適用されます。公開されている GitHub プッシュの拒否 の例ではツール名でブロックしますが、この例ではさらに一歩踏み込んで引数の値をチェックします。
CREATE OR REPLACE FUNCTION main.governance.block_protected_repo(
event VARIANT
)
RETURNS VARIANT
LANGUAGE SQL
RETURN
CASE
WHEN event:type::string = 'request'
AND event:context.tool.arguments.repo::string = 'prod-infra'
THEN to_variant_object(named_struct('result', 'DENY', 'reason', 'Actions on the prod-infra repository are not permitted through the agent.'))
ELSE to_variant_object(named_struct('result', 'ALLOW', 'reason', ''))
END;
機密性の高いツールを承認済みエージェントに制限する
このポリシーは、 MCP サービス 上の機密性の高い書き込みツールを承認済みエージェントのみに制限します。ユーザーに代わって行われる push_files 呼び出しは、実行中のエージェントの OAuth クライアント ID (event:context.actor.context.client_id) が承認リストにある場合にのみ許可されます。それ以外はすべて許可されます。クライアント ID が欠落しているか null の場合、呼び出しも拒否されるため、ゲートはフェイルクローズ状態のままになります。エージェントに代わって行われない呼び出しは ALLOW にフォールスルーされ、通常のアクセスは権限付与によって管理されます。
CREATE OR REPLACE FUNCTION main.governance.restrict_push_to_approved_agents(
event VARIANT
)
RETURNS VARIANT
LANGUAGE SQL
RETURN
CASE
WHEN event:type::string = 'request'
AND event:context.tool.name::string = 'push_files'
AND event:context.actor.context.is_on_behalf_of::boolean = true
AND (
event:context.actor.context.client_id IS NULL
OR event:context.actor.context.client_id::string NOT IN ('release-bot', 'ci-deployer')
)
THEN to_variant_object(named_struct('result', 'DENY', 'reason', 'Only approved agents can call the push_files tool on this service.'))
ELSE to_variant_object(named_struct('result', 'ALLOW', 'reason', ''))
END;
ルールをさらに絞り込むには、エージェントチェックと引数の値を組み合わせます。たとえば、引数によるツール呼び出しのブロックを使用して、特定のリポジトリへのプッシュのみを許可するようにします。この例では、エージェントがユーザーの代理として行動する場合の承認を必須にすると同じユーザー代理のアクターコンテキストを使用しますが、未承認のエージェントに対してはASKの代わりにDENYを返します。
ジャッジとしてのLLMポリシーの例
LLM-as-a-judgeポリシーは、評価モデルを使用して、自然言語で記述した基準に基づいてリクエストまたはレスポンスを分類します。メッセージがトピックに沿っているか、レスポンスが専門的であるかなど、決定論的なルールでは表現できないセマンティックチェックに使用します。
作成するには、ポリシーの添付手順に従いますが、 ガードレールタイプ で カスタム を選択し、 タイプ を LLM-as-a-judge に設定します。 プロンプト フィールドに分類器を入力し、 評価者モデルサービス を選択します(選択したモデルにCAN QUERYが必要です)。
分類基準を作成します。Databricks はプロンプトに構造化出力コントラクトを追加するため、評価器は自由形式のテキストではなく、JSON 形式の決定(flagged の Boolean と confidence のスコア)を返します。プロンプトに ALLOW や DENY を記述しないでください。また、出力形式も指定しないでください。評価器がコンテンツにフラグを立てると、Databricks はそのインタラクションをブロックします。また、Databricks は評価対象のコンテンツをラップし、評価器に対して、それを従うべき指示ではなく信頼できないデータとして扱うよう指示します。
このセクションの例はモデルサービス上でランされ、フラグが付けられたコンテンツをブロックします。インタラクションをブロックするのではなく、人間による承認のために保留にするには、MCPサービスに適用されるASK結果を使用してください。エージェントがユーザーの代理として行動する場合の承認の要求を参照してください。
効果的なジャッジプロンプトの作成
このページのプロンプトは出発点です。それぞれをアシスタントのドメインに適応させ、ブロックに使用する前に、現実的なスコープ内のトラフィックでテストしてください。
次の表は、ジャッジプロンプトの信頼性を高めるためのベストプラクティスをまとめたものです。
ベストプラクティス | 説明 |
|---|---|
明確なフラグ設定基準とフラグ設定除外基準を指定します。 | フラグを立てるコンテンツと、そのままにするコンテンツを説明してください。ここでの各例は、「フラグを立てる条件」と「フラグを立てない境界」をペアにしています。フラグを立てる対象のみをリストアップするプロンプトは、フラグを立てすぎる傾向があります。 |
境界ケースのタイブレーカーを指定します。 | 2つのリストの中間に位置するコンテンツの分類方法を指定します。例えば、教育的またはフィクション的な構成であれば、本来は許可されない詳細が免除されるかどうかなどを指定することで、評価者がそれらのケースを一貫性のない方法で判断することを防ぎます。 |
キーワードや手法だけでなく、意図を説明してください。 | 単語や手法の存在だけでなく、メッセージが何をしようとしているかに基づいてフラグを立ててください。ロールプレイやエンコードされた文字列自体はジェイルブレイクではありません。許可されていないコンテンツを取得しようとする試みが必要です。 |
適切な場合は組み込みのものを使用し、カスタム基準は的を絞ったものにしてください。 | PII、危険なコンテンツ、ジェイルブレイクなど、組み込みガードレールですでにカバーされているリスクについては、カスタムプロンプトで再定義するのではなく、組み込みガードレールを使用してください。ポリシーを重ねて適用することは可能であり、意図的にそうするチームもありますが、評価やコストが重複し、どのポリシーが特定のインタラクションをブロックしたのかを判別するのが難しくなります。 |
最初に Log モードで展開し、非決定性を考慮してください。 | Log モードでポリシーをアタッチして判定を記録し、 強制 モードに切り替える前に、実際の対象トラフィックで誤検知や見逃しを確認してください。これらの判定結果を確認するには、サービスで推論テーブルを有効にする必要があります。有効でない場合、Logsモードのポリシーは評価されますが、検査できるデータはありません。評価者はモデルであるため、同じ入力でも判定が異なる場合があります。また、境界線上のコンテンツを積極的にフラグ付けするプロンプトは、大規模な運用において誤検知を発生させる可能性があります。 |
アシスタントのトピックを維持する
この入力フェーズ(ON CALL)ポリシーは、 モデルサービス 上で実行されます。アシスタントのサポート範囲外の要求にフラグを立てるため、特定の目的で構築されたアシスタントが汎用チャットボットとして使用されることはありません。
プロンプト:
会社の製品、注文、請求、およびアカウントのサポートのみを支援するカスタマーサポートアシスタントに送信されたメッセージをレビューしています。一般的なコーディングのヘルプ、エッセイの作成、無関係なトリビア、またはアシスタントを汎用チャットボットとして使用するなど、その範囲外のことを要求するメッセージにはフラグを立ててください。正当な製品またはサポートに関する質問にはフラグを立てないでください。
プロフェッショナルな口調を強制する
この出力フェーズ(ON RESULT)ポリシーは、 Model サービス 上で実行されます。これは、ブランドイメージにそぐわない応答やプロフェッショナルではない応答にフラグを立てるもので、トーンではなく有害なコンテンツを対象とする組み込みの block_unsafe_content ガードレールを補完します。
プロンプト:
公開されているアシスタントが作成した回答をレビューしています。無礼、皮肉、冷淡、高圧的、冒とく的な表現が含まれている場合、または顧客が目にした場合に会社が恥をかくような内容である場合は、その応答にフラグを立てます。プロフェッショナルで敬意を払い、ブランドイメージに沿った回答にはフラグを立てないでください。
規制対象のアドバイスをブロック
この出力フェーズ(ON RESULT)ポリシーは、 Model サービス 上で実行されます。これは、個別化された規制対象のアドバイスを提供する応答にフラグを立て、キーワードルールでは確実に識別できない一般的な非アドバイザリー情報と区別します。
プロンプト:
金融サービスアシスタントによって作成された回答をレビューしています。個別化された投資、税務、または法的な助言、あるいは特定の個人への推奨事項を提供する応答にはフラグを立ててください。一般的な製品情報、教育、または助言ではないコンテンツのみを提供する応答にはフラグを立てないでください。
この例では、フラグが付けられた応答をブロックします。インタラクションをブロックする代わりに人間の承認を待機させるにはASKの結果を使用します。これは、エージェントがユーザーに代わって行動する場合に承認を要求するにあるように、MCPサービスに適用されます。
マルチターンLLMジャッジの例
上記のLLMジャッジの例では、最新のメッセージのみを個別に評価しています。最新のメッセージは問題ないように見えても、直近の会話全体で見ると問題がある場合など、一部のリスクはやり取り全体を通してのみ確認できます。 マルチターン LLMジャッジポリシーでは、最新のメッセージだけでなく、直近のメッセージのウィンドウを評価者に提供します。
これを有効にするには、ポリシーを LLMジャッジポリシー としてアタッチし、 Conversation window フィールドに評価者が受け取る直近のメッセージ数を設定するか、 Evaluate the entire conversation を選択します。マルチターン評価は、 Model Services および Model Provider Services の input (ON CALL) phase にのみ適用されます。出力フェーズや MCP Services では利用できません。最後のメッセージだけでなく、直近のメッセージをまとめて評価するようにプロンプトを作成してください。
会話ウィンドウ は、やり取りのペアではなく、任意の役割(システム、ユーザー、アシスタント、ツール)の個々のメッセージをカウントします。そのため、6 のウィンドウは最後の 6 つのメッセージをカバーし、1 のウィンドウは単一メッセージ評価と同じになります。ウィンドウが 1 より大きい場合、評価器はリクエストからの最新のユーザーメッセージとともに最近のメッセージを受け取るため、現在のターンは常に最近のコンテキストと合わせて評価されます。
会話全体を評価 は、サーバーが保持するセッション履歴ではなく、現在のリクエストに含まれるすべてのメッセージを送信します。Databricks はリクエスト間で会話の状態を保持しません。サイズ制限は適用されないため、長い会話は評価器モデルのコンテキストウィンドウを超えて評価に失敗する可能性があります。ポリシーは「フェイルクローズ(失敗時に拒否)」されるため、その場合はリクエストが拒否されます。ウィンドウを大きくすると、トークンコストとレイテンシも増加します。確認対象のパターンをキャプチャするのに十分な大きさの制限付き数値ウィンドウを使用し、 会話全体を評価 は短いやり取りのために予約しておくことをお勧めします。
マルチターン評価はウィンドウ化されており、ステートフルではありません。評価器は現在のリクエストに存在するメッセージのみを参照し、Databricks はリクエスト間で状態を保持しません。そのウィンドウ内であれば、ポリシーは以前のターンに対して作用できますが、リクエストから脱落した情報を使用したり、リクエストをまたいで実行スコアを維持したりすることはできません。「このエージェントが機密データを読み取ったら、セッションの残りの期間はそのエージェントの他のツールをブロックする」といった、セッションスコープの制御を実装することはできません。
ジェイルブレイク および 安全でないコンテンツ のリスクに対しては、組み込みの Jailbreak および Unsafe Content ガードレールを使用してください。これは、 会話ウィンドウ を設定することで、最近のメッセージ全体に対しても実行できます。組み込みの判定ではカバーできないドメイン固有のポリシーには、カスタムのマルチターン判定を予約してください。ドメイン固有のポリシーの例については、以降のセクションを参照してください。
会話がトピックから逸脱していることを検出する
この入力フェーズ(ON CALL)ポリシーは、 モデルサービス または モデルプロバイダーサービス 上で実行されます。これはアシスタントのトピックを維持するのマルチターン形式です。最新のメッセージ単体では問題ないように見えても、数ターンにわたってアシスタントのサポート範囲外に逸脱した会話にフラグを立てます。
プロンプト:
あなたは、会社の製品、注文、請求、およびアカウントサポートのみを支援するカスタマーサポートアシスタントとの会話の最新のやり取りを確認しています。直近のやり取りが、一般的なコーディングのヘルプ、エッセイの作成、無関係なトリビアなど、その範囲外に及んでいる場合は、たとえ最新のメッセージ単体では範囲内のように見える場合でも、その会話にフラグを立ててください。サポートされているトピックの範囲内にとどまる会話には、フラグを立てないでください。
ターン全体にわたる機密プロジェクトに関する議論にフラグを立てる
この入力フェーズ(ON CALL)ポリシーは、 モデルサービス または モデルプロバイダーサービス 上で実行されます。これは、決定論的なキーワードコードネームブロックを補完するセマンティックなマルチターン機能です。最新のメッセージで名前が言及されていない場合でも、機密の内部プロジェクトを探ったり議論したりしている会話をフラグ付けします。何が機密情報とみなされるかについての説明を、貴組織に合わせて調整してください。
プロンプト:
内部アシスタントとの会話の最新のターンをレビューしています。最近のメッセージが、ロードマップ、財務情報、コードネームなど、機密性の高い未公開の内部プロジェクトの詳細を要求または議論している場合は、たとえ最新のメッセージ単体でプロジェクト名が言及されていなくても、その会話にフラグを立ててください。一般公開されている製品や会社の公開情報に関する一般的な質問にはフラグを立てないでください。
規制されたアドバイスに向けたリクエストにフラグを立てる
この入力フェーズ(ON CALL)ポリシーは、 Model Service または Model Provider Service 上で実行されます。これは、単一の応答をチェックする規制されたアドバイスのブロックを補完する、リクエストフェーズのマルチターン機能です。アシスタントが個別化された規制対象のアドバイスを提供するように誘導する会話をフラグ付けし、アシスタントが回答する前にリダイレクトできるようにします。
プロンプト:
一般的な教育情報のみを共有する可能性のある金融サービスアシスタントとの会話の、直近のやり取りを確認しています。直近のメッセージが、個別の投資、税務、法律に関するアドバイス、またはユーザー自身の状況に対する具体的な推奨事項を得ることを目的としている場合は、たとえ最新のメッセージ単体では一般的な質問のように見えても、その会話にフラグを立ててください。一般的なアドバイスを伴わない情報にとどまっている会話には、フラグを立てないでください。