فاز 19 · درس 64

مقایسه‌ی استراتژی‌های قطعه‌بندی متن در RAG

نوع
ساختنی
زمان
حدود 90 دقیقه
زبان‌ها
Python
یک طناب بافته‌شده و قطور که با ابزارهای مختلف در فاصله‌های منظم و نامنظم برش خورده و بخش‌های آن دسته‌بندی شده‌اند
فهرست مطالب
  1. اهداف یادگیری
  2. صورت مسئله
  3. مفاهیم پایه
  4. پنجره‌ی ثابت (Fixed-window)
  5. جمله‌محور (Sentence)
  6. تقسیم بازگشتی (Recursive split)
  7. خوشه‌بندی معنایی (Semantic clustering)
  8. ساختارمحور بر اساس تیترهای مارک‌داون (Structural markdown headers)
  9. نحوه‌ی سنجش انتخاب مرزها با Recall@K
  10. پیاده‌سازی از صفر
  11. حالت‌های شکستی که جدول پنهان نمی‌کند
  12. انتخاب روش پیش‌فرض بدون اجرای بنچمارک
  13. کاربرد در محیط عملیاتی
  14. تحویل نهایی
  15. تمرین‌ها
  16. اصطلاحات کلیدی
  17. برای مطالعه‌ی بیشتر

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

این درس به شما کمک می‌کند پنج استراتژی کلیدی قطعه‌بندی شامل پنجره‌ی ثابت، جمله‌محور، تقسیم بازگشتی، خوشه‌بندی معنایی و ساختارمحور را از صفر در پایتون بسازید و آن‌ها را بر اساس معیار Recall@K روی داده‌های واقعی ارزیابی کنید تا متناسب با ساختار مستندات خود بهترین راهکار را برگزینید.

قطعه‌بندی متن (Chunking) تعیین می‌کند که بازیاب (retriever) شما اصلاً چه مواردی را می‌تواند پیدا کند. اگر مرزها را اشتباه تعیین کنید، هیچ مدل امبدینگ، هیچ بازرتبه‌بندی‌کننده (reranker) و هیچ مدل زبانی بزرگی نمی‌تواند این آسیب را در مراحل بعدی جبران کند.

اهداف یادگیری

  • پنج استراتژی قطعه‌بندی متن را از صفر پیاده‌سازی کنید: پنجره‌ی ثابت (fixed-window)، جمله‌محور (sentence)، تقسیم بازگشتی (recursive-split)، خوشه‌بندی معنایی (semantic clustering) و ساختارمحور بر اساس تیترهای مارک‌داون (structural markdown headers).
  • معیار Recall@K را روی یک مجموعه‌داده‌ی نمونه (fixture corpus) با بخش‌های پاسخِ برچسب‌خورده با داده‌ی مرجع (gold-labeled answer spans) بسنجید و دلیل برتری یک استراتژی در متون ساده و استراتژی دیگر در اسناد فنی را بررسی کنید.
  • توزیع طول قطعه‌ها را تحلیل کنید و حالت‌های شکستی (failure modes) را که هر استراتژی تحمیل می‌کند بشناسید: جمله‌های یتیم، برش در میانه‌ی نمادها، قطعه‌های فقط‌حاوی‌تیتر و انحراف معنایی (semantic drift).
  • با بررسی سه ویژگی بدون نیاز به اجرای بنچمارک، گزینه‌ی پیش‌فرض برای یک مجموعه‌داده‌ی جدید را انتخاب کنید: نوع سند، میانگین طول پاراگراف و وجود ساختار صریح در فرمت متن.

صورت مسئله

هر پایپ‌لاین RAG با خرد کردن اسناد مبدأ آغاز می‌شود؛ قطعه‌ها باید به‌اندازه‌ای کوچک باشند که مدل امبدینگ (embedding) گنجایش آن‌ها را داشته باشد و به‌اندازه‌ای بزرگ که هر قطعه یک ایده‌ی مستقل و خودبسنده را منتقل کند. محل برش یک هایپرپارامتر ساده نیست؛ این مرزها حد بالای (upper bound) چیزی هستند که بازیاب در کل فرایند می‌تواند برگرداند.

پرسمانی که می‌پرسد «آستانه‌ی توقف بودجه چیست؟» فقط در صورتی به پاسخ می‌رسد که قطعه‌ی حاوی مقدار آستانه در دسترس باشد. اگر قطعه‌بند پنجره‌ی ثابت، مقدار آستانه را از بافت اطرافش جدا کرده باشد، امبدینگ به خوشه‌ی دیگری منتقل می‌شود، امتیاز BM25 افت می‌کند، بازرتبه‌بندی‌کننده‌ها فقط نوفه (نویز) می‌بینند و پاسخی که مدل زبانی می‌سازد غلط خواهد بود. مقاله‌ی سال 2024 با عنوان «LongRAG: Enhancing Retrieval-Augmented Generation with Long-context LLMs» نشان داد که انتخاب روش قطعه‌بندی به‌تنهایی می‌تواند باعث نوسان مطلق 35 درصدی در بازخوانی (recall) بازیابی شود. پژوهش‌های بعدی در سال 2025 روی تیترهای بافت‌محور قطعه‌ها (contextual chunk headers) این شکاف را کمتر کردند اما نتوانستند آن را کاملاً ببندند.

در این درس پنج استراتژی را در کنار هم پیاده می‌کنیم، آن‌ها را روی یک مجموعه‌داده‌ی نمونه با بخش‌های پاسخ برچسب‌خورده اجرا می‌کنیم و ارقام بازخوانی را با هم می‌سنجیم.

مفاهیم پایه

سند منبعپنجره ثابتجملهتقسیم بازگشتیخوشه‌بندی معناییساختار Markdownتکه‌هاتکه‌هاتکه‌هاتکه‌هاتکه‌هانمایه امبدینگبازخوانی در k در برابر اسپن‌های مرجع

پنجره‌ی ثابت (Fixed-window)

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

جمله‌محور (Sentence)

متن را با یک عبارت منظم (regex) یا یک ماشین وضعیت (state machine) ساده بر اساس مرزهای جمله خرد کنید. یک یا چند جمله را تا رسیدن به سقف نویسه‌ی مشخص درون یک قطعه جا دهید. این روش دیگر کلمات را از وسط نصف نمی‌کند؛ اما همچنان پاراگراف‌ها و بخش‌ها را از وسط می‌بُرد. این استراتژی انتخاب پیش‌فرض در بسیاری از پایپ‌لاین‌های اولیه‌ی RAG بود و گزینه‌ای منطقی برای متن‌های ساده‌ی بدون ساختار است.

تقسیم بازگشتی (Recursive split)

استراتژی سلسله‌مراتبی که کتابخانه‌های سال 2023 آن را فراگیر کردند. ابتدا تلاش می‌کند روی قوی‌ترین جداکننده (خط خالی دوگانه یا پاراگراف) خرد کند، اگر نشد به سراغ بعدی (تک‌خط جدید)، سپس جمله‌ها و در نهایت نویسه‌ها می‌رود. فرایند بازگشتی وقتی متوقف می‌شود که طول قطعه در سقف مجاز بگنجد. این روش برای اسنادی که ساختار یکدستی ندارند بسیار کارآمد است، چون مرزها را متناسب با هر بخش تنظیم می‌کند.

خوشه‌بندی معنایی (Semantic clustering)

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

ساختارمحور بر اساس تیترهای مارک‌داون (Structural markdown headers)

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

نحوه‌ی سنجش انتخاب مرزها با Recall@K

در پرسمان‌های برچسب‌خورده با داده‌ی مرجع، آفست‌های دقیق نویسه‌ایِ بخش پاسخ درون سند مبدأ مشخص شده است. پس از قطعه‌بندی، این پرسش را مطرح می‌کنید: آیا هیچ‌یک از K قطعه‌ی برترِ بازگردانده‌شده توسط بازیاب، با بخش پاسخ مرجع هم‌پوشانی دارد؟ اگر بله، امتیاز Recall@K برای آن پرسمان 1 است؛ اگر نه، 0. سپس میانگین را برای کل پرسمان‌ها به دست آورید. اجرای همین ارزیابی برای هر استراتژی نشان می‌دهد که کدام سیاست مرزبندی در برابر مجموعه‌داده‌ی شما دوام می‌آورد.

مرزهای قطعه‌بندییک سند · سه طرح برش
CHUNK BOUNDARIESEvery strategy cuts the same document at different offsets. The fixed 512-token window slices straight through the gold answer span, so the two halves embed into different clusters and recall drops before the retriever even runs. Sentence and structural markdown splitters respect the boundaries the text already carries.سندبخش پاسخ طلاییثابت 512جملهمارک‌داونپنجره ثابت اسپن را می‌برد؛ مارک‌داون آن را یکپارچه نگه می‌دارد
هر استراتژی همان سند را در آفست‌های متفاوتی برش می‌دهد. پنجره‌ی ثابت 512 توکنی درست از میان بخش پاسخ طلایی عبور می‌کند؛ در نتیجه دو نیمه در خوشه‌های متفاوتی امبد می‌شوند و بازخوانی حتی پیش از اجرای بازیاب افت می‌کند. تقسیم‌کننده‌های مبتنی بر جمله و ساختاری مارک‌داون، به مرزهای طبیعی متن احترام می‌گذارند.

پیاده‌سازی از صفر

فایل code/main.py این بخش‌ها را پیاده‌سازی می‌کند:

  • fixed_window(text, size, overlap) - خط مبنا.
  • sentence_chunks(text, target) - متراکم‌ساز ساده‌ی جمله‌ها.
  • recursive_split(text, separators, target) - تقسیم بازگشتی و سلسله‌مراتبی.
  • semantic_chunks(text, similarity_threshold) - خوشه‌بندی مبتنی بر مرکز خوشه بر پایه‌ی یک امبدینگ ساختگی (mock) و قطعی.
  • structural_markdown(text) - قطعه‌بند آگاه به تیترها.
  • mock_embed(text, dim) - امبدینگ مبتنی بر هش تا این چرخه به‌شکل آفلاین اجرا شود.
  • DenseIndex - با همان ساختاری که در درس بازیابی ترکیبی فاز 19 مسیر B پیاده شد.
  • eval_recall(strategy, corpus, queries, k) - چرخه‌ی مقایسه و ارزیابی.
  • تابع main() که تمام استراتژی‌ها را روی مجموعه‌داده‌ی نمونه اجرا کرده و جدول Recall@K را در خروجی چاپ می‌کند.

برای اجرا:

python3 code/main.py

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

حالت‌های شکستی که جدول پنهان نمی‌کند

جمله‌های یتیم. جا دادن جملات در قطعه‌ها بدون ساختار گاهی قطعه‌هایی می‌سازد که فاقد جمله‌ی موضوعی (topic sentence) هستند؛ در نتیجه امبدینگ به خوشه‌ی اشتباهی اشاره می‌کند.

برش در میانه‌ی نمادها. پنجره‌ی ثابت درون کدهای برنامه‌نویسی یا YAML یک شناسه را از وسط نصف می‌کند. این دو نیمه بعد از امبدینگ به نوفه‌ی خالص تبدیل می‌شوند.

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

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

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

انتخاب روش پیش‌فرض بدون اجرای بنچمارک

سه ویژگی تعیین می‌کنند که برای یک مجموعه‌داده‌ی تازه از چه قطعه‌بندی پیش‌فرضی استفاده کنید.

ویژگی مقدار پیش‌فرض
نوع سند متن ساده‌ی بدون ساختار تقسیم بازگشتی، هدف 800
نوع سند اسناد Markdown / RFC / API ساختارمحور مارک‌داون
نوع سند کد منبع آگاه به ساختار AST (خارج از دامنه؛ به درس 02 فاز 19 مراجعه کنید)
طول پاراگراف بلند، تک‌موضوعی جمله‌محور، هدف 500
طول پاراگراف کوتاه، موضوعات ترکیبی معنایی، آستانه‌ی 0.6

اگر تردید دارید، تقسیم بازگشتی را انتخاب کنید؛ این روش قوی‌ترین خط مبنا در میان استراتژی‌های تکی است.

کاربرد در محیط عملیاتی

الگوهای محیط عملیاتی (پروداکشن):

  • قبل از انتقال پایپ‌لاین جدید به پروداکشن، حتماً ارزیابی را اجرا کنید؛ هرگز به استراتژی پیش‌فرض کتابخانه‌ی خود اعتماد نکنید.
  • هر بار که مدل امبدینگ یا ترکیب اسناد مجموعه‌داده را تغییر دادید، ارزیابی را تکرار کنید؛ استراتژی برنده وابسته به مجموعه‌داده است.
  • نام استراتژی را در متادیتای هر قطعه ذخیره کنید تا در آینده بتوانید افت‌های کیفی را به‌درستی ریشه‌یابی کنید.

تحویل نهایی

سیستم RAG سرتاسری (end-to-end) در درس 69 مسیر F، از قطعه‌بند انتخاب‌شده در این درس به‌عنوان گام نخست خود استفاده می‌کند. بستر آزمایشی (eval harness) درس 68 نیز معیار Recall@K را دقیقاً با همان فرمتی که eval_recall در این درس برمی‌گرداند دریافت می‌کند. بهترین استراتژی سازگار با مجموعه‌داده‌ی خود را بردارید و به مراحل بعد تحویل دهید.

تمرین‌ها

  1. استراتژی ششم را اضافه کنید: پنجره‌ی مبتنی بر توکن (token) با استفاده از tiktoken به‌جای شمارش نویسه‌ها. خروجی آن را با پنجره‌ی ثابت روی همان مجموعه‌داده مقایسه کنید.
  2. به میزان 30 درصد بلوک کد به نمونه‌ی متنی اضافه کنید. جدول ارزیابی را دوباره بسازید. بررسی کنید چرا بازخوانی در تمام استراتژی‌ها به‌جز ساختارمحور مارک‌داون افت می‌کند.
  3. امبدینگ ساختگی را با ارائه‌دهنده‌ی واقعی پروژه‌ی خود جایگزین کنید. تغییر بازخوانی خوشه‌بندی معنایی را بسنجید و گزارش کنید که فاصله‌ی بین استراتژی‌ها بیشتر شد یا کمتر.
  4. برای هر قطعه یک فیلد summary (یک جمله در توصیف مرکز خوشه) در نظر بگیرید. ارزیابی را با افزودن این خلاصه به انتهای بدنه‌ی قطعه مجدداً اجرا کنید و میزان بهبود بازخوانی را بسنجید.

اصطلاحات کلیدی

اصطلاح در گفت‌وگوها معنای دقیق فنی
Recall@K «آیا قطعه‌ی درست رو پیدا کردیم؟» نسبت پرسمان‌هایی که دست‌کم یکی از K قطعه‌ی برتر آن‌ها با بخش پاسخ مرجع هم‌پوشانی دارد
هم‌پوشانی قطعه‌ها «پنجره‌ی لغزان» (Sliding window) گنجاندن مجدد N نویسه‌ی پایانیِ قطعه‌ی قبلی در آغاز قطعه‌ی بعدی
قطعه‌بند ساختاری «قطعه‌های تیترمند» برش در مرزهای H1/H2/H3؛ متن تیتر هم جزئی از خود قطعه لحاظ می‌شود
قطعه‌بند معنایی «قطعه‌های تفکیک‌شده بر اساس موضوع» امبدینگ جملات، خوشه‌بندی بر اساس شباهت به مرکز خوشه و برش در زمان انحراف معنایی
انحراف مرکز خوشه «عوض شدن بحث» افت شباهت کسینوسی (cosine similarity) میان میانگین متحرک و جمله‌ی بعدی از یک آستانه‌ی مشخص

برای مطالعه‌ی بیشتر

خودآزمایی

به سؤال‌ها جواب بدهید تا ببینید چقدر از درس در ذهنتان مانده است.

  1. پیش از درسچرا انتخاب روش قطعه‌بندی متن یک حد بالا برای کیفیت بازیابی است و نه صرفاً یک هایپرپارامتر ساده؟
  2. پیش از درسهنگامی که هیچ دانش پیشینی از پیکره متنی ندارید، کدام استراتژی قوی‌ترین گزینه پیش‌فرض محسوب می‌شود؟
  3. حین درسمعیار recall@k در این درس چه چیزی را می‌سنجد؟
  4. حین درسچرا قطعه‌بندی با پنجره ثابت روی پیکره‌های کد یا YAML عملکرد بسیار ضعیفی دارد؟
  5. حین درسمعیار توقف بر اساس رانش مرکز خوشه (centroid drift) در قطعه‌بندی معنایی چیست؟
  6. پس از درسقطعه‌بندی معنایی چه حالت خطایی از جنس امبدینگ‌های کهنه (stale) ایجاد می‌کند که در چهار روش دیگر وجود ندارد؟

سؤالات متداول

چرا قطعه‌بندی با پنجره‌ی ثابت (Fixed-window) برای محیط عملیاتی پیشنهاد نمی‌شود؟

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

تفاوت قطعه‌بندی بازگشتی (Recursive split) با قطعه‌بندی معنایی چیست؟

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

معیار Recall@K در ارزیابی قطعه‌بندی چگونه محاسبه می‌شود؟

در این آزمون بررسی می‌شود که آیا دست‌کم یکی از K قطعه‌ی برتر بازگردانده‌شده توسط بازیاب، با بازه‌ی متنیِ پاسخ مرجع (Gold Span) هم‌پوشانی دارد یا خیر.

ما رو توی گوگل بیشتر ببین

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