LangGraphを単なる「長いチェーン」として扱わないでください
LangGraphを「ステップ数が増えただけのLangChain」と考えるのはやめましょう。その間違いが、壊れたエージェントを生む原因になります。
LangGraphは、状態(state)、分岐、ツール呼び出し、そして人間の承認を必要とするワークフローのためのものです。エラーが発生しても、最初からやり直すことなく復旧できるエージェントのためのものです。
LangGraphを使用する場合、まず最初に「state(状態)」「interrupts(中断)」「recovery(復旧)」の3つを定義しなければなりません。
最初の境界:State Schema
単一のプロンプトにおける境界はテキストです。しかし、LangGraphにおける境界はState schemaです。以下の項目を決定する必要があります:
- どのフィールドがノード間を移動するか。
- どのフィールドをノードが更新するか。
- 並行する分岐がどのように値をマージするか。
- どの値がチェックポイントに保存されるか。
- どの値を決して永続化させてはいけないか。
ここではReducerが極めて重要です。メッセージを追記するための適切なルールを設定していないと、並行処理中にデータが消失してしまいます。
小さく始めましょう。1つのschema、1つのnode、1つのreducerを持つグラフを作成してください。それが機能しないのであれば、ツールを追加してもエラーを隠蔽するだけです。
ランタイムの境界
compile() を呼び出す前、グラフは単なる記述に過ぎません。compile() を呼び出した後、ランタイムが制御を引き継ぎます。
グラフが失敗したとき、単にノードだけを見るのではなく、以下の4点を確認してください:
- State schemaは、そのノードがそのキーを書き込むことを許可しているか?
- ノードは有効なStateフィールドを返しているか?
- Reducerはデータを正しくマージしているか?
- 条件付きエッジ(conditional edge)に脱出パスがあるか?
Human In The Loop(人間による介入)
人間の承認を単なるUI機能として扱わないでください。グラフの「契約(contract)」として扱ってください。
信頼できるパターンは以下の通りです:
- モデルがツール呼び出しを提案する。
- グラフがinterrupt(中断)を発生させる。
- 人間がアクションを承認または編集する。
- グラフがその正確な地点から再開する。
これにより、エージェントは単なる「反応的なもの」ではなく、「復旧可能なもの」になります。
スモークテスト・チェックリスト
本番環境に投入する前に、このテストを実行してください:
- 本番データを含まない一時ディレクトリを使用する。
- 最小限のStateを定義する。
- 有効なフィールドのみを返すノードを1つ作成する。
- 追記アクションにはreducerを使用する。
- ツールアクションの前にinterruptを1つ追加する。
- checkpointerを追加する。
- あえて失敗を発生させ、再開時の挙動を確認する。
このプロセスが失敗する場合、ツールを追加してはいけません。問題はランタイムの境界にあります。
LangGraphは、単発のモデル呼び出しのためのものではありません。AIが、検査可能で、一時停止可能で、かつレビュー可能なマルチステップの作業を行う必要がある場合に活用してください。
Optional learning community: https://t.me/GyaanSetuAi
