AI

オープンソース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"])

機能比較表

比較項目LlamaIndexHaystackLangChain
RAGに特化⚠️汎用
データコネクタ✅ 100+✅ 30+✅ 100+
チャンキング✅ 高機能
ベクターDB統合✅ 30+✅ 15+✅ 40+
全文検索統合✅ Elastic
評価フレームワーク✅ Ragas
ストリーミング
ローカルLLM対応
APIの簡潔さ★★★★☆★★★☆☆★★★☆☆
本番実績★★★★☆★★★★☆★★★★★
ライセンスMITApache 2.0MIT
GitHub Stars37k+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が適しています。

まとめ

ユースケース推奨ツール
社内ドキュメントRAGLlamaIndex
本番グレードNLPパイプラインHaystack
汎用LLMアプリの一部としてRAGLangChain
完全ローカルRAGLlamaIndex + Ollama

関連外部リソース

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。