LangGraphとは
- LangGraphは、LangChainのツール群に含まれる一つで、各LLMエージェントのステップなどをグラフ化して状態管理を行うためのツールです。
- LangChainでは、一方向の処理しかできませんでした。LangGraphはループを持つ処理のフローを簡単に構築できるため、LangChainよりも複雑なタスクをこなすことができます。
- 処理の流れをノードとエッジで構成されるグラフ構造として定義し、ループ、分岐、状態管理を直感的かつ効率的に扱えるようにします。
特徴
- グラフベースのアーキテクチャ: ワークフローをノードとエッジのグラフとして定義します。これにより、線形のスクリプトでは扱いにくい複雑な処理フロー(ループ、再試行、分岐など)を、コードを複雑にせずに構築できます。
- ステート管理: グラフの各ステップで状態(コンテキスト)が管理され、次のステップに引き継がれるため、長期的な記憶を持つアプリケーションが実現できます。
- マルチエージェントのサポート: 複数のエージェントが協調して動作するような、より高度なシナリオを構築できます。
- 高い柔軟性: LangChainのツールとの統合は必須ではなく、任意のPython関数をノードとして使用できるため、LangChain以外のエコシステムや独自実装とも組み合わせやすいです。
基本コンポーネント
| コンポーネント | 説明 |
|---|---|
| Graph | LangGraphの中核となる構成要素で、各NodeとEdgeの集合体です。 |
| State | ノード間の遷移の際に保持される情報で、各ノードが参照および更新します。 |
| Node | グラフ内の個々のステップや状態を表す要素で、特定のアクションやチェックポイントとして機能します。 |
| Edge | ノード間の接続を表し、遷移の条件やアクションを定義します。条件付きエッジなど、特定のロジックに基づいて遷移を制御できます。 |
インストール
## langgraph
pip install langgraph
## モデル(今回は使用しません)
pip install langchain-google-genai
基本的な使い方
- pythonのコードは下記の通りになります。
# 必要なライブラリを読み込む
from typing_extensions import TypedDict
from langgraph.graph import StateGraph
from IPython.display import Image, display
# stateの定義
## TypedDictでStateクラスを定義
class State(TypedDict):
value: str
# Nodeの作成
## nodeはStateを受け取って、更新したい情報を返す関数
def node1(state: State):
value = state["value"] + "_node1"
return {"value": value}
def node2(state: State):
value = state["value"] + "_node2"
return {"value": value}
# Graphの作成
## StateGraphのインスタンスを作成
graph = StateGraph(State)
# GrphにNodeを追加
graph.add_node("node1", node1)
graph.add_node("node2", node2)
# Edgeを追加
graph.add_edge("node1", "node2")
# 始点と終点を定義
graph.set_entry_point("node1")
graph.set_finish_point("node2")
# NodeとEdgeで構成したGraphをコンパイル
graph = graph.compile()
# Graphを可視化(mermaid)
img_bytes = graph.get_graph().draw_mermaid_png()
with open("./lang_graph.png", "wb") as f:
f.write(img_bytes)
# 実行
graph.invoke({"value": "hoge"})
## デバッグ実行
graph.invoke({"value": "hoge"}, debug=True)
- 可視化の例
- 実行時の例
{'value': 'hoge_node1_node2'}
- デバック実行の例
[values] {'value': 'hoge'}
[updates] {'node1': {'value': 'hoge_node1'}}
[values] {'value': 'hoge_node1'}
[updates] {'node2': {'value': 'hoge_node1_node2'}}
[values] {'value': 'hoge_node1_node2'}
後記
- 最後まで読んで頂きありがとうございます。
- LangGraph関して学んでいる最中ですが、今後も学んだことをOutPutしていこうと思います。
参考
