تصور کنید هرج و مرج یک حادثه در محیط عملیاتی (Production) را در نظر بگیرید که تنها به دلیل یک علامت بکتیک (backtick) بازنشده در فرمت markdown توسط یک مدل زبانی بزرگ (LLM) رخ داده و باعث کرش کردن هندلر API شما شده است. برای حل این مشکل، شرکت SpaceAI360 در تاریخ ۲۵ جولای ۲۰۲۶، یک معماری آماده برای محیط عملیاتی را برای Next.js 15 به تفصیل شرح داد؛ معماریای که بهطور خاص برای متوقف کردن خروجیهای غیرقطعی (non-deterministic) هوش مصنوعی طراحی شده تا از شکست خوردن رابط کاربری (UI) در فرانتاند جلوگیری کند.
بسیاری از توسعهدهندگان اغلب دچار یک «دوره ماه عسلی» میشوند، جایی که فکر میکنند پرامپتهای سیستمی با موفقیت مدلهایی مانند Gemini یا Claude را مجبور میکنند تا همیشه JSON معتبر برگردانند. برای مثال، یک پرامپت معمولی ممکن است ساختار دقیقی را درخواست کند: { "summary": string, "sentiment": "positive" | "negative", "score": number } و صراحتاً استفاده از بلوکهای کد markdown یا متنهای گفتگو-محور را ممنوع کند. طبق گزارش SpaceAI360، این سیستمها در ۹۰٪ تستها بدون نقص عمل میکنند، اما در نهایت زمانی که مدلها وزنهای خود را بهروزرسانی کنند یا با موارد خاص و استثنایی (edge cases) مواجه شوند، شکست میخورند.
این شکستها اغلب به این صورت ظاهر میشوند که LLM پاسخ را در سه بکتیک محصور میکند یا رشتهای مانند «۸/۱۰» را در جایی برمیگرداند که یک عدد مورد انتظار است. این ناپایداری دقیقاً بازتابدهنده چالشهای یکپارچگی دادههاست که ما در پوششهای قبلی خود درباره نحوه ردیابی منشأ دادهها (provenance) در خروجیهای LLM توسط Graffiti Framework بررسی کردیم. در حالی که تمرکز «منشأ» روی این است که داده از کجا آمده است، «اجرای درگاه» (gateway enforcement) بر این تمرکز دارد که آیا آن داده برای مصرف در سیستم ایمن است یا خیر. این چالشها بهویژه در مدلهای تخصصیتر مشهود است؛ برای نمونه، بررسیهای ما روی مدل Ornith-1.0-35b نشان داد که حتی مدلهای قدرتمند نیز در سناریوهای سخت مهندسی و فراخوانی ابزارها با افت شدید نرخ موفقیت مواجه میشوند.
ریسک اعتماد به JSON.parse()
اکثر تیمها به یک فراخوانی شکننده از JSON.parse() تکیه میکنند که هر خطایی را به استثناهای (exceptions) مدیریتنشده تبدیل میکند. در این رویکرد ناقص، توسعهدهندگان ابتدا یک LLM را فراخوانی میکنند، بلافاصله متن خام را پارس میکنند و سپس سعی در درج آن در پایگاهداده دارند. این اقدام خطرناک است، زیرا اگر مدل بکتیکها یا تایپهای اشتباه اضافه کند، رشتهی پردازش (thread) سرور میسوزد.
زمانی که یک مدل JSON معیوب یا عدم تطابق تایپ (type mismatch) برگرداند، رشتهی پردازش سرور از کار میافتد و منجر به خطاهای داخلی ۵۰۰ (500 Internal Server Errors) و شکست در مهاجرتهای پایگاهداده (database migrations) میشود. اگر یک مهاجرت طرح دیتابیس (DB schema migration) با رشتهای متنی در یک فیلد عددی مواجه شود، یک تخلف محدودیت (constraint violation) پرتاب میکند و باعث کرش کردن کل درخواست میشود.
الگوی سه مرحلهای برای تضمین ساختار
برای حل این مسئله، SpaceAI360 یک خط لوله اعتبارسنجی سختگیرانه در سطح API Gateway به کار گرفته است تا تضمین کند طرحهای JSON ۱۰۰٪ قطعی هستند، پیش از آنکه دادهها با پایگاهداده تماس پیدا کنند:
- تعریف طرح سختگیرانه (Strict Schema Definition): با استفاده از Zod، آنها یک طرح هدف به نام
AnalysisResponseSchemaتعریف میکنند. این کار تضمین میکند کهsummaryحداقل ۵ کاراکتر داشته باشد،sentimentمحدود به یک enum شامل 'positive'، 'neutral' یا 'negative' باشد وscoreعددی بین ۰ تا ۱۰۰ باشد. همچنین یک آرایه خالی پیشفرض برایkeyTopicsدر نظر گرفته شده است. این رویکرد مشابه استراتژیهایی است که در بهبود دقت ارجاعات AI از طریق مجموعهدادههای ساختاریافته مشاهده کردیم، جایی که ماشینخواندنی بودن دادهها اولویت اصلی است. - پاکسازی (Sanitization): یک تابع کمکی اختصاصی به نام
extractCleanJsonبا استفاده از عبارات منظم (regular expressions)، حصارهای کد markdown — مانندjson ...— را حذف کرده و فضاهای خالی ابتدایی یا انتهایی را پیش از رسیدن رشته به پارسر پاک میکند. - حلقه تلاش مجدد خودکار (Automatic Retry Loop): هندلرهای مسیر (Route Handlers) آنها در Next.js 15 یک حلقه تعمیر را با محدودیت
maxAttemptsبرابر با ۲ پیادهسازی کردهاند. اگر پاسخ اول درJSON.parse()بومی یاsafeParse()کتابخانه Zod شکست بخورد، سیستم یک هشدار (warning) ثبت کرده و یک فراخوانی اضافی به ارائهدهنده (provider) میزند تا اصلاحیه را دریافت کند.
مکانیزم اجرا
منطق سیستم از یک توالی خاص پیروی میکند: هندلر ابتدا خروجی خام را واکشی میکند، آن را از طریق تابع کمکی پاکسازی میکند و سپس تلاش میکند پارس بومی را انجام دهد. اگر JSON.parse() موفق شود، دادهها به AnalysisResponseSchema.safeParse() منتقل میشوند. تنها در صورتی که نتیجه این مرحله موفقیتآمیز باشد، حلقه شکسته شده و دادهها به لایههای پاییندستی منتقل میگردند.
مدیریت قطعی شکستها
به جای اجازه دادن به سوختن رشتهی پردازش سرور، این سیستم برای «تخریب تدریجی» (graceful degradation) مهندسی شده است. اگر هر دو تلاش با شکست مواجه شوند، API یک خطای ساختاریافته ۴۲۲ (Unprocessable Entity) با کد خاص SCHEMA_VALIDATION_FAILED و پیامی مبنی بر اینکه مدل نتوانسته است یک محموله (payload) مطابق با استاندارد تولید کند، برمیگرداند.
این امر تضمین میکند که فرانتاند یک کد خطای پیشبینیپذیر دریافت کند که بتواند بدون کرش کردن کل رابط کاربری، آن را مدیریت کند. با جداسازی اعتبارسنجی از منطق برنامه، مهندسان میتوانند تضمین کنند که درج در پایگاهداده هرگز به دلیل فیلدهای گمشده یا تایپهای نامعتبر شکست نخواهد خورد. این معماری منجر به صفر شدن کرشهای runtime در UI میشود، زیرا کامپوننتهای فرانتاند میتوانند بر اینترفیسهای دقیق TypeScript تکیه کنند.
این تغییر نشاندهنده حرکتی به سمت treating کردن خروجیهای هوش مصنوعی به عنوان ورودیهای غیرقابلاعتماد کاربر است. برای مهندسی هوش مصنوعی در سال ۲۰۲۶، درس روشن است: انتظار اینکه یک LLM مانند یک نقطه انتهایی (endpoint) صلب REST رفتار کند، یک نقص طراحی است. تنها راه دستیابی به پایداری در محیط عملیاتی، از طریق حفاظهای سخت (hard guardrails)، پاکسازی و مسیرهای بازگشتی (fallbacks) صراحتبخش است.
برای پیادهسازی این روش، توسعهدهندگان باید با بازبینی پیادهسازیهای فعلی JSON.parse() خود شروع کرده و آنها را به الگوهای safeParse ارائهشده توسط Zod منتقل کنند.
گام بعدی شما
- تمام توابع
JSON.parse()را در پروژههای خود بررسی کنید و آنها را با الگویsafeParseکتابخانه Zod جایگزین کنید. - یک لایهی پاکساز (Sanitizer) برای حذف علامتهای markdown از خروجی مدلها اضافه کنید.
- برای پاسخهای حیاتی، مکانیزم Try-Catch را با یک حلقه تلاش مجدد (Retry) کوتاه ترکیب کنید. اما در پیادهسازی این حلقه، باید مراقب بود تا دچار تکرارهای کورکورانه در APIها نشویم، زیرا این رویکرد میتواند منجر به بحرانهای هزینهای و فنی جدی در محیط عملیاتی شود.
اما برای کسانی که نمیخواهند هر بار هزینه استنتاج را برای تلاش مجدد پرداخت کنند، تکنیکهای کشینگ خروجیهای ساختاریافته راهکار بهتری است — به تحلیل ما دربارهی بهینهسازی هزینه استنتاج مراجعه کنید.




گفتگو