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の前で通知を送るノードを再開した。通知の再送を防ぐには?
- ノードが先頭から再実行される前提で通知を冪等にする
- interruptより前のコードは再実行されないと考える
- thread_idを毎回変えて同じ待機を再開する
解答と解説
ノードが先頭から再実行される前提で通知を冪等にする
再開時はノードの先頭から実行される。新しいthread_idは同じ待機の再開にならない。通知を繰り返せる設計にし、必要なら処理を分ける。