CSのTips一覧

LangGraphのinterruptから再開するとノードの先頭が再実行される

interruptの再開は停止した行の次からプロセスを続ける動きではない。ノードの先頭から再実行されるため、承認待ちの前に置いた外部操作も再び呼ばれ得る。

用語

interrupt
グラフを停止し、外部入力を受け取って再開するためのLangGraphの関数。
チェックポイント
グラフの状態と処理位置などを再開用に保持する記録。
冪等性キー
同じ操作の再送を識別し、処理結果の重複を防ぐためのキー。

図と例

設計の流れ(独自の例)

承認ノードでinterrupt → 同じthread_idで再開 → ノード先頭から再実行 → 操作IDを照合して実行

仮定の例:承認通知メールを送ってからinterruptで待つノードを再開したら、同じメールが送られた。通知を繰り返しても1回の結果になる処理へ変え、承認と発注は別ノードで扱う。

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

  • LangGraph interrupt

    LangGraphは、interruptの再開でノードが先頭から実行されることと、待機前の副作用を冪等にするか別ノードへ分ける方法を説明している。

    資料を読む

解説

interruptの前後と、操作成功後の保存前に停止するケースを試す。再開要求では利用者・案件・承認対象を検証し、単なる真偽値だけを権限の根拠にしない。

LangGraphのinterruptはチェックポイントを使って待機し、同じthread_idでCommandのresume値を渡して再開する。再開したノードではinterruptより前のコードも実行される。承認ノードと操作ノードを分け、待機前には安全に繰り返せる処理だけを置く。操作を承認後へ移しても、外部操作の成功後に保存が失敗する経路は残るので、操作IDや冪等性キーによる重複防止も設計する。複数のinterruptを持つノードは、待機中に呼び出し順を変更する際の互換性にも注意する。

トレードオフ

承認と実行を別ノードにする
得るもの:再開で繰り返される処理を把握しやすい
払うもの:ノード間で承認内容と操作対象を照合する必要がある
待機前の処理を冪等にする
得るもの:再実行されても同じ結果として扱える
払うもの:外部サービスとの対応や操作結果の保存を設計する

さらに学ぶ

チェック

interruptの前で通知を送るノードを再開した。通知の再送を防ぐには?

  1. ノードが先頭から再実行される前提で通知を冪等にする
  2. interruptより前のコードは再実行されないと考える
  3. thread_idを毎回変えて同じ待機を再開する
解答と解説

ノードが先頭から再実行される前提で通知を冪等にする

再開時はノードの先頭から実行される。新しいthread_idは同じ待機の再開にならない。通知を繰り返せる設計にし、必要なら処理を分ける。

このTipを深掘りした記事