自動推論チェックをアプリケーションに統合する - Amazon Bedrock

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

自動推論チェックをアプリケーションに統合する

自動推論ポリシーをガードレールにデプロイした後 (「」を参照自動推論ポリシーをアプリケーションでデプロイする)、実行時にそれを使用して LLM レスポンスを検証し、フィードバックに基づいて行動できます。このページでは、検証 API を呼び出し、検出結果をプログラムで解釈し、無効なレスポンスの書き換えや明確化のための質問などの一般的な統合パターンを実装する方法について説明します。

自動推論チェックは検出モードでのみ動作し、コンテンツをブロックするのではなく検出結果とフィードバックを返します。アプリケーションは、レスポンスの提供、書き換え、明確化のリクエスト、デフォルトの動作へのフォールバックなど、検出結果の処理を決定する責任があります。

インテグレーションの概要

実行時に、統合は次のフローに従います。

User question ──► LLM generates response ──► ApplyGuardrail validates response │ ┌─────────┴─────────┐ │ │ VALID Not VALID │ │ ▼ ▼ Serve response Inspect findings to user │ ┌────────┴────────┐ │ │ OTHER FINDING TRANSLATION_ TYPES AMBIGUOUS / SATISFIABLE │ │ ▼ ▼ Rewrite using Ask user for AR feedback clarification │ │ ▼ ▼ Validate again Validate with clarified input

自動推論の検出結果は、Amazon Bedrock ガードレール設定をサポートするすべての API を通じて返されます。

  • ApplyGuardrail — スタンドアロン検証 API。これは、LLM 呼び出しとは無関係にコンテンツを検証する場合に使用します。これは、検証されるコンテンツとタイミングを完全に制御できるため、自動推論チェックに推奨されるアプローチです。

  • Converse および InvokeModel — ガードレール設定の LLM 呼び出し APIs。自動推論の結果は、レスポンスの traceフィールドに返されます。

  • InvokeAgent および RetrieveAndGenerate — ガードレール設定を持つエージェントおよびナレッジベースの APIs。

このページでは ApplyGuardrail API に焦点を当てています。これは、以下で説明する書き換えと明確化のパターンを最も柔軟に実装できるからです。他の APIs」を参照してください。 https://docs.aws.amazon.com/bedrock/latest/userguide/guardrails-use.html

オープンソースの書き換えチャットボットのサンプル

このページで説明されているパターンの完全な本番環境スタイルの実装については、GitHub の「自動推論チェックのチャットボットの書き換え」を参照してください。このサンプルアプリケーションでは、以下を示します。

  • AR フィードバックに基づいて無効なレスポンスが自動的に修正される反復書き換えループ。

  • LLM が正確に書き換えるためにユーザーから追加のコンテキストが必要な場合のフォローアップの質問。

  • ユーザーが明確化の質問に応答しない場合に自動的に処理を再開するタイムアウトメカニズム。

  • LLM プロンプトへのポリシーコンテキストインジェクションにより、LLM は書き換え中にポリシールール全体を参照できます。

  • コンプライアンスとデバッグのためのすべての検証反復の JSON 監査ログ記録。

このサンプルでは、Python/Flask バックエンドと React フロントエンドを使用し、Amazon Bedrock と通信して LLM 推論を行い、Amazon Bedrock ガードレールと通信して ApplyGuardrail API による検証を行います。

注記

サンプルアプリケーションには、ドキュメントのアップロードを必要とせずに自動推論ポリシーをサポートするためのポリシーコンテンツが LLM 生成プロンプトに直接含まれています。本番デプロイでは、通常、自動推論ポリシーのソースコードではなく、RAG コンテンツを使用するか、元の自然言語ドキュメントを LLM にフィードします。

自動推論チェックを使用して ApplyGuardrail を呼び出す

ApplyGuardrail API を使用して、ガードレールに対してコンテンツを検証します。API は 1 つ以上のコンテンツブロックを受け入れ、自動推論の結果を含む評価を返します。

リクエスト構造

guardrailIdentifier (必須)

ガードレール ID または ARN。自動推論ポリシーがアタッチされているガードレールを使用します。

guardrailVersion (必須)

ガードレールのバージョン番号 (例: 1)。本番ワークロードには、 ではなく番号付きバージョンを使用しますDRAFT

source (必須)

LLM レスポンスを検証するOUTPUTときは、 に設定します。ユーザープロンプトを検証するINPUTときは、 を に設定します。自動推論チェックでは、通常、LLM 出力を検証します。

content (必須)

検証するコンテンツブロックの配列。各ブロックには、確認するコンテンツを含むtextフィールドが含まれています。ユーザーの質問と LLM レスポンスを個別のコンテンツブロックとして渡すことも、1 つのブロックに結合することもできます。

例: を使用して LLM レスポンスを検証する AWS CLI

aws bedrock-runtime apply-guardrail \ --guardrail-identifier "your-guardrail-id" \ --guardrail-version "1" \ --source OUTPUT \ --content '[ { "text": { "text": "User: Am I eligible for parental leave if I have been working here for 2 years full-time?\nAssistant: Yes, you are eligible for parental leave." } } ]'

例: Python を使用して LLM レスポンスを検証する (boto3)

import boto3 import json bedrock_runtime = boto3.client("bedrock-runtime", region_name="us-east-1") response = bedrock_runtime.apply_guardrail( guardrailIdentifier="your-guardrail-id", guardrailVersion="1", source="OUTPUT", content=[ { "text": { "text": ( "User: Am I eligible for parental leave if I have been " "working here for 2 years full-time?\n" "Assistant: Yes, you are eligible for parental leave." ) } } ], ) # The AR findings are in the assessments for assessment in response.get("assessments", []): ar_assessment = assessment.get("automatedReasoningPolicy", {}) findings = ar_assessment.get("findings", []) for finding in findings: # Each finding is a union — exactly one key is present # Possible keys: valid, invalid, satisfiable, impossible, # translationAmbiguous, tooComplex, noTranslations print(json.dumps(finding, indent=2, default=str))

応答の構造

ApplyGuardrail レスポンスには assessments配列が含まれます。各評価には、findings配列を持つautomatedReasoningPolicyオブジェクトが含まれます。各検出結果はユニオンタイプです。次のいずれかのキーがあります。

  • valid

  • invalid

  • satisfiable

  • impossible

  • translationAmbiguous

  • tooComplex

  • noTranslations

各検出結果タイプとそのフィールドの詳細な説明については、「」を参照してください結果と検証結果

実行時に AR の検出結果を解釈する

自動推論の検出結果をプログラムで処理するには、アプリケーションが検出結果タイプ、翻訳の詳細、およびサポートルールまたは矛盾するルールを抽出する必要があります。以下のセクションでは、検出結果の各部分を解析する方法について説明します。

検出結果タイプを決定する

各検出結果は結合であり、1 つのキーのみ存在します。検出結果タイプを決定するには、どのキーが存在するかを確認します。

def get_finding_type(finding): """Return the finding type and its data from an AR finding union.""" for finding_type in [ "valid", "invalid", "satisfiable", "impossible", "translationAmbiguous", "tooComplex", "noTranslations" ]: if finding_type in finding: return finding_type, finding[finding_type] return None, None

翻訳を読む

ほとんどの検出結果タイプには、自動推論チェックによって自然言語入力がどのように形式ロジックに変換されたかを示すtranslationオブジェクトが含まれています。翻訳には以下が含まれます。

  • premises — 入力から抽出された条件 (例: isFullTime = truetenureMonths = 24)。

  • claims — 検証するアサーション (例: eligibleForParentalLeave = true)。

  • untranslatedPremises — ポリシー変数にマッピングできなかった入力の一部。これらのパートは検証されません。

  • untranslatedClaims — ポリシー変数にマッピングできなかったクレーム。

untranslatedPremises と をチェックuntranslatedClaimsして、検証の範囲を理解します。VALID 結果は翻訳されたクレームのみを対象とし、翻訳されていないコンテンツは検証されません。

サポートルールまたは矛盾するルールを読む

結果のタイプに応じて、結果を説明するルールが結果に含まれます。

  • valid 検出結果にはsupportingRules、クレームが正しいことを証明するポリシールールが含まれます。

  • invalid 検出結果にはcontradictingRules、クレームが違反するポリシールールが含まれます。

  • satisfiable 検出結果には、クレームが true claimsFalseScenario claimsTrueScenarioと false の条件を示す と の両方が含まれます。

これらのルールとシナリオは、「」で説明されている書き換えパターンの主要な入力ですAR フィードバックを使用して無効なレスポンスを書き換える

集計結果を決定する

1 つの検証リクエストで複数の検出結果を返すことができます。全体的な結果を判断するには、結果を重要度でソートし、最も悪いものを選択します。重要度の最悪順は、TRANSLATION_AMBIGUOUSIMPOSSIBLE、、INVALIDSATISFIABLE、、 ですVALID

SEVERITY_ORDER = { "tooComplex": 0, "translationAmbiguous": 0, "impossible": 1, "invalid": 2, "satisfiable": 3, "valid": 4, "noTranslations": 5, } def get_aggregate_result(findings): """Return the worst finding type from a list of findings.""" worst = None worst_severity = float("inf") for finding in findings: finding_type, _ = get_finding_type(finding) severity = SEVERITY_ORDER.get(finding_type, 0) if severity < worst_severity: worst_severity = severity worst = finding_type return worst

アプリケーションでの検証結果の処理

集計結果を使用して、アプリケーションが次に何をするかを決定します。次の表は、各結果タイプに推奨されるアクションをまとめたものです。

結果 意味 推奨されるアクション
valid レスポンスは、オンプレミスとポリシールールを考慮して、数学的に正しいことが証明されています。 ユーザーにレスポンスを提供します。監査目的で検出結果をログに記録します (「」を参照監査証跡を構築する)。
invalid レスポンスはポリシールールと矛盾します。contradictingRules フィールドは、違反したルールを識別します。 AR フィードバックを使用してレスポンスを書き換えます (「」を参照AR フィードバックを使用して無効なレスポンスを書き換える)。複数回の試行後に書き換えが失敗した場合、レスポンスをブロックし、フォールバックメッセージを返します。
satisfiable レスポンスは一部の条件下では正しいですが、すべてではありません。これは間違いではありませんが、不完全です。すべての要件に言及しているわけではありません。 レスポンスを書き換えて、欠落している条件を含めます。を使用してclaimsFalseScenario、不足しているものを特定します。または、LLM にユーザーにわかりやすい質問をさせることができます。
impossible オンプレミスが矛盾しているか、ポリシーに競合するルールが含まれています。 入力を明確にするようユーザーに依頼します (「」を参照明確な質問をする)。問題が解決しない場合は、ポリシーの問題を示している可能性があります。品質レポートを確認してください。
translationAmbiguous 入力には複数の有効な解釈があります。翻訳モデルでは、自然言語をポリシー変数にマッピングする方法に異論がありました。 あいまいさを解決するには、ユーザーに説明を求めます。フィールドoptionsdifferenceScenariosフィールドを使用して、ターゲットを絞った明確化の質問を生成します。
tooComplex 入力が論理分析の処理制限を超えています。 入力を小さな部分に分割して簡略化するか、応答を検証できなかったことを説明するフォールバックメッセージを返します。
noTranslations 入力はポリシーのドメインには関係ありません。ポリシー変数をマッピングできませんでした。 このポリシーのコンテンツはトピック外です。AR 検証なしでレスポンスを提供するか、他のガードレールコンポーネント (トピックポリシーなど) を使用してトピック外のコンテンツを処理します。

AR フィードバックを使用して無効なレスポンスを書き換える

自動推論チェックの最も強力な統合パターンは、書き換えループです。レスポンスが invalidまたは の場合satisfiable、アプリケーションは元のレスポンス、特定の検出結果、ポリシールールを含むプロンプトを作成し、ポリシーと一致するようにレスポンスを書き換えるように LLM に要求します。書き換えられたレスポンスは再度検証され、レスポンスが validまたは最大反復回数に達するまでループが続行されます。

ループフローの書き換え

LLM generates initial response │ ▼ Validate with ApplyGuardrail ◄──────────────────┐ │ │ ▼ │ ┌─────┴─────┐ │ │ │ │ VALID Not VALID │ │ │ │ ▼ ▼ │ Done Construct rewriting prompt │ with findings + rules │ │ │ ▼ │ LLM rewrites response │ │ │ ▼ │ Max iterations? ──── No ────────────────┘ │ Yes │ ▼ Return best response with warning

書き換えプロンプトを作成する

書き換えプロンプトには、AR の検出結果からの 3 つの情報を含める必要があります。

  1. 検証に失敗した元のレスポンス。

  2. 翻訳された施設、クレーム、矛盾するルールやサポートルールなど、特定の検出結果。

  3. ポリシールールと一致するようにレスポンスを書き換える手順。

プロンプトテンプレートの書き換え例:

The following response was checked against our policy and found to be {finding_type}. Original response: {original_response} The validation found the following issue: - Premises (what was understood from the input): {premises} - Claims (what was asserted): {claims} - Contradicting rules: {contradicting_rules} Please rewrite the response so that it is consistent with the policy document. Keep the same helpful tone and answer the user's question accurately based on the rules. If you cannot provide an accurate answer without more information, explain what additional information is needed.
ヒント

LLM が書き換え時に必要なすべてのコンテキストを持つように、書き換えリクエストまたはポリシールールには必ず取得拡張生成 (RAG) コンテンツを含めてください。書き換えプロンプトテンプレートは特定の結果の詳細を提供し、システムプロンプトはより広範なポリシーコンテキストを提供します。このデュアルコンテキストアプローチは、オープンソースの書き換えチャットボットのサンプルで示されています。

ベストプラクティスの書き換え

  • 最大反復回数を設定します。無限ループを防ぐために、書き換えループにはハード制限 (通常は 2~5 回) が必要です。レスポンスが最大イテレーションvalidの後でもない場合は、警告付きの最適なレスポンスを返すか、デフォルトのメッセージにフォールバックします。

  • 結果を優先度順に処理します。複数の検出結果が返されたら、最初に最も重大な検出結果に対処します。重要度の順序は、translationAmbiguousimpossible、、satisfiableinvalid、 ですvalid

  • システムプロンプトにポリシーコンテキストを含めます。LLM は、正確に書き換えるために、ソースドキュメントまたはポリシールール全体にアクセスする必要があります。 ナレッジベースを使用して生成リクエストにドキュメントを含めることも、 ExportAutomatedReasoningPolicyVersion API を使用してポリシー定義を取得し、LLM 用にフォーマットすることもできます。

  • 各イテレーションをログに記録します。イテレーションごとに、元のレスポンス、結果、書き換えプロンプト、書き換えたレスポンスを記録します。この監査証跡は、デバッグとコンプライアンスに役立ちます (「」を参照監査証跡を構築する)。

明確な質問をする

自動推論チェックが translationAmbiguoussatisfiable、または impossibleの結果を返す場合、LLM にはレスポンスを正確に書き換えるのに十分な情報がない可能性があります。このような場合、アプリケーションはユーザーに明確化を求め、その回答を次の検証試行に組み込むことができます。

明確化を求めるタイミング

  • translationAmbiguous — 入力には複数の有効な解釈があります。options フィールドは競合する解釈を示し、 differenceScenariosフィールドは実際にどのように異なるかを示します。これらを使用して、特定のあいまいさに関するターゲットを絞った質問を生成します。

  • satisfiable — レスポンスは一部の条件下では正しいですが、すべてではありません。は、レスポンスが正しくない条件claimsFalseScenarioを示します。これらの特定の条件についてユーザーに尋ねます。

  • impossible — 入力には矛盾するステートメントが含まれています。ユーザーに矛盾を明確にするよう依頼します。

  • 書き換えが失敗する — LLM が複数回試行validした後にレスポンスを書き換えられない場合は、ユーザーからの追加のコンテキストが必要になる場合があります。結果に基づいて明確な質問を生成するように LLM に依頼します。

明確化パターン

明確化フローは次のように機能します。

  1. AR の検出結果からあいまいな変数または欠落している条件を抽出します。

  2. 明確な質問を生成する — 検出結果フィールドからプログラムで生成するか、検出結果に基づいて質問を作成するように LLM に依頼します。

  3. ユーザーに質問を提示し、回答を収集します。

  4. 回答をコンテキストに組み込み、新しいレスポンスを生成します。

  5. で新しいレスポンスを検証しますApplyGuardrail

例: satisfiable検出結果から明確な質問を生成する

def generate_clarifying_questions(finding_data, user_question): """Ask the LLM to generate clarifying questions from a SATISFIABLE finding.""" claims_true = json.dumps( finding_data.get("claimsTrueScenario", {}), indent=2, default=str ) claims_false = json.dumps( finding_data.get("claimsFalseScenario", {}), indent=2, default=str ) prompt = ( f"A user asked: {user_question}\n\n" f"The answer is correct when these conditions hold:\n{claims_true}\n\n" f"But incorrect when these conditions hold:\n{claims_false}\n\n" f"Generate 1-3 short, specific questions to ask the user to determine " f"which conditions apply to their situation. Format each question on " f"its own line." ) return generate_response(prompt, "You are a helpful assistant.")

監査証跡を構築する

自動推論の検出結果は、数学的に検証可能な有効性の証明を提供します。規制された業界やコンプライアンスシナリオでは、この証明が重要な差別化要因です。パターンマッチングや確率的に評価されるだけでなく、特定の変数割り当てを持つ特定のポリシールールに対して AI レスポンスが検証されたことを示すことができます。

効果的な監査証跡を構築するには、検証リクエストごとに次の情報をログに記録します。

  • タイムスタンプとリクエスト ID。検証が発生した日時とリクエストの一意の識別子。

  • 入力コンテンツ。検証されたユーザーの質問と LLM レスポンス。

  • 検出結果のタイプと詳細。検証結果 (valid、 など)invalid、翻訳された施設とクレーム、サポートルールまたは矛盾するルール。

  • 実行されたアクション。アプリケーションが検出結果に対して行ったこと — はレスポンスを提供し、書き直し、明確化を求め、またはブロックしました。

  • 履歴の書き換え。レスポンスが書き換えられた場合は、各イテレーションをログに記録します。元のレスポンス、書き換えプロンプト、書き換えられたレスポンス、および各イテレーションの検証結果です。

  • ポリシーバージョン。検証に使用されるガードレールバージョンとポリシーバージョン。これにより、後で検証結果を再現できます。

例: 監査ログエントリ構造

{ "timestamp": "2025-07-21T14:30:00Z", "request_id": "req-abc123", "guardrail_id": "your-guardrail-id", "guardrail_version": "1", "user_question": "Am I eligible for parental leave?", "llm_response": "Yes, you are eligible for parental leave.", "validation_result": "valid", "findings": [ { "type": "valid", "premises": "isFullTime = true, tenureMonths = 24", "claims": "eligibleForParentalLeave = true", "supporting_rules": ["A1B2C3D4E5F6"] } ], "action_taken": "served_response", "rewrite_iterations": 0 }
ヒント

監査ログは、オブジェクトロックが有効になっている Amazon CloudWatch Logs や Amazon S3 などの耐久性の高い改ざん防止ストアに保存します。コンプライアンスシナリオでは、Lake を使用して組織全体の監査ログをクエリすることを検討してください。