LangGraphは、グラフ理論をベースにしたアーキテクチャで、複雑なデータフローやエージェント間の連携を効率的に実現できるライブラリです。ここでは、親グラフからサブグラフ(子グラフ)を呼び出し、情報(State)を引き渡す方法を解説します。
サブグラフ(子グラフ)とは
サブグラフ(subgraph)は、LangGraphのようなグラフ構造を持つライブラリや、グラフ理論全般で使われる概念です。親グラフ(大きなグラフ)の中に含まれる、より小さなグラフのことを指します。
別表現・関連用語
- 子グラフ:親グラフに対して、その内部に含まれるグラフを「子グラフ」と呼ぶこともあります。これは家系図や木構造の「親子関係」をグラフに拡張した表現です。
- 部分グラフ:サブグラフは英語で「subgraph」、日本語では「部分グラフ」とも訳されます。これは「全体の中の一部を構成するグラフ」という意味合いです。
- 階層構造の一部:LangGraphでは、サブグラフを親グラフのノードとして扱うことで、グラフの階層構造を表現できます。これにより、複雑な処理やエージェントのチームワークを分かりやすく設計できます。
サブグラフの特徴
- 独立性:サブグラフは親グラフから独立して定義・動作できますが、親グラフの一部として振る舞います。
- 再利用性:サブグラフを定義することで、同じ処理を複数の場所で再利用できます。
- 状態の分離:LangGraphでは、サブグラフごとに独自の状態(State)を管理できるため、マルチエージェントや複雑なワークフローにも対応しやすくなります。
親グラフとサブグラフの情報連携方法
同じStateを共有する場合
親グラフとサブグラフが同じState(状態)のプロパティを持つ場合、親から子へStateが自動的に引き継がれます。
・Stateの定義例
class State(TypedDict):
messages: list
・サブグラフのノード追加例
subgraph = StateGraph(State)
subgraph.add_node("sub_node", call_model)
subgraph.set_entry_point("sub_node")
subgraph.set_finish_point("sub_node")
・親グラフでのサブグラフ呼び出し
builder = StateGraph(State)
builder.add_node("subgraph_node", subgraph)
builder.add_edge(START, "subgraph_node")
graph = builder.compile()
この場合、親グラフからサブグラフへStateが引き渡され、サブグラフの処理結果も親のStateに反映されます。
Stateスキーマが異なる場合
親グラフとサブグラフのStateスキーマが異なる場合、親グラフのノード内でサブグラフを呼び出し、Stateの変換を行います。
・サブグラフのState定義例
class SubState(TypedDict):
sub_messages: list
・親グラフのノード内でサブグラフを呼び出す例
def call_subgraph(state: State):
sub_state = {"sub_messages": state["messages"]}
result = subgraph.invoke(sub_state)
return {"messages": result["sub_messages"]}
このように、親から子へ、また子から親へ情報を柔軟に引き渡せます。
サブグラフから親グラフのノードを呼び出す方法
サブグラフの処理中に、親グラフの特定のノードを直接呼び出したい場合、LangGraphのCommand
機能を使います。
・Commandの利用例
from langgraph.graph import Command
# サブグラフのノードで親グラフのノードを呼び出す
def child_node(state):
# 親グラフのparent_node2を呼び出す
return Command(graph=Command.PARENT, node="parent_node2")
このようにすることで、サブグラフの本来の遷移先ではなく、親グラフのノードに処理を移すことができます。
まとめ
LangGraphでは、親グラフからサブグラフ(子グラフ・部分グラフ)を呼び出し、Stateを引き渡すことで、複雑な処理を柔軟かつ効率的に実現できます。Stateスキーマが異なる場合でも、ノード内で変換処理を行うことで情報を引き渡せます。また、サブグラフから親グラフのノードを直接呼び出すことも可能です。
この仕組みを活用することで、LangGraphを使ったアプリケーションの設計や拡張がより柔軟に、そして効率的に行えるようになります。
コメント