2026年の技術トレンドの中心にあるのは、間違いなく 「AIエージェント」 です。
AIエージェントとは、LLMが単に質問に答えるだけでなく、自分で考え、必要なツールを使い、複数のステップを踏んで目的を達成する仕組みのことです。そして、このAIエージェントを構築するためのフレームワークとして最も広く使われているのが LangGraph です。
この記事では、LangGraphの基本概念を押さえつつ、実際に動くコードを使って「天気を調べて回答するエージェント」を作ってみます。
LangGraphとは?
LangGraph は、LangChainチームが開発した AIエージェント構築用のオーケストレーションフレームワーク です。2024年初頭にリリースされ、2025年10月に v1.0(GA) に到達しました。Uber、LinkedIn、Klarnaなどの企業が本番環境で採用しています。
LangChainとの関係を整理すると、こうなります。
| LangChain | LangGraph | |
|---|---|---|
| 役割 | LLMとの接続・プロンプト管理 | エージェントのワークフロー制御 |
| 設計思想 | チェーン(直線的な処理の連鎖) | グラフ(分岐・ループを含む処理) |
| 向いている場面 | RAGパイプラインなどの定型処理 | 状態に応じて動的に判断するエージェント |
LangChainが「パーツ」の提供なら、LangGraphはそのパーツを 「どういう順番で、どう判断して動かすか」 を制御する役割です。
LangGraphの3つの基本概念
LangGraphを理解するうえで、押さえておくべき概念は3つだけです。
① State(状態)
エージェントが処理を進めるなかで持ち回るデータのことです。「今どういう状況か」を記録する辞書のようなものです。
from typing import Annotated, TypedDict
from langgraph.graph.message import add_messages
class AgentState(TypedDict):
messages: Annotated[list, add_messages]
この例では messages(会話の履歴)を状態として保持しています。
② Node(ノード)
実際の処理を行う関数です。「LLMに問い合わせる」「ツールを実行する」といった各ステップが1つのノードになります。
③ Edge(エッジ)
ノード同士をつなぐ線です。「このノードが終わったら次はどのノードへ行くか」を定義します。条件分岐もエッジで表現します。
[LLM呼び出し] --ツールが必要→ [ツール実行] --結果を返す→ [LLM呼び出し]
\--ツール不要→ [終了]
この 「ノードとエッジで構成されたグラフ」 がLangGraphの設計思想の核です。直線的なチェーンでは表現しにくい「LLMが自分で判断してループする」動きを、グラフ構造で自然に書けます。
実践:天気を調べるAIエージェントを作る
それでは、実際にLangGraphでエージェントを組んでみましょう。「天気を聞いたらツールで調べて答える」シンプルなエージェントです。
前提
pip install langgraph langchain-openai
Step 1:ツールを定義する
まず、エージェントが使えるツールを作ります。
from langchain_core.tools import tool
@tool
def get_weather(city: str) -> str:
"""指定された都市の天気を返す"""
# 実際にはAPIを呼ぶが、ここではダミー
weather_data = {
"東京": "晴れ / 22°C",
"大阪": "曇り / 19°C",
"札幌": "雪 / -2°C",
}
return weather_data.get(city, f"{city}の天気情報は見つかりませんでした")
Step 2:LLMとツールを接続する
LLMにツールを使える能力を持たせます(Function Calling / Tool Use)。
from langchain_openai import ChatOpenAI
tools = [get_weather]
llm = ChatOpenAI(model="gpt-4o").bind_tools(tools)
Step 3:ノードを定義する
エージェントのグラフを構成する各処理を関数として書きます。
from langgraph.prebuilt import ToolNode
# ノード①:LLMに問い合わせる
def call_llm(state: AgentState):
response = llm.invoke(state["messages"])
return {"messages": [response]}
# ノード②:ツールを実行する
tool_node = ToolNode(tools)
Step 4:条件分岐を定義する
LLMの応答にツール呼び出しが含まれるかどうかで、次のステップを分岐させます。
def should_use_tool(state: AgentState) -> str:
last_message = state["messages"][-1]
if last_message.tool_calls:
return "tools" # ツール実行ノードへ
return "end" # 終了へ
Step 5:グラフを組み立てる
ノードとエッジを組み合わせてグラフを完成させます。
from langgraph.graph import StateGraph, END
# グラフを構築
graph = StateGraph(AgentState)
# ノードを追加
graph.add_node("llm", call_llm)
graph.add_node("tools", tool_node)
# エッジを定義
graph.set_entry_point("llm")
graph.add_conditional_edges("llm", should_use_tool, {
"tools": "tools",
"end": END,
})
graph.add_edge("tools", "llm") # ツール実行後、LLMに戻る
# コンパイル
agent = graph.compile()
Step 6:実行する
from langchain_core.messages import HumanMessage
result = agent.invoke({
"messages": [HumanMessage(content="東京の天気を教えて")]
})
print(result["messages"][-1].content)
# → 東京の天気は「晴れ / 22°C」です。
何が起きているのか
上のコードで実行されるフローはこうなっています:
ユーザー「東京の天気を教えて」
↓
[llm] LLMが「get_weatherツールを呼ぶべきだ」と判断
↓ (should_use_tool → "tools")
[tools] get_weather("東京") を実行 → "晴れ / 22°C"
↓
[llm] ツールの結果を元に自然言語で回答を生成
↓ (should_use_tool → "end")
[END] 「東京の天気は晴れ / 22°Cです。」
ポイントは、LLM自身が「ツールを使うべきか否か」を判断しているところです。単純なif文ではなく、LLMの推論によって処理フローが動的に変化します。これがAIエージェントの本質です。
RAG・MCP・Ollamaとの関係
LangGraphはこのシリーズで紹介してきた技術と自然に連携します。
| 技術 | LangGraphとの関係 |
|---|---|
| RAG | 検索ツールをノードとして組み込み、知識に基づく回答を生成 |
| MCP | MCPサーバーをツールとして接続すれば、GitHub・Notionなどの外部操作が可能 |
| Ollama |
ChatOllama に差し替えればローカルLLMでエージェントを動かせる |
つまりLangGraphは、これらの技術を 「いつ・どの順番で・どう使うか」 をオーケストレーションする役割を果たします。
まとめ
| キーワード | 内容 |
|---|---|
| LangGraph | AIエージェントのワークフローを制御するフレームワーク |
| State | エージェントが持ち回る状態データ |
| Node | 各処理ステップ(LLM呼び出し、ツール実行など) |
| Edge | ノード間の接続と条件分岐 |
| v1.0 GA | 2025年10月にリリース。本番環境で利用可能 |
LangGraphは「AIに考えさせて動かす」ための設計図を書くフレームワークです。まずは今回のような小さなエージェントから始めて、徐々にノードやツールを追加していくのがおすすめです。
参考: