LangGraphで親グラフからサブグラフ(子グラフ)を呼び出し情報を引き渡す方法

この記事は約4分で読めます。
スポンサーリンク

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を使ったアプリケーションの設計や拡張がより柔軟に、そして効率的に行えるようになります。

コメント

タイトルとURLをコピーしました