از یک مدل زبانی بپرسید که کلمه “strawberry” چند حرف دارد. احتمال زیادی وجود دارد که اشتباه کند. ممکن است بگوید ده حرف. ممکن است یازده حرف را حدس بزند. با اطمینان کامل صحبت خواهد کرد، اما باز هم اشتباه خواهد بود. از همان مدل بخواهید سود مرکب یک وام را محاسبه کند، یا دو عدد بزرگ را با هم جمع کند، یا تعداد روزهای کاری بین دو تاریخ را بشمارد؛ اغلب با پاسخی به‌ظاهر منطقی مواجه می‌شوید که ارقام آن کمی، و به شکلی خطرناک، اشتباه هستند.

این اتفاق به این دلیل می‌افتد که مدل‌های زبانی بزرگ، اعداد را آن‌گونه که انسان‌ها استدلال می‌کنند، درک نمی‌کنند. آن‌ها توکن‌ها (tokens) را پیش‌بینی می‌کنند. یک توکن می‌تواند یک کلمه کامل، بخشی از یک کلمه یا یک رقم واحد باشد. وقتی مدل کلمه “strawberry” را می‌بیند، هشت حرف مجزا را که در یک ردیف قرار گرفته‌اند، نمی‌بیند؛ بلکه مجموعه‌ای از تکه‌ها (chunks) را می‌بیند. به آن یاد نداده‌اند که کاراکترها را بشمارد، بلکه فقط یاد داده‌اند پیش‌بینی کند که کدام تکه از متن در مرحله بعد می‌آید. همین محدودیت در مورد محاسبات ریاضی نیز صدق می‌کند. مدل فاقد یک ماشین‌حساب داخلی است. فاقد منطق رقم نقلی (carry logic) است. درک واقعی از ارزش مکانی (place value) ندارد. وقتی عدد ۱۴۸ را در ۲۷۹ ضرب می‌کند، در واقع عمل ضرب را انجام نمی‌دهد؛ بلکه در حال تطبیق الگو با عبارات مشابهی است که در طول آموزش دیده است و حدس می‌زند که چه دنباله‌ای از ارقام باید در ادامه بیاید. برای جمع‌های بسیار کوچک، الگو به اندازه کافی قوی است که کار کند، اما برای هر چیزی که نیاز به دقت واقعی دارد، حدس مدل در نهایت از مسیر خارج می‌شود.

دو وظیفه، یک ربات

روش‌های استاندارد پرسشگری (prompting)، از یک سیستم واحد می‌خواهند که دو کار بسیار متفاوت را هم‌زمان انجام دهد. اول، درک منطق مسئله. دوم، اجرای دقیق محاسبات ریاضی. مدل در انجام وظیفه اول واقعاً تحسین‌برانگیز است. می‌تواند یک مسئله کلامی را بخواند، متغیرها را استخراج کند، روابط را ترسیم کند و مسیر حل مسئله را برنامه‌ریزی کند. اما سپس باید نقش ماشین‌حساب خودش را ایفا کند. اینجاست که زنجیره از هم می‌پاشد. یک رقم اشتباه در مرحله سوم، تمام مراحل بعد از آن را مخدوش می‌کند. خودِ منطق ممکن است بی‌نقص باشد، اما پاسخ نهایی بی‌ارزش است چون مدل در جمع کردن اشتباه کرده است.

مدل‌های زبانی کمک‌گرفته از برنامه، یا PAL، این مشکل را با تقسیم کار حل می‌کنند. به جای اینکه از مدل بخواهید مستقیماً پاسخ را بدهد، از او می‌خواهید یک برنامه بنویسد.

روال کار به این صورت است: شما مسئله را ارائه می‌دهید. مدل منطق را درک می‌کند، متغیرها را تعریف می‌کند و الگوریتم را ساختاردهی می‌کند. سپس، به جای اینکه خودش نتیجه را محاسبه کند، یک اسکریپت کوتاه، معمولاً به زبان Python، می‌نویسد. آن اسکریپت به یک مفسر کد (code interpreter) واقعی تحویل داده می‌شود. مفسر، منطق را اجرا کرده و نتیجه دقیق و قطعی را بازمی‌گرداند. مدل، ریاضیات را توصیف می‌کند و Python، ریاضیات را انجام می‌دهد.

استدلال قابل اجرا در عمل

PAL را به عنوان «استدلال قابل اجرا» در نظر بگیرید. اگر یک اسکریپت می‌تواند مسئله‌ای را حل کند، اجازه دهید مدل آن اسکریپت را بنویسد.

یک مثال ملموس را در نظر بگیرید. شما باید مبلغ سررسید یک سپرده ثابت ۵۰,۰۰۰ روپیه با نرخ بهره سالانه ۸.۵ درصد، با محاسبه سود مرکب به صورت فصلی، برای مدت هفت سال را محاسبه کنید. اگر مستقیماً از یک مدل زبانی بپرسید، ممکن است یک فرمول بنویسد، مقادیر را جایگذاری کند و نتیجه را در یک زنجیره فکری محاسبه کند. اما اگر دقیق‌تر نگاه کنید، ممکن است متوجه شوید که در محاسبه سود مرکب فصلی دچار خطا شده (مثلاً نرخ را به اشتباه تقسیم کرده) یا یک مرحله میانی را گرد کرده و خطا را به مراحل بعد منتقل کرده است. پاسخ منطقی به نظر می‌رسد اما با صدها روپیه اختلاف دارد.

با استفاده از PAL، نحوه تعامل تغییر می‌کند. شما به مدل دستور می‌دهید کدی به زبان Python تولید کند که در آن principal = 50000، rate = 0.085، time = 7 و n = 4 تعریف شده و سپس amount = principal * (1 + rate/n) ** (n * time) محاسبه شود. مدل کد را صادر می‌کند. یک محیط اجرای Python آن را اجرا می‌کند. شما هر بار، عدد دقیق را تا آخرین رقم اعشار دریافت می‌کنید. در ضرب کردن هیچ حدسی وجود ندارد، هیچ باقی‌مانده توهمی نیست و هیچ خطای گرد کردنِ با اعتمادبه‌نفسی در کار نیست.

همین الگو در محاسبات تاریخ نیز صدق می‌کند. از مدل بپرسید چه تاریخی دقیقاً ۱۲۰ روز کاری از امروز فاصله دارد (با حذف آخر هفته‌ها). یک مدل متنی ممکن است روزها را بشمارد و در یک شنبه دچار خطا شود. در رویکرد PAL، مدل اسکریپتی با استفاده از منطق datetime و calendar می‌نویسد و سپس اجازه می‌دهد مفسر دقیقاً آن را پیمایش کند. مدیریت داده‌ها نیز به همین صورت عمل می‌کند. اگر نیاز به تجزیه یک فایل CSV نامنظم، فیلتر کردن یک JSON تو در تو یا اجرای یک تبدیل آماری سریع دارید، مدل باید منطق را پیش‌نویس کند و مفسر وظیفه تکرار و اجرا را بر عهده بگیرد.

چرا این موضوع واقعاً اهمیت دارد

تغییر از پاسخ‌های متنی به کدهای قابل اجرا، سه مزیت عملی به همراه دارد.

قطعیت. یک مدل زبانی اگر دو بار یک سوال یکسان از او پرسیده شود، ممکن است لحن خود را تغییر دهد یا یک رقم را عوض کند. یک مفسر (interpreter) هر بار برای ورودی یکسان، خروجی یکسانی برمی‌گرداند. این پایداری در حسابداری، لجستیک، زمان‌بندی و هر محاسبه مهندسی که در آن ثبات یک امر اختیاری نیست، اهمیت بسیار زیادی دارد.

تأییدپذیری. وقتی یک مدل سه پاراگراف استدلال به شما تحویل می‌دهد، باید تک‌تک جملات را بخوانید تا به دنبال آن یک عدد اشتباه بگردید. اما وقتی یک اسکریپت ده خطی به شما می‌دهد، می‌توانید کد را بازبینی کنید. می‌توانید قبل از اینکه مفسر اجرا شود، از درست بودن فرمول سود مرکب مطمئن شوید. می‌توانید نام متغیرها را بررسی کنید، خطاهای «یکی کم یا زیاد» (off-by-one errors) را شناسایی کنید و حتی برای راه حل خود از کنترل نسخه (version-control) استفاده کنید. سطح خطاهای پنهان به طرز چشمگیری کاهش می‌یابد.

قابلیت اطمینان. مدل در محدوده وظایف خود باقی می‌ماند. کاری را انجام می‌دهد که برای آن ساخته شده است: استدلال درباره ساختار، معناشناسی (semantics) و تجزیه مسئله. ماشین کاری را انجام می‌دهد که برای آن ساخته شده است: محاسبات دقیق. این «تفکیک وظایف» (separation of concerns) دقیقاً همان روشی است که نرم‌افزارهای قابل اطمینان بر اساس آن معماری می‌شوند. ترکیب‌پذیری (Composition) بر طراحی یکپارچه (monolithic design) برتری دارد.

آن را مانند کد غیرقابل اعتماد اجرا کنید

یک هشدار لازم است. کدهای تولید شده باید به عنوان ورودی غیرقابل اعتماد در نظر گرفته شوند. مدل ممکن است اسکریپتی بنویسد که دارای یک حلقه بی‌نهایت، یک درخواست شبکه غیرضروری یا یک عملیات روی سیستم فایل باشد که شما درخواست نکرده‌اید. همیشه این برنامه‌ها را در یک محیط ایزوله (sandbox) اجرا کنید. از کانتینرهایی با دسترسی‌های محدود، توابع بدون سرور (serverless functions) بدون دسترسی به شبکه، یا محیط‌های تحت کنترل شدید با زمان CPU محدود و بدون ذخیره‌سازی دائمی استفاده کنید. امنیت در اینجا یک نکته حاشیه‌ای نیست، بلکه بخشی از طراحی سیستم است.

جایی که PAL می‌درخشد و جایی که متوقف می‌شود

PAL برای ریاضیات، تاریخ‌ها و دستکاری داده‌های ساختاریافته به زیبایی عمل می‌کند. این مدل خطاهای مکانیکی را که گریبان‌گیر استدلال‌های صرفاً متنی هستند، از بین می‌برد.

با این حال، منطق اشتباه را اصلاح نمی‌کند. اگر مدل فرمول اشتباهی را انتخاب کند،