2026-05-02·生成 AI·⏱ 約 6 分
RAG (検索拡張生成) を1から理解する ─ ハルシネーション対策の本命
ChatGPT 系の課題「もっともらしい嘘」を解決する RAG パターン。ベクトル DB・埋め込みモデル・プロンプト設計の実装フローを G 検定対策と実装の両面で解説。
ChatGPT の登場以来、生成 AI 最大の課題は ハルシネーション(もっともらしい嘘の生成)でした。RAG は、これを 外部知識をプロンプトに動的に取り込む ことで解決する設計パターン。G 検定でも頻出のキーワードであり、企業の生成 AI 導入で最も使われている方式です。
なぜ RAG が必要か
- 学習データの古さ: GPT-4 系の知識カットオフは 2023〜2024 年で、それ以降のニュースは知らない
- 社内文書の不在: 公開 LLM は当然、自社の社内ドキュメント・契約書・議事録を学習していない
- ハルシネーション: 知らないことを聞かれると LLM は『それっぽい嘘』を作る傾向
- 根拠の不在: 答えの出典が示せないため、信頼性のある業務利用には不適
RAG の基本フロー
- 事前準備: 社内文書を分割(チャンク化)し、埋め込みモデル(text-embedding-3-large など)でベクトル化、ベクトル DB(Pinecone・Weaviate・pgvector・Chroma)に保存
- ユーザーが質問: 例「就業規則で在宅勤務日数の上限は?」
- 質問を埋め込み化: 質問文も同じ埋め込みモデルでベクトル化
- ベクトル DB で近傍検索: 質問ベクトルとコサイン類似度が高い文書チャンクを top-k(例: 5)取得
- プロンプト合成: 「以下の社内文書を参考に質問に答えてください。文書: ... 質問: ...」
- LLM が回答: 関連文書を踏まえた回答を生成。可能なら出典(文書名・ページ)を付与
シンプル実装(LangChain ベース)
最小 RAG の構造
# pip install langchain-openai langchain-community chromadb
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain.chains import RetrievalQA
# 1. 文書を分割
with open('handbook.md') as f:
text = f.read()
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.create_documents([text])
# 2. 埋め込み + ベクトル DB に保存
embed = OpenAIEmbeddings(model='text-embedding-3-large')
vecdb = Chroma.from_documents(chunks, embed, persist_directory='./db')
# 3. RAG チェーン
llm = ChatOpenAI(model='gpt-4o-mini')
qa = RetrievalQA.from_chain_type(
llm=llm,
retriever=vecdb.as_retriever(search_kwargs={'k': 5}),
return_source_documents=True,
)
# 4. 質問
result = qa.invoke({'query': '在宅勤務日数の上限は?'})
print(result['result'])
for doc in result['source_documents']:
print('出典:', doc.metadata)精度を左右する 3 つのチューニングポイント
- チャンクサイズ: 200〜500 トークンが目安。大きすぎると関連性が薄まり、小さすぎると文脈が切れる
- 埋め込みモデル: OpenAI の text-embedding-3-large が高精度、Cohere・Voyage AI も日本語に強い。BGE-M3 などオープンモデルも実用的
- Re-ranking: 検索 top-k の中から、Cross-Encoder(Cohere Rerank・bge-reranker)で本当に関連度が高いものに並べ替える 2 段検索が効果大
ハイブリッド検索 ─ ベクトル + キーワード
「意味」だけでは取りこぼす
ベクトル検索は意味的近さを捉えられますが、固有名詞(製品コード・法令名・人名)は文字列一致が重要。BM25 などのキーワード検索とベクトル検索を組み合わせる ハイブリッド検索 が実務で標準になりつつあります。Elasticsearch・Qdrant・Weaviate などの主要ベクトル DB が標準サポート。
RAG の限界と対策
- 文書間の関係を捉えづらい: 「A と B の違いは?」のように複数文書をまたぐ質問が苦手 → GraphRAG・Multi-hop RAG で対処
- 最新性のラグ: ベクトル DB の更新頻度がボトルネック → リアルタイム更新可能な DB を選択
- 評価が難しい: 質問と理想回答のペアを用意して RAGAS・LangSmith で精度を測定
G 検定での出題傾向
- 「ハルシネーション対策の代表的な手法は?」 → RAG
- 「RAG で使うベクトル DB の例は?」 → Pinecone、Weaviate、Chroma、pgvector
- 「埋め込みモデルの目的は?」 → 文書をベクトル化して類似度検索可能にする
- 「Chain-of-Thought との違いは?」 → CoT は推論手法、RAG は外部知識参照手法
まとめ
- RAG = 外部知識を動的にプロンプトに取り込む手法
- ハルシネーション抑制・社内文書活用・最新情報反映に有効
- 実装は埋め込み → ベクトル DB → 検索 → プロンプト合成の 4 段
- 精度向上には Re-ranking・ハイブリッド検索・適切なチャンクサイズが鍵
関連リンク
- [G 検定教科書 第 7 章 生成 AI](/certs/g-test/textbook#ch7)
- [ディープラーニング基礎ミニ教科書](/deep-learning-basics)
Sponsored / Recommended
本気で AI エンジニアを目指すなら ─ 関連スクール
以下は当サイトと提携しているスクールの紹介です。リンク経由でのお申込で運営費を支援できます(読者の皆様の追加負担はありません)。
Related Articles
関連記事
- 2026-04-30実装Slack Bot を LLM で作る ─ FastAPI + OpenAI で社内ツール化Slack の Slash Command と Events API を使い、社内チャンネル内で動く LLM Bot を構築。FastAPI バックエンド + OpenAI で 1 日で完成。
- 2026-04-30実装FastAPI 入門 ─ ML モデルを 5 分で API にするPython の高速 Web フレームワーク FastAPI を使って、ML モデルを REST API として公開する最短ルート。型ヒント・自動ドキュメント・非同期対応の 3 拍子。
- 2026-04-30実装Docker 入門 ─ ML 環境の再現性を担保する「自分の PC では動く問題」を解決する Docker。ML プロジェクトの Dockerfile・GPU 対応・docker-compose・Multi-Stage Build までを実用視点で。