🔥

RAG入門

に公開

1. RAGの基本

業務で RAG アプリケーションを開発する機会があり、今までRAGという言葉を雰囲気で使っていたのでこのタイミングで勉強してみました。

RAG(Retrieval-Augmented Generation)は「外部知識を検索してから生成AIに渡す」仕組みです。社内文書検索やFAQ対応などに広く使われています。
仕組みとしては大きく5つのステップに分かれており、以下で詳しく解説します。


Step1: 文書のチャンク化と埋め込み

チャンク化

長文を“小さなまとまり”に分割する処理。

  • 元々の課題: そのままでは検索効率も精度も悪い
  • 狙い: チャンク化で「質問に近い部分」だけを取得できる
  • 効果: 精度とコストを両立できる

オーバーラップ

分割時に一部を重複させることで、文脈が途切れにくくなる。

埋め込み

文章を多次元ベクトルに変換する仕組み。埋め込みモデルを使用する。

  • 出力例: [0.02, −0.11, …]

  • 主な埋め込みモデル

    • OpenAI: text-embedding-3-small
    • Voyage AI: voyage-3 / voyage-3-lite / multilingual-2
    • Google Vertex AI: textembedding-gecko(英語)/gecko-multilingual(多言語)

Step2: ベクターストア格納

埋め込みベクトルをベクターストアに格納し、検索可能な形にする。

自分はこれまで埋め込みとベクターストア格納を同じ意味の言葉だと勘違いしていました。

  • 埋め込み = 数値ベクトル化
  • ベクターストア = 検索用DB(専用のベクトルDBを利用)

Step3: 検索(top-k)

クエリを埋め込みベクトル化し、ベクターストアから「近いk件」を取得(k近傍法)。

  • 例: クエリに似ている複数の文章を返す
    • 画像: TBA
  • LangChainのデフォルトは k=4らしい

取得後の工夫

ただ「k件返す」だけでは不十分。以下の追加処理が使われる。

  1. 再ランキング

    • より関連度の高い順に並び替える
    • 例: クロスエンコーダ利用
  2. 多様性確保(MMR: Maximal Marginal Relevance)

    MMR: 「関連度が高いけど似すぎてない文書セットを選ぶ」アルゴリズム

    • 目的: 関連度だけだと同じ内容だらけになる→多様性も入れて選ぶ
    • 具体例:
    Step1: 最初の1件は関連度で1位を採用
    [選抜] A
    [未選] B C D E F ...
    
    Step2: 2件目は「関連度」-「Aとの似すぎ度」で評価
    [選抜] A  +  C ← BはAに似すぎだったので落選
    [未選] B D E F ...
    
    Step3: 3件目も同様に追加
    [選抜] A  C  E
    [未選] B D F ...
    
  3. 文脈を広げる(Parent Document Retrieval)

    • 背景: 小チャンクだけでは前後が欠けてしまう
    • 目的: 親の塊に戻すことで誤読を防ぐ
    • 具体例: (ChatGPTのスクショですみません)
    • LangChainの ParentDocumentRetriever で実現可
  4. スリム化(コンテキスト圧縮)

    • 不要な部分を削って効率化
    • LangChainの ContextualCompressionRetriever を利用可(デフォルトOFF)

Step4: プロンプト組み立て

検索で得た文書をそのまま渡すのではなく、プロンプト設計で回答の質が決まる。

Anthoropic おすすめの方針:

  • 与えたコンテキストのみで回答させる
  • 不確実な場合は「不明」と答えさせる
  • 出典を併記させる

Step5: 回答生成

最後に、LLMが文脈とプロンプトを元に回答を生成する。
ここは一見シンプルだが、RAG全体の品質はここまでの準備工程に大きく依存する。


2. FAQ

自分が気になった疑問と、それについて調べた結果をつらつらと書いていきます。

Q. LangChainって何?

RAGを効率よく実装するためのフレームワーク。

  • 文書ローダーやリトリーバーなどの機能が標準搭載
  • 部品を組み合わせる感覚でRAGアプリを構築できる

補足

  • ローダー = PDFやWebページからテキストやメタデータを抽出する仕組み
  • ベクターDBは内包してる? → 内包していない。外部のDBを接続する形。

Q. 「ハイブリッド検索」とは?RAGでなぜ有効?

→「キーワード検索」と「ベクター検索」を合わせた検索方法
→ それぞれの長所を組み合わせることで精度が安定しやすくなる(Elastic より)


Q. RAGとファインチューニングの使い分けは?

  • TBA

Q. RAGに与えるドキュメントはどのように最新化する?

  • TBA

Q. ベクターDBってRDB?

  • TBA

Discussion