0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【保存版】LangChain完全ガイド2026 — LCEL・LangGraph・RAG・エージェントを本番投入レベルで理解する

0
Posted at

LangChainってまだ現役なの?LangGraphとの違いは?結局どう書くのが正解?

この記事は、そんなモヤモヤを1本で全部解消することを目的にした2026年版の総まとめです。ブックマーク推奨。


この記事のゴール

  • LangChainの全体像とエコシステムをスッと掴める
  • LCEL(LangChain Expression Language)で書く現代的な書き方が身につく
  • LangGraphを使ったエージェント設計の勘所がわかる
  • RAGの本番実装パターンを最短で理解できる
  • LlamaIndexとの棲み分けが明確になる

想定読者:Python中級以上・LLMアプリを趣味から本番に押し上げたいエンジニア。


目次

  1. 2026年、LangChainはまだ熱いのか?
  2. エコシステム地図:LangChain / LangGraph / LangSmith
  3. LCEL入門:Runnableを制する者はLangChainを制す
  4. RAGを最短で作る(本番品質)
  5. LangGraphでエージェントを制御可能にする
  6. マルチエージェント設計パターン
  7. LangChain vs LlamaIndex — 2026の結論
  8. 本番投入で失敗しないためのチェックリスト
  9. 学習ロードマップ

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年時点の情報に基づいています。フィードバックは編集リクエストまたはコメントでお願いします。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?