Патерн PRG для ШІ-агентів
ШІ-агенти стикаються зі старою проблемою. Це той самий баг, який ламав вебформи у 90-х.
У старі часи вебу користувач надсилав форму. Якщо він натискав «оновити», браузер повторно надсилав дані. Це призводило до двох замовлень, двох списань коштів або двох електронних листів.
Вирішенням став патерн Post/Redirect/Get (PRG).
Логіка проста:
- Користувач надсилає POST-запит.
- Сервер обробляє запит.
- Сервер надсилає 302 Redirect на нову URL-адресу.
- Браузер переходить за редиректом за допомогою GET-запиту.
Тепер оновлення лише перезавантажує сторінку з результатом. Воно не повторює дію.
ШІ-агенти повернули цей баг на новий рівень.
Коли агент викликає інструмент для списання коштів з картки або створення запису, щось іде не так. Відбувається розрив з'єднання. Контейнер перезапускається. Спрацьовує обмеження частоти запитів (rate limit). Агент не знає, чи був успішним останній виклик. Тому він робить повторну спробу.
Без виправлення агент створює дублікати замовлень і списує кошти, що викликає гнів клієнтів.
Ви повинні застосувати патерн PRG до своїх агентських конвеєрів (agentic pipelines), використовуючи ключі ідемпотентності.
Ключ ідемпотентності — це ваш редирект. Він відокремлює дію від результату.
Як це реалізувати:
- Кожен інструмент, що змінює стан (mutating tool), повинен приймати ключ ідемпотентності.
- Генеруйте ключ перед першою спробою.
- Похідним для ключа має бути намір користувача, а не мітка часу.
- Сервер повинен перевіряти, чи бачив він цей ключ раніше.
- Якщо ключ уже існує, поверніть збережений результат замість повторного виконання завдання.
Для тривалих завдань вам потрібно більше, ніж просто ключ. Вам потрібне створення контрольних точок (checkpointing).
Checkpointing зберігає стан на кожному кроці. Якщо агент аварійно завершує роботу на середині двадцятихвилинного завдання, він продовжує з того місця, де зупинився. Він не починає спочатку.
Якщо ви можете зробити лише щось одне, зробіть так, щоб кожен виклик інструменту можна було безпечно виконати двічі.
Будуйте своїх агентів, враховуючи ці п'ять перевірок:
- Чи приймає кожен інструмент ключ ідемпотентності?
- Чи базується ключ на намірі, а не на часі?
- Чи повторно використовується той самий ключ при кожній повторній спробі?
- Чи повертає сервер збережені результати для дубльованих ключів?
- Чи зберігаються проміжні кроки для тривалих завдань?
Патерн той самий. Змінився лише рівень.
