導入
ここまでの5つの章では、チャンク分割・ベクトル化・検索・プロンプト拡張・精度向上を、それぞれ別のレッスンとして切り出して学んできました。しかし実際にRAGシステムを作るときは、これらを1本のパイプラインとしてつなげて動かす必要があります。ここで一度、全体を俯瞰しておきましょう。
説明
RAGは、レッスン2で見た通り2つのフェーズに分かれます。質問が来る前に済ませておくインデックス作成フェーズと、質問が来たその場で動く問い合わせフェーズです。これまで学んだ要素を、この2フェーズに配置し直すと次のようになります。
flowchart TD
subgraph idx["インデックス作成フェーズ(事前準備)"]
d1["文書収集"] --> d2["チャンク分割"]
d2 --> d3["埋め込み<br/>(ベクトル化)"]
d3 --> d4["ベクトルDBに保存"]
end
subgraph qt["問い合わせフェーズ(質問時)"]
q0["質問"] --> q1["クエリ変換<br/>(言い換え・分解)"]
q1 --> q2["ハイブリッド検索<br/>(キーワード+意味)"]
q2 --> q3["リランキング<br/>(候補の並べ替え)"]
q3 --> q4["プロンプト拡張<br/>(質問+検索結果)"]
q4 --> q5["LLM生成"]
q5 --> q6["出典つき回答"]
end
d4 -.検索対象.-> q2
質問が投げられるたびにインデックス作成フェーズをやり直す必要はありません。ベクトルDBへの保存は事前に一度済ませておき、問い合わせフェーズだけが質問ごとに動く――この非対称さが、RAGシステムを高速に保つコツです。
それぞれのステップを、どの章で学んだか整理しておきます。
| ステップ | やっていること | 学んだ章 |
|---|---|---|
| 文書収集・チャンク分割 | 長い文書を検索しやすい小さな単位に切る | 第2章 |
| 埋め込み・ベクトルDB保存 | 文章を意味のベクトルに変換し、検索できる形で貯めておく | 第3章 |
| クエリ変換・ハイブリッド検索・リランキング | 質問の言い換えや、キーワード検索と意味検索の組み合わせ、候補の並べ替えで検索の精度を底上げする | 第5章 |
| プロンプト拡張・LLM生成・出典つき回答 | 検索結果を質問と一緒にLLMへ渡し、根拠を示しながら答えを作らせる | 第4章 |
実装の選択肢
このパイプラインを実際に組むとき、道は大きく2つあります。1つは、これまでのレッスンでやってきたように、TfidfVectorizer やベクトルDBのクライアントを自分でコードに書いてつなぐフルスクラッチの方法。もう1つは、LangChain や LlamaIndex のようなフレームワークを使う方法です。これらは検索器(retriever)・チャンク分割器(text splitter)・プロンプトのテンプレートといった部品をあらかじめ用意してくれていて、部品を差し替えるだけでパイプラインを組み立てられます。仕組みの中身は今回学んだものと同じなので、フレームワークを使うときも「今、パイプラインのどこを触っているか」が見えるはずです。
まとめ
- RAGは「インデックス作成フェーズ(事前準備)」と「問い合わせフェーズ(質問ごと)」の2段構えで、これまでの各章はこの地図のどこかに対応している。
- 文書収集・分割は第2章、ベクトル化と検索は第3章、生成につなぐ部分は第4章、精度向上の工夫は第5章で学んだ。
- 実装はフルスクラッチでもLangChain・LlamaIndexのようなフレームワークでもよく、どちらも部品の組み合わせという骨格は同じ。