LangChain 2026 - LLMアプリ開発フレームワークの現状と実践

中級 | 10分 で読める | 2026.04.23

公式ドキュメント

この記事の要点

• LangChain 0.3系でlangchain-core/community/partnersの明確な分離が完了
• LCEL(LangChain Expression Language)が成熟し、型安全なパイプライン構築が可能
• 月間ダウンロード数1400万回超(PyPI、2026年4月時点)
• LangGraphへの責務分離で、複雑なエージェントは別フレームワークへ移行中

LangChainとは何か

LangChainは2022年10月にHarrison Chase氏が開発を開始したPython/TypeScript製のLLMアプリケーションフレームワークで、プロンプト管理・モデル抽象化・チェーン構築・ツール統合を一元的に提供します。OpenAI・Anthropic・Google・Cohere等の主要LLMプロバイダーを統一インターフェースで扱え、RAG(Retrieval-Augmented Generation)やエージェントシステムの実装を大幅に簡略化します。

2026年4月時点でLangChainはバージョン0.3.12に到達し、企業向け管理プラットフォーム「LangSmith」と監視ツール「LangChain Hub」も安定稼働しています(LangChain公式ブログ、2026年3月)。Claude 4Gemini 3など最新モデルにも即座に対応しており、LLMエコシステムの事実上の標準ライブラリとして機能しています。

LangChain 2026の主要アーキテクチャ

1. パッケージ分割と依存管理

LangChain 0.3系では、モノリシックだった構造が以下のように分割されました。

パッケージ役割依存
langchain-core基盤インターフェース・抽象クラスなし
langchain-community非公式統合・実験的機能core
langchain主要チェーン・ツールcore + community
langchain-partners公式プロバイダー統合core

ポイント: 2026年時点では langchain-partners 配下に langchain-openai、langchain-anthropic、langchain-google-vertexai などが独立パッケージとして提供されており、必要なプロバイダーのみを個別インストールできます。

# 必要最小限のインストール例(2026年推奨)
pip install langchain-core langchain-anthropic langchain-community

# 従来の一括インストール(非推奨、依存肥大化)
pip install langchain

この分離により、Docker イメージサイズが平均42%削減されました(LangChain公式ベンチマーク、2026年2月)。

2. LCEL(LangChain Expression Language)の成熟

LCELはパイプライン演算子(|)で処理を連鎖させる宣言的DSLで、0.2系で導入され0.3系で型推論が強化されました。

from langchain_anthropic import ChatAnthropic
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

# LCEL による型安全なチェーン構築
model = ChatAnthropic(model="claude-4-opus-20260301", temperature=0)
prompt = ChatPromptTemplate.from_messages([
    ("system", "あなたは{domain}の専門家です。"),
    ("human", "{question}")
])
output_parser = StrOutputParser()

chain = prompt | model | output_parser

# 実行
result = chain.invoke({
    "domain": "量子コンピューティング",
    "question": "量子もつれを簡潔に説明してください"
})
print(result)

LCELは内部でRunnable Protocolを実装しており、.invoke().stream().batch().ainvoke()(非同期)が自動的に利用可能になります。従来のLLMChainクラスベースの記述と比べて、コード行数が平均32%削減されることが報告されています(公式移行ガイド)。

3. プロバイダー抽象化の実装

LangChainは主要LLMをBaseChatModelインターフェースで統一し、切り替えが1行で完了します。

from langchain_anthropic import ChatAnthropic
from langchain_openai import ChatOpenAI
from langchain_google_vertexai import ChatVertexAI

# 環境変数でプロバイダーを切り替え
import os
provider = os.getenv("LLM_PROVIDER", "anthropic")

if provider == "anthropic":
    llm = ChatAnthropic(model="claude-4-sonnet-20260229")
elif provider == "openai":
    llm = ChatOpenAI(model="gpt-5-turbo-2026")
elif provider == "google":
    llm = ChatVertexAI(model="gemini-3-pro")

# 以降のコードは共通
response = llm.invoke("量子コンピューティングの現状は?")

この抽象化はベンダーロックイン回避と開発環境/本番環境でのモデル使い分けに有効で、RAG 2025で解説したマルチプロバイダー戦略の基盤となっています。

4. ツール連携とFunction Calling

LangChain 0.3ではOpenAI互換のツール定義が標準化され、Pydanticスキーマからの自動変換が可能です。

from langchain_core.tools import tool
from pydantic import BaseModel, Field

class WeatherInput(BaseModel):
    location: str = Field(description="都市名(例: 東京)")
    unit: str = Field(default="celsius", description="温度単位")

@tool(args_schema=WeatherInput)
def get_weather(location: str, unit: str = "celsius") -> str:
    """指定された都市の現在の天気を取得します。"""
    # 実際のAPI呼び出しは省略
    return f"{location}の気温は22{unit}です。"

# モデルにツールをバインド
llm_with_tools = llm.bind_tools([get_weather])
response = llm_with_tools.invoke("東京の天気を教えて")

2026年時点ではAnthropic MCPとの統合も進んでおり、MCPサーバー経由のツールをLangChainToolとして自動登録できます(langchain-mcp統合パッケージ、2026年3月リリース)。

RAG実装の実践パターン

シンプルなRAGパイプライン

from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_anthropic import ChatAnthropic
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate

# 1. ドキュメント読み込み
loader = WebBaseLoader("https://python.langchain.com/docs/")
docs = loader.load()

# 2. チャンク分割
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200
)
splits = text_splitter.split_documents(docs)

# 3. ベクトルストア構築
vectorstore = FAISS.from_documents(
    documents=splits,
    embedding=OpenAIEmbeddings()
)
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})

# 4. RAGチェーン構築
system_prompt = (
    "あなたは質問応答アシスタントです。"
    "以下のコンテキストを使って質問に答えてください。\n\n"
    "{context}"
)
prompt = ChatPromptTemplate.from_messages([
    ("system", system_prompt),
    ("human", "{input}")
])

llm = ChatAnthropic(model="claude-4-sonnet-20260229")
question_answer_chain = create_stuff_documents_chain(llm, prompt)
rag_chain = create_retrieval_chain(retriever, question_answer_chain)

# 5. 実行
result = rag_chain.invoke({"input": "LCELとは何ですか?"})
print(result["answer"])

実践メモ: 本番環境ではFAISSよりもPinecone・Weaviate・[Supabase Vector](/news/supabase-vector)などのマネージドベクトルDBが推奨されます。LangChainは40種類以上のベクトルストアに対応しており、インターフェースの変更なしで切り替え可能です。

マルチクエリ検索とリランキング

2026年時点では、単純な類似度検索よりクエリ拡張とリランキングを組み合わせたRAGが主流です。

from langchain.retrievers.multi_query import MultiQueryRetriever
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import CohereRerank

# マルチクエリ検索(LLMが自動で複数の質問バリエーションを生成)
multi_query_retriever = MultiQueryRetriever.from_llm(
    retriever=retriever,
    llm=llm
)

# Cohereリランカーで精度向上
compressor = CohereRerank(model="rerank-multilingual-v3.0")
compression_retriever = ContextualCompressionRetriever(
    base_compressor=compressor,
    base_retriever=multi_query_retriever
)

# 精度の高い検索結果を取得
compressed_docs = compression_retriever.get_relevant_documents(
    "LangChainのストリーミング機能について教えて"
)

この構成で、単純なベクトル検索と比較して検索精度(NDCG@10)が平均18%向上したという報告があります(LangSmith実測データ、2026年1月)。

エージェント構築とLangGraphへの移行

従来のAgentExecutor

LangChain 0.2系まではAgentExecutorクラスで簡易的なエージェントを構築できました。

from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate

tools = [get_weather]
prompt = ChatPromptTemplate.from_messages([
    ("system", "あなたは親切なアシスタントです。"),
    ("placeholder", "{chat_history}"),
    ("human", "{input}"),
    ("placeholder", "{agent_scratchpad}"),
])

agent = create_tool_calling_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools)

result = agent_executor.invoke({
    "input": "東京の天気を調べて、適切な服装を提案して"
})

注意: AgentExecutorは2026年時点で非推奨化されており、複雑なワークフローやマルチエージェント構成にはLangGraphへの移行が推奨されています(公式移行ガイド、2026年3月)。

LangGraphへの責務分離

LangGraphは状態管理・分岐・ループを含む複雑なエージェントワークフローに特化したフレームワークで、LangChainとは独立したパッケージとして提供されています。2026年の方針では以下のように責務が分離されています。

用途推奨フレームワーク
シンプルなLLM呼び出し・プロンプト管理LangChain LCEL
RAG・ベクトル検索LangChain
単一ツール呼び出しエージェントLangChain AgentExecutor
複数ステップ・分岐・並列実行LangGraph
マルチエージェント協調LangGraph

LangChainとLlamaIndexの比較

LlamaIndex 2026はRAGに特化したフレームワークで、LangChainとしばしば比較されます。

観点LangChainLlamaIndex
主要ユースケースエージェント・汎用チェーンRAG・インデックス管理
ドキュメント読み込み150種類のLoader100種類のLoader
ベクトルDB統合40種類30種類
エージェント機能LCEL + LangGraphAgentic RAG
TypeScript対応充実限定的
学習曲線やや緩やか急(概念が多い)

実際には両者を併用するケースも多く、LlamaIndexのインデックスをLangChainのRetrieverとして使う統合パターンが公式に提供されています。

from llama_index import VectorStoreIndex
from langchain.retrievers import LlamaIndexRetriever

# LlamaIndexでインデックス構築
index = VectorStoreIndex.from_documents(documents)

# LangChainのRetrieverとして利用
retriever = LlamaIndexRetriever(index=index)
rag_chain = create_retrieval_chain(retriever, question_answer_chain)

LangSmithによる監視と評価

LangSmithはLangChainアプリケーションの観測性プラットフォームで、2026年時点で有料プランが月額50ドルから提供されています。

import os
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = "your-api-key"
os.environ["LANGCHAIN_PROJECT"] = "my-rag-app"

# 以降のLangChain呼び出しが自動的にLangSmithにログされる
result = rag_chain.invoke({"input": "..."})

LangSmithダッシュボードでは以下が可視化されます。

  • 各ステップの実行時間とトークン使用量
  • プロンプトの入出力履歴
  • エラーのスタックトレース
  • ユーザーフィードバックの集計

ポイント: LangSmithは評価データセットを作成し、プロンプト改善前後の精度を自動比較できます。本番環境では「回答が役立った」フィードバックをLangSmith APIに送信し、継続的な品質改善に活用します。

本番環境での実装パターン

パターン1: 社内文書検索RAG

from langchain_community.document_loaders import DirectoryLoader
from langchain_community.vectorstores import Pinecone
from langchain_openai import OpenAIEmbeddings
from langchain.text_splitters import MarkdownHeaderTextSplitter
import pinecone

# 1. マークダウン文書を階層構造を保持して読み込み
loader = DirectoryLoader("./docs", glob="**/*.md")
docs = loader.load()

# 2. ヘッダー構造を認識した分割
headers_to_split_on = [
    ("#", "Header 1"),
    ("##", "Header 2"),
    ("###", "Header 3"),
]
markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on)
splits = markdown_splitter.split_text("\n\n".join([d.page_content for d in docs]))

# 3. Pineconeにインデックス構築
pinecone.init(api_key="...", environment="us-west1-gcp")
index_name = "company-docs"
vectorstore = Pinecone.from_documents(
    splits,
    OpenAIEmbeddings(),
    index_name=index_name
)

# 4. メタデータフィルタリング付き検索
retriever = vectorstore.as_retriever(
    search_kwargs={
        "k": 5,
        "filter": {"department": "engineering"}
    }
)

パターン2: カスタマーサポートチャットボット

from langchain_anthropic import ChatAnthropic
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationalRetrievalChain

memory = ConversationBufferMemory(
    memory_key="chat_history",
    return_messages=True
)

qa_chain = ConversationalRetrievalChain.from_llm(
    llm=ChatAnthropic(model="claude-4-haiku-20260307", temperature=0),
    retriever=retriever,
    memory=memory,
    verbose=True
)

# セッションごとにメモリを保持
session_id = "user-12345"
response = qa_chain.invoke({
    "question": "返品ポリシーを教えて",
    "chat_history": []
})

実践メモ: 本番環境ではメモリをRedisなど永続ストアに保存します。langchain-community に RedisMemory が含まれており、セッションIDをキーにした会話履歴管理が可能です。

TypeScript版の状況

LangChain.jsは2026年時点でバージョン0.3.9に到達し、Python版の主要機能を90%以上カバーしています。

import { ChatAnthropic } from "@langchain/anthropic";
import { ChatPromptTemplate } from "@langchain/core/prompts";
import { StringOutputParser } from "@langchain/core/output_parsers";

const model = new ChatAnthropic({
  model: "claude-4-sonnet-20260229",
  temperature: 0,
});

const prompt = ChatPromptTemplate.fromMessages([
  ["system", "あなたは{domain}の専門家です。"],
  ["human", "{question}"],
]);

const chain = prompt.pipe(model).pipe(new StringOutputParser());

const result = await chain.invoke({
  domain: "機械学習",
  question: "転移学習を簡潔に説明してください",
});
console.log(result);

Node.js/Deno/Bun環境で動作し、Next.js・Remix等のフレームワークとの統合も充実しています。ただし、Python版と比べてコミュニティ統合の種類が少なく、新機能リリースが1〜2ヶ月遅れる傾向があります。

よくある質問

LangChainは本番環境で使えますか?
2026年時点で多数の企業が本番採用しています。特にRAGやシンプルなエージェントには実績があります。ただし、LLM呼び出しの抽象化レイヤーが厚く、デバッグが困難になる場合があるため、LangSmithなどの監視ツールと併用が推奨されます。小規模プロジェクトでは直接LLM APIを呼び出す方がシンプルなこともあります。

LangChainとLangGraphはどう使い分けますか?
LangChainはプロンプト管理・RAG・ツール統合に特化し、LangGraphは複雑なワークフロー(条件分岐・ループ・並列実行)に特化します。まずはLangChainで実装し、制御フローが複雑になったらLangGraphに移行するのが推奨パターンです。両者は同じエコシステムなので段階的移行が容易です。

既存のOpenAI API呼び出しをLangChainに移行すべきですか?
すでに動いているコードを無理に移行する必要はありません。LangChainの価値は以下の場合に発揮されます: (1)複数LLMプロバイダーを切り替えたい、(2)RAGを実装したい、(3)ツール連携エージェントを作りたい、(4)プロンプト管理を体系化したい。単純な質問応答APIであればOpenAI SDK直接利用で十分です。

まとめ

LangChain 2026は実用フェーズに入り、エンタープライズでの採用が加速しています。以下のポイントを再確認します。

  • langchain-core/partners分離で依存管理が改善、必要なパッケージのみインストール可能
  • LCEL により型安全で簡潔なパイプライン記述が可能
  • RAG実装ではベクトルDBとリランキングの組み合わせが主流
  • 複雑なエージェントはLangGraphへの移行が推奨される
  • LangSmithによる観測性確保が本番運用の鍵

AI Agents 2025で解説した通り、エージェント市場の成長とともにLangChainエコシステムも進化しています。直接API呼び出しとの適切な使い分けを意識しながら、生産性向上に活用してください。

参考リソース

この技術を体系的に学びたいですか?

未来学では東証プライム上場企業のITエンジニアが24時間サポート。月額24,800円から、退会金0円のオンラインIT塾です。

メールで無料相談する
← 一覧に戻る