NTT DATA TECH
⛓️

遂に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では、AIMessageHumanMessagecontent_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

LLMChainConversationChain、旧 Retrieversindexing APIhub モジュールなどは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 TECH
NTT DATA TECH
設定によりコメント欄が無効化されています