近年、大規模言語モデル(LLM)を活用したアプリケーションの開発が急速に進んでいます。
その中で、LangChain はLLMを活用する上で非常に強力なフレームワークとして注目されています。
そして、LangChainのツール群の一つである LangGraph は、LLMを活用したアプリの構築をより柔軟にするための ステートマシン(状態遷移)管理ライブラリ です。
本記事では、LangGraphの基本的な使い方を徹底解説 します!
「LangGraphって何?」「LLMアプリにどう活用できるの?」と疑問に思っている方は、ぜひ最後まで読んでみてください。
【本記事の目次】
📌 LangGraphとは?
LangGraph とは、LangChainのツールチェインの一つであり、
ステートマシンを構築し、LLMエージェントの状態管理を効率的に行う ためのフレームワークです。
✅ LangGraphの特徴
- グラフ構造でエージェントのフローを定義できる
- マルチエージェント(複数のAI)が協調するシステムを構築可能
- LangChainとシームレスに連携できる
- 状態の管理が明確になり、複雑なワークフローを実装しやすい
LLMアプリケーションを開発する際に、単純なプロンプト処理だけでなく、
「対話の分岐」「条件による遷移」「複数のエージェントの連携」 などを実装する際に強力な武器となります。
🔧 環境構築
LangGraphを使用するために、まずは環境を整えましょう。
📌 必要なライブラリのインストール
pip install langchain langgraph
📌 確認済みバージョン(2024年7月時点)
記事執筆時点では、以下のバージョンを使用しています。
ライブラリ | バージョン |
---|---|
Python | 3.10.12 |
langgraph | 0.1.5 |
LangChainの開発速度は非常に速いため、実行前にバージョンを確認することを推奨します。
🎯 LangGraphの基本コンポーネント
LangGraphは、グラフ構造 を使ってLLMの状態を管理します。
主なコンポーネントは以下の通りです。
コンポーネント | 説明 |
---|---|
Graph | LangGraphの中核であり、NodeとEdgeの集合体 |
State | ノード間の状態データを保持するオブジェクト |
Node | 各ステップの処理を実行する要素 |
Edge | ノード間の遷移を定義する要素 |
1️⃣ Graphの作成
まず、グラフの基本構造を定義しましょう。
from langgraph.graph import StateGraph
from typing_extensions import TypedDict
# Stateの定義
class State(TypedDict):
value: str
# グラフの作成
graph = StateGraph(State)
2️⃣ Stateの定義
State は、エージェント間で共有するデータを格納します。
class State(TypedDict):
value: str
また、Pydantic
を使用して定義することも可能です。
🚀 LangGraphを使った簡単なワークフロー
✨ 単純なグラフの作成
まず、簡単な ステートマシン を作成し、順番にノードを処理する基本的なワークフローを構築します。
from langgraph.graph import StateGraph
from langchain_core.runnables import RunnableConfig
from typing_extensions import TypedDict
Stateの定義
class State(TypedDict):
value: str
Nodeの定義(ステップごとの処理)
def node(state: State, config: RunnableConfig):
return {"value": "Step 1 完了"}
def node2(state: State, config: RunnableConfig):
return {"value": "Step 2 完了"}
Graphの作成
graph_builder = StateGraph(State)
Nodeを追加
graph_builder.add_node("node", node)
graph_builder.add_node("node2", node2)
Edgeの定義(node → node2)
graph_builder.add_edge("node", "node2")
始点・終点の設定
graph_builder.set_entry_point("node")
graph_builder.set_finish_point("node2")
Graphのコンパイル
graph = graph_builder.compile()
実行
result = graph.invoke({"value": ""})
print(result)
✅ 実行結果
{'value': 'Step 2 完了'}
🔄 分岐のあるワークフロー(条件付き遷移)
LangGraphでは、条件に応じて次のノードを変更する分岐 を作ることが可能です。
import random
from typing import Literal
分岐のルールを定義
def routing(state: State, config: RunnableConfig) -> Literal["node2", "node3"]:
if random.randint(0, 1) == 0:
return "node2"
return "node3"
def node2(state: State, config: RunnableConfig):
return {"value": "Path A"}
def node3(state: State, config: RunnableConfig):
return {"value": "Path B"}
グラフ作成
graph_builder.add_node("node2", node2)
graph_builder.add_node("node3", node3)
分岐を追加
graph_builder.add_conditional_edges("node", routing)
これにより、ランダムに “node2” または “node3” に遷移するグラフが作成できます。
📊 グラフを可視化する方法
LangGraphには、グラフの可視化機能も用意されています。
✅ Mermaid記法での出力
print(graph.get_graph().draw_mermaid())
✅ PNG画像での出力
from IPython.display import Image, display
display(Image(graph.get_graph().draw_mermaid_png()))
🎯 まとめ
✅ LangGraphは、LLMエージェントの状態管理をグラフ構造で定義できるライブラリ
✅ シンプルなワークフローから、条件分岐を持つ複雑なフローまで実装可能
✅ グラフの可視化機能があり、開発・デバッグに便利
LangGraphを活用することで、より高度なLLMアプリケーション を構築できます!