生成AI入門 2026.05.14
LangChain vs LlamaIndex【2026年版】RAG実装コードで比較|用途別の選び方
機能比較表
| 特徴 | LangChain | LlamaIndex |
|---|---|---|
| 主な強み | 複雑なエージェント・チェーン構築 | ドキュメント検索・RAGに特化 |
| 学習難度 | やや高い(多機能) | 低め(RAGがシンプル) |
| LLM対応 | 100+(Claude/GPT/Ollama等) | 多数対応 |
| ベクターDB | Chroma/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 → 要件を整理してから再検討
あわせて読みたい
- Claude Sonnet APIコスト完全解説|トークン計算・バッチ割引・月額試算
- AI同士を討論・協力させる実装ガイド|マルチエージェントシステム
- Ollama v0.30.0アップデート解説|ローカルLLMの使い方