はじめに
これまで、個人的な実験として、Google Colab を使ったマルチモーダルの実験(Google AI Gemini APIを使ってマルチモーダルを体験してみた)や、ファインチューニングの実験(Google AI Gemini APIを使ってファインチューニングを実施してみた)、仕事では、Azure の Document Intelligence を用いた RAG システムの PoC 等を行ってきておりましたが、AWS でも AI を検証してみたく、この度 Bedrock を使っての RAG について調べてみました。他の記事なども参考にしつつ、自分なりに色々実験してみましたので、ご参考にしていただけると嬉しいです。(今回は GoogleColabでPythonを使ってクラス成績を可視化してみたで使った Excel のシートを RAG として読み込ませようと思います)
Bedrock とは
まずは Bedrock について簡単に説明します。Bedrock は、AWS において生成AIアプリケーションを構築・スケールするためのフルマネージドサービスです。様々な基盤モデル(FM)を利用でき、テキスト生成、画像生成、チャットボット作成など、多岐にわたるAI機能を提供します。
RAG とは
RAG(Retrieval-Augmented Generation:検索拡張生成)は、大規模言語モデル(LLM)の性能を向上させるための技術の一つです。LLMは膨大なデータで学習していますが、特定の情報や最新情報については知識が不足している場合があり、誤った情報を回答する(ハルシネーション)ことがあります。RAGは、LLMが質問に答える前に外部のデータベースや知識ベースから関連情報を検索し、その情報を基に応答を生成することで、より正確で信頼性の高い回答を可能にします。
ナレッジベースとは
AWS Bedrock のナレッジベースは、生成 AI アプリケーションにおける検索拡張生成 (RAG) のワークフロー全体を効率化するためのフルマネージド機能です。
後述しますが、私が触ってみた感想としては、RAG データの保管元(S3等)の指定や、検索データベース(Aurora等)の利用が簡単にできる様になっており、大変便利だなと感じました。
ナレッジベースを使った RAG 検証の準備
早速ですが、ナレッジベースを使って RAG を検証してみましょう。
①RAG 用の対象文書の準備
まずは RAG の情報元を格納するため、対象文書を用意し、対象文書を S3 に保存します。
(対象文書は、PDF、JPEG、Word、Excel、PDF文書などを適宜用意してください)
「パケット作成」をクリックします。
パケット名を入力します。(その他の項目はデフォルトのまま)
「パケットを作成」をクリックします。
これで S3 のパケットが作成されました。続けて S3 に RAG の対象文書を格納します。
パケットの名前(上記例では rag-test-1234567890)をクリックします。
「ファイルを追加」をクリックします。
ファイルを指定するダイアログが出てきますので、RAG 対象文書を指定します。

ローカルのデスクトップ等からファイルを選択して、「アップロード」をクリックします。
ファイルを指定するダイアログが出てきますので、RAG 対象文書を指定します。
アップロードが完了すると、
のようなメッセージが表示されます。
これで、RAG 対象文書の準備ができました。いよいよ Bedrock の設定です。
②Bedrock ナレッジベースの設定
Bedrock の ナレッジベースの準備を行います。
Bedrock の初期画面より、「ナレッジベース」を選択します。

続けて、「Create」→「Knowledge Base with vector store」を選択します。
ここからは、ウィザード的な画面になり、次のステップを実施していきます。
ステップ 1:ナレッジベースの詳細を入力
ステップ 2:データソースを設定
ステップ 3:埋め込みモデルを選択し、ベクトルストアを設定する
ステップ 4:確認して作成
ステップ1では「ナレッジベース名」や「データソース(S3)」なども自動入力してくれているので、そのまま「次へ」で大丈夫です。
ステップ2では「データソース名」などは自動入力してくれているので、①でファイルをアップロードした S3 のバケットを選択します。「S3を参照」で、バケット選択画面が表示されます。

S3 のバケットを選択(チェック)して、「選択」でバケット選択が完了します。

なお、このデータソースは、最大5つまで設定できると記載されていますので、複数の場所にあるS3バケットを指定できる様です。
また、S3 以外に、「Web Crawler - Preview」という選択肢もあり、Webクロールして RAG データとして使うこともできるようです。(これは追って調べてみたいと思います)
また、データソース毎に、そのデータソースの「Parsing strategy(解析戦略)」と、「チャンキング戦略」が選択できます。(今回はいずれもデフォルトを使っています)
+αの料金を払うことで、より精度の高い RAG を構築できそうです。ので、こちらも調べてみたいと思います。

なお、チャンキングについては、下記の選択肢があります。

ステップ3では、「埋め込みモデル」と「ベクトルストア」を選択します。

「モデルを選択」では、日本語対応であり、精度も高いということで、今回は「Cohere」の「Embed Multilingual V3」を選択しています。

「ベクトルストア」では、デフォルトの「Amazon OpenSearch Serverless」を選択しています。(Auroraも含めて、Serverless の時代を感じます)
※OpenSearch Serverless より、Aurora Serverless の方が安価なようです。
ステップ4は、確認だけですので、確認の上「ナレッジベースを作成」を行います。

かなり時間がかかりますので、しばらく休憩するのがお薦めです。^^
(私の環境では、10分程度で完了しました)
③いよいよ ナレッジベース で問い合わせを実施!
ナレッジベースが作成されると、次の画面になりますので「モデルを選択」します。

ここで、モデルのリストが表示されますが、モデルが有効になっていません!
「アクセスをリクエスト」リンクを押して、モデルを有効にする必要があります。

使いたいモデルを選択して、有効化するのですが、今回は「すべてのモデルを選択する」としています。

下記の様なリストが表示されますので、一番下の行まで行き「次へ」としてください。
(今回の画面コピーでは「次へ」が見えてませんのでご了承ください)

続けて確認画面が表示されるので「送信」を押すと有効化ができます。

モデル選択画面に戻ると、モデルが選択可能になっていますので、モデルを選択して「適用」してください。

※ここで、「3.推論」のところで、「推論プロファイル」というのを選択しています。
モデルによっては、

のように、「オンデマンド」が選択できるのですが、私の環境でオンデマンドを使うと、

の様なエラーとなってしまいました。
「オンデマンド」の方が安価で利用ができそうなのですが、「推論プロファイル」の方が、リクエスト制限などによる不具合を少なくできると判断しました。
(こちらはもう少し調べてみようと思います)
続いて、データソースの同期を行います。まずは「データソースに移動」を押してください。

すると画面の中央あたりに、データソースが表示されるので、以前に作成したデータソースを選択(チェックボックスをチェック)します。

下の様に同期ボタンなどが表示されるので「同期」ボタンを押します。
(同期は忘れがちなので、もしうまくいかないな、と思ったときは「同期」を疑ってみてください)

少しの間、下記が表示されます。(RAG に入れるデータの量により時間が変わりますが、少量であれば数秒~1分以内で終わります)

同期が終わると、下記の様な画面になり、いよいよ確認ができる状態になりました。

ナレッジベースを使って RAG を検証
早速 RAG の精度がどのようなものか検証してみましょう。
今回入力したのは、以前に使ったテストデータですので、それに対して質問してみました。
まずは簡単な質問から実施してみましょう。

名前が呼び捨てですが^^;、なかなか調子が良いので、少し難しめな質問をしてみました。

・・・修正前の記事で正解と書いてしまったのですが、平均点はちょっと違ってました。
原因を調べようと思い、「ソースの詳細を表示」してみたところ、
の様にチャンクが2つに分かれてしまっていることが判りました。
平均点は全体が見れないと算出できないので、これが原因ではと考え、ナレッジベースのチャンクの設定を「チャンクなし」の様に変えて、再作成してみました。

この結果、下記の様にソースチャンクを1つにすることはできました。
そして平均点も正解!と言いたいところですが、どういうわけか平均点は、

となり、Excelで計算した平均値(56.8)とは異なる結果となりました。
(こちらについても、継続して検証をしてみようと思っております)
なお、データ全体に対する質問については難しかったですが、

のような行に対する質問などについてはすべて正解が得られました。
コストについて
気になるコストについてですが、正直なところ、予想よりも少なかった感じです。
今回、当初 OpenSearch Service を使っていたのですが、それが一番大きく、とはいえ 3 ドル程度、ちょっと高くなるかもと考えて、途中から Aurora Serverless を使ったので、それが概ね 1 ドルちょっとでした。
他の AI 系リソースは、今回の検証程度であれば、ほぼ無視できる金額でした。
実は今月末まで、無料枠が適用されているので、そのおかげかもしれませんが、ご参考まで。
たまに AWS セミナーなどで、アンケートに答えると xx USD 分のクレジットが配布されたりしますので、それを使えば検証には十分な感じです。
まとめ
今回は「AWS で Bedrock の ナレッジベース を使って RAG を検証」というテーマで、以前に GoogleColabでPythonを使ってクラス成績を可視化してみたで使った Excel のシートを RAG として読み込ませてみました。
ちょっとうまくいかない部分もありましたが、概ね良い結果が得られました。
今回検証をしながら、色々なモデルや RAG データの格納先が選択できること、データソースもいろいろ変えられることがわかりましたので、いろいろ面白い使い方がありそうなので、これらも続けて実施していきたいと思います。
さらに、エージェントやフローについても引き続き試してみたいと思います。