AIエージェント活用実践編 / Capstone-A — RAG型業務QAエージェント
Retrieval + Generation のループ
無料公開レッスン / 読了目安 6 分
学習のねらい
これまでのレッスンで、ドキュメントのチャンク化とEmbedding、そしてベクトルストアへの保存を学びました。 このレッスンでは、RAG(Retrieval Augmented Generation)システムの中核となる「Retrieval(検索)」と「Generation(生成)」のループを実装します。 具体的には、ユーザーの質問から関連チャンクを検索し、それらをコンテキストとしてLLMに与えて回答を生成させる方法、引用元(citation)の付け方、そして「分かりません」と回答する条件について学びます。
Retrieval (検索) のプロセス
Retrievalは、ユーザーからの質問に対して、最も関連性の高いチャンクをベクトルストアから見つけ出すプロセスです。
- 質問のEmbedding: ユーザーからの質問テキストを、保存されているチャンクと同じEmbeddingモデルでベクトルに変換します。
- 類似度検索: 質問ベクトルと、ベクトルストア内のすべてのチャンクベクトルとの類似度(コサイン類似度など)を計算します。
- 上位K件の取得: 類似度が高い順に、事前に定めたK個のチャンクを取得します。これを「top-K検索」と呼びます。
この上位K件のチャンクが、LLMが回答を生成するための「コンテキスト(context、文脈情報)」となります。Kの値を大きくしすぎると、LLMが処理すべき情報量が増え、ノイズが増える可能性があります。逆に小さすぎると、重要な情報を見落とす可能性があります。適切なKの値は、ドキュメントの性質やタスクによって調整が必要です。
Generation (生成) のプロセス
取得した上位K件のチャンクをコンテキストとして、LLMがユーザーの質問に回答を生成します。
プロンプトの構造
LLMに与えるプロンプトは、以下のような構造が一般的です。
あなたは役立つアシスタントです。
以下の「コンテキスト情報」を参考に、ユーザーの質問に答えてください。
コンテキストに情報がない場合は、「分かりません」と答えてください。
<コンテキスト情報>
{{ 検索結果として取得したチャンクのテキスト }}
</コンテキスト情報>
<質問>
{{ ユーザーの質問 }}
</質問>
このように、コンテキスト情報と質問を明確に区別してプロンプトに含めることで、LLMは与えられた情報に基づいて回答を生成しやすくなります。
AnthropicのClaudeのようなモデルはXMLタグ(<<context>> </context>>など)を使うことで、プロンプト内の情報セクションを明確に区切ることが推奨されています。
Citation (引用元) の付け方
RAGシステムが生成する回答の信頼性を高めるためには、回答の根拠となった情報の「引用元」を明示することが非常に重要です。
Citationのメリット
- 信頼性の向上: ユーザーは回答がどこから来た情報なのかを確認できます。
- 検証可能性: ユーザーは元のドキュメントを参照して、回答の正確性を検証できます。
- 幻覚(hallucination)の抑制: LLMが事実に基づかない情報を生成する「幻覚」のリスクを減らす助けになります。
実装方法
前レッスンでチャンクに付与したメタデータ(ドキュメント名、ページ番号など)をCitationとして利用します。
- LLMに回答を生成させる際に、プロンプト内で「どのコンテキスト情報を使ったか」をLLMに意識させ、回答にその引用元を含めるように指示します。
- 例: 「回答の最後に、参照したコンテキスト情報の
sourceとtitleを[ソース名: タイトル]の形式で列挙してください。」
- 例: 「回答の最後に、参照したコンテキスト情報の
- LLMからの回答と、実際に参照されたチャンクのメタデータを合わせてユーザーに提示します。
「分かりません」を出す条件
RAGシステムは、常に正しい情報を提供できるわけではありません。コンテキスト情報に関連する内容がない場合や、質問が複雑すぎる場合は、無理に回答を生成しようとすると幻覚を起こすリスクがあります。 そのため、「分かりません」と明確に回答する条件を設けることが重要です。
主な条件
- 関連チャンクが見つからない場合: 類似度検索で上位K件のチャンクが見つからなかったり、見つかったとしても類似度が非常に低い場合。
- LLM自身が情報不足と判断した場合: プロンプトに「コンテキストに情報がない場合は『分かりません』と答えてください」と指示することで、LLM自身が判断してくれます。
- LLMの確信度(confidence)が低い場合: LLMの内部的な確信度スコア(利用できるモデルによる)が低い場合に、「分かりません」と回答させることも検討できます。
これにより、ユーザーはRAGシステムの限界を理解し、誤った情報を信じることを防げます。
まとめ
Retrieval(検索)とGeneration(生成)のループはRAGシステムの中核であり、ユーザーの質問に回答するための重要なステップです。 適切なトップK検索とプロンプトエンジニアリングにより、LLMは関連性の高い情報を活用して回答を生成します。 Citationの付与と「分かりません」と回答する条件設定は、システムの信頼性と安全性を高める上で不可欠です。