LLMها واقعاً چطور کار میکنند؟
از اینکه مدل چطور الگوهای متن را یاد میگیرد و چرا گاهی «توهم» میزند، تا توکنسازی، تولید مرحلهبهمرحله، دما، سازوکار توجه و معماری ترنسفورمر؛ این فصل یک تصویر ذهنی روشن میدهد تا بفهمی پشت پاسخهای یک LLM واقعاً چه میگذرد.
LLMها از توکن تا ترنسفورمر
آخر این فصل دقیقاً چه چیزی را میفهمی؟
قبل از اینکه بخواهیم پرامپت خوب بنویسیم، باید یک چیز مهم را بفهمیم: مدل زبانی متن را مثل ما نمیبیند. بعضی کارهایی که برای ما خیلی سادهاند، مثل شمردن حروف یک کلمه، ممکن است برای مدل سخت باشند؛ و برعکس، نوشتن یک متن بلند برایش راحت باشد.
قرار نیست وارد فرمولهای سنگین شویم. هدف این فصل این است که با چند مثال ساده بفهمیم مدل چطور متن را میخواند، چطور کلمهٔ بعدی را انتخاب میکند و چرا گاهی جوابهای عجیب میدهد.
- 01LLM در سادهترین تعریف چیست؟
- 02آموزش، مدل پایه و آموزش تکمیلی
- 03مدلها الگو را یاد میگیرند، نه اینکه موتور جستوجو باشند
- 04بیشبرازش و تفاوت حفظکردن با تعمیمدادن
- 05به پرامپت مثل شروع یک متن نیمهکاره نگاه کن
- 06چرا انسان مکث و تحقیق میکند ولی مدل مجبور است حدس بزند؟
- 07توهم و سوگیریِ پذیرش فرض
- 08توکنایزر، توکن و واژگان
- 09سه تفاوت مهم بین دیدن متن توسط انسان و LLM
- 10پنجرهٔ زمینه و شمارش توکن
- 11تولید خودبازگشتی و تولید یک توکن در هر مرحله
- 12چرا مدل نمیتواند واقعاً برگردد و اشتباهش را پاک کند؟
- 13دامِ الگو و تکرارهای عجیب
- 14احتمال، احتمال لگاریتمی، نمونهگیری و دما
- 15جستوجوی پرتوی و انتخاب دنباله بهتر
- 16ترنسفورمر به زبان مغزهای کوچک
- 17توجه بهعنوان سؤال و جواب
- 18ماسکگذاری، پردازش موازی و چرا پرامپت سریعتر از خروجی پردازش میشود
- 19حرکت رو به عقب / رو به پایین و اثر ترتیب پرامپت
- 20مدل ذهنی نهایی، واژهنامه و چکلیست مهندسی
اول از همه: LLM واقعاً چه کاری انجام میدهد؟
وقتی با ChatGPT حرف میزنیم، حس میکنیم یک نفر آن طرف صفحه نشسته، سؤال را میفهمد، فکر میکند و بعد جواب میدهد. برای استفادهٔ روزمره این تصویر بد نیست؛ اما اگر بخواهیم رفتار مدل را درست بفهمیم، باید یک قدم سادهتر نگاه کنیم.
در پایهایترین حالت، مدل یک متن میگیرد و سعی میکند ادامهٔ مناسب آن را بسازد. چیزی که ما میفرستیم «پرامپت» است و چیزی که مدل تولید میکند «پاسخ» یا ادامهٔ متن است.
یک مدل آموزشندیده تقریباً چیزی از زبان نمیداند و خروجیاش میتواند بیمعنا باشد. آموزش باعث میشود کمکم الگوهای زبان را یاد بگیرد؛ مثلاً بفهمد بعد از «سلام، حالت...» احتمال آمدن «خوبه؟» خیلی بیشتر از یک کلمهٔ تصادفی است.
پرامپت متنی است که به مدل میدهی. ادامهٔ متن ادامهای است که مدل برای آن متن تولید میکند. واژهی پاسخ در رابط گفتوگو رایجتر شده، اما در عمق ماجرا همچنان داریم دربارهی ادامهی یک زمینه حرف میزنیم.
آموزش مدل یعنی چه؟ خیلی ساده: دیدن مثالهای خیلی زیاد
مدل زبانی با حجم بزرگی از متنها آموزش میبیند: کتاب، مقاله، سایت، گفتوگو، کد و چیزهای دیگر. هدف این نیست که همهٔ این متنها را کلمهبهکلمه حفظ کند؛ هدف این است که از بین آنها الگو پیدا کند.
مثلاً اگر مدل هزاران بار متنهای پرسشوپاسخ دیده باشد، کمکم یاد میگیرد بعد از یک سؤال معمولاً چه نوع پاسخی میآید. اگر کد زیادی دیده باشد، شکل و قواعد کدنویسی را بهتر یاد میگیرد.
به مجموعهٔ متنهایی که مدل از آنها یاد میگیرد «دادهٔ آموزشی» میگوییم. نوع این داده خیلی مهم است، چون روی رفتار بعدی مدل اثر میگذارد.
مجموعهی متنهایی که مدل در فرایند آموزش از آنها الگو یاد میگیرد.
اگر مجموعهداده مقدار زیادی کد داشته باشد، مدل فرصت بیشتری برای یادگیری قواعد نوشتاری و الگوهای برنامهنویسی دارد. اگر مکالمه کم باشد، رفتار گفتوگویی خام احتمالاً ضعیفتر است.
مدل پایه چیست؟
آموزش تکمیلی یعنی چه و چرا از صفر شروع نمیکنیم؟
فرض کن مدلی داریم که زبان عمومی را خوب بلد است. حالا میخواهیم آن را برای کار حقوقی، پزشکی یا برنامهنویسی بهتر کنیم. منطقی نیست همهچیز را از صفر دوباره به آن یاد بدهیم.
در عوض همان مدل قبلی را برمیداریم و با دادههای تخصصی بیشتری آموزش میدهیم. به این کار «آموزش تکمیلی» یا Fine-tuning میگوییم.
نتیجه این است که مدل همان دانش عمومی قبلی را دارد، اما رفتار و تخصصش به سمت موضوع جدید میرود.
ادامهی آموزش یک مدل از قبل آموزشدیده روی مجموعهداده جدید و معمولاً کوچکتر، با هدف تغییر رفتار یا تخصصیترکردن آن.
نسخههای اولیه کدx از مدل زبانی GPT-3 شروع کردند و بعد با حجم زیادی کد منبع آموزش تکمیلی شدند تا برای GitHub Copilot مناسبتر شوند.
پس مدل زبانی چه فرقی با موتور جستوجو دارد؟
موتور جستوجو معمولاً دنبال یک صفحه یا سند موجود میگردد و آن را پیدا میکند. مدل زبانی کار اصلیاش این نیست که یک صفحهٔ ذخیرهشده را تحویل بدهد؛ سعی میکند از الگوهایی که یاد گرفته، یک پاسخ تازه بسازد.
مثلاً گوگل میتواند صفحهای را که دربارهٔ «طرز تهیهٔ لازانیا» نوشته شده پیدا کند. مدل زبانی میتواند با توجه به چیزهایی که یاد گرفته، برای مواد غذاییای که خودت در خانه داری یک دستور تازه بسازد.
پس یک جملهٔ مهم را یادت بماند: موتور جستوجو بیشتر «پیدا میکند»، مدل زبانی بیشتر «میسازد».
موتور جستوجو
سند موجود را پیدا میکند. بازیابی هستهی کار است.
LLM
الگو یادگرفتهشده را روی زمینه جدید اعمال میکند و ادامه تولید میکند.
بیشبرازش: وقتی مدل بهجای یادگرفتن، جواب را حفظ کرده باشد
گاهی یک مدل روی مثالهایی که قبلاً دیده عالی جواب میدهد، اما وقتی سؤال کمی تغییر کند خراب میکند. این یعنی ممکن است بهجای فهمیدن الگوی کلی، خودِ مثالها را زیادی حفظ کرده باشد.
به این حالت «بیشبرازش» یا Overfitting میگوییم. برعکس، اگر مدل بتواند چیزی که یاد گرفته را روی مثالهای تازه هم استفاده کند، میگوییم «تعمیم» خوبی دارد.
برای همین اگر مدل یک معمای معروف را خیلی سریع حل کرد، همیشه به این معنی نیست که استدلالش فوقالعاده است؛ شاید همان معما یا نمونهای خیلی شبیهش را قبلاً دیده باشد.
حالتی که مدل روی نمونههای دیدهشده خیلی خوب است، اما الگو را آنقدر عمومی یاد نگرفته که روی نمونههای جدید همان کیفیت را داشته باشد.
توانایی مدل برای استفاده از چیزی که یاد گرفته روی نمونهها و مسئلههایی که عیناً در آموزش حضور نداشتهاند.
یک ترفند ذهنی مهم: پرامپت را شروع یک متن نیمهکاره ببین
برای پیشبینی رفتار مدل، یک سؤال خیلی کمک میکند: «اگر این متن واقعاً بخشی از یک نوشته بود، طبیعیترین ادامهاش چه بود؟» مدل هم تقریباً دنبال همین ادامهٔ طبیعی میگردد.
مثلاً اگر بنویسی «دیروز تلویزیونم خراب شد و الان اصلاً روشن نمیشود...» ادامهٔ طبیعی میتواند توضیح مشکل یا راهحل باشد. اما اگر متن شبیه داستان نوشته شده باشد، مدل ممکن است داستان را ادامه دهد.
پس شکل نوشتن پرامپت روی نوع پاسخی که میگیری اثر دارد. مدل فقط معنی جمله را نمیبیند؛ سبک و الگوی متن را هم دنبال میکند.
انسان وقتی نمیداند، میتواند بگوید «بذار چک کنم»؛ مدل خام نه
فرض کن داری مقاله مینویسی و آدرس دقیق یک سایت یادت نیست. خیلی طبیعی است که نوشتن را متوقف کنی، مرورگر را باز کنی، آدرس را پیدا کنی و بعد ادامه بدهی.
مدل خام اگر ابزار جستوجو نداشته باشد، چنین کاری نمیتواند بکند. باید همان لحظه توکن بعدی را حدس بزند. اگر جواب دقیق را نداند، ممکن است چیزی بسازد که ظاهرش کاملاً درست است ولی واقعی نیست.
برای همین در برنامههای جدی، فقط به خود مدل تکیه نمیکنیم. اگر اطلاعات باید دقیق باشد، جستوجو، پایگاهداده، کد یا ابزار را هم وارد فرایند میکنیم.
توهم مدل یعنی چه؟ وقتی جواب قشنگ است ولی واقعیت ندارد
«توهم» یعنی مدل چیزی میگوید که خیلی طبیعی و مطمئن به نظر میرسد، اما واقعیت ندارد. این اتفاق عجیب و جدا از بقیهٔ کار مدل نیست؛ مدل باز هم همان کاری را میکند که همیشه میکند: ادامهای میسازد که از نظر زبانی محتمل به نظر میرسد.
مشکل اینجاست که «محتمل بودن جمله» با «درست بودن جمله» یکی نیست. یک نام، تاریخ یا منبع جعلی هم میتواند از نظر زبانی کاملاً طبیعی باشد.
پس برای اطلاعات حساس، بهتر است جواب مدل را بررسی کنیم؛ مخصوصاً آمار، نقلقول، نام مقاله، لینک، قانون، قیمت و اطلاعات پزشکی یا مالی.
خروجیای که قانعکننده و طبیعی به نظر میرسد، ولی با واقعیت سازگار نیست.
راه بهتر: خروجی را قابل راستیآزمایی کن
اگر سؤال را با یک فرض اشتباه شروع کنی، مدل ممکن است همان اشتباه را ادامه بدهد
مدل معمولاً سعی میکند دنیایی را که در پرامپت ساختهای ادامه بدهد. اگر در سؤال چیزی را از قبل «واقعیت» فرض کنی، ممکن است مدل هم بدون اعتراض همان را قبول کند.
مثلاً اگر بگویی «وقتی ایران در سال ۲۰۲۲ عضو اتحادیهٔ اروپا شد چه اتفاقی افتاد؟» سؤال از پایه یک فرض غلط دارد. مدل خوب شاید اصلاح کند، اما همیشه نباید روی این اصلاح حساب کنیم.
این رفتار در داستان و سناریوهای فرضی مفید است، اما در برنامههای واقعی باید ورودی و دادهها را قبل از فرستادن به مدل بررسی کنیم.
تمایل مدل به پذیرفتن فرضهای اولیه موجود در پرامپت بهعنوان واقعیت داخل متن و ادامهدادن بر همان اساس.
توکن چیست؟ مدل متن را به تکههای کوچکتر میشکند
مدل متن را دقیقاً مثل ما به شکل کلمه و حرف نمیبیند. قبل از اینکه متن وارد مدل شود، یک ابزار به نام «توکنایزر» آن را به تکههای کوچکتری به نام «توکن» تبدیل میکند.
یک توکن ممکن است یک کلمهٔ کامل باشد، بخشی از یک کلمه باشد یا حتی ترکیبی از فاصله و چند حرف. بعد هر توکن به یک شماره تبدیل میشود و مدل با همان شمارهها کار میکند.
پس وقتی میگوییم مدل «متن را میخواند»، در واقع مدل دنبالهای از توکنها را پردازش میکند، نه حروفی که ما روی صفحه میبینیم.
واحد پردازش متن برای مدل. توکن میتواند یک کلمه کامل، بخشی از کلمه، فاصله همراه با حروف یا حتی بخشی از یک نماد باشد.
الگوریتمی که متن را به شناسهٔ توکنها تبدیل میکند و در انتها توکنها را دوباره به متن برمیگرداند.
فهرست تمام توکنهایی که توکنایزر و مدل میشناسند.
ما هم کلمه را یکجا میبینیم، ولی مغزمان خیلی انعطافپذیرتر است
اگر یک کلمه کمی غلط تایپی داشته باشد، معمولاً باز هم منظور را میفهمیم. مغز انسان میتواند از معنی جمله و شکل کلی کلمه کمک بگیرد.
مدل هم گاهی غلط تایپی را میفهمد، اما دلیلش این نیست که مثل انسان به حروف نگاه میکند. دلیلش این است که نمونههای مشابه زیادی دیده و الگو را یاد گرفته است.
توکنایزر حدس نمیزند؛ همیشه طبق یک قانون مشخص متن را میشکند
انسان وقتی یک غلط تایپی میبیند، میتواند حدس بزند منظور چه بوده. توکنایزر چنین حدسی نمیزند؛ فقط طبق قواعد خودش متن را به توکن تقسیم میکند.
برای همین ممکن است یک کلمهٔ درست فقط یک توکن باشد، اما همان کلمه با یک غلط تایپی به چند توکن تبدیل شود. مدل بعداً شاید از روی الگو بفهمد منظور چه بوده، ولی ورودی اولیه فرق کرده است.
برای یک ورودی مشخص همیشه توکنسازی مشخصی دارد؛ بر خلاف خواندن انسان که میتواند خطا را ناخودآگاه اصلاح کند.
چرا شمردن حروف برای مدل عجیب سخت است؟
اگر از تو بپرسم در کلمهٔ «strawberry» چند حرف r وجود دارد، میتوانی کلمه را حرفبهحرف نگاه کنی و بشماری. اما مدل معمولاً خودِ حروف را مستقیم نمیبیند؛ توکنها را میبیند.
برای همین کارهایی مثل شمردن حرف، برعکسکردن دقیق یک رشته، بررسی کاراکتر به کاراکتر یا ساختن کلمه با محدودیت حروفی میتواند برای LLM سختتر از چیزی باشد که انتظار داریم.
وقتی چنین دقتی مهم است، بهتر است از کد استفاده کنیم. کد واقعاً رشته را کاراکتر به کاراکتر میبیند.
کاری که نیاز دارد مدل یک توکن را به اجزای کوچکتر مثل حرف بشکند یا دوباره کنار هم بچیند کند.
قاعدهی مهندسی: قسمت قطعی را بده به کد
حتی بزرگ و کوچک بودن حروف هم میتواند توکنها را عوض کند
برای ما A و a همان حرف هستند، فقط شکلشان فرق دارد. اما برای توکنایزر ممکن است دو رشتهٔ متفاوت باشند و حتی به تعداد توکن متفاوتی شکسته شوند.
این یعنی بعضی تغییرهای ظاهراً ساده در متن میتوانند شکل ورودی مدل را تغییر دهند. معمولاً مدل از پس این تفاوتها برمیآید، اما خوب است بدانیم داخل مدل همهچیز به سادگی نگاه انسانی نیست.
چرا باید حواسمان به تعداد توکنها باشد؟
هر مدل یک محدودیت دارد که مشخص میکند در یک درخواست چند توکن را میتواند همزمان ببیند. به این محدوده «پنجرهٔ زمینه» میگوییم.
اگر پرامپت خیلی طولانی باشد، جا برای پاسخ کمتر میشود. علاوه بر این، تعداد توکن روی هزینه و سرعت هم اثر دارد.
نکتهٔ مهم این است که تعداد حرف و تعداد توکن رابطهٔ ثابتی ندارند. یک متن فارسی، انگلیسی، کد یا رشتهٔ عجیب ممکن است نسبتهای متفاوتی داشته باشند.
حداکثر تعداد توکنهایی که مدل میتواند در یک درخواست در محدودهی زمینه خود داشته باشد؛ معمولاً مجموع پرامپت و ادامهٔ تولیدشده باید در این بودجه جا شود.
بعضی توکنها برای معنی نیستند؛ برای کنترل ساختارند
همهٔ توکنها بخشی از یک کلمه نیستند. بعضی توکنها نقش علامت کنترلی دارند؛ مثلاً میتوانند به مدل بگویند متن تمام شده یا یک بخش جدید شروع شده است.
این توکنهای ویژه برای ساختاردهی خیلی مهماند، مخصوصاً در مدلهای گفتوگویی که باید پیام کاربر، سیستم و دستیار از هم جدا شوند.
توکنِ ویژهای که نقش ساختاری دارد، نه محتوای معمولی؛ مثل پایان متن یا نشانگرهای خاص در قالب گفتوگو.
مدل جواب را یکجا نمیسازد؛ توکنبهتوکن جلو میرود
یکی از مهمترین نکتههای این فصل همین است: مدل کل جواب را از قبل آماده نمیکند. یک توکن تولید میکند، آن را به متن قبلی اضافه میکند و بعد با دیدن همهٔ چیزهایی که تا آن لحظه دارد، توکن بعدی را انتخاب میکند.
به این روش «تولید خودبازگشتی» میگویند. یعنی هر انتخاب جدید به انتخابهای قبلی وابسته است.
برای همین یک انتخاب بد در ابتدای پاسخ میتواند روی ادامهٔ پاسخ هم اثر بگذارد.
مدلی که خروجی را مرحلهبهمرحله تولید میکند و پیشبینی بعدی به توکنهایی که قبلاً خودش تولید کرده وابسته است.
مدل معمولاً وسط پاسخ برنمیگردد جملهٔ قبلی را پاک کند
ما وقتی مینویسیم میتوانیم برگردیم، جمله را پاک کنیم و از نو بنویسیم. تولید معمولی LLM اینطور نیست. توکنی که تولید شده، وارد متن شده و مرحلهٔ بعد باید با همان ادامه پیدا کند.
برای همین گاهی میبینی مدل از یک اشتباه اولیه دفاع میکند یا سعی میکند ادامه را طوری بسازد که اشتباه قبلی کمتر عجیب به نظر برسد. این لجبازی نیست؛ نتیجهٔ همان تولید مرحلهبهمرحله است.
چرا مدل گاهی روی یک جمله یا قالب گیر میکند و تکرار میکند؟
چون مدل به الگوها حساس است، اگر چند بار یک ساختار را تکرار کند، همان ساختار برای مرحلهٔ بعد هم محتملتر میشود. یعنی تکرار میتواند خودش تکرار بیشتری بسازد.
مدل حس انسانی «دیگه بسه» ندارد. اگر الگوی متن به او بگوید ادامهٔ فهرست هنوز طبیعی است، ممکن است بیش از حد ادامه بدهد.
در برنامههای واقعی میتوان با محدودیت طول، تشخیص تکرار یا تنظیم روش نمونهگیری جلوی این مشکل را گرفت.
مدل برای توکن بعدی فقط یک گزینه ندارد؛ چندین گزینه با احتمالهای مختلف دارد
در هر مرحله، مدل برای تعداد زیادی توکن ممکن امتیاز میسازد. بعضی گزینهها خیلی محتملاند، بعضی کمتر. بعد یکی از آنها برای خروجی انتخاب میشود.
پس مدل همیشه فقط «یک جواب قطعی» در ذهن ندارد. پشت هر توکن انتخابشده، فهرستی از گزینههای دیگر هم بوده است.
به فرایند انتخاب یک توکن از بین این گزینهها «نمونهگیری» میگوییم.
مدل برای توکن بعدی چند گزینه دارد و برای هرکدام احتمال متفاوتی در نظر میگیرد.
احتمال لگاریتمی به ما میگوید مدل چقدر بین گزینهها مردد بوده
بعضی APIها عددی به نام Logprob میدهند. لازم نیست وارد ریاضیاش شویم؛ کاربرد سادهاش این است که بفهمیم یک توکن نسبت به گزینههای دیگر چقدر قویتر بوده است.
اگر دو برچسب تقریباً امتیاز مشابهی داشته باشند، یعنی مدل بین آنها مردد بوده. اگر یکی خیلی جلوتر باشد، انتخاب مدل مطمئنتر بوده است.
اما یک هشدار مهم: این عدد میزان «درست بودن واقعیت» را نمیگوید؛ فقط نشان میدهد آن ادامه از نظر مدل چقدر محتمل بوده.
عددی که کمک میکند بفهمیم یک توکن نسبت به گزینههای دیگر چقدر محتملتر بوده است.
دما چیست؟ یک پیچ برای کموزیاد کردن تصادفیبودن جواب
دما یا Temperature تعیین میکند مدل هنگام انتخاب توکن چقدر محافظهکار یا متنوع باشد. دمای پایین باعث میشود بیشتر سراغ گزینههای خیلی محتمل برود. دمای بالاتر به گزینههای کماحتمالتر هم شانس بیشتری میدهد.
دما مدل را باهوشتر نمیکند. فقط نحوهٔ انتخاب بین گزینهها را تغییر میدهد.
تنظیمی برای اینکه انتخابهای مدل محافظهکارانهتر یا متنوعتر شوند.
| دما | رفتار تقریبی | کاربرد معمول |
|---|---|---|
| 0 | نزدیک به انتخاب محتملترین توکن | دقت، تکرارپذیری، استخراج |
| 0.1 - 0.4 | تنوع محدود | چند پاسخ نزدیک ولی متفاوت |
| 0.5 - 0.7 | تصادفیبودن محسوس | تولیدهای متنوعتر |
| 1 | نمونهگیری نزدیک توزیع اصلی | رفتار طبیعیتر توزیع |
| >1 | توکنهای عجیب شانس بیشتر | آزمایش خلاقیت، با ریسک بالا |
برای کارهای دقیق، دمای پایین معمولاً بهتر است
اگر میخواهی مدل متن را دستهبندی کند، داده استخراج کند یا جوابها تا حد ممکن ثابت باشند، معمولاً دمای پایین انتخاب بهتری است.
دمای خیلی پایین هم همهٔ مشکلات را حل نمیکند. اگر مدل وارد یک الگوی بد شود، ممکن است همان مسیر را با اطمینان بیشتری ادامه بدهد.
پس دما را باید با نوع کار تنظیم کرد؛ نه اینکه همیشه یک عدد ثابت را برای همهچیز استفاده کنیم.
چرا دمای خیلی بالا میتواند جواب را کمکم خراب کند؟
در دمای بالا، مدل بیشتر سراغ انتخابهای غیرمعمول میرود. یک انتخاب عجیب ممکن است بهتنهایی مشکل بزرگی نباشد، اما همان انتخاب وارد زمینه میشود و روی انتخاب بعدی اثر میگذارد.
اگر چند انتخاب عجیب پشت سر هم بیاید، مسیر پاسخ کمکم از متن طبیعی دور میشود. به همین دلیل دمای خیلی بالا مخصوصاً در جوابهای طولانی میتواند آشفتگی ایجاد کند.
بهترین کلمهٔ همین لحظه همیشه بهترین جملهٔ نهایی را نمیسازد
مدل معمولاً قدمبهقدم تصمیم میگیرد. اما ممکن است گزینهای که همین الان کمی محتملتر است، چند کلمه بعد به مسیر بدی برسد؛ و گزینهٔ دوم در نهایت جملهٔ بهتری بسازد.
روشهایی مثل Beam جستوجو چند مسیر را همزمان نگه میدارند و کمی جلوتر را هم بررسی میکنند تا انتخاب کلی بهتری داشته باشند.
این روش میتواند در بعضی کارها مفید باشد، ولی هزینه و زمان بیشتری میخواهد و برای همهٔ کاربردهای گفتوگویی لازم نیست.
روشی که چند ادامهٔ احتمالی را همزمان نگه میدارد و کمی جلوتر را بررسی میکند.
ترنسفورمر را بدون فرمول اینطور تصور کن
برای فهم شهودی، تصور کن روی هر توکن یک «مغز کوچک» قرار دارد. هر مغز کوچک میخواهد بفهمد توکن خودش در این جمله چه معنیای دارد و برای این کار از بخشهای قبلی کمک میگیرد.
این پردازش در چند مرحله انجام میشود که به آنها «لایه» میگوییم. در لایههای بالاتر، نمایش درونی هر توکن معمولاً وابستگی بیشتری به معنی کل جمله پیدا میکند.
این فقط یک تشبیه است، اما کمک میکند بدون ریاضی سنگین بفهمیم چرا معنی یک کلمه به کلمههای اطرافش وابسته میشود.
یکی از مرحلههای پردازش داخل ترنسفورمر؛ هر لایه کمک میکند معنی توکن با توجه به متن اطراف کاملتر شود.
همهٔ توکنهای پرامپت پردازش میشوند، اما آخرین بخش برای ساخت توکن بعدی مهمتر است
وقتی پرامپت را میفرستی، مدل برای همهٔ توکنها نمایش درونی میسازد. این نمایشها کمک میکنند اطلاعات متن به سمت انتهای دنباله منتقل شود.
در لحظهٔ تولید، چیزی که لازم داریم این است که بر اساس تمام متن قبلی، توکن بعدی را حدس بزنیم. بعد توکن جدید اضافه میشود و همین فرایند دوباره ادامه پیدا میکند.
همین تفاوت باعث میشود «خواندن» پرامپت و «نوشتن» پاسخ از نظر سرعت حس متفاوتی داشته باشند.
سازوکار توجه یعنی مدل بفهمد برای این کلمه، کجای متن مهمتر است
توجه یا Attention یکی از مهمترین بخشهای ترنسفورمر است. خیلی ساده، کمک میکند مدل وقتی روی یک توکن کار میکند، تشخیص دهد کدام بخشهای قبلی متن برای فهم آن مهمترند.
مثلاً در جملهٔ «سارا گوشی را برداشت چون او دیرش شده بود»، برای فهمیدن «او» باید بفهمیم احتمالاً به «سارا» اشاره دارد. توجه کمک میکند این ارتباط پیدا شود.
در واقعیت این ارتباط با عدد و بردار انجام میشود، نه با سؤال و جواب واقعی. اما تشبیه «دنبال سرنخ گشتن» برای فهم ایده کافی است.
روشی که کمک میکند مدل برای فهم یک توکن، بخشهای مهمترِ متن قبلی را پیدا کند.
مدل هنگام تولید، آینده را نمیبیند
وقتی مدل دارد توکن بعدی را انتخاب میکند، فقط متن قبلی را دارد. آینده هنوز تولید نشده، پس نمیتواند از آن کمک بگیرد.
برای اینکه مدل تقلب نکند، سازوکاری به نام «ماسکگذاری» جلوی دیدن توکنهای آینده را میگیرد.
به همین دلیل تولید متن از چپ به راست پیش میرود: گذشته روی آینده اثر میگذارد، نه برعکس.
قانونی که اجازه نمیدهد مدل هنگام ساخت توکن فعلی، آیندهای را که هنوز تولید نشده ببیند.
چرا مدل پرامپت را سریع میخواند ولی جواب را آرامتر مینویسد؟
وقتی پرامپت را میفرستی، تمام توکنهای ورودی از قبل آمادهاند. سختافزار میتواند بخش زیادی از محاسبات آنها را همزمان انجام دهد.
اما برای تولید جواب، توکن بعدی هنوز وجود ندارد. اول باید توکن فعلی ساخته شود تا مدل بتواند سراغ بعدی برود. بنابراین تولید پاسخ ذاتاً زنجیرهایتر است.
این همان دلیلی است که معمولاً میبینی مدل یک متن بلند را خیلی سریع «میخواند»، اما جواب را کلمهکلمه جلوی چشمت مینویسد.
پردازش پرامپت
توکنهای ورودی از قبل معلوماند؛ پردازش موازی زیاد ممکن است.
تولید
توکن بعدی به توکن قبلی وابسته است؛ زنجیرهایتر است.
ترتیب پرامپت مهم است؛ چون مدل اطلاعات را از قبل به بعد میبیند
هر توکن میتواند از بخشهای قبلی متن کمک بگیرد، اما اطلاعاتی که بعدتر میآید نمیتواند به گذشته برگردد و پردازش قبلی را از نو انجام دهد.
برای همین اگر یک دستور مهم داری، بهتر است آن را واضح و زودتر بگویی؛ مخصوصاً وقتی میخواهی مدل هنگام خواندن یک متن بلند روی نکتهٔ خاصی تمرکز کند.
چرا نوشتن مرحلههای میانی میتواند به مدل کمک کند؟
داخل مدل، پردازش در لایهها از پایین به بالا جلو میرود. چیزی که در مراحل بالاتر شکل میگیرد، نمیتواند زمان را برگرداند و لایههای قبلی همان توکن را دوباره اجرا کند.
اما وقتی مدل چیزی را بیرون مینویسد، همان نوشته وارد زمینهٔ مرحلهٔ بعد میشود. یعنی خروجی قبلی میتواند به نوعی «یادداشت روی کاغذ» برای ادامهٔ کار تبدیل شود.
به همین دلیل شکستن یک مسئلهٔ پیچیده به چند مرحله، استفاده از ابزار یا نگهداشتن نتایج میانی میتواند به سیستم کمک کند.
چرا اگر آخرِ متن بگویی «تعداد کلمهها را بشمار» ممکن است مدل بد عمل کند؟
فرض کن اول یک بند خیلی بلند به مدل میدهی و تازه در آخر میگویی «حالا دقیق بگو چند کلمه داشت». وقتی مدل متن را پردازش میکرد، از اول نمیدانست که شمارش دقیق قرار است مهم باشد.
انسان میتواند برگردد و دوباره متن را کلمهبهکلمه بشمارد. مدل زبانی برای چنین کار دقیقی ابزار مناسبی نیست و ممکن است فقط تخمین بزند.
اگر شمارش دقیق لازم است، بهترین راه معمولاً کد است. اگر هم میخواهی مدل کمک کند، دستور را قبل از متن بده تا از ابتدا بداند دنبال چه چیزی بگردد.
یک تست سریع: این کار برای مدل طبیعی است یا بهتر است ابزار اضافه کنیم؟
از خودت بپرس: «اگر یک انسان متخصص فقط یک بار این متن را بخواند و اجازه نداشته باشد برگردد، یادداشت کند یا ابزار استفاده کند، میتواند کار را دقیق انجام دهد؟»
اگر جواب بله باشد، احتمالاً LLM هم با پرامپت خوب شانس خوبی دارد. اگر جواب نه باشد، بهتر است به مدل کمک بدهیم: کد، جستوجو، حافظه، ابزار، چند مرحله یا راستیآزمایی.
این قانون صددرصد نیست، اما برای طراحی سیستم خیلی مفید است.
این چیزها در عمل چه کمکی به طراحی محصول میکنند؟
چند اشتباه رایج که از مدل انتظار بیجا ایجاد میکند
«مدل این اطلاعات را بلد است، پس حتماً درست میگوید»
مدل ممکن است یک واقعیت درست و یک واقعیت ساختگی را با همان لحن مطمئن بنویسد. پس لحن قاطع را با صحت اشتباه نگیر.
زمینهٔ بیشتر همیشه بهتر نیست. ریختن حجم زیادی متن نامرتبط میتواند مدل را گیج کند و هزینه را بالا ببرد.
دما هوش مدل را زیاد نمیکند؛ فقط تنوع انتخابها را تغییر میدهد.
مدل در تولید معمولی دکمهٔ برگشت واقعی ندارد. اگر اصلاح لازم است، باید یک مرحلهٔ جدید برای بازبینی یا تولید دوباره بسازی.
کارهای دقیقِ کاراکترمحور مثل شمارش حروف، بهتر است به کد سپرده شوند.
«هرچه پرامپت بلندتر، بهتر»
«دما بالا یعنی مدل باهوشتر»
«اگر مدل اشتباه کرد، دوباره از همان نقطه خودش اصلاح میکند»
«شمارش و دستکاری رشتهٔ متنی سادهاند، پس LLM هم ساده انجام میدهد»
کل مسیر را در یک خط ببین
متن وارد توکنایزر میشود، به توکن تبدیل میشود، ترنسفورمر احتمال توکن بعدی را میسازد، روش نمونهگیری یکی را انتخاب میکند، توکن جدید به متن اضافه میشود و چرخه دوباره تکرار میشود.
چهار نکتهای که واقعاً باید از این فصل یادت بماند
۱) مدل زبانی در پایه یک ادامهدهندهٔ متن است. ۲) از مثالهای آموزشی الگو یاد میگیرد، نه اینکه مثل موتور جستوجو فقط سند پیدا کند. ۳) پاسخ را توکنبهتوکن میسازد و هر انتخاب روی انتخاب بعدی اثر دارد. ۴) ترتیب اطلاعات در پرامپت مهم است، چون مدل متن را از قبل به بعد پردازش میکند.
واژهنامه - آموزش و رفتار مدل
واژهنامه - توکنسازی و زمینه
واژهنامه - تولید و نمونهگیری
واژهنامه - ترنسفورمر و توجه
چکلیست قبل از اینکه مسئله را گردن مدل بیندازی
- میدانم پرامپت من شبیه چه نوع متنی است.
- اطلاعات حساس را بدون راستیآزمایی رها نمیکنم.
- زمینه تولیدشدهی برنامه را قبل از مدل اعتبارسنجی میکنم.
- منطق در سطح حروف را در صورت امکان با کد انجام میدهم.
- شمارش توکن را روی دادهی واقعی اندازه میگیرم.
- برای خروجی و پرامپت با هم بودجهٔ توکن دارم.
- دما را متناسب با درستی یا تنوع تنظیم میکنم.
- در کار مهم خروجی را اعتبارسنجی و در صورت نیاز تلاش دوباره میکنم.
- برای الگوهای تکراری تشخیص دارم.
- ترتیب پرامپت را آگاهانه طراحی میکنم.
- اگر انسان برای کار نیاز به جستوجو، یادداشتبرداری یا برگشت و اصلاح دارد، ابزار یا روند کار مشابه برای مدل در نظر میگیرم.
- ارزیابی را با نمونههای دیدهنشده انجام میدهم.
جمعبندی فصل: حالا مدل باید خیلی کمتر مرموز به نظر برسد
در این فصل دیدیم LLM از بیرون خیلی ساده است: متن میگیرد و ادامهٔ متن میسازد. چیزی که آن را قدرتمند میکند، آموزش روی حجم بزرگی از داده و یادگیری الگوهای زبان است.
بعد فهمیدیم مدل متن را مستقیم به شکل حرف و کلمه نمیبیند؛ اول متن به توکن تبدیل میشود. همین نکته توضیح میدهد چرا بعضی کارهای حرفبهحرف مثل شمارش یا برعکسکردن رشته برای مدل عجیب سختاند.
بعد دیدیم پاسخ یکجا ساخته نمیشود. مدل یک توکن میسازد، آن را به زمینه اضافه میکند و بعد توکن بعدی را انتخاب میکند. برای همین اشتباههای اولیه میتوانند روی ادامهٔ جواب اثر بگذارند.
همچنین فهمیدیم مدل برای هر مرحله چند گزینه با احتمالهای مختلف دارد و دما فقط مشخص میکند انتخاب بین این گزینهها چقدر محافظهکار یا متنوع باشد.
در آخر به ترنسفورمر و سازوکار توجه رسیدیم. توجه کمک میکند مدل بفهمد کدام قسمتهای قبلی متن برای توکن فعلی مهمترند و ترتیب اطلاعات در پرامپت چرا روی نتیجه اثر میگذارد.
اگر بخواهیم همهٔ فصل را در یک جمله خلاصه کنیم: مدل زبانی جادو نمیکند؛ یک سیستم احتمالاتی است که متن را تکهتکه میبیند و قدمبهقدم ادامه میدهد. وقتی این را بفهمی، خیلی راحتتر میتوانی برایش پرامپت و ابزار درست طراحی کنی.
این فصل بر پایهی پوشش کامل فصل دوم شناخت مدلهای زبانی بزرگ از کتاب مهندسی پرامپت for LLMs نوشته شده است. ساختار آموزشی، توضیح فارسی، مثالهای بازطراحیشده و نمودارهای این نسخه بهصورت مستقل بازنویسی شدهاند و هدف آن ترجمهی خطبهخط متن منبع نیست.