RAG(検索拡張生成)の実装ガイド【2026年版】OSSで社内文書AIを構築
オープンソースラボ編集部 ・ 2026年6月13日
「社内ドキュメントに何でも答えてくれるAIチャットを作りたい」——これを実現するのが**RAG(Retrieval-Augmented Generation:検索拡張生成)**です。本記事でOSSを使った実装方法を解説します。
RAGとは
RAGは外部の知識(文書・DB)を検索してLLMの回答に組み込む手法です。
[ユーザーの質問]
↓
[Embedding変換] → [ベクトルDB検索] → [類似文書取得]
↓
[LLMに文書+質問を渡す]
↓
[根拠に基づいた回答]
LLMの学習データにない最新情報・社内情報にも回答できるようになります。
RAGのOSSスタック比較表
| コンポーネント | OSS選択肢 | 役割 |
|---|---|---|
| オーケストレーション | LangChain / LlamaIndex | パイプライン管理 |
| Embedding | OpenAI / nomic-embed-text | ベクトル変換 |
| ベクトルDB | pgvector / Chroma / Qdrant | 類似検索 |
| LLM | Claude / GPT-4 / Llama 3 | 回答生成 |
| UIフレームワーク | Chainlit / Streamlit | チャットUI |
LangChainで実装する最小RAG
LangChain(公式サイト↗)はRAGパイプラインを最も簡単に構築できるOSSフレームワークです:
from langchain_community.document_loaders import DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain.chains import RetrievalQA
# 1. 文書ロード
loader = DirectoryLoader('./docs', glob='**/*.pdf')
docs = loader.load()
# 2. チャンク分割
splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
chunks = splitter.split_documents(docs)
# 3. ベクトルDB構築
vectordb = Chroma.from_documents(chunks, OpenAIEmbeddings())
# 4. RAGチェーン
qa = RetrievalQA.from_chain_type(
llm=ChatOpenAI(model="gpt-4o-mini"),
retriever=vectordb.as_retriever(search_kwargs={"k": 5})
)
# 5. 質問
result = qa.invoke({"query": "有給休暇の申請方法は?"})
print(result["result"])
LlamaIndex:エンタープライズ向けRAG
LlamaIndex(公式サイト↗)はより高度なRAG機能を提供します。階層的インデックス・ハイブリッド検索・評価ツールが充実しており、大規模な社内ドキュメントに向いています。
LLMツール関連はLLMツールカテゴリから。DevOps構成はDevOps関連OSSをDevOpsカテゴリから。
pgvectorでPostgreSQL上にRAGを構築
-- pgvector拡張の有効化
CREATE EXTENSION vector;
-- 文書チャンクのテーブル
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
content TEXT,
embedding vector(1536)
);
-- 類似検索
SELECT content, embedding <=> '[0.1, 0.2, ...]'::vector AS distance
FROM documents
ORDER BY distance
LIMIT 5;
Supabase上でpgvectorを使えばサーバーレスにRAGを構築できます(Supabase Vector公式ガイド↗参照)。
まとめ
RAGは「LLMに社内知識を与える」最もポピュラーな手法です。LangChain+pgvector+OpenAIで1日で動くプロトタイプが作れます。本番化にはLlamaIndexの評価ツールで精度を計測しながら改善しましょう。
よくある質問(FAQ)
Q. RAGとファインチューニングの違いは何ですか?
RAGは推論時に外部知識を検索して参照するのに対し、ファインチューニングはモデル自体を特定データで再学習します。最新情報への対応・プライバシー管理はRAGが優位です。
Q. 日本語文書のRAGは精度が出ますか?
Embeddingモデルにtext-embedding-3-small(OpenAI)やmultilingual-e5-large(多言語対応)を使えば日本語でも高精度なRAGが実現できます。
Q. どのくらいのコストがかかりますか?
社内ドキュメント1,000ページのEmbedding生成はOpenAI APIで約$0.1〜$0.5。推論コストはクエリ数に依存します。Ollamaなどローカルモデルを使えばコストゼロも可能です。
関連リンク・公式情報
ここで紹介したツールの一次情報(公式サイト・ソースコード)と、オープンソースラボ内の関連ページをまとめました。導入検討の際にご活用ください。
公式サイト・ソースコード(外部リンク)
オープンソースラボの関連ページ(内部リンク)
