生成AI入門 2026.05.14

LangChain vs LlamaIndex【2026年版】RAG実装コードで比較|用途別の選び方

タグ:LangChain / LlamaIndex / RAG / ベクターDB / Python

機能比較表

特徴LangChainLlamaIndex
主な強み複雑なエージェント・チェーン構築ドキュメント検索・RAGに特化
学習難度やや高い(多機能)低め(RAGがシンプル)
LLM対応100+(Claude/GPT/Ollama等)多数対応
ベクターDBChroma/Pinecone/FAISS等Chroma/Pinecone/FAISS等
エージェント機能充実(Tool Use・Multi-agent)基本的
ローカルLLM設定直感的追加設定が必要な場合あり

同じRAGシステムを両方で実装して比較

LangChainでPDF検索システムを実装

# langchain_rag.py
# pip install langchain langchain-anthropic langchain-community chromadb pypdf

from langchain_anthropic import ChatAnthropic
from langchain_community.document_loaders import PyPDFLoader
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains import RetrievalQA

# 1. ドキュメントをロード
loader = PyPDFLoader("company_manual.pdf")
documents = loader.load()

# 2. チャンクに分割
splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200,
)
chunks = splitter.split_documents(documents)
print(f"チャンク数: {len(chunks)}")

# 3. 埋め込みとベクターDB(ローカル・無料)
embeddings = HuggingFaceEmbeddings(
    model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
)
vectorstore = Chroma.from_documents(chunks, embeddings, persist_directory="./chroma_db")

# 4. Claude Haikuで質問応答
llm = ChatAnthropic(model="claude-haiku-4-5-20251001")
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=vectorstore.as_retriever(search_kwargs={"k": 3}),
)

# 5. 質問
result = qa_chain.invoke("有給休暇の取得方法を教えてください")
print(result["result"])

LlamaIndexで同じシステムを実装

# llamaindex_rag.py
# pip install llama-index llama-index-llms-anthropic llama-index-embeddings-huggingface

from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.llms.anthropic import Anthropic
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
import os

# 1. LLMと埋め込みの設定
Settings.llm = Anthropic(
    model="claude-haiku-4-5-20251001",
    api_key=os.environ["ANTHROPIC_API_KEY"]
)
Settings.embed_model = HuggingFaceEmbedding(
    model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
)

# 2. ドキュメントをロード&インデックス作成
documents = SimpleDirectoryReader("./docs").load_data()  # PDFも対応
index = VectorStoreIndex.from_documents(documents)

# 3. クエリエンジン作成
query_engine = index.as_query_engine(similarity_top_k=3)

# 4. 質問
response = query_engine.query("有給休暇の取得方法を教えてください")
print(response.response)
print("\n参照ソース:")
for node in response.source_nodes:
    print(f"  - {node.metadata.get('file_name', '不明')}: p.{node.metadata.get('page_label', '?')}")

コード量比較

LangChain: 約35行(インポート含む)
LlamaIndex: 約25行(インポート含む)

LlamaIndexの方がRAGは簡潔。
LangChainは多機能なため設定が多い。

エージェント機能:LangChainが優位な例

# langchain_agent.py
# 複数ツールを使うエージェント(LangChainの強み)

from langchain_anthropic import ChatAnthropic
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain.tools import tool
from langchain_core.prompts import ChatPromptTemplate

@tool
def search_docs(query: str) -> str:
    """社内文書を検索する"""
    return vectorstore.similarity_search(query, k=3)[0].page_content

@tool
def get_today_date() -> str:
    """今日の日付を返す"""
    from datetime import date
    return str(date.today())

llm = ChatAnthropic(model="claude-sonnet-4-5")
tools = [search_docs, get_today_date]

prompt = ChatPromptTemplate.from_messages([
    ("system", "あなたはHRアシスタントです。社内文書と日付を使って質問に答えてください。"),
    ("human", "{input}"),
    ("placeholder", "{agent_scratchpad}"),
])

agent = create_tool_calling_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

result = executor.invoke({"input": "今日から有給を3日取ると何日になりますか?"})
print(result["output"])

選び方フローチャート

スタート

ドキュメントから情報を検索することが主な用途か?
  ├ Yes → LlamaIndex(シンプル・少ないコード)
  └ No ↓
    
複数のLLMを切り替えたい or エージェントが必要か?
  ├ Yes → LangChain(多機能・柔軟)
  └ No ↓
    
チャットボットやシンプルなQ&Aシステムか?
  ├ Yes → どちらでも可(LlamaIndexの方が簡単)
  └ No → 要件を整理してから再検討

あわせて読みたい

参考ソース