本文へスキップ
BecomeCoder
ブログ一覧Wikiコース一覧

RAGとは?生成AIに社内文書を答えさせる仕組みをわかりやすく解説

#RAG#生成AI#LLM#初心者#業務活用

結論:RAGとは「質問に関係しそうな文書をまず検索し、その文書ごと生成AIに渡して答えさせる」仕組みです。 AIを賢くするのではなく、AIにカンペを持たせるのが本質です。だから作り込むべき場所はAIの側ではなく検索の側にあり、精度が出ないときも真っ先に疑うのは検索です。この検索の部分は特別なAPIキーがなくても練習でき、RAGコースではブラウザ内の本物のPythonで実際に動かせます(無料・環境構築なし)。

なぜ生成AIは自社の文書に答えられないのか

大規模言語モデル(LLM)は、大量の文章を学習して「次に来そうな言葉」を予測する仕組みです。裏を返すと、学習に含まれていなかった情報は原理的に知りません。

やっかいなのは、AIが「知りません」と言わずに、それらしい答えを作ってしまうことです。これをハルシネーション(幻覚)と呼びます。社内で使うと「規則にない条文」を堂々と答えてしまう、といった事故になります。

この「知らないことは答えられない」という性質は、AIの出来が悪いから起きているのではありません。仕組み上そうなっているだけです。だから対処法も「もっと賢いモデルを待つ」ではなく、答える材料をこちらから渡すという方向になります。

RAGのいちばん最初の考え方は、RAGコース第1回でLLM単体との比較表つきで説明しています(このレッスンは読み物です)。

RAGの骨格は「検索して、渡して、答えさせる」

RAG は Retrieval-Augmented Generation の略で、日本語では検索拡張生成といいます。名前をそのまま分解すると、やっていることが全部見えます。

語やること
Retrieval(検索)質問に関係しそうな文書を、手元の資料から探す
Augmented(拡張)探してきた文書を、質問と一緒にAIへの入力に足す
Generation(生成)AIは渡された文書を根拠に答えを組み立てる

試験にたとえるなら、記憶だけで答えさせるのがLLM単体、正しい資料を机の上に置いた状態で答えさせるのがRAGです。答える力そのものは変わりませんが、手元に正解が書いてある紙があるかどうかで結果はまるで違います。

そしてこの構造から、重要な結論がひとつ出ます。机の上に置く紙を間違えたら、どんなに賢いAIでも正しく答えられない。RAGの品質は検索の品質でほぼ決まる、と言われるのはこのためです。

全体の流れは2つのフェーズに分かれる

RAGは、質問が来る前にやっておく準備と、質問が来てからやる処理に分かれます。

準備(インデックス作成)のフェーズ

  1. 文書を集める
  2. 長い文書を小さく切り分ける(チャンク分割)
  3. 各断片を数値の並びに変換する(ベクトル化・埋め込み)
  4. 検索できる形で保存しておく

質問が来てからのフェーズ

  1. 質問を受け取り、同じ方法で数値化する
  2. 保存してある断片の中から「近い」ものを取り出す
  3. 取り出した断片を質問と一緒にプロンプトへ詰める
  4. AIが答えを生成する

この2フェーズの地図はRAGコース第2回に図でまとめてあります。そして、この流れを最小構成で通しで動かすのがはじめてのRAGを動かすで、こちらはブラウザ上で実際に実行できます。scikit-learn を使って「検索して、その結果を答えに使う」という一直線の流れを、数十行のコードで体験できます。

つまずきポイント1:なぜ文書を切り刻むのか

初心者がまず「なぜ?」となるのがチャンク分割です。文書をそのまま丸ごと渡せばいいように思えますが、そうしない理由が2つあります。

ひとつは、AIに一度に渡せる文字量に上限があること。もうひとつは、関係のない部分まで一緒に渡すと、答えの根拠がぼやけることです。100ページのマニュアルを丸ごと渡すより、該当する半ページだけを渡したほうが、正確で短い答えが返ります。

一方で、切り方が雑だと今度は文章が途中でぶつ切りになり、「その条件は」で終わって肝心の内容が別の断片に行ってしまいます。これを防ぐために、断片の端を少し重ねるオーバーラップという工夫があります。オーバーラップ付きチャンクはブラウザで実行しながら、重なりの有無で結果がどう変わるかを確かめられます。

つまずきポイント2:「意味が近い」をどう計算するのか

「関連しそうな文書を探す」と一言で言いますが、コンピュータは意味を理解しません。そこで、文章を数値の並び(ベクトル)に変換して、数値としての近さを測るという方法をとります。

最初に理解すべきなのは、キーワードの重みづけの考え方です。TF-IDFを体験するでは、「その文書によく出る語ほど重要、ただしどの文書にも出るありふれた語は軽くする」という重みづけを、実際に行列を表示しながら確認できます。続くコサイン類似度で、2つのベクトルがどれくらい同じ方向を向いているかを数値で出し、ミニ・ベクトルストアで「上位k件を返す検索」を自分で組み立てます。ここまで全てブラウザで動きます。

実務で使う本物の埋め込みモデルや、大量のベクトルを高速に検索する専用の保存先については、本物の埋め込みとベクトルDBの位置づけで読み物として解説しています(外部APIやサーバーが必要なため、これらは実行ではなく解説です)。

仕組みを先に手で作ってから既製品の名前を知ると、「この製品は自分が書いたあの処理を速くやるものだ」と位置づけが分かります。

つまずきポイント3:検索結果をどうAIに渡すか

見つけた文書は、ただ添付するのではなくプロンプトの中に組み込みます。文脈をプロンプトに差し込むではこの組み立てをブラウザで実行して確かめられます。

そのうえで、実務では次の2点を指示に入れます。

このプロンプト設計は出典を示す・幻覚を減らすで扱っています。RAGを入れれば幻覚がゼロになる、ということはありません。渡す資料と指示の書き方で減らしていく、という現実的な話です。

ファインチューニングとの使い分け

「自社データをAIに使わせる」と聞くと、ファインチューニング(追加学習でモデルを仕立て直す方法)を思い浮かべる人もいます。ざっくりした使い分けは次のとおりです。

RAGファインチューニング
得意なこと知識を後から足す・差し替える口調や出力形式、専門的な振る舞いを覚えさせる
情報の更新元の文書を差し替えるだけ学習をやり直す必要がある
出典の提示できる(渡した文書を示せる)難しい
始めるコスト低い高い(データ整備と学習が必要)

社内文書に答えさせたい、という目的であればまずRAGを検討するのが定石です。中身が頻繁に更新される情報を、学習でモデルの中に埋め込んでしまうと、更新のたびに学習し直すことになるからです。

精度が出ないとき、何を疑うか

RAGを組んだのに答えがずれる、という相談はよくあります。このとき最初に見るべきは、AIの答えではなく、検索が何を持ってきたかです。持ってきた文書が的外れなら、その後ろで何を工夫しても答えは直りません。

ありがちな失敗は「検索がRAGの命」にまとめられています。代表的な打ち手は次のとおりです。

最後の項目が実は一番大事です。「良くなった気がする」で調整を続けると、逆効果の変更に気づけません。評価の計算はブラウザで実行できるので、指標の意味を手を動かして覚えてしまうのが早道です。

学ぶ順番:どこから手をつけるか

RAGは生成AIの応用なので、Pythonの基礎があると理解が段違いに速くなります。おすすめの順序は次のとおりです。

  1. Pythonの基礎 — リスト・辞書・関数が読めれば十分です。Pythonコースはprintから関数まで、すべてブラウザで実行できます
  2. 機械学習の感覚 — 「データから学ぶ」がどういうことかを、Python AIコースのはじめての機械学習で体験しておくと、ベクトルや類似度の話がすんなり入ります
  3. RAG本体 — RAGコースを第1章から順に。検索まわりの回はブラウザで動き、生成APIや埋め込みAPIを使う回は読み物として整理されています

Pythonをどこまでやるか迷う場合はPython学習ロードマップ、AI全体の中でのRAGの位置づけを知りたい場合はAI・機械学習の独学ロードマップも参考にしてください。

手を動かさず概念だけ知りたい人へ

「自分で作るわけではないが、社内の企画や外注との会話で困らない程度に理解したい」という場合は、用語集を横断するだけでも輪郭がつかめます。

次に読む

← ブログ一覧に戻る