【AWS】Bedrockを触ってみたらすぐにRAGとして利用できた【備忘録】

はじめに
-
AWS Bedrockは、ナレッジベースを構築するための強力なツールです。
この記事では、Bedrockを利用してナレッジベースを構築する手順を解説します。


システム概要
--
<目的要件>
S3に保存されたpdfファイルからベクトルストアを作成し、
Bedrockで情報抽出(RAG)を行う。

以下のAWSサービスを使用しました。
・AWS Bedrock
・AWS S3
・Amazon OpenSearch Serverless

過去にopensearchを使用した件は下記

https://qiita.com/tomoya-Miyake/items/2184ee7aaaa454af508a


<簡易アーキテクチャ>
![キャプチ2ャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3978543/3c4a26db-ce3c-4410-b7f5-90547059a77e.png)

下記記事を参考にさせていただきました。

https://zenn.dev/ncdc/articles/41bf6e7735ec9f



実装手順
--
1. AWSアカウントの準備とサービスの有効化
2. データの準備とアップロード
3. ナレッジベースの種類を選択
4. ナレッジベースの作成
5. RAGの実装

1.AWSアカウントの準備とサービスの有効化
--
下記3つを実施してください。

・AWSアカウントにログイン
　AWSの公式サイトでアカウントを作成し、Consoleにログインします。

・必要なサービスの有効化
　AWS Management Consoleで「Bedrock」を検索し、サービスを有効化します。

・IAMユーザーの設定
　AWS Identity and Access Management（IAM）を使用して、
　必要なアクセス権限を持つユーザーを作成します。


2.データの準備とアップロード
--
必要なデータ（テキスト、PDF、Excelなど）を収集・整理します。
S3にアップロードし、完了です。
今回はアイスクリームの景品表示法についての資料を入れました。

![キャプaチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3978543/3feb5fa9-4168-46c1-9032-929c185de3e2.png)


※バケット設定・バケットポリシー・IAMロールは各自設定ください。



3.ナレッジベースの種類を選択
--
Bedrockのコンソールのメニューからナレッジベースを選択して新規作成を押下する


![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3978543/46b37f77-3216-42c2-b655-3914b5e5cff4.png)

AWS Bedrockでは、以下のナレッジベースタイプから選択できます。用途に応じて選びます。
今回はpdfファイルでテストするためベクトルストアを含むナレッジベースを使用します。
 

■ ベクトルストア
　大量のテキストデータやメディアファイルを迅速に検索したい場合
■ 構造化データストア
　表形式のデータ（例えば販売データ、顧客情報）を効率的に管理したい場合
■ Kendra GenAI
　高度な質問応答システムやドキュメント検索を実現したい場合


4.ナレッジベースの作成
--
ナレッジベース名とロールを設定します。

![aaaaaa.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3978543/89d8a959-8e70-49ec-9c1a-0543f3c85030.jpeg)

データソースを選択します。
ここではS3を選択する。選択したら「次へ」ボタンを押下(tag,ログ配信は未設定)
![s3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3978543/aec47419-29d4-4768-8ee5-4d63c3c23b3f.jpeg)

他の選択肢については下記らしい。
■ ウェブクロール
　指定したウェブページから直接データを取得し、その情報をナレッジベースに追加
■ カスタムデータソース
　外部システムから独自にデータを取り込むため、設定次第で柔軟なデータ管理が可能
■ Confluence/Salesforce
　これらのツールに格納されているデータを直接AWS Bedrockで利用できるようになります。
　企業内のドキュメントやCRMデータを統合することができます。


先ほど作成したS3と紐づける。
(S3と同じリージョンで作成しないと選べないようです。)
他の設定はとりあえずデフォルトのままで。

![datasouse.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3978543/d7c16e0b-3c0e-4643-befc-75068fd6bf4c.png)

埋め込みモデルと、ベクトルストアを設定する
埋め込みモデルは「Embed Multilingual V3」を一旦選択。
マルチリンガル対応なので日本語資料もうまくベクトル化してほしい。

ベクトルストアは「Amazon OpenSearch Serverless」を使用するが、費用を抑えるなら「Aurora PostgreSQL Serverless」を、RAGの精度が「GraphRAG」によって上がりそうな資料の場合は「Amazon Neptune Analytics」を選択すると良さげ。

![em.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3978543/e32df805-0e13-4f3f-915f-4e10027ad79a.png)

設定完了後、「ナレッジベースを作成」を押下すると5~10分程度でナレッジベースが完成。

5.RAGの実装
--
ナレッジベース画面でもテスト的にチャットができますが、下記のようにエージェントまで作成すると、詳細設定までできるようになるのでチャットの精度が向上します。

![test1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3978543/20538ef5-5be7-4201-9c00-6d2115481170.png)

![ej.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3978543/62dd8e0f-b630-415c-b04d-580020bd0ec9.png)

今回はエージェントの作成までは割愛します。お疲れ様でした。
次回、Evaluations Create automatic Knowledge Base evaluationでRAGの精度評価ができる？と聞いたので使ってみようと思います。
(なんならこっちがメインで下準備でした。)


蛇足：ナレッジベースの種類と利用ケース
--
① ベクトルストアを含むナレッジベース
　ベクトルストアは、データを数値的なベクトル形式に変換して保存し、
　類似性検索や情報抽出を高速に行えるストレージです

　<拡張子例>
　　テキストファイル（.txt, .csv, .json）
　　PDF, Wordファイル（.pdf, .docx）
　　音声データや画像データ（音声認識や画像キャプション）

　<使用ケース例>
　　RAG構築: データをベクトル化し、検索ができる
　　検索エンジン: 大量のテキストデータから関連する情報を迅速に検索

② 構造化データストアを含むナレッジベース
　構造化データストアは、データを表形式で保存し、
　効率的に検索や集計を行えるデータベースストレージです。

　<拡張子例>
　　CSV, Excel, JSON などの表形式データ
　　データベースバックアップファイル（.sql, .db）

　<使用ケース例>
　　販売データの分析: 商品売上や取引履歴を管理し、SQLクエリで集計や分析。
　　顧客管理システム: 顧客情報を整理し、検索やフィルタリング機能を提供。


③ Kendra GenAI Index を含むナレッジベース
　Kendra GenAIはAIを活用した検索サービスで、文書データをインデックス化して、
　ユーザーの質問に基づいた答えを迅速に提供します。

　<拡張子例>
　　PDF, Word, HTML, Markdown などの文書ファイル
　　スプレッドシート（Excel, CSV）
　　メールやチャット履歴（.eml, .msg, .json）

　<使用ケース例>
　　企業の内部ドキュメント検索: 技術マニュアルやポリシー文書を検索可能にする。
　　FAQシステム: よくある質問をインデックス化し、迅速な回答提供。


※③ Kendra GenAI Index > ① ベクトルストア　の精度イメージ。ただし③の方が高額


はまったポイント
--
・ベクトル化にかかる料金が想像以上に高かった。
　　何回かテスト的にナレッジベースを作成したが、
　　特に、OpenSearchによるベクトル化を数回実施した際に想定以上の料金がかかった。

　<原因>
　　OpenSearchでデータをベクトル化する際、データ量やリクエスト回数に応じて追加料金が発生
　　テストを行った回数が多く、またベクトルストアが大きくなると、その分だけ料金が積み上がる


　最終的に、OpenSearchを何度も使用したため、料金が約1万円ほど発生してしまいました。💦
　予想していた以上のコストで、テストの段階では注意が必要だと感じました。
　恥ずかしいポイントです。。

　<対策>
　　リソース使用量の制限を設定し、テスト実行の際に必要な最小限のデータのみを使用するようにしました。
　　また、OpenSearchの使用回数を減らし、初期テストの段階では小さなデータセットを使うようにしました。
　　更に、前述しましたがベクトルストアの選択肢を見直すことも重要です。
　　例えば、Aurora PostgreSQL Serverlessを選択することで、費用を抑えつつナレッジベースを作成できることが分かりました。




・S3とBedrockの作成リージョンが異なるため、S3が選択できない
　<原因>
　　AWS Bedrockでナレッジベースを作成する際、S3のバケットとBedrockの作成リージョンが異なっていたため、S3バケットが選択できなかった

　<対策>
　　Bedrockでナレッジベースを作成する際には、S3バケットと同じリージョンでBedrockを設定する必要があるため、AWS Management Consoleでリージョン設定を確認し、
  　同じリージョンで新たにBedrockを作成しました。