View a markdown version of this page

在您的应用程序中集成自动推理检查 - 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 Guardrails 配置的 API 返回:

  • ApplyGuardrail— 独立验证 API。如果您想独立于 LLM 调用验证内容,请使用此选项。这是自动推理检查的推荐方法,因为它可以让你完全控制哪些内容需要验证以及何时进行验证。

  • ConverseInvokeModel — APIs 带护栏配置的 LLM 调用。自动推理结果将在响应trace字段中返回。

  • InvokeAgent以及 RetrieveAndGenerate — APIs 带有护栏配置的代理和知识库。

本页重点介绍 ApplyGuardrail API,因为它为实现下述重写和澄清模式提供了最大的灵活性。有关将护栏与其他护栏一起使用的信息 APIs,请参阅使用护栏。

开源重写聊天机器人示例

有关本页描述的模式的完整生产风格实现,请参阅自动推理检查重写聊天机器人。 GitHub此示例应用程序演示:

  • 一个迭代重写循环,根据增强现实反馈自动更正无效的响应。

  • 当 LLM 需要用户提供更多背景信息才能准确重写时,请跟进问题。

  • 一种超时机制,当用户不回答澄清问题时,它会自动恢复处理。

  • 向 LLM 提示注入策略上下文,这样 LLM 就可以在重写过程中引用完整的策略规则。

  • 每次验证迭代的 JSON 审计日志,以实现合规性和调试。

该示例使用带有 React 前 Python/Flask 端的后端,并通过 API 与 Amazon Bedrock 通信进行法学硕士推断,与 Amazon Bedrock Guardrails 通信进行验证。ApplyGuardrail

注意

示例应用程序在 LLM 生成提示中直接包含策略内容,无需上传文档即可支持任何自动推理策略。在生产部署中,您通常会使用 RAG 内容或向 LLM 提供原始的自然语言文档,而不是自动推理策略源代码。

ApplyGuardrail 使用自动推理检查致电

使用 ApplyGuardrail API 在您的护栏上验证内容。API 接受一个或多个内容块,并返回包含自动推理结果的评估。

请求结构

guardrailIdentifier(必需)

护栏 ID 或 ARN。使用附有自动推理策略的护栏。

guardrailVersion(必需)

护栏版本号(例如,1)。对生产工作负载使用编号版本,不是DRAFT

source(必需)

验证 LLM 响应OUTPUT时设置为。验证用户提示INPUT时设置为。对于自动推理检查,通常需要验证 LLM 输出。

content(必需)

要验证的内容块数组。每个区块都包含一个包含要检查内容的text字段。您可以将用户问题和 LLM 响应作为单独的内容块传递,也可以将它们组合成一个块。

示例:使用验证 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 (boto3) 验证 LLM 响应

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 结果

要以编程方式对自动推理结果采取行动,您的应用程序需要提取结果类型、翻译详细信息以及支持或相互矛盾的规则。以下各节说明了如何解析结果的每个部分。

确定查找类型

每个发现都是一个结合——只有一个钥匙存在。检查存在哪个密钥以确定查找类型:

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— 无法映射到保单变量的索赔。

检查untranslatedPremisesuntranslatedClaims并了解验证的范围。VALID结果仅涵盖已翻译的声明,未翻译的内容未经过验证。

阅读支持或相互矛盾的规则

根据查找结果的类型,查找结果包括解释结果的规则:

  • valid调查结果包括 supportingRules ——证明索赔正确性的保单规则。

  • invalid调查结果包括 contradictingRules ——索赔违反的政策规则。

  • satisfiable调查结果包括a claimsTrueScenario 和a claimsFalseScenario ——显示了主张的真实和错误的条件。

这些规则和场景是中描述的重写模式的关键输入。使用 AR 反馈重写无效的回复

确定聚合结果

单个验证请求可以返回多个结果。要确定总体结果,请按严重程度对结果进行排序,然后选择最差的结果。从最差到最佳的严重性顺序为:TRANSLATION_AMBIGUOUSIMPOSSIBLEINVALID、、SATISFIABLEVALID

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来识别缺少的内容。或者,你可以让你的法学硕士询问用户澄清问题。
impossible 前提相互矛盾,或者政策包含相互矛盾的规则。 要求用户澄清他们的输入(请参阅提出澄清问题)。如果问题仍然存在,则可能表明存在政策问题,请查看质量报告。
translationAmbiguous 输入有多种有效解释。翻译模型在如何将自然语言映射到政策变量上存在分歧。 要求用户进行澄清以解决歧义。使用optionsdifferenceScenarios字段生成有针对性的澄清问题。
tooComplex 输入超出了逻辑分析的处理限制。 通过将输入分成较小的部分来简化输入,或者返回一条说明无法验证响应的备用消息。
noTranslations 输入的内容与您的政策的域名无关。无法映射任何策略变量。 内容与本政策无关紧要。在没有 AR 验证的情况下提供响应,或者使用其他护栏组件(例如主题策略)来处理题外内容。

使用 AR 反馈重写无效的回复

Automated Reasoning 检查最强大的集成模式是重写循环:当响应为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 发现的三条信息:

  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.
提示

务必在重写请求或策略规则中包含检索增强生成 (RAG) 内容,以便 LLM 在重写时拥有所需的所有上下文。重写提示模板提供了具体的发现细节,而系统提示则提供了更广泛的策略背景。这种双上下文方法在开源重写聊天机器人示例中得到了演示。

重写最佳实践

  • 设置最大迭代次数。重写循环应该有一个硬限制(通常是 2-5 次迭代),以防止无限循环。如果响应仍未valid达到最大迭代次数,则返回带有警告的最佳响应或回退到默认消息。

  • 按优先顺序处理调查结果。当返回多个发现结果时,请先解决最严重的发现。严重性顺序为:translationAmbiguousimpossibleinvalidsatisfiablevalid

  • 在系统提示符中包含策略上下文。LLM 需要访问源文档或完整政策规则才能准确地重写。您可以使用知识库将您的文档包含在生成请求中,也可以使用 ExportAutomatedReasoningPolicyVersion API 检索策略定义并将其格式化为 LLM。

  • 记录每次迭代。记录每次迭代的原始响应、调查结果、重写提示和重写的响应。此审计跟踪对于调试和合规性非常有用(请参阅建立审计跟踪)。

提出澄清问题

当自动推理检查返回translationAmbiguoussatisfiable、或impossible结果时,法学硕士可能没有足够的信息来准确地重写响应。在这些情况下,您的应用程序可以要求用户进行澄清,然后将答案纳入下一次验证尝试中。

何时要求澄清

  • translationAmbiguous— 输入有多种有效解释。该options字段显示了相互竞争的解释,该differenceScenarios字段显示了它们在实践中的不同之处。使用它们来生成有关特定歧义的有针对性的问题。

  • satisfiable— 在某些条件下,响应是正确的,但不是所有条件下都是正确的。claimsFalseScenario显示了在哪些情况下响应会不正确。向用户询问这些具体情况。

  • impossible— 输入内容包含相互矛盾的陈述。要求用户澄清矛盾。

  • 重写失败 — 如果 LLM 无法在多次尝试valid后重写响应,则可能需要用户提供其他上下文。要求法学硕士根据调查结果提出澄清性问题。

澄清模式

澄清流程的工作原理如下:

  1. 从 AR 结果中提取模棱两可的变量或缺失的条件。

  2. 生成澄清问题 — 可以从查找字段中以编程方式生成问题,也可以要求法学硕士根据发现提出问题。

  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.")

建立审计跟踪

自动推理结果提供了数学上可验证的有效性证据。对于受监管的行业和合规场景,这种证明是一个关键的差异化因素——你可以证明,人工智能响应是根据具有特定变量分配的特定政策规则进行验证的,而不仅仅是模式匹配或概率评估。

要建立有效的审计跟踪,请记录每个验证请求的以下信息:

  • 时间戳和请求 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 L CloudWatch ogs 或 Amazon S3。对于合规性场景,可以考虑使用 Lake 来查询整个组织的审计日志。