AIエージェントのためのPRGパターン
AIエージェントは、ある古い問題に直面しています。それは、90年代にウェブフォームを壊したのと同じバグです。
昔のウェブでは、ユーザーがフォームを送信しました。もしユーザーがページをリフレッシュすると、ブラウザはデータを再送信してしまいました。これは、注文が2回、課金が2回、あるいはメールが2通送られることを意味していました。
その解決策が、Post/Redirect/Get (PRG) パターンでした。
ロジックは単純です:
- ユーザーがPOSTリクエストを送信する。
- サーバーが処理を実行する。
- サーバーが新しいURLへ302リダイレクトを送信する。
- ブラウザがGETリクエストでそのリダイレクトに従う。
これにより、リフレッシュしても結果ページが再読み込みされるだけで、アクションが繰り返されることはなくなりました。
AIエージェントはこのバグを、新しいレイヤーへと持ち込んでしまいました。
エージェントがカード決済やレコード作成のためにツールを呼び出す際、問題が発生します。ネットワークの切断、コンテナの再起動、レート制限の発動などです。エージェントは、直前の呼び出しが成功したかどうかを知りません。そのため、リトライ(再試行)を行います。
対策を講じなければ、エージェントは重複した注文を作成し、顧客を怒らせることになります。
べき等性キー(idempotency keys)を使用して、エージェントのパイプラインにPRGパターンを適用しなければなりません。
べき等性キーは、あなたの「リダイレクト」にあたります。それはアクションと結果を分離します。
実装方法:
- すべての状態を変更するツール(mutating tool)は、べき等性キーを受け入れなければならない。
- 最初の試行の前にキーを生成する。
- キーはタイムスタンプではなく、ユーザーの意図(intent)から派生させる。
- サーバーは、そのキーを以前に受け取ったかどうかを確認しなければならない。
- キーが既に存在する場合、タスクを再度実行するのではなく、保存されている結果を返す。
長時間のタスクには、単なるキー以上のものが必要です。チェックポインティング(checkpointing)が必要です。
チェックポインティングは、各ステップの状態を保存します。エージェントが20分かかるタスクの途中でクラッシュしても、中断したところから再開できます。最初からやり直す必要はありません。
もし、たった一つのことしかできないのであれば、すべてのツール呼び出しを「2回実行しても安全」なものにしてください。
以下の5つのチェック項目を備えたエージェントを構築してください:
- すべてのツールはべき等性キーを受け入れるか?
- キーは時間ではなく、意図に基づいているか?
- リトライのたびに同じキーが再利用されているか?
- 重複したキーに対して、サーバーは保存済みの結果を返しているか?
- 長時間のタスクにおいて、中間ステップが保存されているか?
パターンは同じです。変わったのはレイヤーだけです。
