الگوی PRG برای عاملهای هوش مصنوعی
عاملهای هوش مصنوعی با یک مشکل قدیمی روبرو شدهاند. این همان باگی است که در دهه ۹۰ میلادی فرمهای وب را مختل میکرد.
در دوران قدیمی وب، کاربر فرمی را ارسال میکرد. اگر صفحه را رفرش میکرد، مرورگر دوباره دادهها را ارسال میکرد. این یعنی دو سفارش، دو پرداخت، یا دو ایمیل.
راه حل، الگوی Post/Redirect/Get (PRG) بود.
منطق ساده است:
- کاربر یک درخواست POST ارسال میکند.
- سرور عملیات را پردازش میکند.
- سرور یک Redirect 302 به یک URL جدید میفرستد.
- مرورگر با یک درخواست GET، ریدایرکت را دنبال میکند.
حالا رفرش کردن فقط صفحه نتیجه را دوباره بارگذاری میکند و عمل را تکرار نمیکند.
عاملهای هوش مصنوعی این باگ را به لایه جدیدی آوردهاند.
وقتی یک عامل برای شارژ کردن کارت یا ایجاد یک رکورد، ابزاری را فراخوانی میکند، مشکلات پیش میآید. قطع شدن شبکه، ریاستارت شدن کانتینر، یا اعمال محدودیت نرخ (rate limit). عامل نمیداند که آیا آخرین فراخوانی موفق بوده است یا خیر. بنابراین، دوباره تلاش میکند.
بدون یک راه حل، عامل سفارشهای تکراری ایجاد میکند و باعث نارضایتی مشتریان میشود.
شما باید با استفاده از کلیدهای idempotency، الگوی PRG را در خط لولههای (pipelines) عاملی خود اعمال کنید.
کلید idempotency همان ریدایرکت شماست. این کلید، «عمل» را از «نتیجه» جدا میکند.
نحوه پیادهسازی:
- هر ابزار تغییردهنده (mutating tool) باید یک کلید idempotency را بپذیرد.
- کلید را قبل از اولین تلاش تولید کنید.
- کلید را از روی قصد کاربر (user intent) مشتق کنید، نه از روی برچسب زمانی (timestamp).
- سرور باید بررسی کند که آیا قبلاً این کلید را دیده است یا خیر.
- اگر کلید وجود داشت، به جای اجرای دوباره وظیفه، نتیجه ذخیره شده را بازگردانید.
برای وظایف طولانی، شما به چیزی فراتر از یک کلید نیاز دارید. شما به چکپوینتگذاری (checkpointing) نیاز دارید.
چکپوینتگذاری، وضعیت را در هر مرحله ذخیره میکند. اگر عامل در میانه یک وظیفه بیست دقیقهای کرش کرد، از همان جایی که رها شده بود ادامه میدهد و از اول شروع نمیکند.
اگر فقط میتوانید یک کار انجام دهید، کاری کنید که هر فراخوانی ابزار، اجرای دو باره آن ایمن باشد.
عاملهای خود را با این پنج بررسی بسازید:
- آیا هر ابزار یک کلید idempotency را میپذیرد؟
- آیا کلید بر اساس قصد کاربر است تا زمان؟
- آیا کلید در هر تلاش مجدد (retry) دوباره استفاده میشود؟
- آیا سرور برای کلیدهای تکراری، نتایج ذخیره شده را بازمیگرداند؟
- آیا مراحل میانی برای وظایف طولانی ذخیره میشوند؟
الگو همان است. فقط لایه تغییر کرده است.
