本文へスキップ
BecomeCoder

RAGコース · 第6章 まとめと次の一歩 · レッスン24

RAGパイプライン全体の組み立て

ローカル実施

導入

ここまでの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つは、LangChainLlamaIndex のようなフレームワークを使う方法です。これらは検索器(retriever)・チャンク分割器(text splitter)・プロンプトのテンプレートといった部品をあらかじめ用意してくれていて、部品を差し替えるだけでパイプラインを組み立てられます。仕組みの中身は今回学んだものと同じなので、フレームワークを使うときも「今、パイプラインのどこを触っているか」が見えるはずです。

まとめ

  • RAGは「インデックス作成フェーズ(事前準備)」と「問い合わせフェーズ(質問ごと)」の2段構えで、これまでの各章はこの地図のどこかに対応している。
  • 文書収集・分割は第2章、ベクトル化と検索は第3章、生成につなぐ部分は第4章、精度向上の工夫は第5章で学んだ。
  • 実装はフルスクラッチでもLangChain・LlamaIndexのようなフレームワークでもよく、どちらも部品の組み合わせという骨格は同じ。