در طراحی سیستمهای 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) این شکاف را کمتر کردند اما نتوانستند آن را کاملاً ببندند.
در این درس پنج استراتژی را در کنار هم پیاده میکنیم، آنها را روی یک مجموعهدادهی نمونه با بخشهای پاسخ برچسبخورده اجرا میکنیم و ارقام بازخوانی را با هم میسنجیم.
مفاهیم پایه
پنجرهی ثابت (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. سپس میانگین را برای کل پرسمانها به دست آورید. اجرای همین ارزیابی برای هر استراتژی نشان میدهد که کدام سیاست مرزبندی در برابر مجموعهدادهی شما دوام میآورد.
پیادهسازی از صفر
فایل 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 در این درس برمیگرداند دریافت میکند. بهترین استراتژی سازگار با مجموعهدادهی خود را بردارید و به مراحل بعد تحویل دهید.
تمرینها
- استراتژی ششم را اضافه کنید: پنجرهی مبتنی بر توکن (token) با استفاده از
tiktokenبهجای شمارش نویسهها. خروجی آن را با پنجرهی ثابت روی همان مجموعهداده مقایسه کنید. - به میزان 30 درصد بلوک کد به نمونهی متنی اضافه کنید. جدول ارزیابی را دوباره بسازید. بررسی کنید چرا بازخوانی در تمام استراتژیها بهجز ساختارمحور مارکداون افت میکند.
- امبدینگ ساختگی را با ارائهدهندهی واقعی پروژهی خود جایگزین کنید. تغییر بازخوانی خوشهبندی معنایی را بسنجید و گزارش کنید که فاصلهی بین استراتژیها بیشتر شد یا کمتر.
- برای هر قطعه یک فیلد
summary(یک جمله در توصیف مرکز خوشه) در نظر بگیرید. ارزیابی را با افزودن این خلاصه به انتهای بدنهی قطعه مجدداً اجرا کنید و میزان بهبود بازخوانی را بسنجید.
اصطلاحات کلیدی
| اصطلاح | در گفتوگوها | معنای دقیق فنی |
|---|---|---|
| Recall@K | «آیا قطعهی درست رو پیدا کردیم؟» | نسبت پرسمانهایی که دستکم یکی از K قطعهی برتر آنها با بخش پاسخ مرجع همپوشانی دارد |
| همپوشانی قطعهها | «پنجرهی لغزان» (Sliding window) | گنجاندن مجدد N نویسهی پایانیِ قطعهی قبلی در آغاز قطعهی بعدی |
| قطعهبند ساختاری | «قطعههای تیترمند» | برش در مرزهای H1/H2/H3؛ متن تیتر هم جزئی از خود قطعه لحاظ میشود |
| قطعهبند معنایی | «قطعههای تفکیکشده بر اساس موضوع» | امبدینگ جملات، خوشهبندی بر اساس شباهت به مرکز خوشه و برش در زمان انحراف معنایی |
| انحراف مرکز خوشه | «عوض شدن بحث» | افت شباهت کسینوسی (cosine similarity) میان میانگین متحرک و جملهی بعدی از یک آستانهی مشخص |
برای مطالعهی بیشتر
- LongRAG: Enhancing Retrieval-Augmented Generation with Long-context LLMs (arXiv 2406.15319)
- Anthropic, Contextual Retrieval
- LlamaIndex, Chunking strategies for production RAG
- فاز 11 درس 06 - مبانی RAG
- فاز 11 درس 07 - مباحث پیشرفتهی RAG
- فاز 19 درس 65 - بازیابی ترکیبی برای رتبهبندی قطعههای تولیدشده در این درس
- فاز 19 درس 68 - بستر آزمایشی سنجش استراتژی انتخابی در محیط عملیاتی
