وقتی یک قابلیت مبتنی بر مدل در محصول خراب میشود، تقریباً هیچوقت مدل خراب نشده. خرابی یکی از دو طرف تماس است: پاراگرافی که هیچوقت بازیابی نشد، یا جوابی که هیچکس اعتبارسنجیاش نکرد. خود تماس چند خط کد است و همان تکهای است که از قبل کار میکرد.
در فارسی، طرف اول از طرف دوم زودتر و بیصداتر خراب میشود، چون بازیابی روی متن فارسی پیش از آنکه به مدل برسد شکست میخورد. این صفحه ترتیبی است که این دو طرف را قابل تشخیص میکند، و شروعش از جایی است که بیشتر پروژهها آخر از همه نگاهش میکنند.
باشگاه آریانا، و پاراگرافی که هیچوقت بازیابی نشد
پویا صدرایی برای یک باشگاه بدنسازی در مشهد یک دستیار پیامرسان ساخت. مواد کار دو چیز بود: آییننامه باشگاه، ۹ صفحه متن که برای تابلوی اعلانات نوشته شده بود، و برنامه کلاسها که هفتهبههفته عوض میشود. عضوی نوشت «شهریه سهماهه چنده؟» و جواب گرفت که سیصد و شصت هزار تومان است. عدد درست، اما مال جلسه خصوصی مربی بود، نه اشتراک.
در آییننامه اصلاً کلمه «شهریه» نیامده. آنجا نوشته «هزینه اشتراک سه ماهه». تنها جایی از آن ۹ صفحه که کلمه «شهریه» را دارد بند مربوط به مربی خصوصی است، پس بازیابی دقیقاً همان بند را برگرداند و مدل هم دقیقاً از روی همان جواب داد. اگر متن درست در چند نتیجه اول نباشد، هیچ مدلی جواب را نجات نمیدهد؛ مدل چیزی را که ندیده نمیتواند بگوید، و چیزی را که دیده با اطمینان میگوید.
هیچچیز در آن جواب علامت نمیدهد که بند اشتباهی بازیابی شده. جواب همانقدر روان و همانقدر مطمئن است که جواب درست میبود. برای همین است که بازیابی، و نه مدل، جایی است که وقت باید صرف شود.
یکسانسازی، همان ده خطی که کسی نمینویسد
پیش از هر جستوجویی، متن و پرسش را پیش از نمایه کردن یکسانسازی کنید، وگرنه یک کلمه چند کلمه است. در فارسی یک عبارت به چند صورت تایپ میشود و همهشان از نظر آدم یکیاند و از نظر رشته بایتها نیستند.
- ی و ک عربی به ی و ک فارسی، چون نیمی از متنهای اداری با کیبورد عربی تایپ شدهاند.
- نیمفاصله: یک تصمیم برای کل نمایه، و همان تصمیم برای پرسش.
- «ها»ی جمع، چسبیده یا جدا، به یک شکل.
- ارقام فارسی و لاتین به یک مجموعه، وگرنه یک عدد یکسان در دو نمایش، دو رشته متفاوت است.
- کشیده و اعراب و فاصلههای تکراری، حذف.
این ده خط کد است و یک بار نوشته میشود، و باید هم روی متنی که نمایه میشود اجرا شود و هم روی پرسشی که میرسد. اجرا کردنش فقط روی یکی از این دو، بدتر از اجرا نکردنش است، چون خطاها را نامنظم میکند.
مترادف را باید نمایه کرد
یکسانسازی مسئله «شهریه» را حل نمیکند، چون آنجا املا یکی نبوده، کلمه یکی نبوده. بازیابی مترادف نمیسازد؛ یا مترادف را نمایه میکنید یا خطا را میپذیرید. راهش خستهکننده است: فهرستی از کلمههایی که اعضا به کار میبرند در برابر کلمههایی که در آییننامه آمده، و نوشتنش نیم روز طول میکشد. پویا آن نیم روز را گذاشت و هجده جفت پیدا کرد، از شهریه و هزینه اشتراک تا سانس و بازه زمانی.
تنظیم دقیق چه چیزی را یاد میدهد
وقتی جوابها بد بودند، اولین پیشنهادی که همیشه میرسد این است که مدل را روی داده باشگاه تنظیم دقیق کنیم. برای این خرابی هیچ کاری نمیکند. تنظیم دقیق یک شکل را یاد میدهد، نه یک واقعیت: لحن، قالب جواب، اینکه کجا کوتاه باشد و کجا فهرست بدهد. قیمت اشتراک سال بعد عوض میشود و مدلی که رویش تنظیم شده همان قیمت پارسال را با اطمینان بیشتری میگوید.
جای درستش وقتی است که خروجی باید شکل ثابتی داشته باشد و دستور دادن به تنهایی نگهش نمیدارد، و آن هم فقط در برابر چیزی که بشود اندازه گرفت.
مجموعه ارزیابی، پیش از خود قابلیت
مجموعه ارزیابی را پیش از خود قابلیت بنویسید، چون یک دمو نمیتواند شکست بخورد. دموی هر کسی کار میکند؛ کسی که آن را ساخته سوال را طوری میپرسد که خودش میداند جواب دارد. مجموعه ارزیابی یعنی فهرستی از پرسشهای واقعی با جوابهای انتظاری، که بعد از هر تغییر دوباره اجرا میشود.
و مجموعه ارزیابی بدون جواب غلط فقط میسنجد که برنامه اجرا میشود. باید پرسشهایی داخلش باشد که جوابشان در آییننامه نیست، و انتظارشان این باشد که سامانه بگوید نمیدانم. برای فارسی یک ستون دیگر هم لازم است: همان پرسش، به چند املایی که واقعاً میرسد. «شهریه سهماهه»، «شهریه سه ماهه»، «هزینه سه ماه»، و همانها با ی عربی. اگر همه اینها در مجموعه نباشند، چیزی که در عمل خراب میشود هرگز حتی یک بار در آزمون خراب نمیشود.
طرف دوم تماس همینجاست: با خروجی مدل مثل فرمی رفتار کنید که یک غریبه پر کرده است. اگر قرار است جواب به یک عدد یا یک برچسب تبدیل شود، آن را با یک الگوی داده تجزیه کنید و هرچه نخواند رد شود. و هر تماس یک تماس شبکه است و همانطور خراب میشود که تماسهای شبکه خراب میشوند: مهلت، تلاش دوباره، و جوابی که نصفه رسیده.
جایی که کار هست
همهچیز به یک درخواست تنگ میشود، و درخواست همان تکهای است که ننوشتهاید
چهار چیز داخل یک تماس فشرده میشوند و سه پیامد از آن بیرون میافتد. خود تماس چند خط است.
- سوال عضو باشگاههمانطور تایپشده که آدم روی گوشی تایپ میکند
- آییننامه باشگاه۹ صفحه، نوشتهشده برای تابلوی اعلانات
- برنامه کلاسهاهفتهبههفته عوض میشود و در سامانه دیگری زندگی میکند
- دستور ثابتجواب برای کیست، و چه چیزی را حق ندارد بسازد
- جوابی که تجزیه شدهیا یک رد، که برای مجموعه ارزیابی ماه بعد نگه داشته میشود
- یک ثبتنام، یا یک نهسطری در پایگاه داده که پس گرفتنش دردسر دارد
- جمعه یک نفرجایی که پاراگراف بازیابینشده بالاخره میرسد
دو مخروط سامانهاند و گلوگاه فروشنده است. نقاشیای که گلوگاه را بزرگترین تکه میکرد، تصویر دمو بود نه تصویر چیزی که در سرویس است.
ایست: دمو به املای خودِ سازنده تایپ شده است
کار اینجا میایستد و ایستادنش دیدنی نیست. کسی که سامانه را میسازد پرسش را با املای خودش تایپ میکند و همیشه جواب میگیرد. اعضا با پنج املای دیگر تایپ میکنند. پس چیزی که در سرویس خراب میشود در تمام دوره ساخت حتی یک بار خراب نشده، و هیچ لحظهای وجود ندارد که کسی متوجه شود، چون هر بار که آزمایش میشود کار میکند.
راه بیرون آمدن از آن مکانیکی است و مهارت نمیخواهد: پرسشها را از خودتان نگیرید. سی پیام واقعی از هر جایی که امروز جواب داده میشود بردارید، عیناً، با غلطهای تایپی، و همانها را مجموعه ارزیابی اول قرار دهید. همین یک کار، پله دوم را از یک تشریفات به یک ابزار عیبیابی تبدیل میکند.
پشتهای که تنها یک تکهاش از ایران باز نمیشود
pgvector از ۲۰۲۶ جای بالا آوردن یک پایگاه داده دوم را فقط برای نگه داشتن بردارها گرفته است: رایگان و متنباز است و داخل همان Postgres زندگی میکند که از قبل زیر برنامه هست. Pydantic از ۲۰۲۶ جای تجزیه کردن متن با عبارت باقاعده و امیدوار بودن را گرفته؛ رایگان و متنباز، و همان چیزی است که خروجی مدل را به یک فرم قابل رد کردن تبدیل میکند.
promptfoo از ۲۰۲۶ جای امتحان کردن همان سه سوال با دست بعد از هر ویرایش را گرفته: مجموعه ارزیابی را در یک فایل نگه میدارد و بعد از هر تغییر دوباره میگرداند، و رایگان و متنباز است. نکتهای که برای خواننده ایرانی میارزد گفته شود این است که هر سه از مخزنهای عمومی نصب میشوند و نه حساب میخواهند نه کارت خارجی. تنها تکه این پشته که از ایران مستقیم در دسترس نیست، خودِ تماس با مدل است، و آن دقیقاً همان تکهای است که کمترین کار را میبرد.
پنج پله، و مجازات تعویقیِ رد شدن از دومی
اول درخواست، پاسخ، و تکههایی که غافلگیرتان میکنند، که یک شب کار است و هزینه و شکل خرابیها را معلوم میکند. بعد آزمون برای سامانهای که دو بار یک جور جواب نمیدهد، پیش از آنکه قابلیتی وجود داشته باشد. بعد دادن داده خودتان به مدل، در همان لحظهای که جواب میدهد، که کل ماجرای این صفحه است. بعد یاد دادن یک سبک یا یک کار به مدل، فقط در برابر پله دوم، و آخر همهچیزِ بین یک دمو و یک سرویس.
پلهای که از رویش رد میشوند دومی است، و مجازاتش تعویقی است: حدود شش هفته هیچ اتفاقی نمیافتد چون هرچه بالای آن است هنوز کار میکند. چیزی که غایب است درستی نیست، توانایی فهمیدن این است که بعد از هر تغییر چیزی بهتر یا بدتر شد. اینجا خروجی را یک غریبه میخواند و شما هرگز نمیخوانید، که در کار کردن با مدلها، فهمیدنشان، و ساختن با آنها پله سوم است.
بازیابی پیش از آنکه یک مسئله مدل باشد یک مسئله داده است، و به دست آوردنش، تمیز کردنش، و فهمیدن اینکه چه میگوید همانجاست که یکسانسازی و مترادف خانه دارند. وقتی همین تماس اجازه پیدا کند خودش کاری بکند، به مدلی که ابزار گرفته و اجازه دارد کاری بکند تبدیل میشود. و مهلت و تلاش دوباره و پایش، چیز تازهای نیستند؛ همانهایی هستند که بیرون بردن کد از دستگاه خودتان، و زنده نگه داشتنش دربارهشان است.
آنچه بیجواب میماند این است: وقتی سامانه بگوید نمیدانم، چه اتفاقی میافتد. اگر جوابش این است که عضو باشگاه پیام را میبندد و زنگ میزند، آنوقت نمیدانم گفتن هزینه دارد و باید در همان مجموعه ارزیابی قیمتگذاری شود.