遂にLangChain v1.0リリース! 新機能と移行のポイントをコード付きで分かりやすく解説!
2025年10月22日、ついに LangChain v1.0 がリリースされました! 🥳
v1.0は特に「エージェント構築」が強化され、従来LangGraphが持っていた機能の統合なども行われています。本記事では、LangChain 1.0の新機能とv0.xからv1.0への移行のポイントをコード付きで紹介します。
LangChain v1.0のサマリー
| 項目 | 内容 |
|---|---|
| create_agent | シンプルで高機能なエージェントAPI |
| Middleware | 柔軟な拡張・制御が可能に |
| 標準コンテンツブロック | テキスト・画像・ツール呼び出し・推論ステップを統一的に扱う |
| 構造化出力 | 指定したフォーマットでの出力を簡単に |
| LCEL | 簡潔なチェインの設定 |
| 旧機能の分離 |
langchain-classic として独立 |
| パッケージの細分化 | 必要な機能だけを選択可能 |
| Python 3.9のサポート終了 | macOSユーザは標準で3.9なので注意 |
LangChain v1.0 主な新機能と変更点
1. create_agent: 高度なエージェント開発を簡単に
LangGraphで提供されていた create_react_agent と同様の機能が、LangChain v1.0の langchain.agents.create_agent として統合・強化されました。これにより、Tool Calling/MCPを利用した高度なエージェントをLangChainのみで簡単に作成できるようになりました。
from datetime import datetime
from zoneinfo import ZoneInfo
from langchain.agents import create_agent
from langchain.tools import tool
@tool
def get_current_time(timezone: str) -> str:
"""timezoneで指定されたタイムゾーンの現在時刻を取得"""
now = datetime.now(ZoneInfo(timezone))
return {
"time": now.strftime("%Y-%m-%d %H:%M:%S %Z"),
}
tools = [get_current_time]
agent = create_agent(
model="openai:gpt-5",
tools=tools,
system_prompt="あなたは優秀なアシスタントです。"
)
result = agent.invoke({
"messages": [
{"role": "user", "content": "ハノイの現在時刻"}
]
})
print(result["messages"][-1].content)
create_agentとinvokeにより、モデルがツールを必要な時に利用するエージェントを簡単に作成することができます。
新機能ではありませんが、以前は、モデルの定義で
agent = create_react_agent(
model=ChatOpenAI(model='gpt-5'),
...
のようにChatOpenAIなどを利用していましたが、最近のLangChainでは、
agent = create_agent(
model="openai:gpt-5",
のようにopenai:などのプレフィクスを利用して簡潔に表現できるようになっています。
2. ミドルウェア (Middleware) の導入
create_agent では、Middleware が利用できるようになりました。
モデル呼び出しやツール実行の前後で、任意の処理を挿入できます。
代表的な活用例
- 会話履歴の自動要約
- 機密情報(PII)のマスキング
- ツール実行前の人間承認(Human-in-the-loop)
例えば、この機能を使って、メール送信前に、人間による確認を実施するサンプルは、下記のようになります。
from langchain.agents import create_agent
from langchain.agents.middleware import (
SummarizationMiddleware,
HumanInTheLoopMiddleware
)
from langchain.tools import tool
@tool
def send_email(to: str, subject: str, body: str) -> str:
"""Eメールを送信します。"""
print(f"Tool: send_email(to='{to}', ...)")
return f"{to} 宛にメールを送信しました。"
agent = create_agent(
model="openai:gpt-5",
tools=[send_email],
middleware=[
HumanInTheLoopMiddleware(
interrupt_on={
"send_email": True,
"description": "このメールを送信しますか? (approve/reject)"
}
)
]
)
3. 標準コンテンツブロック (Standard Content Blocks)
v1.0では、AIMessage や HumanMessage に content_blocks プロパティが追加されました。
これにより、テキスト・画像・ツール呼び出し・推論ステップなどを統一的に表現・処理できるようになっています。
従来はメッセージ本文全体を単一の文字列として扱っていましたが、v1.0からは各要素が構造化されたブロックとして格納されるため、モデルの出力構造をより柔軟に解析・可視化できます。
AnthropicモデルやOpenAIの一部新モデルなど、マルチモーダル出力・逐次推論対応モデルで特に有効です。
代表的な用途
- モデルの「推論ステップ」を抽出して可視化
- ツール呼び出し(Tool Call)の識別と実行制御
- マルチモーダル出力(テキスト+画像など)の処理
from langchain_anthropic import ChatAnthropic
model = ChatAnthropic(model="claude-3-sonnet-20240229")
response = model.invoke("フランスの首都は? 理由は?")
for block in response.content_blocks:
if block["type"] == "reasoning":
print("--- モデルの推論 ---")
print(block['reasoning'])
print("--------------------")
elif block["type"] == "text":
print(f"回答: {block['text']}")
elif block["type"] == "tool_call":
print(f"ツール呼び出し: {block['name']}({block['args']})")
4. 構造化出力 (Structured Output)
LangChain v1.0では、モデル出力をフリーテキストではなく、指定した構造化フォーマット(Pydanticモデル)で受け取ることができるようになりました。
これにより、LLMの回答をコードやシステムで扱いやすい形式(例:JSON相当のオブジェクト) として直接利用できます。
天気情報を構造化出力する例(structured_output.py)
from langchain.agents import create_agent
from langchain.agents.structured_output import ToolStrategy
from pydantic import BaseModel, Field
class Weather(BaseModel):
"""都市の天気情報"""
temperature: float = Field(description="気温")
humidity: float = Field(description="湿度")
condition: str = Field(description="天気(例:晴れ、曇り、雨)")
wind_direction: str = Field(description="風向")
wind_speed: str = Field(description="風速")
agent = create_agent(
"openai:gpt-5",
tools=[],
response_format=ToolStrategy(Weather)
)
result = agent.invoke({
"messages": [{"role": "user", "content": "サンフランシスコの天気は晴れ、気温は25℃、湿度は30%、風向きは南西風速5m。サンフランシスコの今の天気は?"}]
})
if result["structured_response"]:
print(result["structured_response"])
# weather_data: Weather = result["structured_response"]
# weather_data.temperatureなどで値にアクセス
出力例:
% python structured_output.py
temperature=25.0 huminity=30.0 condition='晴れ' wind_direction='南西' wind_speed='5m'
下記のWeatherクラスで、エージェントに出力させるフォーマットを定義しています。
class Weather(BaseModel):
create_agent時にresponse_format=ToolStrategy(Weather)を指定することにより、Weather型で応答を返すように指示されます。
agent = create_agent(
"openai:gpt-5",
tools=[],
response_format=ToolStrategy(Weather)
)
実行結果resultからstructured_responseを取り出すと、直接Weatherクラスのインスタンスとして扱えるため、weather_data.temperature のように安全にアクセスできます。
weather_data: Weather = result["structured_response"]
weather_data.temperature などで値にアクセス
5. ChatPromptTemplateと簡潔なチェイン
ChatPromptTemplateにより、プロンプトのテンプレートを簡潔に書けるようになりました。
# LangChain v1.0より前
prompt_template = PromptTemplate(
input_variables=["product"],
template="{product}を作る会社名を提案してください。"
)
# LangChain v1.0以降
prompt_template = ChatPromptTemplate.from_template(
"{product}を作る会社名を提案してください。"
)
LangChain v1.0から従来は試験的導入だったLCEL (LangChain Expression Language)が正式採用されました。LangChainのコンポーネント(プロンプト、モデル、パーサーなど)の連携が|(パイプ)を利用して簡潔に書けるようになりました。
model = ChatOpenAI(model="gpt-5")
prompt_template = ...
output_parser = StrOutputParser()
# LangChain v1.0より前
chain = LLMChain(llm=model, prompt=prompt_template)
# LangChain v1.0以降
chain = prompt_template | model | output_parser
chain.invoke({"product": "カラフルな靴下"})
LangChain v1.0の完全なサンプルを紹介しておきます。
proposal-company.py
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
model = ChatOpenAI(model="gpt-5")
prompt = ChatPromptTemplate.from_template(
"{product}を作る会社名を提案してください。"
)
output_parser = StrOutputParser()
chain = prompt | model | output_parser
response = chain.invoke({"product": "カラフルな靴下"})
print(response)
実行例
% python proposal-company.py
- くつしたブーケ
- 万華鏡ソックス
...
- プリズムソックススタジオ
- ビビッドソックワークス
必要であれば、ターゲット(例:キッズ向け、ギフト、高級ライン)や世界観(ポップ、和モダン、ミニマル)に合わせて候補を精査・追加します。商標・ドメインの空き確認も一緒に進めましょう。
LangChain v1.0 移行のポイント
1. 旧バージョンの主要機能は langchain-classic へ
LLMChain や ConversationChain、旧 Retrievers、indexing API、hub モジュールなどはlangchain から 分離 されました。
これらを引き続き使う場合は次の通りインストールしてください。
pip install langchain-classic
インポートパスの変更例
# v0.x
# from langchain.chains import LLMChain
# from langchain import hub
# v1.0
from langchain_classic.chains import LLMChain
from langchain_classic import hub
2. パッケージ構成のモジュール化と分離
v1.0では、モジュール化が進み、必要な機能だけを選択してインストールできるようになりました。そのため、分離されたモジュールを利用するには、別途インポートする必要があります。
langchainのみをインポートした場合、分離されたモジュールは利用できないので注意してください。
| パッケージ名 | 内容 |
|---|---|
langchain-core |
Runnableやメッセージなど、LangChainの基盤機能 |
langchain-community |
コミュニティ製インテグレーション(LLM, VectorStoreなど) |
langchain-openai, langchain-anthropic
|
各主要モデルプロバイダ向け機能 |
langchain |
エージェント実行の中心(create_agentなど) |
langchain-classic |
旧バージョンの機能群 |
3. Python 3.9 のサポート終了
v1.0では Python 3.10以上 が必要です。
3.9はサポート対象外になりました。macOSのデフォルトのPythonは3.9ですので、macOSユーザの方は、Pythonをインストールする必要があります。
macOSでPython 3.14をインストールする例
% brew install python@3.14
まとめ
LangChain v1.0正式リリースに合わせて、様々な機能追加や改善が行われ、エージェントフレームワークとしての完成度がより高まっています。以前はLangChainを利用していると他の後発のフレームワークの進化に遅れを取っていると感じることがありましたが、今回の正式リリースにより、後発のフレームワークにも見劣りしない仕上がりを見せています。
本記事が皆さんのLangChain v1.0の導入の助けになればと思います。
NTT DATA公式アカウントです。 技術を愛するNTT DATAの技術者が、気軽に楽しく発信していきます。 当社のサービスなどについてのお問い合わせは、 お問い合わせフォーム nttdata.com/jp/ja/contact-us/ へお願いします。