【2026年版】エンジニアのためのRAG実装入門|社内ドキュメントQ&Aシステムを作る完全ガイド
はじめに:RAGがAIプロダクトの標準装備になった2026年
生成AI(LLM)の弱点として、「学習データに含まれない情報は答えられない」「古い情報しか返せない」というものがあります。これを解決するのが RAG(Retrieval Augmented Generation)です。社内ドキュメント・最新情報・プライベートデータをAIに参照させることで、AIが「自社の文脈」を持った回答を返せるようになります。
2026年現在、ChatGPT Enterprise・Claude Projects・Gemini Gems などの主要AIプラットフォームにもRAGは標準装備されており、「AIプロダクト開発では RAG実装が必須スキル」と言える状況です。
この記事では、現役SWEがPython + LangChain + Chromaで実際に動くRAGシステム(社内ドキュメントQ&A)を構築する手順を実例ベースで解説します。
- RAGの仕組みを図解で理解
- Python + LangChain + Chromaで実装
- 検索精度を上げる4つのテクニック
- 本番運用でのTips
- 2026年のRAG最新トレンド
RAG とは? 仕組みを図解で理解
LLMだけでは解決できない問題
- 最新情報(今日のニュース・最新バージョン情報)に対応できない
- プライベート情報(社内ドキュメント・顧客データ)を知らない
- ハルシネーション(自信満々に間違える)が起こる
RAGの基本フロー
RAGは2つの処理を組み合わせます:
- Retrieval(検索):ユーザー質問に関連するドキュメントをベクトルDBから検索
- Augmented Generation(拡張生成):検索結果をプロンプトに含めてLLMに回答させる
イメージ: 「社内規定を読んだうえで、質問に答えてください」とAIに指示する仕組みです。
RAGシステムの構成要素
- Document Loader:PDF/Markdown/Webページを読み込む
- Text Splitter:長文を適切なサイズに分割(チャンク化)
- Embedding Model:テキストを数値ベクトルに変換
- Vector Store:ベクトルを保存・検索(Chroma / Pinecone / pgvector 等)
- Retriever:質問に関連する文書を検索
- LLM:検索結果と質問を元に回答生成(GPT-5 / Claude 等)
環境準備
Python 3.10以上を前提に、必要パッケージをインストールします。
# 仮想環境作成
python3 -m venv venv
source venv/bin/activate
# 必要パッケージインストール
pip install langchain langchain-openai langchain-community chromadb pypdf unstructured
# OpenAI API キーを環境変数に設定
export OPENAI_API_KEY="sk-..."OpenAI APIキーは OpenAI Platformで取得できます。従量課金ですが、個人検証なら月数百円で収まります。
ステップ1:ドキュメントを読み込む
対象のPDF/Markdownを読み込みます。
from langchain_community.document_loaders import PyPDFLoader, DirectoryLoader
# 単一PDF読み込み
loader = PyPDFLoader("./docs/company_policy.pdf")
documents = loader.load()
# ディレクトリ内の全PDF一括読み込み
loader = DirectoryLoader("./docs", glob="**/*.pdf", loader_cls=PyPDFLoader)
documents = loader.load()
print(f"読み込んだドキュメント数: {len(documents)}")LangChainには Markdown・CSV・Web URL・Notion・Confluence など多数の DocumentLoader が用意されています。
ステップ2:テキストを適切に分割する(チャンク化)
長いドキュメントをそのままLLMに渡すのは効率が悪いため、適切なサイズに分割します。
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000, # 各チャンクのサイズ(文字数)
chunk_overlap=200, # チャンク間の重複(文脈つなぎ)
separators=["\n\n", "\n", "。", "、", ""], # 日本語を考慮
)
chunks = text_splitter.split_documents(documents)
print(f"チャンク数: {len(chunks)}")チャンク化のコツ
- chunk_size は 500〜1500 文字が目安(用途次第で調整)
- chunk_overlap を 10〜20%設定し、文脈切れを防ぐ
- 日本語なら
["\n\n", "\n", "。", "、", ""]のseparatorsを明示 - HTMLは別のSplitterを使う(
HTMLHeaderTextSplitter等)
ステップ3:ベクトル化して保存する
各チャンクを埋め込みモデルで数値ベクトルに変換し、Chromaに保存します。
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_db" # 永続化パス
)
print("ベクトルDB構築完了")これで永続化されたベクトルDB(ChromaはSQLiteベース)が作成されます。次回起動時は Chroma(persist_directory="./chroma_db", embedding_function=embeddings)で読み込めます。
ステップ4:質問に対して検索&回答生成
Retriever と LLM を組み合わせて RAG チェーンを構築します。
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
retriever = vectorstore.as_retriever(search_kwargs={"k": 4})
template = """以下の社内ドキュメントの抜粋を元に、質問に答えてください。
ドキュメントにない情報は「分かりません」と答えてください。
社内ドキュメント:
{context}
質問: {question}
回答:"""
prompt = ChatPromptTemplate.from_template(template)
llm = ChatOpenAI(model="gpt-5", temperature=0)
rag_chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
# 使ってみる
answer = rag_chain.invoke("有給休暇の付与日数を教えて")
print(answer)これで完動する RAG システムの完成です。合計 30〜40行のPythonで、社内ドキュメントQ&Aシステムが動きます。
検索精度を上げる4つのテクニック
1. チャンクサイズを調整する
検索精度が悪い場合、まず chunk_size を変えてみる。短めのチャンク(300〜500字)の方が精密検索しやすい反面、文脈不足になりがち。試行錯誤が必要。
2. より良い埋め込みモデルを使う
- デフォルト
text-embedding-3-small→ 多言語対応text-embedding-3-largeに変更で精度向上 - 日本語特化なら
multilingual-e5-large(オープンソース)
3. ハイブリッド検索(ベクトル + キーワード)
ベクトル検索だけでなく、BM25のようなキーワード検索も併用。LangChainの EnsembleRetrieverで両者を組み合わせられる。
4. Rerankingで検索結果を再ランク付け
Retrieverで取得した上位20件を、CrossEncoder(Cohere Rerank APIなど)で再ランキングし、Top5だけLLMに渡す。精度が顕著に上がる。
本番運用でのTips
ベクトルDB選定
- 個人・小規模:Chroma(ローカル・無料)
- 本番(クラウド):Pinecone / Weaviate / Qdrant Cloud
- 既存PostgreSQLがある:pgvector拡張
コスト管理
- Embedding コスト: $0.02/1M tokens(text-embedding-3-small)
- LLMコスト: GPT-5の場合 Input $5/1M, Output $20/1M 程度
- 大規模データなら、埋め込みは1回計算して永続化、更新時のみ再計算
更新戦略
- ドキュメント更新時のみ対応チャンクを再埋め込み(差分更新)
- cron で定期更新(1日1回など)
観測・デバッグ
- LangSmith でトレース(どのドキュメントが検索されたか可視化)
- ユーザー評価収集(回答に👍👎を付けさせる)
- 失敗回答のサンプルを定期レビュー
2026年のRAG最新トレンド
GraphRAG
単純なベクトル検索ではなく、知識グラフ(ナレッジグラフ)を構築してRAG。Microsoft GraphRAGが2024年秋リリースされ、複雑な関連性を扱える新手法として注目。
Agentic RAG
単発検索ではなく、AIが自ら「追加の検索が必要か」判断して再検索する動的RAG。LangGraphで実装可能。
マルチモーダルRAG
テキストだけでなく、画像・表・図を含むドキュメントもベクトル化。GPT-5 vision/Claude Opus Vision を活用。
Context Caching
Google Gemini・Anthropic Claude で プロンプト全体をキャッシュし、同じコンテキストで複数質問する際のコストを 90% 削減する手法が標準化。
よくある質問(FAQ)
Q. ファインチューニングと何が違う?
ファインチューニング=モデル自体を再訓練(重い・遅い・高コスト)。RAG=既存モデルに検索結果を渡すだけ(軽い・速い・低コスト)。99%の企業用途はRAGで十分です。
Q. 月額どのくらいコストかかりますか?
小規模検証なら 月数百〜数千円。10万回/月の問い合わせでも 月1〜3万円程度です。ベクトルDBをChromaローカル運用にすればインフラコストはゼロ。
Q. 社内の機密情報を扱って大丈夫?
重要な観点です。OpenAI/Anthropic Enterpriseプランなら学習にデータが使われない契約が可能。それでも心配なら、ローカルLLM(Llama 3 / Qwen等)+ Ollamaで完全オフライン運用も可能。
Q. リアルタイムに更新されるデータに対応できる?
できます。Webhookやイベントドリブンでドキュメント更新を検知し、該当チャンクのみ再埋め込みする設計が標準。LangChain + Pineconeなら数行で実装可能。
Q. Python以外でRAG作れますか?
可能です。TypeScript なら LangChain.jsまたは Vercel AI SDK + Pineconeで同等のRAG実装可能。詳しくは Vercel AI SDK vs LangChain 徹底比較をご覧ください。
まとめ:RAG実装は30行から始められる
RAGは「複雑そう」というイメージがありますが、Python 30行で動くのが実態です。小さく作って動かし、精度を観測しながら改善していくのが王道です。
- まずローカルChromaで試作(週末プロジェクト)
- 検索精度に満足したらPinecone等の本番ベクトルDBへ
- LangSmith等の観測基盤を導入して改善サイクル
- Agentic RAG・GraphRAG等の最新手法に挑戦
2026年のエンジニアにとって、RAG実装スキルは Webフレームワークと同等の必須スキルになりつつあります。今日から1日で動くRAGを作ってみましょう。
関連記事
👉 【2026年版】Vercel AI SDK vs LangChain 徹底比較
👉 【2026年版】ChatGPT活用の実務7パターン
👉 【2026年版】生成AI時代のエンジニアキャリア戦略
👉 【2026年版】Web APIとAPIキー・OAuth・REST/GraphQL 完全ガイド
👉 個人開発・副業に最適なサーバー完全ガイド