Amazon Bedrockの機能である「Guardrails for Amazon Bedrock」にハルシネーションを検知する機能が追加されました。AWS Summit New York 2024で発表されました。
AWS Summit New York 2024で発表された他の機能はこちらが詳しいです。
ハルシネーション検知機能をKnowledge bases for Amazon Bedrockといっしょに使ってみたところ、エラーになりました。
理由がわからなかったのですが、ドキュメントで以下の記述を確認!
どうも、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は、ガードレールのチェックスコアと、アクションがセットされます。
[
{
"text": "Sorry, the model cannot answer this question."
}
]
[
{
"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.