オープンソースRAGフレームワーク比較:LlamaIndex vs Haystack vs LangChain で検索拡張生成を構築する
オープンソースラボ編集部 ・ 2026年6月13日
オープンソースRAGフレームワーク比較:LlamaIndex vs Haystack vs LangChain で検索拡張生成を構築する
RAG(Retrieval-Augmented Generation)はLLMに社内文書・製品ドキュメント・最新情報を参照させる技術です。LlamaIndex・Haystack・LangChainはオープンソースでRAGシステムを構築するための代表的なフレームワークです。「ChatGPTが知らない情報をLLMに答えさせる」仕組みを作りましょう。
RAGが解決する問題
LLMの本質的な限界:
- 知識の古さ: 学習データのカットオフ後の情報を知らない
- ドメイン知識の不足: 社内・業界特有の情報を持っていない
- ハルシネーション: 知らないことをもっともらしく答えてしまう
- 長文の参照不可: 大量のドキュメントをコンテキストに収めきれない
RAGはこれらを「検索して文脈に渡す」アプローチで解決します。
RAGの基本アーキテクチャ
ドキュメント → チャンク分割 → 埋め込みベクトル化 → ベクトルDB保存
↓
ユーザー質問 → 質問を埋め込み → 類似チャンクを検索 → LLMへ文脈付きで送信 → 回答
主要ツールの概要
LlamaIndex
RAGに特化したデータフレームワークです。100種類以上のデータソース(PDF・Word・Notion・Slack・SQLなど)への接続・チャンキング・インデックス化・高度なクエリをシンプルなAPIで提供します。
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.core import Settings
from llama_index.llms.openai import OpenAI
from llama_index.embeddings.openai import OpenAIEmbedding
Settings.llm = OpenAI(model="gpt-4o", temperature=0)
Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small")
documents = SimpleDirectoryReader("docs/").load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine(
similarity_top_k=5,
response_mode="tree_summarize",
)
response = query_engine.query("製品の返品ポリシーを教えてください")
print(str(response))
for node in response.source_nodes:
print(f" - {node.metadata.get('file_name')} (score: {node.score:.3f})")
Haystack
Deepsetが開発する本番グレードのNLPフレームワークです。RAGパイプライン・ドキュメント検索・情報抽出をコンポーネントベースで構成でき、ElasticsearchやOpenSearch等の全文検索エンジンとの統合も充実しています。
from haystack import Pipeline, Document
from haystack.components.retrievers.in_memory import InMemoryBM25Retriever
from haystack.components.generators import OpenAIGenerator
from haystack.components.builders.answer_builder import AnswerBuilder
from haystack.components.builders.prompt_builder import PromptBuilder
from haystack.document_stores.in_memory import InMemoryDocumentStore
store = InMemoryDocumentStore()
store.write_documents([
Document(content="製品の返品は30日以内に限り受け付けます。"),
Document(content="返品時は領収書が必要です。"),
])
template = '''
以下のコンテキストを参考にして質問に答えてください。
コンテキスト:
{% for doc in documents %}
{{ doc.content }}
{% endfor %}
質問: {{question}}
回答:
'''
rag_pipeline = Pipeline()
rag_pipeline.add_component("retriever", InMemoryBM25Retriever(document_store=store))
rag_pipeline.add_component("prompt_builder", PromptBuilder(template=template))
rag_pipeline.add_component("llm", OpenAIGenerator(model="gpt-4o"))
rag_pipeline.add_component("answer_builder", AnswerBuilder())
rag_pipeline.connect("retriever", "prompt_builder.documents")
rag_pipeline.connect("prompt_builder", "llm")
rag_pipeline.connect("llm.replies", "answer_builder.replies")
rag_pipeline.connect("retriever", "answer_builder.documents")
result = rag_pipeline.run({
"retriever": {"query": "返品ポリシーは?"},
"prompt_builder": {"question": "返品ポリシーは?"},
"answer_builder": {"query": "返品ポリシーは?"},
})
print(result["answer_builder"]["answers"][0].data)
LangChain(RAG特化構成)
LangChainはRAGに必要なすべてのコンポーネント(ドキュメントローダー・テキストスプリッター・ベクターストア・チェーン)を提供しています。
from langchain_community.document_loaders import PyPDFDirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain.chains import RetrievalQA
loader = PyPDFDirectoryLoader("docs/")
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=100,
)
chunks = text_splitter.split_documents(documents)
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectordb = Chroma.from_documents(chunks, embeddings, persist_directory="./chroma_db")
llm = ChatOpenAI(model="gpt-4o", temperature=0)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectordb.as_retriever(search_kwargs={"k": 5}),
return_source_documents=True,
)
result = qa_chain.invoke("返品ポリシーを教えてください")
print(result["result"])
機能比較表
| 比較項目 | LlamaIndex | Haystack | LangChain |
|---|---|---|---|
| RAGに特化 | ✅ | ✅ | ⚠️汎用 |
| データコネクタ | ✅ 100+ | ✅ 30+ | ✅ 100+ |
| チャンキング | ✅ 高機能 | ✅ | ✅ |
| ベクターDB統合 | ✅ 30+ | ✅ 15+ | ✅ 40+ |
| 全文検索統合 | ✅ | ✅ Elastic | ✅ |
| 評価フレームワーク | ✅ Ragas | ✅ | ✅ |
| ストリーミング | ✅ | ✅ | ✅ |
| ローカルLLM対応 | ✅ | ✅ | ✅ |
| APIの簡潔さ | ★★★★☆ | ★★★☆☆ | ★★★☆☆ |
| 本番実績 | ★★★★☆ | ★★★★☆ | ★★★★★ |
| ライセンス | MIT | Apache 2.0 | MIT |
| GitHub Stars | 37k+ | 17k+ | 100k+ |
ローカルLLM(Ollama)でのRAG構成
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.llms.ollama import Ollama
from llama_index.embeddings.ollama import OllamaEmbedding
# Ollamaを使った完全ローカルRAG
Settings.llm = Ollama(model="llama3.1:8b", request_timeout=60.0)
Settings.embed_model = OllamaEmbedding(model_name="nomic-embed-text")
documents = SimpleDirectoryReader("docs/").load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine()
response = query_engine.query("製品の保証期間は?")
RAGやLLMツールはLLMツールカテゴリ(/categories/llm-tools)で一覧でき、ベクターデータベースはDevOpsカテゴリ(/categories/devops)でも探せます。
FAQ
Q. LlamaIndexとLangChainはどちらをRAGに使うべきですか?
A. RAGの構築に特化するならLlamaIndexが推奨です。データインジェスチョン・インデックス管理・高度なクエリ(サブクエリ・ルータ・エージェント)のAPIがより洗練されています。汎用LLMアプリの一部としてRAGを組み込む場合はLangChainが既存の資産を活かせます。最近ではLlamaIndexとLangChainを組み合わせて使うケースも多いです。
Q. RAGの回答品質を評価するにはどうすればいいですか?
A. Ragas(Retrieval Augmented Generation Assessment)が標準的な評価フレームワークです。指標として、信頼性(Faithfulness)・回答関連性(Answer Relevancy)・文脈適合性(Context Precision)・文脈再現率(Context Recall)の4つを測定します。LlamaIndexはRagas統合をネイティブサポートしています。
Q. チャンクサイズはどう設定すればいいですか?
A. 一般的なガイドライン: チャンクサイズ500〜1000トークン・オーバーラップ10〜20%が出発点です。ただし最適値はドキュメントの種類によって大きく異なります。法律文書のような長い文脈が必要な場合は1000〜2000トークン、FAQのような短い答えが多い場合は200〜500トークンが向いています。実際には複数設定をRAGASで評価して選ぶことを推奨します。
Q. 社内ドキュメントへのRAGはセキュリティ的に安全ですか?
A. Ollamaを使ったローカルLLM・ローカルのChromaDBでRAGを構成すると、データが外部に出ません。クラウドLLM(OpenAI等)を使う場合はチャンク化されたテキストがAPIに送信されます。機密情報を含む場合はデータの分類→機密レベルに応じてローカルLLMかクラウドLLMかを切り替える「ハイブリッドRAG」構成が推奨されます。
Q. RAGよりファインチューニングの方がいい場合はいつですか?
A. RAGは「情報を検索して回答する」のに向いています。ファインチューニングは「特定のスタイル・形式・推論パターンをモデルに学習させる」のに向いています。社内規定に従った文章を書く・特定のプログラミングスタイルに準拠したコードを書くにはファインチューニング、最新のドキュメントから答える・特定の知識ベースへの回答にはRAGが適しています。
まとめ
| ユースケース | 推奨ツール |
|---|---|
| 社内ドキュメントRAG | LlamaIndex |
| 本番グレードNLPパイプライン | Haystack |
| 汎用LLMアプリの一部としてRAG | LangChain |
| 完全ローカルRAG | LlamaIndex + Ollama |