使用上下文接地检查来筛选响应中的幻觉 - Amazon Bedrock

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用上下文接地检查来筛选响应中的幻觉

提供引用源和用户查询时,Amazon Bedrock 防护机制支持使用上下文接地检查来检测和筛选模型响应中的幻觉。支持的用例涵盖检索增强生成 (RAG)、摘要、释义或对话代理,这些代理依赖参考来源(例如 RAG 中检索到的段落或对话历史记录)来为代理提供对话基础。

上下文接地检查会检查处理的每个分块的相关性。如果任何一个分块被认为是相关的,则整个响应都被认为是相关的,因为它具有用户查询的答案。对于流式传输 API,这可能会导致向用户返回不相关的响应,并且仅在流式传输整个响应后才被标记为不相关。

上下文接地检查可评估两种范式的幻觉:

  • 接地 – 根据源检查模型响应是否与事实相符且基于源。响应中引入的任何新信息都将被视为无依据的信息。

  • 相关性 – 检查模型响应是否与用户查询相关。

例如,引用源包含“伦敦是英国的首都。东京是日本的首都”,用户查询是“日本的首都是哪里?”。诸如“日本的首都是伦敦”之类的响应将被视为无依据且与事实相悖的响应,而诸如“英国的首都是伦敦”之类的响应将被视为不相关的响应,即使它是正确的,也基于源。

注意

当请求包含多个 grounding_source 标签时,防护机制会将所有提供的 grounding_source 值组合在一起并进行评估,而不是分别考虑每个 grounding_source 值。对于 query 标签,防护机制会进行同样的操作。

注意

上下文接地策略目前最多支持在接地源中包含 10 万个字符,在查询中包含 1000 个字符,在响应中包含 5000 个字符。

置信度分数和阈值

上下文接地检查根据提供的源和用户查询为处理的每个模型响应生成与接地和相关性相对应的置信度分数。您可以配置阈值以根据生成的分数筛选模型响应。筛选阈值决定了模型响应的最低允许置信度分数,达到该分数的模型响应在生成式人工智能应用程序中被视为有依据且相关的响应。例如,如果您的接地阈值和相关性阈值均设置为 0.7,则所有接地分数或相关性分数低于 0.7 的模型响应都将被检测为幻觉并在您的应用程序中受到阻止。随着筛选阈值的增加,阻止无依据且不相关的内容的可能性就会增加,而在应用程序中看到幻觉内容的可能性也会降低。您可以将接地和相关性的阈值配置为 0 到 0.99 之间的值。阈值为 1 是无效的,因为这将阻止所有内容。

上下文接地检查需要 3 个组件来执行检查:接地源、查询和要防护的内容(或模型响应)。根据您使用的是 Invoke、还是 ApplyGuardrail 直接使用 Invoke APIs Converse APIs,它们的配置会有所不同。

  • 接地源 – 回答任何用户查询所需的上下文信息。例如,“伦敦是英国的首都。东京是日本的首都”。

  • 查询 – 用户可能会问的问题。例如,“日本的首都是哪里?”。

  • 要防护的内容 – 相对于接地源和查询应加以防护的文本。对于 Invoke 和 Converse APIs,这是模型响应。例如,这可以是“日本的首都是东京”。

无依据内容示例

  • 接地源 –“伦敦是英国的首都。东京是日本的首都。”

  • 查询 –“日本的首都是哪里?”

  • 要防护的内容 –“日本的首都是伦敦。”

在此示例中,要防护的内容与查询相关,但由于未正确使用接地源,因此属于无依据内容。此类内容的接地分数会很低。

不相关内容示例

  • 接地源 –“伦敦是英国的首都。东京是日本的首都。”

  • 查询 –“日本的首都是哪里?”

  • 要防护的内容 –“英国的首都是伦敦。”

在此示例中,要防护的内容有依据但不相关。它使用来自接地源的信息,但没有回答查询。此类内容的相关性分数会很低。

无依据且不相关内容示例

  • 接地源 –“伦敦是英国的首都。东京是日本的首都。”

  • 查询 –“日本的首都是哪里?”

  • 要防护的内容 –“外面正在下雨。”

在此示例中,要防护的内容无依据且不相关。它既没有使用来自接地源的信息,也没有回答查询。此类内容的接地分数和相关性分数可能会很低。

更多示例

考虑一个旨在回答与费用和收费相关的问题的银行应用程序。

源:

  • 开设支票账户不收取任何费用。

  • 维护支票账户的月费为 10 美元。

  • 国际转账需支付 1% 的交易费。

  • 国内转账不收取任何费用。

  • 逾期支付信用卡账单的相关费用为 23.99%。

从上述源来看,根据用户的查询可以分为四种情况。

有依据且相关

  • 问:与支票账户相关的费用是多少?

  • 答:维护支票账户的月费为 10 美元。国内转账不收取任何费用。但是,国际转账需支付 1% 的交易费。开设支票账户不收取任何费用。

无依据但相关

  • 问:与信用卡相关的交易费是多少?

  • 答:与信用卡相关的交易费是 23.99%?

有依据但不相关

  • 问:使用银行支票账户需要支付多少费用?

  • 答:根据提供的信息,信用卡的滞纳金为 23.99%。

无依据且不相关

  • 问:使用银行支票账户需要支付多少费用?

  • 答:经纪人账户的费用为每笔交易 0.5 美元。

使用控制台添加情境接地检查

  1. AWS Management Console 使用具有 Amazon Bedrock 权限的 IAM 角色登录,然后通过以下网址打开 Amazon Bedrock 控制台。https://console.aws.amazon.com/bedrock/

  2. 从左侧导航窗格中选择 Guardrails,然后选择创建护栏

  3. 对于提供护栏详细信息页面,请执行以下操作:

    1. 防护机制详细信息部分,提供防护机制的名称和(可选的)描述

    2. 对于已屏蔽提示的消息,请输入在安装护栏时显示的消息。选中 “对回复应用相同的屏蔽消息” 复选框,以便在对响应应用防护栏时使用相同的消息。

    3. (可选)要为护栏启用跨区域推理,请展开跨区域推理,然后为您的护栏选择启用跨区域推理。选择一个护栏配置文件,该配置文件定义了 AWS 区域 可以路由护栏推理请求的目的地。

    4. (可选)默认情况下,您的护栏使用加密。 AWS 托管式密钥要使用您自己的客户管理的 KMS 密钥,请展开 KMS 密钥选择并选中 “自定义加密设置(高级)” 复选框。

      您可以选择现有 AWS KMS 密钥或选择 “创建 AWS KMS 密钥” 来创建新密钥。

    5. (可选)要向护栏添加标签,请展开标签,然后为您定义的每个标签选择添加新标签。

      有关更多信息,请参阅 标记 Amazon Bedrock 资源

    6. 选择下一步

  4. 添加上下文接地检查页面上,配置阈值以屏蔽未接地或不相关的信息。

    注意

    对于每种类型的检查,您可以移动滑块或输入介于 0 到 0.99 之间的阈值。针对使用情况选择合适的阈值。较高的阈值将要求响应的内容必须有依据或相关,并具有很高的置信度。低于阈值的响应将被筛选掉。

    1. 接地字段中,选择启用接地检查以检查模型响应的内容是否有依据。

    2. 相关性字段中,选择启用相关性检查以检查模型响应是否相关。

    3. 配置完敏感信息筛选条件后,选择下一步跳至“查看并创建”

使用 Invoke 调用上下文基础检查 APIs

为了在输入中标记接地源和查询,我们提供了 2 个与运行方式与输入标签相同的标签。这些标签是 amazon-bedrock-guardrails-groundingSource_xyzamazon-bedrock-guardrails-query_xyz(假设标签后缀是 xyz)。例如:

{ "text": """ <amazon-bedrock-guardrails-groundingSource_xyz>London is the capital of UK. Tokyo is the capital of Japan. </amazon-bedrock-guardrails-groundingSource_xyz> <amazon-bedrock-guardrails-query_xyz>What is the capital of Japan?</amazon-bedrock-guardrails-query_xyz> """, "amazon-bedrock-guardrailConfig": { "tagSuffix": "xyz", }, }

请注意,执行上下文接地检查需要模型响应,因此只对输出进行检查,不对提示执行检查。

这些标签可以与 guardContent 标签一起使用。如果不使用 guardContent 标签,则防护机制将默认对整个输入(包括接地源和查询)应用所有配置的策略。如果使用 guardContent 标签,则上下文接地检查策略将仅调查接地源、查询和响应,而其余策略将调查 guardContent 标签内的内容。

调用上下文接地检查 Converse APIs

要标记接地源并查询 Converse APIs,请使用每个防护内容块中的限定符字段。例如:

[ { "role": "user", "content": [ { "guardContent": { "text": { "text": "London is the capital of UK. Tokyo is the capital of Japan", "qualifiers": ["grounding_source"], } } }, { "guardContent": { "text": { "text": "What is the capital of Japan?", "qualifiers": ["query"], } } }, ], } ]

请注意,执行上下文接地检查需要模型响应,因此只对输出进行检查,不对提示执行检查。

如果所有内容块都没有使用 guard_content 限定符进行标记,则上下文接地检查策略将仅调查接地源、查询和响应。其余策略将遵循默认的调查行为:系统提示默认为不进行调查,消息默认为进行调查。但是,如果内容块使用 guard_content 限定符进行标记,则上下文接地检查策略将仅调查接地源、查询和响应,而其余策略将调查标有 guardContent 标签的内容。

使用 API 调用上下文基础检查 ApplyGuardrail

使用上下文接地检查与 ApplyGuardrail 使用上下文接地检查类似。Converse APIs要标记基础源并查询 ApplyGuardrail,请使用每个内容块中的限定符字段。但是,由于不使用调用模型 ApplyGuardrail,因此您还必须提供一个包含要保护的内容的额外内容块。可以选择使用 guard_content 限定此内容块,它等同于 Invoke* 或 Converse* 中的模型响应。 APIs例如:

[ { "text": { "text": "London is the capital of UK. Tokyo is the capital of Japan", "qualifiers": [ "grounding_source" ] } }, { "text": { "text": "What is the capital of Japan?", "qualifiers": [ "query" ] } }, { "text": { "text": "The capital of Japan is Tokyo." } } ]

请注意,执行上下文接地检查需要模型响应,因此只对输出进行检查,不对提示执行检查。

如果所有内容块都没有使用 guard_content 限定符进行标记,则上下文接地检查策略将仅调查接地源、查询和响应。其余策略将遵循默认的调查行为:系统提示默认为不进行调查,消息默认为进行调查。但是,如果内容块使用 guard_content 限定符进行标记,则上下文接地检查策略将仅调查接地源、查询和响应,而其余策略将调查标有 guardContent 标签的内容。