Text Chunking Strategies
توسعه عاملهای هوشمند (Agentic Ai) با Langchain و Langgraph
- Explain chunk size, overlap, separators, and semantic boundaries.
- Apply recursive text splitting to files of varying structure.
- Evaluate chunk boundaries for retrieval quality and citation precision.
چرا متن را قطعهبندی کنیم؟
**اصل مرکزی**
هر `chunk` باید زمینه کافی داشته باشد، اما اطلاعات نامرتبط را تا حد ممکن وارد نکند.
**مثال عددی**
سند ۱۰۰۰ نویسهای با سه موضوع جدا: یک قطعه بزرگ، موضوعها را مخلوط میکند؛ سه قطعه موضوعی، بازیابی هدفمندتری میدهند.
```mermaid
flowchart LR
A["فایل"] --> B["Document"]
B --> C["Chunk"]
C --> D["Embedding"]
D --> E["Retrieval"]
E --> F["پاسخ و citation"]
```
چهار پارامتر اصلی
**نسبت همپوشانی**
\[\frac{\text{overlap}}{\text{chunk size}}=\frac{40}{200}=0.20=20\%\]
**محاسبه آغاز قطعه بعدی**
قطعه اول تا موقعیت ۲۰۰ میرود. همپوشانی ۴۰ است؛ بنابراین آغاز قطعه بعدی برابر با \(200-40=160\) است.
```mermaid
flowchart TD
A["متن کامل"] --> B{"separator مناسب؟"}
B -->|"پاراگراف"| C["حفظ مرز معنا"]
B -->|"جمله"| D["برش ریزتر"]
B -->|"فاصله یا نویسه"| E["آخرین راهحل"]
C --> F["chunk با اندازه هدف"]
D --> F
E --> F
```
Recursive Text Splitting
**محاسبه اندازه بخشها**
`Intro.` برابر ۶ نویسه، `Python loads files.` برابر ۲۰ نویسه و `RAG retrieves context.` برابر ۲۲ نویسه است؛ چون هر سه حداکثر ۴۰ هستند، برش ریزتر لازم نیست.
```mermaid
flowchart TD
A["متن"] --> B["پاراگراف"]
B --> C{"اندازه بخش ≤ 40؟"}
C -->|"بله"| D["نگهداشتن بخش"]
C -->|"خیر"| E["خط یا جمله"]
E --> F{"اندازه بخش ≤ 40؟"}
F -->|"بله"| D
F -->|"خیر"| G["فاصله یا نویسه"]
D --> H["اعمال overlap برابر 10"]
```
مرز خوب یا بد؟
**مقایسه دو مرز**
مرز بد، عدد `30` را از `days` جدا میکند. مرز بهتر، جمله `Password expires after 30 days.` را کامل نگه میدارد.
**پرسش کوتاه**
- مرز را جابهجا میکنم تا عنوان با متن مرتبط بماند.
- در صورت نیاز، overlap هدفمند اضافه میکنم.
```mermaid
flowchart LR
A["بررسی مرز"] --> B{"واحد معنایی کامل؟"}
B -->|"خیر"| C["جابجایی مرز یا افزایش overlap"]
B -->|"بله"| D{"citation دقیق؟"}
D -->|"خیر"| E["کوچکتر کردن chunk یا حفظ metadata"]
D -->|"بله"| F["آماده برای retrieval"]
```
انتخاب پارامتر با آزمون
**دو نوع سند**
راهنما: `300` و `50`، با مرز پاراگراف و جمله. کد: `500` و `0`، با مرز تابع. دلیل تفاوت، ساختار معنایی متفاوت این دو سند است.
**سقف همپوشانی**
\[a = \min\left(a_{\max},\; \text{context needed near boundary}\right)\]
**آزمون انتخاب**
- چون ساختار تابع و امکان استناد به یک بلوک کامل از بین میرود.
- ابتدا باید مرز تابع را حفظ کرد و فقط در صورت ضرورت، راه دیگری آزمود.
Back to course