AWS Bedrock でナレッジベース-メタデータフィルタを2025年8月当時に構築した際、
詰まった点や後学の知見のために、メモ書きとして作成した記事になります。
- 注意点
- 利用しているAWSインスタンスは自作ではなく、他で検証中利用しているインスタンスの流用です
- 内容確認にはzennやQiita等の各種記事や書籍のサンプル、AmazonQの回答を参考している
- 実ロジックの実装や環境構築にはCopilotのAgentモードを利用している
そのため、誤認や最適解でない場合や、最初からAWS環境を構築していれば前提となる知識の場合もあります。
不備にはコメントを頂けると幸いです。
やったこと
- AWS S3を用いたナレッジベースの構築→メタベースフィルタの適用
(複数の文章ファイルから、関係性のあるファイルに限定して文章内容を抽出する) - pythonからboto3を経由した呼出ロジックの実装
知見と詳細
Amazon OpenSearch Serverless と Amazon Aurora の利用差異
→ 「抽出対象のナレッジを事前に絞り込み」のため、「SQLのWHERE句」との類似を「matadata.jsonの記述」で実行できるとのこと
- Amazon OpenSearch Serverless : matadata.json ファイルの記述から事前フィルタを実行
- Amazon Aurora : 以下2種類で事前フィルタが可能
- ナレッジベース作成/同期にて、Aurora DB に custommetadata カラムが作成される(matadata.json の内容が保持される)
- Aurora and RDS から、 任意カラムを追加することでフィルタ利用が可能(値は同期で連携されない為、自前でupdateが必要)
ナレッジベースのベクトル情報の確認方法
Amazon Aurora でナレッジベースを作成している場合に、クエリエディタから確認可能。(OpenSearch Serverless では内部を確認できないが、おそらく同様に保持している)
- chunks カラム:文書情報を文字情報として分割して保持
- embedding カラム:chunks をベクトル化した多次元情報
※ 確認手順
-
Amazon Bedrock > ナレッジベース から、対象のナレッジベースに対して、以下4情報をメモ
- Amazon Aurora DB クラスター ARN
- 認証情報シークレット ARN
- データベース名
- テーブル名 -
Aurora and RDS > データベース から、「Amazon Aurora DB クラスター ARN」に一致する リージョン別クラスターを確認
-
Aurora and RDS > クエリエディタ から、以下の情報を入力して接続
- データベースインスタンスまたはクラスター : 2 で確認したクラスタの値を選択
- データベースユーザー名 : Secrets Manager ARN と接続する
- Secrets manager ARN : 1 でメモした 認証情報シークレット ARN
- データベースの名前を入力 : 1 でメモした データベース名
-
select * from <1でmemoしたテーブル名> にて、ナレッジベースのDB情報を取得(カラム追加などもalter table で可)
推論プロファイル
ナレッジベースのテスト の際、「オンデマンド」「推論プロファイル」と存在しており、「推論プロファイル」は操作中のリージョンで利用できないため、他リージョンから流用しているモデルとなる
Amazon Bedrock > Cross-region inference にて、「推論プロファイルのモデル」が表示されているため、プログラムからの呼出時、「modelArn」で指定する値はこちらを用いることとなる。
"Sorry, I am unable to assist you with this request." エラーの発生
フィルタ の指定内容が誤っている場合に発生する
→ プログラム呼出ではメソッド引数の jsonに フィルタ要素の保持が必要なので、エンドユーザの任意入力では頻発が懸念される
{"knowledgeBaseConfiguration" :
{"retrievalConfiguration" :
{"vectorSearchConfiguration" :
{"filter" :{***} }}}}
retrive と retrive_and_generate
プログラムから「boto3.client(***) 」からの呼出すメソッドについての差異
- retrive : ナレッジベースの呼出だけを実行する
- response["retrievalResults"]["score"] にて、評価スコア(質問内容に検索結果が一致しているか)を取得できる
- retrive_and_generate : ナレッジベース呼出の内容を、改めてモデルで要約する(以下で両方を取得できる)
- response["output"]["text"] → ナレッジベースの呼出結果
- response["output"] → 要約結果
ベクトル検索の中身
Aurora の場合、パラメータグループを作成することで、検索の途中経過(実行SQLでスコア値など)を確認できる
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/USER_LogAccess.Concepts.PostgreSQL.Query_Logging.html#USER_LogAccess.Concepts.PostgreSQL.Query_Logging.mitigate-risk
SEMANTICとHYBRID
- SEMANTIC : ベクトル検索だけを実行する(ユーザプロンプトをベクトル化して検索する)
- HYBRID : ベクトル検索と入力文字の両方で検索する(ユーザプロンプトが単語/文脈解釈が難しい場合、こちらがよい)
利用を終えた aurora serverless の削除
aurora の場合、ナレッジベース作成で「Aurora and RDS」にDBクラスタ/インスタンスを作成しているため、自動作成されているサービスの削除も必要となる
ナレッジベースの スタック名 で、CloudFormation の対象スタックを削除することで、DBインスタンスなども削除される
関連資料