آموزشمدل‌های زبانی بزرگ (LLM)

درس ۶۳ از ۸۵، هوش مصنوعی، حدود ۱۲ دقیقه خواندن

تکه کردن سند برای RAG

جواب کوتاه

توی RAG، سندهای بزرگ پیش از هر چیز به تکه‌های کوچیک، معمولا حداکثر چند صد توکن، شکسته می‌شن؛ چون فقط تکه‌های مرتبط باید توی پنجره‌ی زمینه برن. اندازه، مرز و هم‌پوشانی تکه‌ها روی پیدا کردن اثر دارن. مشکل اصلی اینه که یه تکه ممکنه زمینه‌ش رو گم کنه؛ مثلا «اون روز تعطیلیم» بی اینکه بگه کدوم روز. یه چاره اینه که اول هر تکه یه توضیح کوتاه از جاش توی سند اضافه بشه؛ توی یه پژوهش ۲۰۲۴، این کار همراه رتبه‌بندی دوباره، بازیابی ناموفق رو ۶۷ درصد کم کرد.

چرا تکه

یه کتاب رو نمی‌شه یه‌جا توی جیب گذاشت؛ صفحه‌صفحه‌ش می‌کنی.

توی درس RAG دیدیم مدل پیش از جواب، سندهای مرتبط رو پیدا می‌کنه و توی پرامپت می‌ذاره. ولی اگه سند شما یه کتابچه‌ی صدصفحه‌ای باشه، نمی‌شه هر بار کلش رو فرستاد؛ همه‌ش باید توی پنجره‌ی زمینه جا بشه، و هزینه‌ی هر بار هم زیاد می‌شه. برای همین سندها رو به تکه‌های کوچیک می‌شکنن و هر بار فقط تکه‌های مرتبط رو می‌فرستن.

یه نکته‌ی جالب از پژوهش ۲۰۲۴ سازنده‌ی Claude: اگه کل دانش شما زیر ۲۰۰ هزار توکنه، یعنی حدود ۵۰۰ صفحه، گاهی ساده‌ترین راه اینه که کلش رو توی پرامپت بذارید و اصلا RAG نسازید. تکه کردن برای وقتیه که دانش از این بزرگ‌تره.

اندازه و مرز

همون پژوهش می‌گه تکه‌ها معمولا حداکثر چند صد توکنن، و اندازه، مرز و هم‌پوشانی اونا روی کیفیت پیدا کردن اثر داره. یه متن شش‌جمله‌ای رو دو جور بریدیم.

تکه‌ی کوچیک دقیق‌تره: اگه سوال درباره‌ی ساعت سنگکه، فقط همون جمله میاد و چیز اضافه‌ای جا نمی‌گیره. ولی ممکنه یه جمله به جمله‌ی قبلش وابسته باشه و تنها معنی نده. تکه‌ی بزرگ‌تر زمینه‌ی بیشتری داره، ولی چیزهای بی‌ربط هم با خودش میاره. «مرز» یعنی کجا ببریم: وسط یه جمله، یا جای طبیعی متن مثل آخر یه بند. «هم‌پوشانی» هم یعنی هر تکه یه کم از آخر تکه‌ی قبلی رو هم داشته باشه، تا چیزی که روی مرز افتاده گم نشه.

چطور ببریم

ساده‌ترین راه اینه که متن رو هر چند صد حرف یا توکن یه بار ببرید، بی توجه به اینکه کجاست. سریعه، ولی خیلی وقت‌ها وسط یه جمله یا حتی یه کلمه می‌بره. برای همین ابزارهای رایج یه راه بهتر دارن که بهش می‌گن بریدن «بازگشتی»، به انگلیسی Recursive.

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

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

هم‌پوشانی

هر چقدر هم خوب ببرید، یه جمله‌ای همیشه روی مرز می‌افته؛ مثلا جمله‌ای که نصف معنیش توی تکه‌ی قبلیه.

هم‌پوشانی یعنی آخر هر تکه، اول تکه‌ی بعدی هم تکرار بشه. اگه جمله‌ی ۲ توی هر دو تکه باشه، هر کدوم پیدا بشه، اون جمله کامل همراهشه. معمولا یه بخش کوچیک از اندازه‌ی تکه رو برای هم‌پوشانی می‌ذارن، چون هم‌پوشانی زیاد یعنی متن تکراری بیشتر، جای بیشتر و هزینه‌ی بیشتر، بی اینکه چیز تازه‌ای پیدا بشه. این عدد هم مثل اندازه‌ی تکه، با امتحان روی سندهای خودتون درست درمیاد.

بریدن از روی معنی

یه راه دیگه هم هست که به جای علامت‌های متن، به خود معنی نگاه می‌کنه: بریدن معنایی، به انگلیسی Semantic Chunking.

اول برای هر جمله یه بردار معنایی می‌سازه، بعد شباهت هر جمله با جمله‌ی بعدیش رو حساب می‌کنه. جایی که این شباهت یهو پایین بیاد، یعنی موضوع عوض شده، و همون‌جا مرز می‌ذاره. توی متن نونوایی ما، با عددهای ساختگی، دو جای افت داریم: جایی که حرف از سنگک به بربری می‌ره، و جایی که از بربری به روز تعطیل. پس سه تکه درمیاد، و جالبه که «روز تعطیل ما جمعه‌ست» و «اون روز هیچ نونی نداریم» توی یه تکه می‌مونن.

هزینه‌ش اینه که برای هر جمله یه بردار لازمه، پس کندتر و گرون‌تره، و اندازه‌ی تکه‌ها یکی نیست. و فقط به اندازه‌ی همون بردارها خوبه: اگه بردارها موضوع رو خوب نشون ندن، مرزها هم بد درمیان. توی یه بند بلند که چند موضوع داره ولی علامت‌گذاریش مرتبه، بریدن بازگشتی متوجه عوض شدن موضوع نمی‌شه؛ این‌جا معنایی کمک می‌کنه.

تکه‌ی بی‌زمینه

حالا مهم‌ترین مشکل. تکه‌ی آخر جمله‌ای ما رو ببینید.

«اون روز هیچ نونی نداریم» به‌تنهایی نمی‌گه کدوم روز. اگه کسی بپرسه «جمعه باز هستید؟»، این تکه شاید اصلا پیدا نشه، چون کلمه‌ی «جمعه» توش نیست. پژوهش ۲۰۲۴ یه مثال شبیه داره: تکه‌ای که می‌گه «درآمد شرکت ۳ درصد نسبت به فصل قبل بیشتر شد»، ولی نمی‌گه کدوم شرکت و کدوم فصل. می‌گه RAG معمولی همین‌طوری «زمینه رو از بین می‌بره».

بازیابی با زمینه

چاره‌ای که همون پژوهش پیشنهاد کرد ساده‌ست: اول هر تکه، یه توضیح کوتاه اضافه کن که این تکه از کجای سنده؛ معمولا ۵۰ تا ۱۰۰ توکن. مثل اینکه بالای هر صفحه‌ی بریده‌شده بنویسی از کدوم فصل کتابه. و چون نوشتن این توضیح برای هزاران تکه کار آدم نیست، یه مدل زبانی با دیدن کل سند و همون تکه، می‌نویسدش.

نتیجه، توی میانگین چند حوزه: با روش معمولی، ۵٫۷ درصد وقت‌ها تکه‌ی درست بین ۲۰ تکه‌ی اول نبود. وقتی بردار هر تکه رو با توضیح زمینه ساختن، شد ۳٫۷؛ یعنی ۳۵ درصد کمتر. وقتی کنار جست‌وجوی معنایی، یه جست‌وجوی تطبیق دقیق کلمه هم گذاشتن، اون هم با زمینه، شد ۲٫۹؛ یعنی ۴۹ درصد کمتر.

کوچیک پیدا کن، بزرگ بفرست

یادتونه که تکه‌ی کوچیک دقیق‌تر پیدا می‌شه و تکه‌ی بزرگ زمینه‌ی بیشتری داره؟ یه راه هست که هر دو رو با هم داشته باشید.

سند رو دو جور می‌برن: بخش‌های بزرگ، و هر بخش به تکه‌های کوچیک‌تر. جست‌وجو روی تکه‌های کوچیک انجام می‌شه، چون بردار یه تکه‌ی کوچیک دقیق‌تر نشون می‌ده درباره‌ی چیه. ولی وقتی یه تکه پیدا شد، به جای خودش، کل بخش بزرگی که توشه به مدل می‌ره. ابزارهای رایج به این می‌گن بازیابی «سند والد»، به انگلیسی Parent Document Retrieval.

یه پژوهش ۲۰۲۴ هم همین مشکل زمینه رو از یه طرف دیگه حل کرد و اسمش رو گذاشت بریدن دیر، به انگلیسی Late Chunking. معمولا اول می‌برن، بعد برای هر تکه جدا بردار می‌سازن، و همین‌جاست که زمینه گم می‌شه. توی این روش، یه مدل بردارساز که متن بلند رو جا می‌ده اول کل سند رو یه‌جا می‌خونه و تازه بعد، بردارها رو تکه به تکه جدا می‌کنه؛ پس بردار «اون روز هیچ نونی نداریم» از جمله‌های قبلش هم خبر داره. پژوهشگرها می‌گن این کار آموزش اضافه لازم نداره و توی چند جور بازیابی بهتر جواب داد.

رتبه‌بندی دوباره

با سندهای خیلی بزرگ، جست‌وجوی اول گاهی صدها تکه با ربط‌های جورواجور برمی‌گردونه. چاره‌ی دوم یه قدم وسط اضافه می‌کنه.

اول یه دسته‌ی بزرگ پیدا می‌شه؛ توی اون پژوهش ۱۵۰ تکه. بعد یه مدل «رتبه‌بند» هر کدوم رو کنار سوال می‌خونه و بهش امتیاز می‌ده، و فقط بهترین‌ها، اون‌جا ۲۰ تا، به مدل اصلی می‌رن. پژوهش می‌گه این هم جواب رو بهتر می‌کنه، هم هزینه و تاخیر رو کم می‌کنه، چون مدل چیز کمتری می‌خونه. با همه‌ی این‌ها روی هم، بازیابی ناموفق از ۵٫۷ رسید به ۱٫۹ درصد؛ ۶۷ درصد کمتر.

چند تکه

چند تا تکه به مدل بدیم؟ پژوهش ۲۰۲۴ می‌گه تکه‌ی بیشتر شانس اینکه اطلاعات درست هم بینشون باشه رو بالا می‌بره، ولی اطلاعات زیاد هم می‌تونه حواس مدل رو پرت کنه؛ پس یه حدی داره. اونا ۵، ۱۰ و ۲۰ رو امتحان کردن و ۲۰ بهتر بود. این عدد برای سندها و سوال‌های شما ممکنه فرق کنه؛ برای همین، مثل درس مهندسی پرامپت، باید با نمونه‌های واقعی خودتون امتحانش کنید.

چند نکته

  • دانش کوچیکه؟ شاید RAG لازم نباشه. کلش رو بفرستید.
  • مرز و اندازه رو آزمایش کنید. روی پیدا کردن اثر دارن.
  • یه خط زمینه اول هر تکه. که از کجای سنده.
  • زیاد پیدا کن، کم بفرست. رتبه‌بندی دوباره.
  • با سوال‌های واقعی بسنجید. عدد درست برای هر سند فرق داره.

درس بعد قلب پیدا کردن رو باز می‌کنه: جستجوی برداری.

جمع‌بندی. آنچه از این درس با خودتان می‌برید.

  • سند بزرگ، تکه‌تکه؛ چند صد توکن.
  • اندازه و مرز تکه مهمه.
  • تکه‌ی تنها ممکنه زمینه‌ش رو گم کنه.
  • یه خط زمینه اول هر تکه.
  • رتبه‌بندی دوباره، بهترین‌ها رو جدا می‌کنه.

خودتون رو بسنجید

۱۵ پرسش، هر بار تازه از میان ۳۰ پرسش این درس. آخرش فقط کارنامه رو می‌بینید: چند تا درست، چند تا نادرست.

خودتون رو بسنجید

۱۵ پرسش

  • هر بار پرسش‌ها و ترتیب گزینه‌ها عوض می‌شه.
  • تا آخر نمی‌گیم کدوم جواب درست بوده؛ می‌تونید برگردید و جوابتون رو عوض کنید.
  • آخرش کارنامه می‌گیرید: چند تا درست، چند تا نادرست.
  • اگه وسطش بستید، دوباره که باز کنید از همون‌جا ادامه می‌دید.

فصل‌های این درس

درس بعد