生成AIの活用シーンの一つとしてRetrieval-Augmented Generation(RAG)があります。このRAGについて一歩進んだ知識と実装を身につけるにはと考えていたところ、以下のGitHubリポジトリを紹介していただきました。
AWSの研修の一つで利用されているGitHubリポジトリで、主にJupyter notebookで実装されているのであまりコードを書かずに先に進めることができます。ただ、それだと何も考えずに動くことが確認できてしまい、知識の習得には結びつかない気がします。そこで、それぞれの実装について追っていきます。今日はLab1とLab2。
advanced_rag_utils.py
複雑な実装はそれぞれのLabの配下にあるadvanced_rag_utils.pyに書かれています。それぞれのnotebookはadvanced_rag_utils.pyに書かれているメソッドを呼び出す形です。このため、notebookをあまりコードを読まずにサクサク進めると、あまり身につかないかもしれません。
Lab1のadvanced_rag_utils.py
Lab2のadvanced_rag_utils.py
Lab1
Lab1の内容は、チャンキング戦略によるRAGの精度の違いを確認するのが主です。コンソールにてナレッジベースを作成するときにある「チャンキング戦略」の部分になります。

ちなみに、このチャンキング戦略はデータソースを一度作ってしまうと変更することはできません。

Knowledge BaseではRetrieve API(ベクトル検索の結果を返す)とRetrieveAndGenerate API(ベクトル検索の結果だけでなく、検索結果をもとにした回答の生成を行う)があります。それぞれのドキュメントは以下のものです。
Retrieve APIは以下のもの。
RetrieveAndGenerate APIは以下のもの。
Lab1ではRetrieve APIしか使っていませんが、RetrieveAndGenerate APIでは見えにくくなっているscoreデータなどがわかって学習がよく進みました。なお、Lab2ではRetrieveAndGenerate APIの使用例が出てきます。
Lab2
Lab2ではRetrieveAndGenerate APIを使用しています。ここでの注目はメタデータによるフィルタリングです。この機能の利用のためにOpenSearchを使っているのかなと思います。フィルタリングはRetrieveAndGenerateConfigurationを指定することで実装しています。
なお、フィルタリングで使用するメタデータは、Lab1のデータダウンロードの部分(download_and_prepare_science_papersやdownload_and_prepare_csv_dataなど)にて定義し.metadata.jsonをサフィックスをつけた保存していることで登録しています。ここら辺の挙動は以下のブログが参考になると思います。
合わせてLab2ではGuardrailsの試行も実施しています。個人名を自動的に検出して{NAME}に置換している結果を確認できます。
考察
AWSが公開しているGitHubリポジトリを手掛かりにRAGの改善方法についてみてみました。研修で用意されているということもあって、かなり練られた構成であると感じます。一方で、今回はある程度うまくいく手法ですが、実際はここで挙げられている改善方法を実装してもうまく精度向上につながらないこともあると考えています。試行錯誤が必要となりますが、精度改善の武器として知って体験しておくことは必要なことかと考えています。