「RAG」という単語、エンジニア界隈でよく目にするようになりましたよね。
でも「なんとなく知ってるけど、ちゃんとは説明できない」という方も多いはず。この記事では、RAGの仕組みを図解感覚でやさしく解説します。コードは最後に少しだけ出てきますが、基本は読むだけでOKです。
そもそも、なぜRAGが必要なの?
まず、RAGが生まれた背景を理解するために、LLM(大規模言語モデル)の弱点から話しましょう。
ChatGPTやClaudeなどのLLMは、大量のテキストデータを学習しています。しかし、この学習には 学習データの締め切り(カットオフ) があります。
「2026年の最新ニュースを教えて」
→ LLMは学習していないので、正確には答えられない
さらに困るのが 「ハルシネーション」 と呼ばれる現象です。LLMは知らないことを聞かれたとき、「知らない」と正直に言わずに、もっともらしい嘘をでっちあげて答えることがあります。
社内ドキュメントや自社製品の情報など、学習データに含まれていない情報を扱いたい場面では、この問題は特に深刻です。
RAGはこの2つの問題を同時に解決するための技術です。
RAG(検索拡張生成)とは?
RAG(Retrieval-Augmented Generation:検索拡張生成) とは、LLMが回答を生成する前に、外部の信頼できる情報源から関連する情報を「検索して取ってくる」仕組みです。
もとは2020年にFacebook AI Research(現Meta AI)の研究チームが発表した論文で提唱された概念で、現在はAI活用の現場で最も広く使われるアーキテクチャのひとつになっています。
一言でいうと、「カンニングOKの試験」をAIに受けさせる仕組み です。
- 通常のLLM → 自分の記憶(学習データ)だけで答える
- RAG搭載のLLM → 答える前に参考資料を検索して確認してから答える
RAGの仕組みを図で理解しよう
RAGは大きく 「準備フェーズ」 と 「回答フェーズ」 の2段階に分かれます。
🗂️ 準備フェーズ(一度だけ実行)
社内ドキュメント・PDF・Webページなど
↓
① チャンキング(文章を小さく分割)
↓
② エンベッディング(テキストを数値ベクトルに変換)
↓
③ ベクトルDBに保存
🔍 回答フェーズ(質問のたびに実行)
ユーザーの質問
↓
④ 質問もベクトルに変換
↓
⑤ ベクトルDBから類似する情報を検索・取得
↓
⑥ 取得した情報 + 質問をLLMに渡す
↓
⑦ LLMが根拠ある回答を生成
↓
回答(ハルシネーションが大幅に減る)
3つのキーワードを押さえよう
① チャンキング(Chunking)
ドキュメントをそのままLLMに渡すと、長すぎて処理できません。そこでまず、文章を小さな「チャンク(塊)」に分割します。
一般的には 200〜1000トークン程度 の単位に分割します。チャンクが小さすぎると文脈が失われ、大きすぎると検索精度が落ちるため、バランスが重要です。
② エンベッディング(Embedding)
テキストを ベクトル(数値の配列) に変換する処理です。
「犬」と「猫」は意味が似ているので、ベクトル空間でも近い場所に配置されます。「犬」と「自動車」は意味が遠いので、ベクトル空間でも遠い場所に配置されます。このベクトル同士の距離(類似度)を使って、質問に関連する情報を探し出します。
③ ベクトルDB(Vector Database)
エンベッディングで変換した大量のベクトルを保存・検索するための専用データベースです。代表的なものとしては、ローカルで手軽に使える Chroma や FAISS、クラウドサービスの Pinecone などがあります。
ファインチューニングとの違いは?
RAGとよく比較される技術に 「ファインチューニング」 があります。両者の違いを整理しましょう。
| RAG | ファインチューニング | |
|---|---|---|
| 何をするか | 検索して情報を補強 | モデル自体を再学習 |
| 情報の更新 | 容易(DBを更新するだけ) | 困難(再学習が必要) |
| コスト | 比較的低い | 高い(GPU必要) |
| 根拠の提示 | しやすい(出典を返せる) | 難しい |
| 向いている場面 | 社内ドキュメント、最新情報 | 特定のスタイル・タスク習得 |
「最新の社内情報に基づいて答えてほしい」という場面では、RAGのほうが圧倒的に向いています。
実際のコードイメージ(Python)
全体の流れを最もシンプルに書くと、このようになります。
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain.text_splitter import RecursiveCharacterTextSplitter
# ① ドキュメントをチャンクに分割
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_text(your_document_text)
# ② ベクトルDBにエンベッディングして保存
vectordb = Chroma.from_texts(chunks, embedding=OpenAIEmbeddings())
# ③ 質問に関連するチャンクを検索
retriever = vectordb.as_retriever()
relevant_docs = retriever.invoke("社内の有給申請の方法は?")
# ④ LLMに渡して回答を生成
llm = ChatOpenAI(model="gpt-4o")
context = "\n".join([doc.page_content for doc in relevant_docs])
answer = llm.invoke(f"以下の情報を元に答えてください:\n{context}\n\n質問:{question}")
ライブラリの細かい使い方よりも、「検索 → 取得 → 生成」という3ステップの流れをつかむことが大切です。
まとめ
| キーワード | 一言で言うと |
|---|---|
| RAG | 検索してから答えるAIの仕組み |
| ハルシネーション | AIが嘘をつく現象。RAGで軽減できる |
| チャンキング | ドキュメントを小さく分割すること |
| エンベッディング | テキストを数値に変換すること |
| ベクトルDB | 数値ベクトルを保存・検索するDB |
RAGは「社内AIチャットボット」「ドキュメント検索」「カスタマーサポートの自動化」など、実務への応用が非常に広い技術です。2026年現在も進化が続いており、精度を上げるための手法(RAG Fusion、Agentic RAGなど)も続々と登場しています。
まずはシンプルなRAGを一度自分で動かしてみることをおすすめします!
参考: