Chunky - مجموعة أدوات RAG التقسيم
Chunky هي مجموعة أدوات مفتوحة المصدر لبناء خطوط أنابيب استيعاب RAG موثوقة، تركز على مرحلة التقسيم التي يتم تجاهلها غالباً. فهو يحول ملفات PDF والمستندات إلى Markdown يمنحك فحص المقاطع ومقارنة استراتيجيات التقسيم جنباً إلى جنب وإثراء بيانات وصف المقطع لتطبيقات LLM. لأن جودة الاسترجاع محدودة بكيفية تقسيم المستندات، فإن قيمة Chunky تجعل خطوة التقسيم مرئية وقابلة للتعديل بدلاً من افتراضي أعمى.
التثبيت
| الطريقة | الأمر |
|---|
| pip | pip install chunky |
| uv | uv add chunky |
| From source | git clone https://github.com/GiovanniPasq/chunky && cd chunky && pip install -e . |
| التحقق | python -c "import chunky; print('ok')" |
مراحل خط الأنابيب
| المرحلة | الغرض |
|---|
| Convert | تحويل PDF/docs إلى Markdown نظيف |
| Clean | إزالة الغلاف، وإصلاح الآثار |
| Chunk | نص منقسم باستخدام استراتيجية مختارة |
| Inspect | تصور الأجزاء الناتجة |
| Compare | تشغيل استراتيجيات متعددة والمقارنة |
| Enrich | أرفق البيانات الوصفية (الرؤوس والمصدر والموضع) |
تحويل وتنظيف
import chunky
# Convert a PDF to clean Markdown
md = chunky.to_markdown("report.pdf")
# Clean common artifacts (headers/footers, hyphenation, noise)
md = chunky.clean(md)
| الدالة | الوصف |
|---|
to_markdown(path) | تحويل مستند إلى Markdown |
clean(text) | شطب الغلاف والعادي |
استراتيجيات التقسيم
| الاستراتيجية | ينقسم على |
|---|
| Fixed-size | N token/characters مع تداخل |
| Recursive | الفقرات → الجمل → الكلمات حسب الحاجة |
| Markdown / header-aware | هيكل المستند (#، ##، أقسام) |
| Semantic | تضمين حدود التشابه |
| Token-aware refinement | دمج undersized، انقسم oversized |
chunks = chunky.chunk(
md,
strategy="header_aware",
max_tokens=512,
overlap=64,
repeat_headers=True, # carry section headers across table splits
)
for c in chunks:
print(len(c.tokens), c.metadata["heading"])
فحص ومقارنة
المميز: انظر وقارن ما تنتجه كل استراتيجية قبل الالتزام.
# Inspect chunk boundaries and sizes
chunky.inspect(chunks) # sizes, overlaps, boundaries
# Compare strategies on the same document
report = chunky.compare(
md,
strategies=["fixed", "recursive", "header_aware", "semantic"],
max_tokens=512,
)
print(report) # per-strategy stats: count, size distribution, fragmentation
| الدالة | العروض |
|---|
inspect(chunks) | توزيع الحجم والتداخل والحدود |
compare(text, strategies=[...]) | مقياس الاستراتيجية جنباً إلى جنب |
إثراء البيانات الوصفية
| البيانات الوصفية | الاستخدام في الاسترجاع |
|---|
| Heading path | توسيع السياق / التصفية |
| Source + page | الاستشهادات |
| Position/index | الترتيب والبحث عن الجار |
| Token count | إدارة الميزانية في وقت الفحص |
enriched = chunky.enrich(chunks, source="report.pdf")
# each chunk.metadata now carries heading path, page, source, index
سير العمل المشتركة
# End-to-end: PDF → clean Markdown → header-aware chunks → enriched
import chunky
md = chunky.clean(chunky.to_markdown("manual.pdf"))
chunks = chunky.chunk(md, strategy="header_aware", max_tokens=512, overlap=64)
chunks = chunky.enrich(chunks, source="manual.pdf")
# embed chunk.text, store chunk.metadata alongside in your vector DB
# Choose a strategy with evidence, not guesswork
print(chunky.compare(md, strategies=["recursive", "header_aware", "semantic"]))
Chunky مقابل الطرق الأخرى
| الجانب | Chunky | Framework default splitters | Docling |
|---|
| Strategy comparison | First-class | Manual | Limited |
| Conversion + clean | Built-in | Separate | Built-in |
| Best for | Tuning the chunking stage | Quick start | Full parse + chunk |
Pairs well with Docling for parsing and your vector DB for storage — Chunky’s job is getting the split right.
الموارد