RAGは、LLMが知らない最新情報や社内ドキュメントをリアルタイムで検索し、その内容を文脈として与えながら回答を生成する技術です。ファインチューニングより低コストで「LLMの幻覚」を減らせる最重要手法です。
RAG(Retrieval-Augmented Generation)は2020年にMeta AIが発表した手法で、「外部ドキュメントを検索(Retrieval)してLLMに渡し、より正確な生成(Generation)を促す」アーキテクチャです。
RAGが解決する問題
ドキュメントをチャンク(小分け)に分割 → 埋め込みモデルでベクトル化 → ベクトルDBに保存。一度作れば使い回し可能。
ユーザーの質問をベクトル化し、DBで類似度検索(コサイン類似度等)。関連度の高いチャンクをTop-Kで取得。
取得したチャンクを「文脈(Context)」としてLLMのプロンプトに追加し、根拠ある回答を生成。ソース引用も可能。
from langchain_community.vectorstores import Chroma from langchain_openai import OpenAIEmbeddings, ChatOpenAI from langchain.chains import RetrievalQA from langchain.document_loaders import TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter # 1. ドキュメントの読み込みとチャンク分割 loader = TextLoader("docs/manual.txt", encoding="utf-8") docs = loader.load() splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50) chunks = splitter.split_documents(docs) # 2. ベクトルDBの作成 embeddings = OpenAIEmbeddings() vectorstore = Chroma.from_documents(chunks, embeddings, persist_directory="./chroma_db") # 3. RAGチェーンの構築と実行 qa_chain = RetrievalQA.from_chain_type( llm=ChatOpenAI(model="gpt-4o-mini"), retriever=vectorstore.as_retriever(search_kwargs={{"k": 3}}), return_source_documents=True ) result = qa_chain.invoke({{"query": "返品ポリシーを教えてください"}}) print(result["result"])
| DB | ホスト | 無料枠 | 向いているケース |
|---|---|---|---|
| Chroma | セルフ | 完全無料 | ローカル開発・プロトタイプ・小〜中規模 |
| Pinecone | クラウド | 1インデックス | 本番環境・スケールが必要な場合 |
| pgvector | セルフ | 完全無料 | 既存PostgreSQL環境・DB統合したい場合 |
| Weaviate | 両対応 | 14日Trial | マルチモーダル・GraphQL検索が必要な場合 |
「最新情報や社内データを使いたい」「データが頻繁に更新される」「コストを抑えたい」場合はRAGが向いています。「モデル自体の振る舞い・文体・専門的なスタイルを変えたい」場合はファインチューニングが向いています。多くのビジネス用途ではRAGで十分解決できます。
主な改善ポイントは①チャンクサイズの最適化②日本語対応の埋め込みモデル選択(intfloat/multilingual-e5-large等)③Hybrid Search(ベクトル検索+BM25キーワード検索の併用)④Re-ranking(取得結果をさらに関連度でソート)です。
Difyのナレッジ機能を使えばコードなしでRAGシステムが構築できます。PDFやWebページをアップロードするだけでチャンキング・埋め込みが自動処理されます。詳細はDify活用ガイドをご覧ください。