تصور کنید یک کارآموز باهوش اما بیباک را در ساعت ۳ صبح با یک کارت دسترسی جامع به پایگاهدادهتان تنها بگذارید؛ این دقیقاً همان شکلی است که یک مدل زبانی با APIهای شما تعامل میکند. اگر هنوز به خروجیهای مدلهای زبانی در محیط عملیاتی اعتماد میکنید، احتمالاً به زودی با تراکنشهای تکراری یا دادههای تخریبشده مواجه خواهید شد. این کارآموز سریع است و مستندات را دقیقتر از بسیاری از مهندسان ارشد میخواند، اما هیچ غریزه بقایی ندارد. اگر دکمهای وجود داشته باشد، او در نهایت آن را با آرگومانهایی فشار میدهد که شما هرگز تصورش را نمیکردید.
در محیطهای دمو، همه چیز طبق یک «مسیر خوشبینانه» (Happy Path) پیش میرود، اما در دنیای واقعی، یک قطعی ساده در شبکه میتواند باعث شود یک عامل هوش مصنوعی، یک دستور بازپرداخت وجه را سه بار پشت سر هم اجرا کند. به همین دلیل است که شرکت Fetchply — یک عامل پشتیبانی هوش مصنوعی برای تجارت الکترونیک — حفاظهای سختگیرانهای را برای جلوگیری از این فجایع پیاده کرده است. طبق راهنمای فنی منتشر شده در ۱۶ اوت ۲۰۲۶، ریسک اصلی زمانی رخ میدهد که ما با یک مدل زبانی بهعنوان یک اپراتور قابلاعتماد رفتار کنیم، در حالی که باید آن را یک کاربر غیرقابلاعتماد بدانیم.
همانطور که در تحلیل قبلی ما دربارهی نقش اسکیماهای JSON در ایجاد گیتهای ایمنی اشاره کردیم، چالش فعلی از فرمتبندی ساده دادهها به قابلیت اطمینان سیستمی تغییر یافته است. در یک دمو، فراخوانی API توسط مدل شبیه جادو است؛ اما در تولید، همین قابلیت اگر در لایههای حفاظتی مهندسی نرمافزار (Bulkheads) محصور نشود، به یک نقطه ضعف تبدیل میشود. مدلها با سرعت زیاد عمل میکنند، اما بدون لایههای حفاظتی، هر قابلیت جدید به یک ریسک جدید تبدیل میشود.
قانون اعتبارسنجی زمان اجرا
مدلها در معنای سنتی «تابع فراخوانی نمیکنند»، بلکه متنی تولید میکنند که شبیه JSON است. SDK شما این متن را تجزیه کرده و یک شیء به شما میدهد، اما این خروجی دقیقاً همان جایگاه معرفتی ورودی یک کاربر در یک فرم وب عمومی را دارد. از آنجا که مدلها اغلب آرگومانهایی تولید میکنند که «تقریباً درست» هستند، توسعهدهندگان باید از اعتبارسنجی مبتنی بر اسکیما در زمان اجرا (Runtime Validation) استفاده کنند. این عدم قطعیت در خروجیها ریشه در ماهیت احتمالی مدلها دارد؛ موضوعی که در تحلیل ما پیرامون پارامتر Temperature و توزیع احتمالات در LLMها به تفصیل بررسی شده است.
به گزارش Fetchply، خطاهای رایج مدلها عبارتند از:
- عدم تطابق نوع (Type Mismatches): ارسال رشته (String) در جایی که عدد (Number) مورد نیاز است.
- خطاهای فرمتبندی: تاریخهای ISO با منطقه زمانی اشتباه.
- توهمات مترادف (Synonym Hallucinations): استفاده از کلمه "cancelled" در حالی که API دقیقاً "canceled" را میطلبد.
- خطاهای منطقی: ارسال مقادیر منفی یا کپی کردن یک ID از بخش اشتباه گفتگو.
توسعهدهندگان میتوانند با استفاده از کتابخانههایی مانند Zod و zod-to-json-schema هم تعریف ابزار برای مدل و هم اعتبارسنج برای اجرا را استخراج کنند. این کار تضمین میکند که قوانین تجاری — مثلاً سقف بازپرداخت ۵۰,۰۰۰ سنت — بهعنوان «قانون» در کد اجرا شوند، نه صرفاً بهعنوان «پیشنهاد» در پرامپت. پرامپتها پیشنهاد هستند؛ اعتبارسنجها قانون.

محدود کردن قابلیتها
دادن تمام ابزارهای موجود به مدل در هر گفتگو، «شعاع تخریب» (Blast Radius) یک اشتباه را افزایش میدهد. این کار معادل دادن کارت دسترسی جامع به کارآموز در روز اول است. برای کاهش این ریسک، قابلیتها باید بر اساس ریسک و زمینه محدود شوند:
- خواندنی در برابر نوشتنی (Read vs. Write): ابزارهایی مثل
get_orderرا ازissue_refundجدا کنید. اینها در دو کلاس ریسک متفاوت هستند. جلسهای که فقط برای پاسخ به سوالات است، باید فقط ابزارهای خواندنی دریافت کند تا سوءاستفاده از ابزارهای نوشتنی اساساً غیرممکن شود. - اتصال زمینهای (Contextual Binding): شناسههای حساب باید در سمت سرور تزریق شوند. اگر مدل بتواند
customerIdرا بهعنوان آرگومان ارسال کند، میتواند شناسه اشتباهی بفرستد. با متصل کردن ابزارها به Session ID در سرور، مدل نمیتواند هویتها را جعل کند. - دسترسی مبتنی بر وضعیت (State-Based Access): ابزارها فقط زمانی باید وارد مجموعه شوند که لازم باشند. برای مثال، ابزار بازپرداخت تنها پس از یافتن و تایید سفارش باید فعال شود. این استراتژی شعاع تخریب هر نوبت از گفتگو را کوچک میکند.
کاهش تعداد ابزارها، مدل را هوشمندتر میکند. انتخاب ابزار تصمیمی است که مدل میتواند در آن اشتباه کند؛ هر ابزار نامرتبط در لیست، یک فرصت برای خطا است. مجموعههای ابزاری کوچک و با توصیفات دقیق، هم دقت و هم ایمنی را بهبود میبخشند.
مدیریت خطاها و Idempotency
یکی از گرانترین اشتباهات در طراحی عاملها، پرتاب Exception برای عملیاتهای غیر-Idempotent است. اکثر چارچوبهای عاملمحور و حلقههای دستنویس دارای منطق تلاش مجدد (Retry) هستند. یک Exception شبیه به یک خطای زیرساختی گذرا به نظر میرسد و سیستم دوباره آن را اجرا میکند.
یک API پرداخت را در نظر بگیرید که دچار Timeout میشود؛ ممکن است تراکنش در واقع موفق شده باشد اما کد خطا بدهد. تلاش مجدد باعث میشود مشتری دو بار شارژ شود. در واقع، پرتاب یک خطا، وعدهای به زیرساخت شماست که «تلاش مجدد ایمن است»؛ برای عملیاتهای غیر-Idempotent، این وعده یک دروغ است.
به جای این کار، خطاها باید بهعنوان «مقدار» (Value) بازگردانده شوند. با بازگرداندن یک شیء ساختاریافته مانند type ToolResult<T> = | { ok: true; data: T } | { ok: false; reason: string; retryable: boolean }، مدل میتواند خطا را مدیریت کند. وقتی ارائهدهنده پرداخت تراکنش را تایید نمیکند، سیستم مقدار { ok: false, reason: "Payment provider did not confirm the charge.", retryable: false } را برمیگرداند. مدل دلیل را میخواند، از کاربر عذرخواهی میکند و گام بعدی را پیشنهاد میدهد. مدل عذرخواهی میکند، اما زیرساخت شما تراکنش را تکرار نمیکند.
برای محافظت بیشتر در برابر فراخوانیهای تکراری — که میتواند به دلیل نوسانات شبکه، دو بار کلیک کاربر یا فراخوانی دوگانه ابزار توسط مدل در یک نوبت رخ دهد — هر عملیات نوشتنی باید از یک کلید Idempotency استفاده کند. این کلیدها باید از شناسههای پایدار مشتق شوند نه از اعداد تصادفی. برای مثال، استفاده از هش SHA-256 از conversationId و toolCallId تضمین میکند که فراخوانی تکراری، یک عملیات بیاثر (no-op) باشد که نتیجه اصلی را برمیگرداند.
بودجهها و نظارت انسانی
عاملهای هوش مصنوعی درک درستی از زمان و هزینه ندارند. یک حلقه عامل میتواند ۱۴ بار پشت سر هم یک API جستجوی کند را فراخوانی کند، در حالی که هر فراخوانی بر اساس نتیجه قبلی است، کاربر منتظر است و صورتحساب شما بالا میرود. این چالشهای عملیاتی در مدیریت هزینههای توکنها، باعث شده برخی شرکتها مدلهای قیمتگذاری خود را تغییر دهند؛ همانطور که در بررسی رویکرد Oxlo.ai برای کاهش هزینههای عاملهای هوش مصنوعی مشاهده کردیم. هر گفتگو به یک بودجه سخت نیاز دارد:
- تایماوتهای سخت (Hard Timeouts): محدودیت زمانی دقیق برای هر فراخوانی ابزار (چند ثانیه برای خواندن و حتی محدودتر برای نوشتن، زیرا یک عملیات نوشتنی کند، یک عملیات مبهم است).
- سقف فراخوانی (Call Caps): حداکثر تعداد دفعات استفاده از ابزار در هر نوبت و هر گفتگو. وقتی سقف پر شود، حلقه خطای "call budget exhausted" را برمیگرداند و مدل صادقانه به کاربر میگوید که نتوانست کار را تمام کند.
- سقف هزینه (Cost Ceilings): در نظر گرفتن هزینههای واقعی برای APIهای خارجی یا کوئریهای سنگین محاسباتی.
برای اقدامات حساس — مانند حذف حساب، ارسال ایمیل به لیست مشتریان یا بازپرداختهای بالاتر از یک حد خاص — مدل هرگز نباید اختیار نهایی داشته باشد. ابزار نباید عمل را مستقیماً انجام دهد، بلکه باید آن را «مرحلهبندی» (Stage) کند. ابزار یک رکورد «در انتظار تایید» میسازد و مقدار { ok: true, data: { status: "pending_confirmation", confirmUrl } } را برمیگرداند. سپس یک انسان باید روی تایید کلیک کند. این کار اجازه میدهد انسانها یک تغییر (Diff) مشخص و عینی را بررسی کنند، نه اینکه صرفاً بر یک گفتگوی انتزاعی نظارت کنند.
ضرورت لاگهای حسابرسی
وقتی مشتری ادعا میکند بات اقدام اشتباهی انجام داده، یک لاگ کلی که میگوید «مدل ابزاری را فراخوانی کرد» بیفایده است. سیستمهای تولیدی به لاگهای دقیق حسابرسی نیاز دارند تا یک «هفته بسیار بد» را به یک پاسخ ۵ دقیقهای تبدیل کنند.
هر فراخوانی ابزار باید این موارد را ثبت کند:
- برچسب زمانی (Timestamp) و Conversation ID.
- نام ابزار و آرگومانهای اعتبارسنجشده کامل (با حذف اطلاعات حساس/Secrets).
- نتیجه یا خطای ساختاریافته.
- تأخیر (Latency) و نسخه دقیق مدل و پرامپت استفاده شده.
دانستن اینکه «مدل در ساعت ۱۴:۰۲ ابزار issue_refund را با مقدار orderId: ord_x, amountCents: 1900 فراخوانی کرد و پاسخ ok: false گرفت» تمام چیزی است که نیاز دارید. علاوه بر این، این لاگها بهترین منبع برای دادههای ارزیابی هستند؛ فراخوانیهای شکستخورده واقعی در محیط تولید، ارزشمندتر از ۵۰ مورد تست مصنوعی هستند.
این تغییر دیدگاه، مدل زبانی را به عنوان یک کلاینت پیشرفته اما غیرقابل پیشبینی در نظر میگیرد. با پیادهسازی این حفاظها، توسعهدهندگان از «امید به رفتار درست مدل» به «تضمین پایداری سیستم» فارغ از خروجی مدل حرکت میکنند. برای کسانی که جریانهای کاری عاملمحور میسازند، مرز بعدی، حرکت از مجموعههای ابزار ایستا به سمت کشف APIهای پویا و خود-تکاملیافته است که همین تضمینهای ایمنی را حفظ کنند.
گام بعدی شما
- تمام فراخوانیهای API خود را از حالت Exception-based به Value-based تغییر دهید تا از تراکنشهای تکراری جلوگیری شود.
- برای هر عملیات تغییر داده (Write)، یک کلید Idempotency بر اساس هش شناسههای گفتگو پیادهسازی کنید.
- لایه اعتبارسنجی Zod را بین خروجی مدل و ورودی API قرار دهید تا قوانین تجاری شما در سطح کد تضمین شوند.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما دربارهی تراشههای Blackwell مراجعه کنید.




گفتگو