LangChainってまだ現役なの?LangGraphとの違いは?結局どう書くのが正解?
この記事は、そんなモヤモヤを1本で全部解消することを目的にした2026年版の総まとめです。ブックマーク推奨。
この記事のゴール
- LangChainの全体像とエコシステムをスッと掴める
- LCEL(LangChain Expression Language)で書く現代的な書き方が身につく
- LangGraphを使ったエージェント設計の勘所がわかる
- RAGの本番実装パターンを最短で理解できる
- LlamaIndexとの棲み分けが明確になる
想定読者:Python中級以上・LLMアプリを趣味から本番に押し上げたいエンジニア。
目次
- 2026年、LangChainはまだ熱いのか?
- エコシステム地図:LangChain / LangGraph / LangSmith
- LCEL入門:Runnableを制する者はLangChainを制す
- RAGを最短で作る(本番品質)
- LangGraphでエージェントを制御可能にする
- マルチエージェント設計パターン
- LangChain vs LlamaIndex — 2026の結論
- 本番投入で失敗しないためのチェックリスト
- 学習ロードマップ
1. 2026年、LangChainはまだ熱いのか?
結論から言うと、Yes。ただし使い方が変わりました。
2023年頃のなんでもLangChain時代は終わりました。今のLangChainは:
- 軽量な合成レイヤーとして(LCELベースで小さく書く)
- LangGraphの土台として(状態機械としてのエージェント)
- LangSmithの観測基盤と組み合わせて(本番デバッグ)
というモジュラーな使われ方に進化しています。
一言で:LangChainはコンポーネント、LangGraphはランタイム、LangSmithは目。
2. エコシステム地図
| レイヤー | 何を担当? | いつ使う? |
|---|---|---|
| LangChain Core | LLM / Prompt / Retriever / Tool の抽象化 | ほぼ必須 |
| LCEL | パイプ` | `で繋ぐDSL |
| LangGraph | 状態を持つグラフ実行エンジン | エージェント・分岐・ループ |
| LangSmith | トレース/評価/モニタリング | 本番運用・デバッグ |
| LangServe | チェーンをREST APIに | 素早くデプロイしたい時 |
[アプリ]
│
▼
[LangGraph] ← 制御フロー(ループ・分岐・状態)
│
▼
[LangChain (LCEL)] ← LLM/Retriever/Toolの合成
│
▼
[LangSmith] ← 実行トレース・評価
3. LCEL入門:Runnableを制する者はLangChainを制す
LCEL(LangChain Expression Language)は、Unixパイプのように | でコンポーネントを繋ぐ記法です。
3.1 最小サンプル
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
prompt = ChatPromptTemplate.from_template("あなたはプロの{role}です。{question}に答えてください。")
model = ChatOpenAI(model="gpt-4o-mini", temperature=0)
parser = StrOutputParser()
# ここがLCELの真骨頂
chain = prompt | model | parser
print(chain.invoke({"role": "料理人", "question": "だし巻きのコツは?"}))
3.2 なぜLCELが強いのか?
- invoke / stream / batch / ainvoke が自動で使える
- 並列実行が RunnableParallel で簡単
- フォールバック・リトライ・キャッシュが宣言的
- LangSmithで自動トレース
3.3 並列実行の例
from langchain_core.runnables import RunnableParallel
parallel = RunnableParallel(
summary=prompt_summary | model | parser,
keywords=prompt_keywords | model | parser,
sentiment=prompt_sentiment | model | parser,
)
result = parallel.invoke({"text": long_document})
# → {"summary": "...", "keywords": [...], "sentiment": "..."}
3つのLLM呼び出しが並列で走ります。従来の逐次コードから体感2〜3倍速。
4. RAGを最短で作る
PDFに質問できるアプリを、最小構成から本番品質までの順に見ていきます。
4.1 最小RAG(30行)
from langchain_community.document_loaders import PyPDFLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import FAISS
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
# 1. Load & Split
docs = PyPDFLoader("manual.pdf").load()
chunks = RecursiveCharacterTextSplitter(
chunk_size=800, chunk_overlap=100
).split_documents(docs)
# 2. Embed & Store
vs = FAISS.from_documents(chunks, OpenAIEmbeddings())
retriever = vs.as_retriever(search_kwargs={"k": 4})
# 3. Chain
prompt = ChatPromptTemplate.from_template("""
以下のコンテキストのみを使って回答してください。
根拠がない場合はわかりませんと答えてください。
# コンテキスト
{context}
# 質問
{question}
""")
rag = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| ChatOpenAI(model="gpt-4o-mini")
| StrOutputParser()
)
print(rag.invoke("返品ポリシーは?"))
4.2 本番品質に上げる7つのテクニック
| # | テクニック | 効果 |
|---|---|---|
| 1 | Hybrid Search(BM25 + ベクトル) | 固有名詞に強くなる |
| 2 | Re-ranking(Cohere Rerank / bge-reranker) | Top-Kの精度爆上げ |
| 3 | Multi-Query(質問を複数生成) | 検索漏れ削減 |
| 4 | Parent Document Retriever | 小chunkでヒット、大chunkで回答 |
| 5 | Contextual Compression | ノイズ削減・コスト削減 |
| 6 | Self-Query Retriever | メタデータフィルタを自動生成 |
| 7 | HyDE(仮想回答で検索) | 抽象的な質問に強くなる |
4.3 Re-rankingサンプル
from langchain.retrievers import ContextualCompressionRetriever
from langchain_cohere import CohereRerank
compressor = CohereRerank(model="rerank-multilingual-v3.0", top_n=3)
compressed_retriever = ContextualCompressionRetriever(
base_compressor=compressor,
base_retriever=retriever, # k=20くらいに増やしておくのがコツ
)
コツ:retriever.k=20 で広く取り → rerank で3件に絞る、が2026年の鉄板。
5. LangGraphでエージェントを制御可能にする
LLMに自由にやらせたら暴走した、途中経過が見えない、ループを止められない…そんな悩みの答えがLangGraphです。
5.1 コアコンセプト
- State:グラフ全体で共有する状態(辞書)
- Node:状態を受け取り、更新を返す関数
- Edge:ノード間の遷移(条件分岐OK)
5.2 ReAct風エージェントを作る
from typing import TypedDict, Annotated
from langgraph.graph import StateGraph, END
from langgraph.graph.message import add_messages
from langchain_core.messages import HumanMessage
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
# --- State定義 ---
class AgentState(TypedDict):
messages: Annotated[list, add_messages]
# --- Tool定義 ---
@tool
def search_web(query: str) -> str:
"""Webを検索する"""
return f"{query} の検索結果...(モック)"
@tool
def calculator(expression: str) -> str:
"""数式を評価する"""
return str(eval(expression))
tools = [search_web, calculator]
model = ChatOpenAI(model="gpt-4o").bind_tools(tools)
# --- Node ---
def call_model(state: AgentState):
response = model.invoke(state["messages"])
return {"messages": [response]}
def call_tool(state: AgentState):
last = state["messages"][-1]
outputs = []
for call in last.tool_calls:
result = {t.name: t for t in tools}[call["name"]].invoke(call["args"])
outputs.append({"role": "tool", "content": str(result), "tool_call_id": call["id"]})
return {"messages": outputs}
# --- 分岐 ---
def should_continue(state: AgentState):
return "tools" if state["messages"][-1].tool_calls else END
# --- Graph構築 ---
workflow = StateGraph(AgentState)
workflow.add_node("agent", call_model)
workflow.add_node("tools", call_tool)
workflow.set_entry_point("agent")
workflow.add_conditional_edges("agent", should_continue)
workflow.add_edge("tools", "agent")
app = workflow.compile()
# --- 実行 ---
result = app.invoke({"messages": [HumanMessage(content="2024年の東京タワーの高さを2倍したら?")]})
print(result["messages"][-1].content)
5.3 LangGraphの本気の強み
- チェックポイント:任意の時点で状態を保存・復元
- Human-in-the-loop:人間の承認を挟める
- タイムトラベル:過去の状態から分岐再実行
- サブグラフ:階層化してスケール
- ストリーミング:ノード単位で逐次配信
6. マルチエージェント設計パターン
2026年、実用アプリの多くは単一エージェントより複数エージェントの協調に移行しました。
主要パターン
| パターン | ユースケース | 例 |
|---|---|---|
| Supervisor | 中央が下位エージェントに指示 | カスタマーサポート振り分け |
| Hierarchical | 部長→課長→担当のツリー | 大規模タスク分解 |
| Network | 全員が全員と話せる | ブレスト・議論シミュレーション |
| Plan-and-Execute | 計画→実行を分離 | リサーチエージェント |
| Reflection | 生成→自己批評→修正 | 記事執筆・コードレビュー |
Supervisorパターン(概念コード)
def supervisor(state):
# LLMが次にどのagentを呼ぶかを返す
decision = model.with_structured_output(Route).invoke(state["messages"])
return {"next": decision.next}
workflow.add_node("supervisor", supervisor)
workflow.add_node("researcher", researcher_agent)
workflow.add_node("writer", writer_agent)
workflow.add_node("reviewer", reviewer_agent)
workflow.add_conditional_edges(
"supervisor",
lambda s: s["next"],
{"researcher": "researcher", "writer": "writer", "reviewer": "reviewer", "FINISH": END},
)
for member in ["researcher", "writer", "reviewer"]:
workflow.add_edge(member, "supervisor")
7. LangChain vs LlamaIndex
2026年の結論はシンプルです。
| 観点 | LangChain / LangGraph | LlamaIndex |
|---|---|---|
| 強み | オーケストレーション、エージェント、マルチステップワークフロー | 検索・インデックス設計、データ接続 |
| 哲学 | 実行フローのフレームワーク | データのフレームワーク |
| 本番RAG | LangGraph + LCEL | 検索層のみ採用も◎ |
| エージェント | LangGraphが本命 | 追随中 |
| 学習コスト | 中〜高 | 低〜中 |
結論:エージェントや複雑ワークフローはLangChain(+LangGraph)、検索の質にこだわりたい部分だけLlamaIndexを部分採用がベストプラクティス。
8. 本番投入チェックリスト
コピペしてPRテンプレに貼ってください。
## LLMアプリ 本番投入チェック
### 観測性
- [ ] LangSmithでトレース有効化
- [ ] 主要チェーンにrun_nameを付与
- [ ] エラー時のフォールバックチェーン設定
### 品質
- [ ] 評価データセット(20件以上)を用意
- [ ] LLM-as-a-Judgeで自動評価
- [ ] Regressionテストがある
### コスト・パフォーマンス
- [ ] キャッシュ(SQLite / Redis)有効
- [ ] 適切なモデル選定(gpt-4o-mini / Haiku等)
- [ ] タイムアウト設定
- [ ] トークン上限のバリデーション
### セキュリティ
- [ ] Prompt Injection対策(システムプロンプト強化 + ガードレール)
- [ ] PIIマスキング
- [ ] レートリミット
### エージェント
- [ ] 最大ステップ数の制限
- [ ] 状態のチェックポイント保存
- [ ] Human-in-the-loop の停止点
9. 学習ロードマップ
Week 1 : LCELの基本(Prompt|Model|Parser) + Streaming
Week 2 : Retrievers全種類・Vector Store比較
Week 3 : RAGを評価まで作る(LangSmith Evals)
Week 4 : LangGraphでReActエージェント
Week 5 : マルチエージェント(Supervisor / Reflection)
Week 6 : 本番デプロイ(LangServe / FastAPI + 監視)
まとめ
- LangChainはモジュラーな合成レイヤーとして今も現役
- LCELで書くのが2026年の標準
- 複雑なフローはLangGraphで状態機械として組む
- RAGはHybrid Search + Rerankが鉄板
- 観測性と評価を最初から組み込むのが本番投入の鍵
この記事が役立ったらストックといいねをぜひ。
手を動かして学びたい方へ
読むだけでは身につかないのがLLMアプリ開発。演習型で手を動かしながら学べるUdemy講座を用意しました。
👉 割引クーポン付き|すべての講座を演習型で学べるUdemyコース一覧はこちら
- 全講座 ハンズオン形式(写経ではなく作りながら学ぶ)
- LangChain / LangGraph / RAG / エージェント まで網羅
- 特別割引価格でアクセス可能
記事を読んで理解したつもりを、実装できる自分に変えていきましょう。
参考リンク
この記事は2026年時点の情報に基づいています。フィードバックは編集リクエストまたはコメントでお願いします。