GenU の RAG チャットで精度向上のためのデバッグ方法

# はじめに

[GenU (Generative AI Use Cases JP)](https://github.com/aws-samples/generative-ai-use-cases-jp) で、RAG チャットを利用しているときに、理想の回答が生成されない場面に遭遇する場合があります。いきなり最初から精度 100 % の回答を目指すのは難しく、良くない回答が得られた際に、内容を確認しながら改善する取り組みが必要です。

今回の記事では、何が原因となっているのか深ぼる方法を簡単に紹介します。



# 見るべき観点

GenU で RAG チャットを利用するときに、見る観点は大きく 3 つあります。この 3 つを確認したあとに、その後の改善アクションに結び付けると良いでしょう。

- Kendra に、どういったクエリーを実行しているのか？
- Kendra から、どういったデータを取得しているのか？
- どういう回答が理想の回答なのか？そのギャップは？



GenU の RAG の構成を、ざっくり図で示すとこんなかんじです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/bb4bc29b-5070-e8f1-06ba-35a5a11639e0.png)


「2. Kendra のクエリーを生成してください」の部分で、Kendra へのクエリー文章を生成しています。これが、どんなクエリーが生成されているのかを確認すると良いです。

「5. 関連ドキュメント」の部分では、Amazon Kendra から検索して取得してきた一部のドキュメントを取得します。取得してきているドキュメントを基に回答をします。別の表現をすると、取得できていなかったドキュメントは回答に使われません。

「7. 回答を生成」の部分で、理想の回答と、実際の回答のギャップを確認します。このギャップを基に、データをどのように準備するべきか具体的な改善のアクションに結び付けられます。

以下のリンクをクリックすると、GenU の GitHub 上で具体的なプロンプトを確認できるので、興味があれば見てみてください。

- [Kendra のクエリーを生成しているプロンプト](https://github.com/aws-samples/generative-ai-use-cases-jp/blob/main/packages/web/src/prompts/claude.ts#L162-L180)

- [回答を生成しているプロンプト](https://github.com/aws-samples/generative-ai-use-cases-jp/blob/main/packages/web/src/prompts/claude.ts#L182-L223)

![image-20240705000225683.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/3338a86e-5c62-39bf-c9fb-ec5ea01002e7.png)

# Tips : Knowledge Bases の場合

RAG チャットは Kendra ベースのものに加えて、Knowledge Base ベースのものも利用できるようになっています。この場合、RAG の構成が異なり、確認観点が 1 個減ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/f96c45ac-523f-eba4-c9b5-0cdc426de16f.png)

Kendra の場合は、Kendra にクエリーする文字列を Bedrock で生成していましたが、Knowledge Bases の場合は、直接利用している違いがあります。ただ、本質的な考え方は同じで、どんなデータがかえって来ているのか、理想の回答とのギャップを確認して、具体的な改善の行動につなげていきます。


# 観点を確認する方法

Chrome を利用した手順を記載します。Firefox などでもたぶん似たようなことが出来るはずです。

まず、Chrome で RAG の画面を開いたあとに、Developer Tools を開きます。

![image-20240705001339384.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/25a4c3b9-4bcb-6104-9433-ea650b39bf8a.png)

　

こんな感じで、Network のタブを表示します。

![image-20240705001243822.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/9b97cff8-d2e9-2d2f-52c8-1c5093096789.png)

　

質問を投げます。

![image-20240705001442658.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/f90b7cdc-a35a-acb6-a8ab-62d445a5bba5.png)

　

すると、Kendra に Query するための「クエリー文字列」を生成する predict を呼んでいることが確認できます。

![image-20240705001650763.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/24bd5266-8b93-1529-9f35-14a52d2697ec.png)

　

**確認ポイント 1 個目です。**

この  Response が「出張時の日当の金額」と確認できます。これが Kendra のクエリーに使われます。

![image-20240705001742151.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/c181249e-ea80-8eb9-c2cd-18563e04aa1f.png)



　

**確認ポイント2 個目です。**

次に Kendra へクエリーした結果、取得した関連ドキュメントについて確認します。`retrieve` 呼び出しのところで、Preview を開きます。「第 11 条 出張者が...」 と見えているのが、Kendra から取得してきた関連していると思われるドキュメントの一部です。

取得している複数のデータを取り出していますので、これをすべて確認しましょう。回答してほしい理想の回答とギャップがあるときに、そもそも Kendra からデータが取得が出来ていない可能性も十分に考えられます。

![image-20240705002035291.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/fc61b4cb-1dc9-ac7b-46fe-2f7756227882.png)





# 改善のためのアクション

上記の確認ポイント 1 と確認ポイント 2 を取得したうえで、理想の回答と実際の回答のギャップを確認しながら改善のアクションを検討していきます。

この記事では詳細はとりあげませんが、クラメソ様の記事がわかりやすいので、このあたりを参考にしてみてください。

https://dev.classmethod.jp/articles/rag-knowledge-on-real-projects/