7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

生成AIに関する記事を書こう!
Qiita Engineer Festa20242024年7月17日まで開催中!

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

Posted at

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

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

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

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

image.png

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

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

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

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を使い解決します。

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

ApplyGuardrails APIとは

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

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

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

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

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

response["outputs"]
[
  {
    "text": "Sorry, the model cannot answer this question."
  }
]
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で回答を生成します。

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は以下のように取得できます。

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で指定します。

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.

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?