Guardrails for Amazon Bedrockのハルシネーション検知をKnowledge bases for Amazon Bedrock（Claude 3）とともに使う方法

Amazon Bedrockの機能である「Guardrails for Amazon Bedrock」にハルシネーションを検知する機能が追加されました。AWS Summit New York 2024で発表されました。

AWS Summit New York 2024で発表された他の機能はこちらが詳しいです。

https://qiita.com/hayao_k/items/6f8c23f62f16e17f45bc

ハルシネーション検知機能をKnowledge bases for Amazon Bedrockといっしょに使ってみたところ、エラーになりました。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/b0bb65db-8131-8a5a-c5db-bc13c69b87e5.png)

理由がわからなかったのですが、ドキュメントで以下の記述を確認！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/4cb84d02-7225-be94-8160-4350bd48fdf5.png)

どうも、Claude 3 SonnetとHaikuではGuardrails for Amazon Bedrockのハルシネーション検知が利用できないようです。（他のガードレール検知には使用できます）

:::note
試しに同じガードレールを指定し、生成に使用するモデルをClaude 2.1にすると、エラーは発生しなくなりました。
:::

:::note

APIで指定する場合は、「`guardrailConfiguration`」を指定します。

```python
import json

question = (
    "BedrockとBedrock StudioとApp Studioについて教えて下さい。日本語でお願いします。"
)
knowledge_base_id = "W4QPINOOGU"
model_arn = "anthropic.claude-v2:1"

response = bar_client.retrieve_and_generate(
    input={"text": question},
    retrieveAndGenerateConfiguration={
        "type": "KNOWLEDGE_BASE",
        "knowledgeBaseConfiguration": {
            "knowledgeBaseId": knowledge_base_id,
            "modelArn": model_arn,
            "generationConfiguration": {
                "guardrailConfiguration": {
                    "guardrailId": "x0d4e0xkwify",
                    "guardrailVersion": "1",
                },
                "inferenceConfig": {"textInferenceConfig": {"temperature": 0.0}},
            },
        },
    },
)

print(json.dumps(response, indent=2, ensure_ascii=False))
```
:::

「retrieve_and_generate」API呼び出し時にガードレールを指定することはできませんが、Guardrails for Amazon Bedrockに新しく追加された「ApplyGuardrails」APIを使い解決します。

:::note
ApplyGuardrails APIも、AWS Summit New York 2024で発表された新機能です。
:::

## ApplyGuardrails APIとは

ApplyGuardrails APIとは、Bedrockのモデル呼び出しとは別に、ガードレール機能のみを呼び出すことができるAPIです。（Bedrock Runtimeに属するAPIです）

APIの呼び出しはこのような形式です。

```python
response = client.apply_guardrail(
    guardrailIdentifier="{{ガードレールID}}",
    guardrailVersion="{{ガードレールバージョン}}",
    source="OUTPUT",
    content=[
        {"text": {"text": "{{検索したナレッジ}}", "qualifiers": ["grounding_source"]}},
        {"text": {"text": "{{ユーザー入力のクエリ文字列}}", "qualifiers": ["query"]}},
        {"text": {"text": "{{生成した回答}}"}},
    ],
)
```

APIの呼び出し結果として、以下の内容が取得できます。

outputsは、ガードレールがブロックした場合の回答文で、ガードレールがブロックした場合のみセットされるようです。
assessmentsは、ガードレールのチェックスコアと、アクションがセットされます。

```json:response["outputs"]
[
  {
    "text": "Sorry, the model cannot answer this question."
  }
]
```
```json:response["assessments"]
[
  {
    "contextualGroundingPolicy": {
      "filters": [
        {
          "type": "GROUNDING",
          "threshold": 0.7,
          "score": 0.18,
          "action": "BLOCKED"
        },
        {
          "type": "RELEVANCE",
          "threshold": 0.7,
          "score": 0.57,
          "action": "BLOCKED"
        }
      ]
    }
  }
]
```

## Knowledge bases for Amazon Bedrock（Claude 3）とGuardrails for Amazon Bedrockを組み合わせる

ApplyGuardrails APIの使い方がわかったので、Knowledge bases for Amazon Bedrockに組み合わせて使ってみます。

まず、RetrieveAndGenerate APIで回答を生成します。

```python
import json

import boto3

br_client = boto3.client("bedrock-runtime")
bar_client = boto3.client("bedrock-agent-runtime")

question = (
    "BedrockとBedrock StudioとApp Studioについて教えて下さい。日本語でお願いします。"
)
knowledge_base_id = "W4QPINOOGU"
model_arn = "anthropic.claude-3-haiku-20240307-v1:0"

response = bar_client.retrieve_and_generate(
    input={"text": question},
    retrieveAndGenerateConfiguration={
        "type": "KNOWLEDGE_BASE",
        "knowledgeBaseConfiguration": {
            "knowledgeBaseId": knowledge_base_id,
            "modelArn": model_arn,
        },
    },
)
```

回答が生成されますが、ハルシネーションが発生しています。

> Bedrock は、Minecraft のゲームエンジンです。Bedrock Edition は、Windows 10、Xbox、PlayStation、Nintendo Switch、iOS、Android などの様々なプラットフォームで動作するバージョンです。Bedrock は、クロスプラットフォーム対応や高度な機能を備えています。 Bedrock Studio は、Bedrock Edition の開発を行う Mojang Studios の一部門です。Bedrock Studio は、Bedrock Edition の開発、更新、サポートを担当しています。 AWS App Studio は、AWS が提供するサービスで、自然言語を使ってエンタープライズレベルのアプリケーションを作成できるツールです。IT 管理者やデータエンジニア、エンタープライズアーキテクトなどの技術者でも、アプリケーション開発が可能になります。

なので、ユーザーに回答を返却する前にApplyGuardrails APIを呼び出します。

RetrieveAndGenerate APIのレスポンスから、ApplyGuardrails APIの呼び出しに必要な値を取得します。

* grounding_source : ユーザーの質問に回答するために必要なコンテキスト情報
* query : ユーザーの質問
* answer : Bedrockが生成した回答

grounding_sourceは以下のように取得できます。

```python
reference = []

for citation in response["citations"]:
    for retrievedReference in citation["retrievedReferences"]:
        context = retrievedReference["content"]["text"]
        reference.append(context)

reference = list(set(reference))
grounding_source = "\n".join(reference)
```

この3つの情報をApplyGuardrails APIで指定します。

```python
response = br_client.apply_guardrail(
    guardrailIdentifier="x0d4e0xkwify",
    guardrailVersion="1",
    source="OUTPUT",
    content=[
        {"text": {"text": grounding_source, "qualifiers": ["grounding_source"]}},
        {"text": {"text": question, "qualifiers": ["query"]}},
        {"text": {"text": response["output"]["text"]}},
    ],
)

```

response["outputs"]に値がセットされていれば、ハルシネーションが発生しているのでApplyGuardrails APIの返却したテキストを回答として、ユーザーに返答しましょう。

> Sorry, the model cannot answer this question.