目次
「ChatGPTに会社の就業規則を読み込ませて、社員からの質問に自動で答えさせたい」「最新の論文データベースを検索して要約してほしい」——こういったニーズが増えてきました。でもChatGPTの学習データは過去のある時点で止まっているし、機密の社内文書をそのままAIに学習させるわけにもいきません。
この課題を解決する技術が RAG(Retrieval-Augmented Generation/検索拡張生成) です。2023年以降、企業のAI活用で最も重要なキーワードの1つになり、ChatGPTの「Custom GPTs」「Projects」機能も内部的にはRAGを使っています。
この記事では、RAGの仕組みを3ステップで図解し、ベクトルデータベース・LangChain実装・ファインチューニングとの使い分けまで、初心者でも理解できるレベルで、しかし技術的にも正確に 解説します。
1. RAGとは何か——Retrieval-Augmented Generation
RAG(Retrieval-Augmented Generation) は直訳すると「検索(Retrieval)で拡張された(Augmented)、生成(Generation)」という意味です。日本語では「検索拡張生成」と訳されます。
一言で説明すると、「LLM(大規模言語モデル)が回答を作る前に、関連する情報を外部データベースから検索し、その検索結果を参考にして回答を生成する仕組み」です。
料理に例えると
LLM単体は「記憶だけで料理を作るシェフ」です。優秀だけれど、知らないレシピは作れないし、冷蔵庫の中身も知りません。
RAGはそのシェフに「レシピ本を渡し、冷蔵庫の中身を伝えてから料理させる」仕組みです。シェフはレシピ本を参照しながら、今ある食材で最適な料理を作れるようになります。
「Retrieval」「Augmented」「Generation」の役割
| 単語 | 意味 | RAGでの役割 |
|---|---|---|
| Retrieval | 検索・取得 | 質問に関連する文書をデータベースから取り出す |
| Augmented | 拡張・増強 | 取り出した情報をプロンプトに追加してLLMに渡す |
| Generation | 生成 | LLMが検索結果を参照しながら回答を生成 |
ポイントは、LLM自体を再学習させるのではなく、質問が来るたびに「必要な知識」を外部から渡す という点です。これが後述するファインチューニングとの決定的な違いです。
2. なぜRAGが必要なのか——LLM単体の3つの限界
ChatGPTやClaudeなどのLLM単体では解決できない問題が3つあります。
限界1: 知識カットオフ(情報の鮮度)
LLMは「ある時点までのデータ」で学習されているため、学習後の最新情報は知りません。例えばGPT-4の初期版は2023年4月までの情報しか持っていませんでした。
- 「昨日発表された新製品について教えて」→ 答えられない
- 「先週出た法改正の内容は?」→ 答えられない
- 「今日の為替レートは?」→ 答えられない
RAGを使えば、最新のニュース、データベース、APIから情報を引いてきて回答できます。
限界2: ハルシネーション(もっともらしい嘘)
LLMは知らない情報を聞かれても、それらしく見える答えを作ってしまう 傾向があります。これをハルシネーション(幻覚)と呼びます。
例:「御社の就業規則では有給休暇は何日ですか?」と聞くと、LLMは知らないのに「一般的には10日〜20日です」と答えてしまう——これでは業務には使えません。
RAGでは実際の就業規則文書を検索して参照させるため、根拠に基づいた回答 が得られます。さらに「どの文書の何ページに書いてあるか」という引用元も添えられます。
限界3: 社内データ・プライベートデータへのアクセス不可
LLMの学習データにはあなたの会社のマニュアル、契約書、顧客データなどは含まれていません。かといって機密情報をそのままLLMに学習させるわけにもいきません(情報漏洩のリスク、コストの問題)。
RAGなら、社内の文書を自社のベクトルDBに保存し、質問が来たときだけ関連部分を抽出してLLMに渡すため、セキュリティを保ったまま社内データを活用できます。
3. 仕組み——3ステップで動くRAG
RAGの動作は大きく分けて「事前準備(インデックス作成)」と「実行時(質問応答)」の2フェーズです。
事前準備フェーズ——ドキュメントをベクトル化して保存
- 文書の収集:PDF、Word、HTML、Markdown等、使いたい文書を集める
- チャンク分割:文書を適切な長さ(例:500〜1000文字)に分割する
- 埋め込み(Embedding):各チャンクを埋め込みモデル(例:OpenAI text-embedding-3-small)に通し、1536次元などのベクトル(数値の配列)に変換する
- ベクトルDBに保存:チャンクと対応するベクトルを専用DB(Pinecone、Qdrant等)に格納
この作業はドキュメントが増えたときや更新されたときに実行します。
実行時フェーズ——質問に答える3ステップ
ユーザーから質問が来たときの処理は以下の通りです。
- Step 1: Retrieval(検索)
- 質問文を同じ埋め込みモデルでベクトル化する
- ベクトルDBで「質問ベクトルに最も近い」チャンクを上位K件(通常3〜10件)取得する
- 近さの計算にはコサイン類似度などを使う
- Step 2: Augmented(拡張)
- 取得したチャンクを「参考情報」としてプロンプトに埋め込む
- 「以下の情報を参考にして質問に答えてください: [検索結果] 質問: [ユーザーの質問]」のような形
- Step 3: Generation(生成)
- LLM(GPT-4、Claude、Geminiなど)が参考情報を基に回答を生成する
- 必要に応じて「どの文書を参照したか」を引用として添える
具体例:社内の就業規則をChatGPTに聞く
「有給休暇は何日ありますか?」という質問の流れ:
- 質問が埋め込みモデルでベクトル化 → [0.12, -0.45, 0.78, ...]
- ベクトルDBから「休暇」「有給」関連のチャンク3件を取得
- 取得したチャンク:「第15条 年次有給休暇 入社6ヶ月経過した社員には10日付与する...」「勤続年数に応じて最大20日まで...」等
- プロンプト組み立て:「参考情報:第15条... 質問:有給休暇は何日ありますか?」
- LLMが回答:「入社6ヶ月で10日、勤続年数に応じ最大20日付与されます(就業規則第15条参照)」
4. RAGの主要コンポーネント
RAGを構成する5つのコンポーネントを見ていきます。
① 埋め込みモデル(Embedding Model)
テキストを数値のベクトルに変換するAIモデルです。「意味的に似ているテキストは、ベクトル空間でも近い位置にある」ように訓練されています。
| モデル | 提供元 | 特徴 |
|---|---|---|
| text-embedding-3-small | OpenAI | 安価で高性能、1536次元 |
| text-embedding-3-large | OpenAI | より高精度、3072次元 |
| voyage-3 | Voyage AI | Anthropic推奨、高精度 |
| Cohere Embed v3 | Cohere | 多言語対応、日本語も得意 |
| multilingual-e5-large | Microsoft(OSS) | ローカル実行可能、無料 |
| BGE-M3 | BAAI(OSS) | 100以上の言語対応、OSS最高峰 |
② ベクトルデータベース
大量のベクトルを保存し、高速に「近いベクトル」を検索できる専用DB。詳細は次章で解説します。
③ 検索エンジン(Retriever)
ベクトル検索に加え、キーワード検索(BM25など)やハイブリッド検索を組み合わせることも多い。
④ LLM(生成側)
最終回答を作る大規模言語モデル。GPT-4、Claude、Gemini、Llama 3など。商用APIでもOSSローカルモデルでも動きます。
⑤ プロンプトテンプレート
検索結果とユーザー質問を組み合わせてLLMに渡すためのテンプレート。RAGの精度を左右する重要な要素です。
あなたは社内規則に詳しいアシスタントです。
以下の参考情報のみに基づいて質問に回答してください。
参考情報にない場合は「情報がありません」と回答してください。
【参考情報】
{retrieved_chunks}
【質問】
{user_question}
【回答】
5. ベクトルデータベースとは
ベクトルDBは、通常のRDB(MySQL等)とは異なり、「高次元ベクトル空間内で最近傍(最も似ているベクトル)を高速に検索する」ことに特化しています。
主要なベクトルDB比較
| DB | タイプ | 特徴 | 料金 |
|---|---|---|---|
| Pinecone | マネージドSaaS | 業界標準、設定が超簡単 | 無料枠あり、$70/月〜 |
| Weaviate | OSS+クラウド | GraphQL API、ハイブリッド検索 | OSS無料、SaaS $25〜 |
| Qdrant | OSS+クラウド | Rust製で高速、フィルタリング強力 | OSS無料、SaaS無料枠 |
| Chroma | OSS | 軽量、Pythonで即使える | 無料(セルフホスト) |
| pgvector | PostgreSQL拡張 | 既存PostgreSQLで使える | 無料(OSS拡張) |
| Milvus | OSS+クラウド | 大規模向け、数十億ベクトル可 | OSS無料、Zilliz Cloud |
| Elasticsearch | 検索エンジン | ベクトル検索対応、既存運用と統合 | OSS無料、マネージドあり |
| Vertex AI Vector Search | Google Cloud | GCPエコシステムと統合 | 従量課金 |
どれを選ぶべきか
- とりあえず試したい:Chroma(pip installで即動く)
- 既存のPostgreSQL活用:pgvector(DBをまとめられる)
- 本番運用・運用負荷最小:Pinecone(設定いらず)
- OSSで本格運用:Qdrant or Weaviate
- 数億〜数十億件の大規模:Milvus
ちなみに、ホスティング先の選び方については PaaS(Vercel等)とレンタル・VPS・クラウドの比較 も参考になります。
6. 主な用途——どこでRAGは使われるか
RAGは2023年以降、企業のAI活用で最も採用されている技術の1つです。代表的な用途を紹介します。
用途1: 社内ドキュメントQA(ナレッジベース)
就業規則、業務マニュアル、技術仕様書、議事録、営業資料などをRAG化し、社員がChatGPT感覚で質問できる環境を構築。Microsoft 365 CopilotもSharePoint文書に対してRAGを使っています。
用途2: カスタマーサポート自動化
FAQやサポート履歴をRAG化し、チャットボットで一次対応を自動化。人間のオペレーターは複雑な問い合わせに集中できます。
用途3: 法律・医療の専門知識Q&A
判例データベース、医学論文、診療ガイドライン等をRAG化。弁護士や医師が日常業務で参照するシステム。引用元が明示される ため、根拠が必要な専門分野と相性が良い。
用途4: 研究論文検索・要約
arXiv、PubMed、Google Scholar等の論文DBをRAG化し、「この研究テーマの最新動向は?」「XX手法の類似研究は?」といった質問に回答。ElicitやPerplexityが有名。
用途5: ECサイトの商品検索・FAQ
商品マニュアル、レビュー、返品ポリシー等を統合したRAG。「この掃除機はペットの毛にも対応していますか?」のような自然言語検索が可能に。
用途6: 開発者向けドキュメントチャット
ライブラリの公式ドキュメントをRAG化し、「AWS Lambdaでこう書きたいけどサンプルコードは?」のような質問に回答。Stripe、Vercel、Supabase等が採用しています。
用途7: 社内コードベースの検索・説明
GitHubのコードをRAG化し、「この関数の使い方を教えて」「似た処理を実装しているファイルは?」という開発者向けツール。GitHub Copilot ChatやCursor、Claude Code等の開発AI もRAG的な手法を内部で使っています。
用途8: llms.txtなど新しいAI最適化
Web上の情報をAIに正しく参照させる llms.txt もRAGと相性が良い仕組みで、サイト運営者がAIに読み取らせたい情報を構造化して提供できます。
7. RAG vs ファインチューニング——どちらを選ぶ
「LLMに独自知識を持たせる」方法としてRAGと並んでよく議論されるのが ファインチューニング(Fine-tuning) です。両者は根本的にアプローチが異なります。
根本的な違い
| 観点 | RAG | ファインチューニング |
|---|---|---|
| アプローチ | 実行時に外部から情報を渡す | 事前にモデル自体を再訓練 |
| 知識の更新 | DBを更新するだけ(即時) | 再訓練が必要(時間・費用) |
| 初期コスト | 低(DB構築のみ) | 高(訓練データ準備と計算資源) |
| 運用コスト | 検索+LLM API代 | 推論のみ(独自モデル保有) |
| ハルシネーション | 低(参照元がある) | 中(学習で覚えたことを話す) |
| 引用元の明示 | 可能 | 困難 |
| 文体・口調の学習 | 苦手 | 得意 |
| 動的データ対応 | 得意(リアルタイム情報も可) | 苦手(再訓練必要) |
| 機密データの扱い | オンプレで完結可 | 同上(ただし重い) |
RAGが向いている場面
- 知識が頻繁に更新される(ニュース、社内文書、商品情報)
- 回答の根拠を明示する必要がある(法律、医療、金融)
- ドキュメントが大量にある(全部学習させるのは非現実的)
- すぐに始めたい(開発期間を短縮したい)
ファインチューニングが向いている場面
- 特定の文体・トーンで回答させたい(企業ブランド、キャラクター性)
- 専門分野の言語パターンを学習させたい(医療用語、法律文体)
- 推論コストを下げたい(プロンプトが短くなるため)
- 既に大量の教師データが揃っている
両方組み合わせるのが最強
実は RAGとファインチューニングは対立する技術ではなく、組み合わせ可能 です。文体はファインチューニングで学ばせ、最新知識はRAGで供給する——という構成は実運用で多く見られます。
ただし 初心者はまずRAGから 試すのが鉄則です。ファインチューニングに比べ、圧倒的に構築・運用が簡単だからです。
8. 実装方法——LangChainで作るRAG
RAG実装の代表的なフレームワークを紹介した後、Pythonでの最小サンプルコードを示します。
主要フレームワーク
| フレームワーク | 言語 | 特徴 |
|---|---|---|
| LangChain | Python / JS | 業界で最も普及、豊富な統合 |
| LlamaIndex | Python | データ接続とインデックスに特化 |
| Haystack | Python | エンタープライズ向け、細かい制御 |
| Semantic Kernel | C# / Python | Microsoft製、.NET統合に強い |
| DSPy | Python | プロンプト最適化を自動化 |
| 自前実装 | 任意 | シンプルなRAGなら100行で書ける |
LangChainによる最小RAGサンプル
社内の就業規則PDFに対して質問に答えるRAGを、LangChainで30行程度で実装してみます。
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain.chains import RetrievalQA
# 1. ドキュメント読み込み
loader = PyPDFLoader("kisoku.pdf")
docs = loader.load()
# 2. チャンク分割
splitter = RecursiveCharacterTextSplitter(
chunk_size=500, chunk_overlap=50
)
chunks = splitter.split_documents(docs)
# 3. 埋め込み + ベクトルDB構築
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_documents(chunks, embeddings)
# 4. RAGチェーン構築
llm = ChatOpenAI(model="gpt-4o-mini")
qa = RetrievalQA.from_chain_type(
llm=llm,
retriever=vectorstore.as_retriever(search_kwargs={"k": 3}),
return_source_documents=True,
)
# 5. 質問
result = qa.invoke({"query": "有給休暇は何日ありますか?"})
print(result["result"])
print("参照元:", [d.metadata for d in result["source_documents"]])
このコードを実行すると、就業規則PDFから関連箇所を検索し、GPT-4o-miniが回答を生成します。参照元のページ番号も取得できるため、ユーザーに「第15条を参照」と引用付きで回答することも可能です。
より本番向けの実装では
- チャンク分割の最適化(セマンティック分割、階層チャンク等)
- ハイブリッド検索(ベクトル + キーワードBM25の組み合わせ)
- リランキング(Cohere Rerank、voyage-rerank等で検索結果を再並び替え)
- クエリ書き換え(HyDE、Multi-Queryなどで検索精度向上)
- 評価パイプライン(RAGASを使った自動評価)
9. RAGの課題と対策
RAGは強力な技術ですが、実運用では以下の課題に直面します。
課題1: チャンク分割の難しさ
文書をどう分割するかで検索精度が大きく変わります。短すぎると文脈が失われ、長すぎると検索精度が落ちます。
対策:
- セマンティック分割(意味的なまとまりで区切る)
- オーバーラップ設定(隣接チャンクと一部重複させる)
- 階層的チャンク(親子構造で保存し、検索は子・参照は親)
課題2: Retrieval(検索)の精度
似ているようで違うチャンクを取ってしまう、重要な情報を取り逃がす等。
対策:
- ハイブリッド検索(ベクトル + BM25キーワード)
- リランキングモデルで検索後に並び替え
- 複数クエリ生成(同じ質問を異なる言い回しで検索)
課題3: コンテキスト長の制限
LLMに渡せるトークン数には上限があり、大量のチャンクは渡せません。
対策:
- K件を絞る(上位3〜5件)
- 要約を先に作ってから渡す
- 長コンテキストLLM(Claude 200Kトークン、Gemini 1M等)を使う
課題4: 評価の難しさ
RAGの回答品質を客観的に測るのは難しい。正解データをどう作るかが課題。
対策:
- RAGAS(RAG評価用OSSフレームワーク)を使う
- 回答の正確性、回答の関連性、検索の忠実性等の指標を自動計算
- LLM-as-a-Judge(別のLLMに採点させる)
課題5: 多言語・マルチモーダル
日本語と英語が混在するドキュメント、画像入りPDF、表やグラフなどの処理が難しい。
対策:
- 多言語対応の埋め込みモデル(BGE-M3、Cohere Multilingual)
- 画像・表はLLMで事前にテキスト化(OCR + VLM)
- マルチモーダル埋め込み(CLIP、Nomic等)
10. 主要ツール・サービス一覧
RAG構築に使える主要ツールをカテゴリ別にまとめます。
フレームワーク・ライブラリ
- LangChain——もっとも普及したRAGフレームワーク
- LlamaIndex——データ接続特化
- Haystack——エンタープライズ向け
- DSPy——プロンプト自動最適化
ベクトルDB(マネージド)
- Pinecone——業界標準
- Weaviate Cloud——GraphQL対応
- Qdrant Cloud——高性能
- Zilliz Cloud——Milvusのマネージド版
ベクトルDB(OSS・セルフホスト)
- Chroma——軽量でPython即利用
- Qdrant——Rust製で高速
- Weaviate——OSS版
- Milvus——大規模向け
- pgvector——PostgreSQL拡張
埋め込みモデル
- OpenAI text-embedding-3——定番、安価
- Voyage AI——Anthropic推奨
- Cohere Embed v3——多言語対応
- BGE-M3——OSS高性能
ノーコード・マネージドRAGサービス
- ChatGPT Projects / Custom GPTs——OpenAIのRAG機能
- Claude Projects——AnthropicのRAG機能
- Notion AI——Notion内のドキュメント検索
- Microsoft Copilot (Microsoft 365)——SharePointやTeamsの文書を横断検索
- Dify——OSSのノーコードAI構築プラットフォーム
- Vertex AI Agent Builder——Google CloudのRAG構築サービス
- Amazon Bedrock Knowledge Bases——AWSのマネージドRAG
評価ツール
- RAGAS——OSSのRAG評価フレームワーク
- TruLens——LLMアプリ評価全般
- LangSmith——LangChain公式のトレース・評価
FAQ
Q. RAGはChatGPTでも使えますか?
はい。ChatGPTの「Projects」機能や「Custom GPTs」にファイルをアップロードすると、内部的にRAGとして動作します(OpenAIの呼称では「File Search」機能)。開発者がAPI経由でRAGを使いたい場合は、OpenAI Assistants APIの「File Search」ツールを使うか、自前でLangChain等で構築する方法があります。同様にClaudeでも「Projects」機能で同じことが可能です。
Q. RAGの運用コストはどれくらい?
規模によって大きく変わります。個人〜小規模(ドキュメント1万件以下、月1000クエリ程度)ならChroma + OpenAI APIで月数十ドルに収まります。中規模(10万件、月10万クエリ)でPinecone + GPT-4oを使うと月数百〜数千ドル。大規模企業向けだと月数万ドル以上になることもあります。主なコスト要素は「埋め込みAPI」「ベクトルDB」「LLM API」の3つです。
Q. RAGはChatGPT等にファイルをアップするのと何が違う?
本質的には同じ「検索拡張生成」の技術です。ChatGPTにファイルをアップする機能は内部でRAGが動いていると言えます。違いは以下の通り:(1) ChatGPTは1〜数十個のファイルまで(Projectsは大幅増)、自前RAGは数百万件も可能、(2) ChatGPTはブラックボックス、自前RAGは検索アルゴリズムを細かく制御可能、(3) ChatGPTはOpenAIのサーバー、自前RAGはオンプレにもできる。企業の本格運用では自前RAGを構築するのが一般的です。
Q. RAGだとハルシネーションは完全になくなる?
完全にはなくなりません。RAGでも、(1) 関連ドキュメントが検索できなかった、(2) 検索結果はあるがLLMが誤解釈した、(3) 検索結果に矛盾があった——などで誤回答が発生します。対策として「参照情報にない場合は『情報がありません』と答えてください」というプロンプト制約、引用元の明示、RAGAS等での継続的評価が重要です。それでも100%の精度は出ないため、医療・法律など重要な用途では人間の確認を必ず入れるべきです。
Q. 日本語ドキュメントに対応するには?
日本語対応は主に3点:(1) 埋め込みモデルに多言語対応モデル(OpenAI text-embedding-3、Cohere Multilingual、BGE-M3等)を使う、(2) チャンク分割で日本語の形態素や句読点を考慮する、(3) LLMも日本語が得意なモデル(GPT-4o、Claude、Gemini等、国産のELYZA等)を選ぶ。OpenAIのtext-embedding-3は日本語にも十分対応していますが、日本語特化ならBGE-M3やCohereがさらに高精度です。
Q. RAGとエージェント(AI Agent)の違いは?
RAGは「検索して答えを作る」固定的な仕組み。エージェントは「目標に応じて自律的にツールを選んで実行する」動的な仕組みです。RAGはエージェントが使えるツールの1つとして組み込まれることが多いです。例えば「社内情報検索(RAG)」「Web検索」「計算」「メール送信」など複数のツールを状況に応じて使い分けるのがエージェントで、RAGはその構成要素という関係。Agentic RAGという「検索戦略自体をLLMが判断するRAG」も登場しています。
Q. セキュリティは大丈夫?機密情報をAIに見せたくない
いくつかの対応策があります:(1) ベクトルDBと埋め込み処理をオンプレやVPC内に置く(Qdrant、pgvector等をセルフホスト)、(2) LLMもローカル実行可能なOSSモデル(Llama 3、Qwen等)を使う、(3) APIを使う場合でも、OpenAIやAzure OpenAIの「データを学習に使わない」契約を結ぶ、(4) 機密レベルに応じてチャンクにアクセス権メタデータを付与し、検索時にフィルタリング。完全オンプレRAGは技術的に実現可能で、金融機関や医療機関でも採用が進んでいます。
Q. RAG構築はどれくらいの期間・スキルで可能?
プロトタイプなら Python初級者で数時間〜1日 で作れます(Chroma + OpenAI APIで30行程度)。本番運用レベルだと、チャンク分割・ハイブリッド検索・リランキング・評価パイプライン等の作り込みで1〜3ヶ月かかることが多いです。必要スキルは「Python基礎」「LLM APIの使い方」「基本的なDB操作」。高度な機械学習知識は不要で、AIエンジニアよりソフトウェアエンジニアが取り組みやすい領域です。
この記事は2026年4月時点の情報を基に作成しています。RAG関連のツールやモデルは変化が早いため、実装時は各サービスの最新ドキュメントをご確認ください。