RAGフレームワーク比較:LlamaIndex vs LangChain vs Haystack でRAGを実装する
オープンソースラボ編集部 ・ 2026年6月13日
RAGフレームワーク比較:LlamaIndex vs LangChain vs Haystack でRAGを実装する
LLMアプリケーションに**RAG(Retrieval-Augmented Generation: 検索拡張生成)**を実装するためのOSSフレームワークが充実しています。外部知識データベースをLLMに提供してハルシネーションを減少させ、最新情報・社内情報を参照できるようにします。LlamaIndex(RAG特化・インデックス構築)・LangChain(最大エコシステム・汎用Chain)・Haystack(パイプライン設計・エンタープライズ)の3つが2026年のOSSRAGフレームワークデファクトスタンダードです。
RAGフレームワークが必要な理由
- ハルシネーション削減: LLMが「知らないこと」を作り話する問題を、実際の文書から検索した根拠情報を渡すことで削減
- 最新情報アクセス: LLMの学習データカットオフ以降の情報(社内文書・最新FAQ・製品カタログ)を参照
- コスト最適化: GPT-4のコンテキストに全文書を詰め込む代わりに必要なチャンクのみ選択してトークンコスト削減
- プライバシー: 社内機密文書をクラウドLLMに学習させず、質問時にのみ必要な部分を安全に参照
主要ツールの概要
LlamaIndex
2022年公開、Python製のOSSです。GitHubスター38k+。RAGとデータインデックスに特化したOSSフレームワークで、複雑なRAGパイプライン(Advanced RAG: HyDE・Re-ranking・Sub-Question・Router Query Engine)を抽象化して構築できます。LlamaHub(300+データローダー)でPDF・Notion・Confluence・GoogleDrive等のデータを統一APIで取得できます。
# Python: LlamaIndex で高精度RAGパイプラインを構築
from llama_index.core import (
VectorStoreIndex,
SimpleDirectoryReader,
StorageContext,
Settings,
)
from llama_index.core.node_parser import SentenceSplitter
from llama_index.core.query_engine import RetryQueryEngine
from llama_index.core.retrievers import VectorIndexRetriever
from llama_index.core.postprocessor import SimilarityPostprocessor, LLMRerank
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.llms.anthropic import Anthropic
from llama_index.vector_stores.postgres import PGVectorStore
# グローバル設定
Settings.llm = Anthropic(model='claude-sonnet-4-6', max_tokens=4096)
Settings.embed_model = OpenAIEmbedding(model='text-embedding-3-small', dimensions=1536)
Settings.node_parser = SentenceSplitter(chunk_size=512, chunk_overlap=64)
def build_index(docs_dir: str) -> VectorStoreIndex:
'''ドキュメントフォルダーを読み込んでpgvectorにインデックス構築'''
vector_store = PGVectorStore.from_params(
database='mydb',
host='localhost',
port=5432,
user='user',
password='pass',
table_name='llamaindex_vectors',
embed_dim=1536,
)
storage_ctx = StorageContext.from_defaults(vector_store=vector_store)
documents = SimpleDirectoryReader(docs_dir, required_exts=['.pdf', '.md', '.txt']).load_data()
index = VectorStoreIndex.from_documents(documents, storage_context=storage_ctx, show_progress=True)
return index
def advanced_rag_query(index: VectorStoreIndex, question: str) -> dict:
'''Advanced RAG: Re-rankingとSimilarityフィルタリングを適用'''
retriever = VectorIndexRetriever(index=index, similarity_top_k=10)
node_postprocessors = [
SimilarityPostprocessor(similarity_cutoff=0.7),
LLMRerank(choice_batch_size=5, top_n=3), # LLMでTop10からTop3に再ランク
]
from llama_index.core.query_engine import RetrieverQueryEngine
query_engine = RetrieverQueryEngine(
retriever=retriever,
node_postprocessors=node_postprocessors,
)
response = query_engine.query(question)
return {
'answer': str(response),
'sources': [n.metadata.get('file_name') for n in response.source_nodes],
}
def sub_question_rag(index: VectorStoreIndex, complex_question: str) -> str:
'''サブクエスチョン分解: 複雑な質問を複数のサブ質問に分解してRAG'''
from llama_index.core.question_gen import LLMQuestionGenerator
from llama_index.core.query_engine import SubQuestionQueryEngine
from llama_index.core.tools import QueryEngineTool
query_engine_tool = QueryEngineTool.from_defaults(
query_engine=index.as_query_engine(),
description='社内FAQと製品マニュアルの知識ベース',
)
sub_question_engine = SubQuestionQueryEngine.from_defaults(
query_engine_tools=[query_engine_tool],
)
response = sub_question_engine.query(complex_question)
return str(response)
# 使用例
index = build_index('./docs')
result = advanced_rag_query(index, '製品の返金ポリシーと保証期間について教えてください')
print(f'回答: {result["answer"]}')
print(f'参照: {result["sources"]}')
LangChain
2022年公開、Python/TypeScript製のOSSです。GitHubスター100k+。最大エコシステムを持つLLMアプリケーションフレームワークで、RAGだけでなくエージェント・ツール呼び出し・マルチステップChain・メモリ管理など幅広いLLMパターンをサポートします。LangSmith(観測・評価)との統合が強みです。
# Python: LangChain で RAGパイプラインを構築(LCEL: LangChain Expression Language)
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import DirectoryLoader, PyPDFLoader
def build_rag_chain(docs_dir: str):
'''LangChain LCEL でRAGパイプラインをシンプルに構築'''
# ドキュメント読み込み
loader = DirectoryLoader(docs_dir, glob='**/*.pdf', loader_cls=PyPDFLoader)
docs = loader.load()
# チャンク分割
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_documents(docs)
# ベクターストア構築
embeddings = OpenAIEmbeddings(model='text-embedding-3-small')
vectorstore = Chroma.from_documents(chunks, embeddings, persist_directory='./chroma_db')
retriever = vectorstore.as_retriever(search_type='mmr', search_kwargs={'k': 5, 'fetch_k': 20})
# プロンプトテンプレート
prompt = ChatPromptTemplate.from_messages([
('system', 'コンテキストのみを参照して質問に答えてください。情報がない場合は「情報がありません」と答えてください。
コンテキスト:
{context}'),
('human', '{question}'),
])
llm = ChatOpenAI(model='gpt-4o', temperature=0)
def format_docs(docs):
return '
'.join(d.page_content for d in docs)
# LCEL Chain (Runnable)
rag_chain = (
{'context': retriever | format_docs, 'question': RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
return rag_chain
chain = build_rag_chain('./docs')
answer = chain.invoke('製品の保証期間は何年ですか?')
print(answer)
Haystack
2019年公開(deepset)、Python製のOSSです。GitHubスター18k+。エンタープライズ向けの堅牢なRAGパイプラインフレームワークで、コンポーネントを宣言的に接続する「パイプライン」設計・埋め込み検索とBM25キーワード検索のハイブリッド検索・多段階ランキングが特徴で、本番環境での信頼性が高いです。
# Python: Haystack 2.x でハイブリッドRAGパイプラインを構築
from haystack import Pipeline, Document
from haystack.components.embedders import OpenAITextEmbedder, OpenAIDocumentEmbedder
from haystack.components.retrievers.in_memory import InMemoryBM25Retriever, InMemoryEmbeddingRetriever
from haystack.components.joiners import DocumentJoiner
from haystack.components.rankers import TransformersSimilarityRanker
from haystack.components.builders import PromptBuilder
from haystack.components.generators import OpenAIGenerator
from haystack.document_stores.in_memory import InMemoryDocumentStore
# ドキュメントストア
doc_store = InMemoryDocumentStore()
docs = [Document(content='製品保証は3年です'), Document(content='返金は30日以内可能')]
doc_store.write_documents(docs)
# ハイブリッド検索パイプライン(BM25 + Embedding)
query_pipeline = Pipeline()
query_pipeline.add_component('text_embedder', OpenAITextEmbedder(model='text-embedding-3-small'))
query_pipeline.add_component('embedding_retriever', InMemoryEmbeddingRetriever(doc_store, top_k=5))
query_pipeline.add_component('bm25_retriever', InMemoryBM25Retriever(doc_store, top_k=5))
query_pipeline.add_component('joiner', DocumentJoiner())
query_pipeline.add_component('ranker', TransformersSimilarityRanker(top_k=3))
query_pipeline.add_component('prompt_builder', PromptBuilder(template='Context: {% for d in documents %}{{d.content}}
{% endfor %}
Question: {{question}}
Answer:'))
query_pipeline.add_component('llm', OpenAIGenerator(model='gpt-4o'))
query_pipeline.connect('text_embedder.embedding', 'embedding_retriever.query_embedding')
query_pipeline.connect('embedding_retriever', 'joiner.documents')
query_pipeline.connect('bm25_retriever', 'joiner.documents')
query_pipeline.connect('joiner', 'ranker.documents')
query_pipeline.connect('ranker', 'prompt_builder.documents')
query_pipeline.connect('prompt_builder', 'llm.prompt')
result = query_pipeline.run({'text_embedder': {'text': '保証期間'}, 'bm25_retriever': {'query': '保証期間'}, 'ranker': {'query': '保証期間'}, 'prompt_builder': {'question': '保証期間は?'}})
print(result['llm']['replies'][0])
機能比較表
| 比較項目 | LlamaIndex | LangChain | Haystack |
|---|---|---|---|
| Advanced RAG | ✅ 最強 | 中 | 中 |
| エコシステム | 中 | ✅ 最大(100k+) | 中 |
| ハイブリッド検索 | △ | △ | ✅ |
| エンタープライズ堅牢性 | 中 | 中 | ✅ |
| GitHub Stars | 38k+ | 100k+ | 18k+ |
RAGフレームワークは/categories/llm-toolsのpgvector・Chroma・LanceDBなどのベクターストアと組み合わせて完全なRAGスタックを構成します。DevOpsカテゴリ/categories/devopsのKubernetes・DockerでRAGパイプラインをAPIサービスとしてホストしてNext.jsフロントエンドからREST/Streamingで呼び出す本番RAGシステム構成が一般的です。
FAQ
Q. LlamaIndexのAdvanced RAG(HyDE・Re-ranking)はどんな効果がありますか?
A. HyDE(仮想文書埋め込み)はクエリ品質を向上させ、Re-rankingは検索精度を高めます。HyDE(Hypothetical Document Embedding): 「返金できますか?」という質問を受けてLLMに「この質問に答えるFAQ文書」を生成させ、その仮想文書の埋め込みで検索→より意味的に正確なベクター検索が可能。Re-ranking: ベクター検索でTop10を取得→LLMや専用ランカー(Cohere Rerank・BGE Reranker)でTop3に精度高く絞り込む→精度が大幅に向上。実測効果: シンプルなRAGと比べてAdvanced RAGはFAQ QAタスクでRecall@3が0.65→0.85に改善するケースが報告されている。コスト: Re-ranking追加でレイテンシが0.5〜1秒増加→精度とレイテンシのトレードオフで判断。
Q. LangChainのRAGで引用付き回答(出典を含む回答)を実装するには?
A. with_sourcesまたはcreate_retrieval_chainを使って引用情報を取得します。実装: from langchain.chains import create_retrieval_chain→from langchain.chains.combine_documents import create_stuff_documents_chain→プロンプトに{context}と{input}を含める→retrieval_chain = create_retrieval_chain(retriever, question_answer_chain)→result = retrieval_chain.invoke({"input": "質問"})→result["context"]に参照ドキュメントのリスト→d.metadata["source"]で元ファイル名・URLを引用として表示。カスタム引用: BaseChatMessageHistoryでconversation historyを保持→複数ターンの会話でも前の引用文書を記憶してフォローアップ質問に対応。
Q. HaystackのハイブリッドRAG(BM25 + embedding)が優れているのはどんなケースですか?
A. 固有名詞・商品コード・数字を含む専門用語検索・多言語コーパスでハイブリッドRAGが純粋なembedding検索を上回ります。BM25が有利なケース: ①製品型番(PX-2024-JP等)②人名・社名の完全一致③コードスニペットや数式。Embedding検索が有利なケース: ①意味的に近い表現(「返金」と「払い戻し」)②多義語の意図理解。ハイブリッドの効果: BM25 Top5 + Embedding Top5をDocumentJoinerで統合→ReciprocalRankFusionで順位統合→TransformersSimilarityRankerで最終スコアリング→どちらだけより全体的な検索品質が向上(ベンチマーク: BEIR datasetで2〜5%のNDCG@10改善)。
Q. RAGフレームワークはどれを選べばいいですか?
A. RAG特化・Advanced RAG機能・データインデックスならLlamaIndex、エコシステム・エージェント・幅広いLLMパターンならLangChain、ハイブリッド検索・パイプライン設計・エンタープライズならHaystackが向いています。LlamaIndex優位: ①Sub-Question・HyDE・Re-ranking等のAdvanced RAGをすぐ使える②LlamaHub(300+データローダー)でNotion・Confluence・Jira等のデータを統一API取得③GraphRAG(知識グラフ+RAG)対応。LangChain優位: ①Python + TypeScriptで同一ロジックをフル実装②LangSmith(観測・評価)との最深統合③エージェント・ツール・マルチモーダル等広範なパターン対応④GitHub 100k+の最大コミュニティ。Haystack優位: ①コンポーネント=パイプライン設計が明確でコードが整理しやすい②ハイブリッド検索と多段階ランキングの実装が成熟③企業の本番RAGシステムでの実績が豊富。
まとめ
| ユースケース | 推奨ツール |
|---|---|
| Advanced RAG・データインデックス特化 | LlamaIndex |
| 汎用LLMアプリ・エージェント・最大エコシステム | LangChain |
| ハイブリッド検索・パイプライン・エンタープライズ | Haystack |