CSのTips一覧

LangGraphのサブグラフは呼び出し単位かスレッド単位かを決める

同じ専門エージェントを再利用しても、以前の依頼の状態を毎回持ち越す必要はない。サブグラフの記憶を残す範囲と、同じインスタンスへの複数呼び出しを設計する。

用語

サブグラフ
親グラフの一部として呼び出す、独立して定義したグラフ。
呼び出し単位
前回の呼び出しの状態を引き継がず、その呼び出しの中で状態を扱う範囲。
名前空間
チェックポイントなどを区別して保存するための識別範囲。

図と例

設計の流れ(独自の例)

子の記憶の寿命を選ぶ → 依頼ごとの入力を渡す → 呼び出し内の待機を再開 → 必要な結果だけ親へ返す

仮定の例:複数の仕入先を同じ調査サブグラフで確認する。前の仕入先の判断を持ち越さない呼び出し単位の状態を使い、案件全体の比較結果だけを親に集める。

実際のサービス・製品では

  • LangGraph subgraphs

    LangGraphの公式資料は呼び出し単位・スレッド単位・チェックポイントなしの3方式と、同じ状態付きサブグラフの複数呼び出しで起きる競合を説明する。

    資料を読む

解説

親と子の状態の項目、記憶の寿命、再開方法を別々に決める。同じ子への複数呼び出しや、親から別案件へ入力を切り替える場合も試す。

サブグラフは親グラフの中で実行するグラフ。親にCheckpointerがある場合、子のcheckpointer=Noneは呼び出し単位で新しく始めつつ、その呼び出しの中断・再開を扱える。checkpointer=Trueは同じスレッドで呼び出しをまたいで状態を保持する。checkpointer=Falseはチェックポイントを使わず、中断・再開の機能も使わない。同じスレッドで状態を持つ同一サブグラフを1つのノード内から複数回呼ぶと、保存先の名前空間が競合する場合がある。独立した調査なら呼び出し単位を選び、継続対話が必要な場合だけ持続する状態を使う。

トレードオフ

呼び出し単位で子の状態を使う
得るもの:独立した依頼へ前の情報を持ち越しにくい
払うもの:呼び出しをまたぐ記憶が要るなら別に保持する
スレッド単位で子の状態を保持する
得るもの:同じ専門エージェントとの継続対話を扱える
払うもの:同じ子への複数呼び出しと状態の競合を管理する

さらに学ぶ

チェック

独立した仕入先調査を同じサブグラフで複数回実行し、各調査で中断・再開も使いたい。親にCheckpointerがある場合の候補は?

  1. 子をcheckpointer=Falseにし中断・再開も使う
  2. すべて同じ永続状態に追記して過去の調査を混ぜる
  3. 子をcheckpointer=Noneにし呼び出し単位で状態を扱う
解答と解説

子をcheckpointer=Noneにし呼び出し単位で状態を扱う

呼び出し単位なら調査ごとに新しく始めつつ、その呼び出し内の中断・再開を親の保存機能で扱える。Falseはチェックポイントなしで、この要件を満たさない。