AIエージェントのためのPRGパターン
AIエージェントは、25年前の過ちを繰り返しています。
90年代、ウェブフォームには重大なバグがありました。ユーザーが注文を行い、ページを更新すると、ブラウザが再び注文を送信してしまうのです。これにより、二重課金が発生し、顧客の怒りを買うことになりました。
その解決策が、Post/Redirect/Get (PRG) パターンでした。仕組みは以下の通りです。
- ユーザーがデータを送信するためにPOSTリクエストを送信する。
- サーバーがデータを処理する。
- サーバーが新しいURLへリダイレクトを送信する。
- ブラウザが結果を表示するためにGETリクエストを実行する。
ユーザーが更新ボタンを押しても、GETリクエストが再送されるだけです。危険なPOSTリクエストは消えています。
AIエージェントが、このバグを復活させてしまいました。
エージェントがカード決済やレコード作成のためのツールを呼び出した際、ネットワークが切断されることがあります。エージェントはアクションが成功したかどうか判断できず、再試行します。その結果、顧客には二重の請求が発生してしまいます。
これは「べき等性キー(idempotency key)」を使用することで解決できます。べき等性キーはリダイレクトのように機能します。「アクションを実行すること」と「結果を表示すること」を分離するのです。
エージェントにおけるパターンは、以下のようになるべきです。
- エージェントは最初の試行の前に一意のキーを生成する。
- ユーザーIDやカートIDのような、安定した値を使用する。
- すべてのツール呼び出しにこのキーを添えて送信する。
- サーバーはキーを確認する。同じキーを再度受け取った場合は、アクションを二度実行するのではなく、前回の結果を返す。
長時間のタスクには、キーだけでは不十分です。「チェックポインティング(checkpointing)」が必要です。各ステップで状態を保存しなければなりません。これにより、再起動時に中断した箇所から再開できるようになります。
データを変更するあらゆるエージェントツールにおいて、以下のルールに従ってください。
- すべての更新(mutating)ツールは、べき等性キーを受け入れなければならない。
- キーはタイムスタンプからではなく、ユーザーの意図から導き出す。
- 最初の試行の前にキーを生成する。
- 再試行の際は常に同じキーを再利用する。
- 長時間のタスクについては、すべての途中経過をチェックポイントとして保存する。
レイヤーは変わっても、ロジックは変わりません。
Optional learning community: https://t.me/GyaanSetuAi
