USB-C HDMI 変換ケーブル 1M|4K@30Hz 映像出力|Thunderbolt 3/4 完全対応|設定不要/在宅勤務|Type C HDMI 接続ケーブル MacBook Pro/Air(M1/M2/M3)、iPad Pro/Air(M1/M2)、iPhone 15/16 シリーズ、Galaxy S/Note シリーズ 多機種対応
¥849 (2025年4月25日 13:08 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)ソニー ゲーミングイヤホン INZONE Buds:WF-G700N Fnatic監修 / 完全ワイヤレス / 低遅延2.4GHzワイヤレス接続 USBType-Cトランシーバー同梱 / LE Audio対応 / アクティブノイズキャンセリング / 立体音響 / 最大約24時間バッテリー / 急速充電 / マイク付き / PS5 スマホ PC Switch ホワイト
¥27,000 (2025年4月25日 13:07 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)
Amazon Bedrockのナレッジベース機能を使って、RAG(Retrieval-Augmented Generation)システムを構築します。RAGシステムでは、テキスト情報をベクトルに変換するエンベディングモデル、ユーザーの入力に基づいて回答を生成するテキスト生成モデルなどの基盤モデルを利用するのが一般的です。最近のテキストモデルは多くのトークンを扱うことが出来ますが、エンベディングモデル側の最大入力トークン数に注意しておく必要があります。
情報をベクトルデータベースに登録する際の処理イメージは以下の通りです。たとえば、「Aさんは静岡県出身」といったテキスト情報をあらかじめS3に格納しておきます。次に、ナレッジベースを同期すると、S3内の情報がエンベディングモデルによってベクトル(浮動小数点数のリスト)に変換され、ベクトルDBに保存されます。
チャットシステムなどを通じて、ユーザーがナレッジベースに問い合わせを行う際の処理フローについて説明します。たとえば、ユーザーが「Aさんの出身地は?」と質問した場合、Claude 3のようなテキスト生成モデルがそのままベクトルDBにクエリを投げるわけではありません。
まず、「Aさんの出身地は?」といった質問文をエンベディングモデルによりベクトル(浮動小数点のリスト)へと変換します。そのベクトルをもとに、ベクトルDB内の類似情報と照合して、関連するチャンクを取得します。その後、取得した情報をもとに、テキスト生成モデルが自然な回答を生成するといった流れになります。AWSの以下マニュアルに詳しい流れが書かれています。
Bedrockを使ってRAGシステムを構築中、RetrieveAndGenerateStream
メソッドを使用した際に、以下のようなエラーが発生しました。入力値または設定値に問題があるとのエラーですが、毎回発生したわけではないので、入力値に問題があるのではないかとあたりをつけました。
An error occurred (ValidationException) when calling the RetrieveAndGenerateStream operation: Invalid input or configuration provided. Check the input and Knowledge Base configuration and try your request again. (Service: BedrockAgentRuntime, Status Code: 400, Request ID: ****-****-****-****-****) (SDK Attempt Count: 1)
原因切り分けのため、ナレッジベースに対して直接問い合わせを行い、回答を得るテストプログラムを作成しました。入力文字数、応答結果、エラー内容を返してくれます。
import boto3
import json
REGION = "ap-northeast-1"
MODEL_ARN = "arn:aws:bedrock:ap-northeast-1::foundation-model/anthropic.claude-3-haiku-20240307-v1:0"
KNOWLEDGEBASE_ID = "*******"
# boto3 クライアント初期化
bedrock_agent = boto3.client("bedrock-agent-runtime", region_name=REGION)
# テストプロンプト
user_question = "これはテスト用の質問です。" * 80
context_prompt = f"""
以下はユーザーからの質問です:
{user_question}
"""
print(f" context_prompt文字数: {len(context_prompt)}")
# API 呼び出し
try:
response = bedrock_agent.retrieve_and_generate_stream(
input={"text": context_prompt},
retrieveAndGenerateConfiguration={
"type": "KNOWLEDGE_BASE",
"knowledgeBaseConfiguration": {
"knowledgeBaseId": KNOWLEDGEBASE_ID,
"modelArn": MODEL_ARN,
}
}
)
# ストリーム受信
print("応答:")
for event in response.get("stream", []):
if "output" in event:
print(event["output"]["text"], end="")
except Exception as e:
print("エラー発生:")
print(e)
下記のように、異なる文字数での確認を行いました。
✅ 問題無し
# テストプロンプト
user_question = "これはテスト用の質問です。" * 80
context_prompt文字数: 1082
応答:
申し訳ありませんが、この質問に対する回答を検索結果から見つけることはできませんでした。この質問は、テスト用の質問であり、検索結果には関連する情報が含まれていないようです。
❌ 問題あり
# テストプロンプト
user_question = "これはテスト用の質問です。" * 100
context_prompt文字数: 1342
エラー発生:
An error occurred (ValidationException) when calling the RetrieveAndGenerateStream operation: Invalid input or configuration provided. Check the input and Knowledge Base configuration and try your request again. (Service: BedrockAgentRuntime, Status Code: 400, Request ID: ****-****-****-****-****) (SDK Attempt Count: 1)
使用していたエンベディングモデル「Cohere Embed Multilingual」の最大トークン数512に引っかかってエラーが発生していました。ナレッジベースで使用するエンベディングモデルをTitan Text Embeddings V2(最大トークン数:8k)にして再作成後、エラーが解消されました。