متن خیلی بلند
جواب کوتاه
پنجرهی متن یعنی بیشترین تعداد تکهای که مدل یهجا میبینه. بلند کردنش سه تا مانع داره؛ حساب توجه با مربع طول متن بالا میره، KV کش با طول متن بزرگ میشه و حافظه رو پر میکنه، و مدل جاهایی رو که موقع آموزش ندیده، خوب نمیشناسه. برای جا، ترفندهایی مثل فشردن شمارهی جاها توی RoPE یا جریمهی فاصله هست؛ برای حساب، توجه سریع و پنجرهی لغزان؛ برای حافظه، کش مشترک و کمدقت؛ و برای متنهای خیلی بلند، پخش متن بین چند کارت. ولی مدلها هنوز چیزی رو که وسط متن بلنده، گاهی کمتر میبینن، و طول موثرشون معمولا از طول ادعاشده کمتره.
یعنی چی
فرض کنید یه کتاب هزار صفحهای رو یهجا بدید دست یکی و بپرسید صفحهی ۴۸۳ چی نوشته بود. سه تا مشکل داره؛ خوندنش وقت میبره، همهش یادش نمیمونه، و تا حالا صفحهشماری به این بلندی ندیده.
مدلهای زبانی هم دقیقا همین سه تا مشکل رو با متن بلند دارن. هر مدل یه «پنجرهی متن» داره؛ بیشترین تعداد تکه که میتونه یهجا ببینه، از سوال شما و سندهایی که بهش دادید تا جوابی که داره مینویسه. هر چی بیرون این پنجره باشه، برای مدل وجود نداره.
این درس اول نشون میده چرا بلند کردن این پنجره سخته، بعد ترفندهایی که برای هر مشکل پیدا شده، و آخر اینکه حتی با پنجرهی بلند، مدلها کجا هنوز ضعف دارن و شما موقع استفاده چی کار کنید.
پنجرهی متن، مثل یه خطکش
پنجرهی متن رو مثل یه خطکش تصور کنید؛ هر تکه یه خونهی خطکشه. سوال، سندها و جواب همه روی همین خطکش جا میشن، و اگه جا تموم بشه، یا باید تکههای اول رو دور ریخت یا جواب نیمهکاره میمونه:
ترنسفورمر اصلی سال ۲۰۱۷ با جملههایی در حد چند ده تا چند صد تکه کار میکرد. مدلهای زبانی اولیه پنجرهای در حد چند هزار تکه داشتن، یعنی چند صفحه متن. امروز پنجرههای صدها هزار تکهای رایجه، و یه گزارش فنی سال ۲۰۲۴ تا یه میلیون تکه هم گزارش کرد؛ چیزی در حد چند کتاب کامل. ولی همونطور که آخر درس میبینید، اینکه مدل همهی این پنجره رو خوب بفهمه، یه حرف دیگهست.
سه تا مانع
مانع اول حسابه. توجه برای هر جفت تکه یه امتیاز حساب میکنه، پس هزینهش با مربع طول متن بالا میره؛ همون هزینهی مربعی. مانع دوم حافظهست. موقع ساختن متن، کلید و مقدار همهی تکههای قبلی توی KV کش نگه داشته میشه، و این کش با طول متن بزرگ میشه.
مانع سوم از همه ناپیداتره؛ جا. مدل باید بدونه هر تکه کجای متنه، و این رو از رمزگذاری موقعیتی یاد میگیره. اگه موقع آموزش هیچوقت متنی بلندتر از چهار هزار تکه ندیده باشه، جای دههزارم براش یه عدد ناآشناست، و رفتارش اونجا قابل پیشبینی نیست. پایینتر هر کدوم رو با عدد میبینیم.
حساب مربعی، با عدد
اگه طول متن ده برابر بشه، تعداد جفتها صد برابر میشه. یعنی حساب توجه برای ۱۰۰ هزار تکه، صد برابر ۱۰ هزار تکهست، نه ده برابر. بقیهی بخشهای مدل، مثل شبکهی پیشخور، فقط با طول متن خطی بالا میرن، پس توی متنهای کوتاه سهم توجه کمه، ولی هر چی متن بلندتر بشه، توجه کمکم بیشترین هزینه رو میگیره.
این توی تجربهی کاربر هم دیده میشه. وقتی یه سند خیلی بلند به مدل میدید، چند ثانیه، یا گاهی بیشتر، طول میکشه تا اولین کلمهی جواب بیاد؛ این وقتیه که مدل داره کل متن رو یه بار میخونه و کش رو پر میکنه. توجه سریع این رو تندتر کرد، ولی مربعی بودنش رو از بین نبرد.
حافظهی کش، با عدد
بیاید برای یه مدل فرضی متوسط حساب کنیم؛ ۳۲ لایه، ۸ سر کلید و مقدار، بردار ۱۲۸ تایی برای هر سر، و هر عدد دو بایت. برای هر تکه، کلید و مقدار روی هم میشه ۲ ضرب در ۳۲ ضرب در ۸ ضرب در ۱۲۸ ضرب در ۲ بایت، یعنی ۱۲۸ کیلوبایت. شاید کم به نظر بیاد، ولی برای ۱۲۸ هزار تکه، میشه حدود ۱۶ گیگابایت، فقط برای کش یه گفتگو، کنار خود مدل.
حالا اگه یه سرور بخواد همزمان به ده نفر با متن بلند جواب بده، کشها از خود مدل بزرگتر میشن. برای همینه که خیلی از ترفندهای متن بلند، در واقع ترفندهای کوچیک کردن کشان؛ مثل کلید و مقدار مشترک بین سرها، که توی همین حساب، بهجای ۳۲ سر، فقط ۸ سر کلید و مقدار نگه داشتیم.
جاهایی که مدل ندیده
رمزگذاریهای موقعیتی مختلفی هست، و امروز رایجترینش RoPE، یعنی چرخوندن بردارها به اندازهی جاشون، هست. توی RoPE، هر جفت عدد توی بردار با یه سرعت چرخش میچرخه؛ بعضی جفتها تند، بعضی خیلی آروم. جفتهای آروم، توی متنهای کوتاه، هیچوقت یه دور کامل هم نمیچرخن.
وقتی متن خیلی بلندتر از متنهای آموزش بشه، این جفتهای آروم به زاویههایی میرسن که مدل هیچوقت ندیده. نتیجهش این نیست که مدل یه کم بدتر بشه؛ خیلی وقتها کیفیت یهو فرو میریزه و مدل حرفهای بیربط میزنه. برای همین آموزش یه مدل روی متن کوتاه و بعد دادن متن بلند بهش، بی هیچ ترفندی، معمولا کار نمیکنه.
یه راه: جریمهی فاصله
یکی از اولین راهها، سال ۲۰۲۱، این بود که اصلا رمزگذاری موقعیتی رو کنار بذارن و بهجاش، به امتیاز توجه هر جفت، یه جریمهی ساده به اندازهی فاصلهشون اضافه کنن؛ هر چی دورتر، امتیاز کمتر. هر سر یه شیب جریمهی جدا داره؛ بعضی سرها فاصله رو خیلی جریمه میکنن و فقط به نزدیکها نگاه میکنن، بعضیها کم.
اسم پژوهشش میگفت «کوتاه آموزش بده، بلند امتحان کن»؛ مدلی که روی ۱۰۲۴ تکه آموزش دیده بود، روی متنهای چند برابر بلندتر هم خوب کار کرد، چون جریمهی فاصله برای هر فاصلهای، حتی فاصلههای ندیده، همون معنی رو داره. عیبش اینه که جریمه، دور رو همیشه کمرنگتر میکنه، و برای جاهایی که یه چیز خیلی دور مهمه، کمتر خوبه.
فشردن جاها
راه دیگه، برای مدلهایی که از قبل با RoPE آموزش دیدن، اینه که شمارهی جاها رو فشرده کنن. اگه مدل فقط جاهای صفر تا چهار هزار رو دیده، و ما میخوایم شونزده هزار تکه بهش بدیم، شمارهی هر جا رو تقسیم بر چهار میکنیم:
حالا جای شونزدههزارم، برای مدل، مثل جای چهارهزارمه؛ یعنی هیچ زاویهی ندیدهای پیش نمیاد. البته جاها حالا به هم نزدیکتر شدن و مدل باید یه کم عادت کنه؛ برای همین بعد از فشردن، یه آموزش کوتاه با متنهای بلند لازمه. پژوهش ۲۰۲۳ نشون داد با حدود هزار قدم آموزش، پنجرهی یه مدل تا ۱۶ برابر، یعنی تا ۳۲ هزار تکه، بلند شد، با کیفیتی نزدیک به قبل روی متنهای کوتاه.
تغییر بسامدها
فشردن ساده یه گیر کوچیک داره؛ همهی جفتها، حتی جفتهای تند که جاهای نزدیک رو از هم جدا میکنن، فشرده میشن، و مدل کمی توی تشخیص کلمههای کنار هم بدتر میشه. راههای بعدی، از ۲۰۲۳، بسامدها رو جدا جدا عوض کردن؛ جفتهای تند رو تقریبا دست نزدن، و فقط جفتهای آروم رو، که مشکل جاهای ندیده از اونها بود، فشرده کردن.
یکی از این راهها پایهی RoPE رو، یعنی عددی که سرعت چرخش همهی جفتها از روش ساخته میشه، بزرگتر کرد؛ ترفندی که خیلیها اول توی اینترنت پیدا کردن و بعد به شکل پژوهش دراومد. یکی دیگه این رو با فشردن ترکیب کرد و با دادهی آموزش خیلی کمتری پنجره رو چند برابر کرد. امروز تقریبا هر مدلی که پنجرهی خیلی بلند داره، یه نسخه از همین فکرها رو به کار برده.
دادهی بلند برای آموزش
ترفندهای جا فقط شروع کارن. مدل برای اینکه واقعا از متن بلند استفاده کنه، باید موقع آموزش متنهای بلند واقعی ببینه؛ کتاب، مقالههای بلند، کد یه پروژهی کامل. ولی بیشتر متنهای اینترنت کوتاهن، و آموزش با متن بلند، به خاطر همون هزینهی مربعی، گرونه.
برای همین روال رایج اینه که بیشتر پیشآموزش با متنهای کوتاهتر انجام بشه، و فقط یه مرحلهی کوتاه آخر کار، با متنهای بلند و ترفند جا، پنجره رو بلند کنه. یه نکتهی دیگه هم هست؛ متنهای بلند ساختگی، که فقط چند تا متن کوتاه پشت هم چسبیدهان، چیز زیادی یاد نمیدن، چون مدل یاد نمیگیره از ابتدای متن برای انتهاش استفاده کنه. دادهای لازمه که واقعا به هم وابسته باشه.
پنجرهی لغزان، و چند تکهی اول
برای کم کردن حساب و حافظه، یه راه ساده اینه که هر تکه فقط به چند هزار تکهی قبلی خودش نگاه کنه، نه به همه؛ یه پنجرهی لغزان. هزینه خطی میشه و کش هم هیچوقت از اندازهی پنجره بزرگتر نمیشه. ولی یه پژوهش ۲۰۲۳ یه چیز عجیب پیدا کرد:
مدلها مقدار زیادی از توجهشون رو به چند تکهی اول متن میدن، حتی وقتی اون تکهها هیچ معنی خاصی ندارن؛ انگار یه جای خالی لازم دارن که توجه اضافهشون رو اونجا بریزن، چون سافتمکس مجبورشون میکنه جمع وزنها یک بشه. به این تکهها «سینک توجه» گفتن. وقتی پنجرهی لغزان این چند تکهی اول رو دور میریخت، مدل یهو خراب میشد.
راهحلش ساده بود؛ چند تکهی اول رو همیشه نگه دار، کنار پنجرهی لغزان. با همین، مدل تونست به شکل پایدار تا میلیونها تکه متن بسازه. البته این یعنی مدل هنوز فقط پنجرهی آخر رو واقعا میبینه؛ برای ساختن متن طولانی و پیوسته خوبه، نه برای پیدا کردن یه جملهی خاص که خیلی وقت پیش اومده. ترکیب پنجرهی لغزان با لایههایی که همهچیز رو میبینن هم رایجه؛ همون فکر توجه پراکنده.
حافظهی کمتر
کنار کلید و مقدار مشترک بین سرها، سه راه دیگه هم برای کوچیک کردن کش هست. اول، نگه داشتن کش با عددهای کمدقتتر، مثلا بهجای دو بایت، یه بایت یا نیم بایت برای هر عدد؛ کش دو تا چهار برابر کوچیک میشه، با کمی افت کیفیت. دوم، دور ریختن تکههایی از کش که کمتر توجه گرفتن، به این امید که بعدا هم لازم نشن؛ ریسکش اینه که یه چیز مهم دور ریخته بشه.
سوم، مدیریت بهتر خود حافظه. پیشتر، برای هر گفتگو یه تکهی بزرگ و پیوسته از حافظه به اندازهی بیشترین طول ممکن کنار میذاشتن، و بیشترش خالی میموند. یه پژوهش ۲۰۲۳ این کار رو مثل حافظهی سیستمعامل کرد؛ کش به صفحههای کوچیک تقسیم میشه و هر صفحه فقط وقتی لازم شد گرفته میشه. هدر رفتن حافظه خیلی کم شد و یه سرور تونست همزمان به چند برابر آدم جواب بده.
پخش متن بین چند کارت
وقتی متن اونقدر بلنده که حتی کلید و مقدارهاش توی یه کارت جا نمیشه، باید متن رو بین چند کارت پخش کرد. یه راه زیبا که سال ۲۰۲۳ معرفی شد، «توجه حلقهای»ه:
هر کارت یه تکه از متن رو نگه میداره، با پرسشهای خودش. بعد تکههای کلید و مقدار دور حلقه میچرخن؛ هر کارت تکهی کلید و مقداری که دستشه رو با پرسشهای خودش حساب میکنه، و بعد اون رو به کارت کناری میده و تکهی بعدی رو از اون یکی کنارش میگیره. وقتی تکهها یه دور کامل زدن، هر کارت پرسشهاش رو با همهی کلیدها حساب کرده.
جمع کردن نتیجهها هم با همون سافتمکس جاری توجه سریع انجام میشه، پس جواب دقیقه. چون جابهجا کردن تکهها با حساب همزمان انجام میشه، تقریبا وقت اضافهای نمیگیره، و طول متن به نسبت تعداد کارتها بالا میره. همین روشها پنجرههای میلیونی رو ممکن کردن.
یه راه قدیمیتر: حافظهی تکهی قبل
پیش از اینکه پنجرههای خیلی بلند ممکن بشن، یه راه دیگه هم امتحان شد. سال ۲۰۱۹ یه پژوهش متن رو به تکههای پشت سر هم تقسیم کرد، ولی وقتی مدل تکهی تازه رو میخوند، حالتهای درونی تکهی قبلی رو هم، بی آموزش دوباره، کنار دستش نگه میداشت و بهشون توجه میکرد. هر لایه یه تکه بیشتر به عقب میدید، پس با لایههای زیاد، مدل خیلی دورتر از یه تکه رو حس میکرد.
برای این کار، جای مطلق کلمهها به درد نمیخورد، چون کلمهی اول تکهی تازه و کلمهی اول تکهی قبل، هر دو جای صفر داشتن. برای همین فاصلهی دو کلمه از هم رو به مدل دادن، نه جای هر کدوم؛ فکری که بعدا توی RoPE و جریمهی فاصله هم دیده شد. پژوهشهای بعدی حتی حالتهای خیلی قدیمی رو فشرده نگه داشتن تا دورتر رو هم به یاد بیارن. امروز بیشتر مدلهای بزرگ پنجرهی مستقیم بلند رو ترجیح میدن، ولی این فکر توی بعضی جایگزینهای ترنسفورمر برگشته.
خوندن و نوشتن، دو تا کار جدا
وقتی یه متن بلند به مدل میدید، کارش دو مرحله داره. مرحلهی اول، خوندن کل متنه؛ همهی تکهها با هم و موازی از مدل رد میشن و کش پر میشه. این مرحله سنگینه، چون حساب توجهش مربعیه، ولی چون موازیه، کارت گرافیک با تمام توان کار میکنه. مرحلهی دوم، نوشتن جوابه؛ یکییکی، هر کلمه با نگاه به کل کش.
این دو مرحله گلوگاههای متفاوتی دارن. خوندن گرفتار حسابه و وقتش با طول متن، تقریبا مربعی، بالا میره. نوشتن گرفتار حافظهست، چون برای هر کلمه کل کش از حافظه خونده میشه، و هر کلمه با بلندتر شدن کش کمی کندتر میاد. برای همین سرویسها گاهی برای تکههای ورودی و خروجی قیمت جدا دارن، و برای همینه که یه جواب کوتاه دربارهی یه سند خیلی بلند، باز هم ممکنه چند ثانیه طول بکشه.
گم شدن وسط متن
فرض کنید پنجره بلنده و همهی ترفندها کار کرده. آیا مدل حالا همهی متن رو یکسان میبینه؟ یه پژوهش ۲۰۲۳ نشون داد نه. به مدلها چند ده سند دادن و جواب سوال توی یکیشون بود؛ بعد جای اون سند رو عوض کردن:
وقتی سند جواب اول یا آخر بود، مدلها خوب جواب دادن. وقتی وسط بود، عملکرد بهطور چشمگیری افت کرد، گاهی حتی بدتر از وقتی که اصلا سندی بهشون داده نشده بود. شکلش یه منحنی Uه؛ اول و آخر بالا، وسط پایین. شبیه حافظهی آدمها، که اول و آخر یه فهرست بلند رو بهتر یادشون میمونه.
مدلهای تازهتر توی این آزمون خیلی بهتر شدن، ولی این ضعف کامل از بین نرفته. نتیجهی عملیش برای شما سادهست؛ چیز مهم رو وسط یه متن خیلی بلند گم نکنید. سوال یا دستور اصلی رو آخر بذارید، بعد از سندها، و اگه یه بخش خاص مهمتره، اسمش رو توی سوال بیارید.
از کجا بفهمیم واقعا میبینه
یه آزمون ساده و معروف، از ۲۰۲۳، «سوزن توی انبار کاه»ه؛ یه جملهی خاص، مثلا یه عدد مخفی، رو جاهای مختلف یه متن خیلی بلند میذارن و از مدل میپرسن. نتیجه یه جدوله؛ برای هر طول متن و هر عمق، پیدا کرد یا نه:
مشکل این آزمون اینه که خیلی آسونه؛ پیدا کردن یه جملهی غیرعادی شبیه جستجوی کلمهست، نه فهمیدن متن. برای همین آزمونهای سختتر اومدن؛ چند تا سوزن، سوزنهایی که شبیه بقیهی متنن، یا سوالهایی که جوابشون از کنار هم گذاشتن چند جای متن درمیاد. یه پژوهش ۲۰۲۴ با همین آزمونهای سختتر نشون داد خیلی از مدلها «طول موثرشون»، یعنی طولی که هنوز خوب کار میکنن، خیلی کمتر از پنجرهای بود که ادعا میکردن.
پس اگه کارتون به متن بلند وابستهست، به عدد پنجره اعتماد نکنید؛ با سندهای خودتون، و سوالهایی که جوابشون وسط سنده، امتحان کنید.
متن بلند یا بازیابی
یه راه دیگه برای کار با سندهای خیلی زیاد، اینکه اصلا همهشون رو به مدل ندیم؛ اول با جستجو تیکههای مرتبط رو پیدا کنیم و فقط اونها رو بدیم. این همون RAGه. پنجرهی بلند و بازیابی رقیب نیستن؛ هر کدوم برای یه جور کار بهتره.
پنجرهی بلند وقتی خوبه که کل یه سند یا چند سند مرتبط لازمه، و جواب از کنار هم گذاشتن جاهای مختلفش درمیاد؛ مثل خلاصهی یه قرارداد کامل یا فهمیدن کل یه برنامه. بازیابی وقتی خوبه که سندها خیلی زیادن، مثلا هزاران صفحه، یا مدام عوض میشن، یا هزینه و سرعت مهمه؛ چون هر تکهی متن پول و وقت داره. خیلی از سیستمهای واقعی هر دو رو با هم دارن؛ بازیابی چند سند، و بعد دادن کامل اون چند سند به یه پنجرهی بلند.
موقع استفاده
چند نکتهی عملی از همهی اینها. اول، هزینه؛ بیشتر سرویسها به ازای هر تکه پول میگیرن، و یه سند صد هزار تکهای، برای هر سوال، دوباره خونده میشه. اگه چند سوال دربارهی یه سند دارید، بعضی سرویسها کش کردن اول متن رو دارن که خیلی ارزونتره؛ ارزش داره بپرسید.
دوم، ترتیب؛ سندها اول، سوال آخر، و چیز مهم نه وسط. سوم، تمیزی؛ چیزهایی که لازم نیست، مثل منوهای تکراری یه صفحهی وب یا پیوستهای بیربط، رو بیرون بذارید؛ هم ارزونتره و هم مدل کمتر حواسش پرت میشه. و چهارم، وقت؛ با متن خیلی بلند، صبر کنید تا اولین کلمه بیاد. اون مکث، خوندن کل متنه، نه خرابی.
از کجا اومد
از همون ۲۰۱۷، بلند کردن پنجره یکی از اصلیترین مسیرهای پژوهش بود. سالهای ۲۰۱۹ و ۲۰۲۰ موجی از توجههای پراکنده و پنجرهای اومد، که هزینه رو خطی میکردن. ۲۰۲۱ جریمهی فاصله و ۲۰۲۲ توجه سریع اومدن. سال ۲۰۲۳ سال ترفندهای RoPE بود؛ فشردن جاها، تغییر بسامدها، و همزمان سینک توجه، مدیریت صفحهای کش، توجه حلقهای و آزمون گم شدن وسط.
از ۲۰۲۴ پنجرههای صدها هزار تا میلیون تکهای توی مدلهای واقعی رایج شد، و تمرکز رفت سمت اینکه مدل واقعا از همهی این پنجره استفاده کنه، نه فقط بتونه بگیرش. همزمان، معماریهای دیگهای که اصلا هزینهی مربعی ندارن دوباره مطرح شدن؛ همون درس جایگزینها.
اشتباههای رایج
خیلیها فکر میکنن پنجرهی بلندتر یعنی مدل همهی متن رو یکسان میفهمه. نه؛ وسط متن گاهی کمتر دیده میشه و طول موثر معمولا از طول ادعاشده کمتره. یکی دیگه اینه که فکر کنن پنجرهی لغزان یعنی مدل همهی متن رو یادشه؛ فقط پنجرهی آخر و چند تکهی اول رو واقعا میبینه.
سومی اینه که فکر کنن میشه یه مدل رو روی متن کوتاه آموزش داد و بی هیچ ترفندی متن بلند بهش داد؛ معمولا کیفیت یهو فرو میریزه. چهارمی اینه که همهچیز رو بریزن توی پنجره چون جا هست؛ هم گرونتره، هم کندتر، و هم مدل بیشتر گیج میشه. و آخری اینه که فکر کنن توجه سریع هزینهی مربعی رو حل کرده؛ فقط حافظه و رفتوآمد رو بهتر کرده.
تمرین
این چهار تا رو اول خودتون جواب بدید. یک، متن از ۲۰ هزار به ۶۰ هزار تکه رسید؛ حساب توجه چند برابر میشه؟ دو، مدلی با ۴۰۹۶ جا آموزش دیده و میخواید ۱۶۳۸۴ تکه بهش بدید با فشردن جا؛ ضریب فشردن چنده؟ سه، یه سند ۸۰ صفحهای دارید و جواب سوالتون وسطشه؛ سوال رو کجا میذارید و دیگه چی کار میکنید؟ چهار، چرا پنجرهی لغزان بی چند تکهی اول خراب میشد؟
جوابها. اولی، نه برابر، چون سه برابر به توان دو. دومی، چهار. سومی، بعد از سند، و اسم بخش یا موضوع اون قسمت رو توی سوال میارید. چهارمی، چون مدل بخش بزرگی از توجهش رو به همون تکههای اول میریزه، و بی اونها، وزنها به هم میریزن.
جمعبندی. آنچه از این درس با خودتان میبرید.
- پنجرهی متن: بیشترین تکههایی که مدل یهجا میبینه.
- سه مانع: حساب مربعی، کش بزرگ، جاهای ندیده.
- فشردن جا یا جریمهی فاصله برای جاهای ندیده.
- پنجرهی لغزان و چند تکهی اول برای حساب و حافظهی کمتر.
- وسط متن بلند گاهی کمتر دیده میشه؛ مهمها رو اول یا آخر بذارید.
- طول موثر رو با آزمون بسنجید، نه با عدد ادعاشده.
خودتون رو بسنجید
۱۵ پرسش، هر بار تازه از میان ۳۰ پرسش این درس. آخرش فقط کارنامه رو میبینید: چند تا درست، چند تا نادرست.