Late Chunking
يضمّن التقسيم المتأخر مستندًا كاملًا باستخدام نموذج ذي سياق طويل، ثم يجمع متجهات الرموز لكل مقطع، بحيث يحتفظ تضمين كل مقطع بسياق المستند.
التجزئة المتأخرة أسلوب لتضمين مقاطع المستندات، إذ يرمّز نموذج تضمين ذي سياق طويل المستند كاملًا أولًا، ثم تُقسّم متجهات الرموز الناتجة عند حدود المقاطع ويُحسب متوسطها لتكوين تضمين واحد لكل مقطع. يكون كل رمز قد اطّلع بالفعل على المستند كاملًا عند حساب المتوسط، لذا يظل المقطع الذي يقول «يجب استبداله» حاملًا لما تشير إليه كلمة «هو». قدّم باحثون في Jina AI الأسلوب في ورقة 2024 البحثية التجزئة المتأخرة: تضمينات مقاطع سياقية باستخدام نماذج تضمين ذات سياق طويل، التي تطبقه على نماذج التضمين الحالية من دون تدريب إضافي.
لماذا تفقد تضمينات الأجزاء السياق#
تقسّم أنظمة التوليد المعزز بالاسترجاع (RAG) المستندات إلى أجزاء، بحيث يمثل كل متجه مقطعًا محددًا ويلائم النص المسترجع نافذة السياق للنموذج. يضمّن التقسيم التقليدي كل جزء على حدة، ما يقطع جميع صلاته بالنص السابق. خذ جملتين متتاليتين من دليل: «تدوّر مضخة XR-12 سائل التبريد عبر خط الضغط.» و«يجب استبدالها بعد 10,000 ساعة تشغيل.» عند تضمين الجملة الثانية وحدها، لا تذكر مضخة XR-12، لذا لا يطابقها سؤال عن استبدال تلك المضخة إلا بقدر ضعيف في البحث المتجهي، رغم أنها تتضمن الإجابة.
آلية عمل التقطيع المتأخر#
يُجرى ترميز المستند كاملًا، ويُسجّل نطاق الرموز الخاص بكل جزء؛ ويمكن تحديد الحدود باستخدام أي أداة تقسيم، بما فيها التقسيم الثابت الحجم أو التقسيم الدلالي. ثم يمر تسلسل الرموز كاملًا عبر نموذج تضمين Transformer، حيث يمزج الانتباه الذاتي المعلومات من كل رمز إلى الرموز الأخرى. وأخيرًا، يُحسب متوسط متجهات الرموز ضمن كل نطاق لإنتاج تضمين ذلك الجزء. تُشفّر المستندات التي تتجاوز الحد الأقصى لمدخلات النموذج، مثل حد 8,192 رمزًا في نماذج jina-embeddings-v2 من Jina، على هيئة أجزاء كبيرة متداخلة، ويسمي البحث ذلك التقسيم المتأخر طويل السياق.
يضمّن المثال أدناه جملة المضخة بالطريقتين باستخدام نموذج صغير من Sentence Transformers، ويقارن كل نسخة بالسؤال:
import torch
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
chunks = [
"The XR-12 pump circulates coolant through the press line.",
"It must be replaced after 10,000 operating hours.",
]
query = model.encode("When should the XR-12 pump be replaced?", convert_to_tensor=True)
# التقسيم التقليدي: تضمين الجزء الثاني منفردًا
naive = model.encode(chunks[1], convert_to_tensor=True)
# التقسيم المتأخر: ترميز المستند كاملًا، ثم حساب المتوسط التجميعي لرموز الجزء الثاني وحدها
tokens = model.encode(" ".join(chunks), output_value="token_embeddings")
start = len(model.tokenizer(chunks[0])["input_ids"]) - 1 # رموز [CLS] + الجزء 1
late = tokens[start:-1].mean(dim=0) # إسقاط [SEP] النهائي
for name, emb in [("naive", naive), ("late", late)]:
print(name, round(torch.cosine_similarity(query, emb, dim=0).item(), 3))تحصل القطعة المضمّنة بصورة مستقلة على درجة 0.382 مقابل السؤال، بينما تحصل نسخة الجملة نفسها بعد التقسيم المتأخر على 0.62، لأن رموزها انتبهت إلى «مضخة XR-12» قبل حساب المتوسط.
أحدث كشف الكائنات التغيير نفسه عام 2015. شغّل R-CNN شبكة التفافية على كل منطقة مقترحة مقتطعة على حدة، بينما شغّل Fast R-CNN الشبكة مرة واحدة على الصورة كاملة، وجمّع كل منطقة من خرائط السمات المشتركة، ما جعل الكشف أسرع 213 مرة وقت الاختبار باستخدام العمود الفقري VGG16. وبالمثل، يشغّل Ultralytics YOLO26 عموده الفقري مرة واحدة على الصورة كاملة، ويتنبأ بكل صندوق انطلاقًا من تلك السمات المشتركة، لذا لا يُحسب أي اكتشاف من قصاصة معزولة.
التقسيم المتأخر مقارنةً بالأساليب ذات الصلة#
- الاسترجاع السياقي: يضيف ملاحظةً كتبها LLM إلى بداية كل جزء قبل فهرسته. ويتطلب استدعاء LLM واحدًا لكل جزء، كما يساعد في البحث بالكلمات المفتاحية لأن السياق المضاف نصي.
- التفاعل المتأخر في ColBERT: يحتفظ بمتجه لكل رمز ويقارنه بالاستعلام وقت البحث. أما التقسيم المتأخر فيجمع المتجهات إلى متجه واحد لكل جزء، لذا تلائمه أي فهرسة متجهية معيارية.
- تداخل الأجزاء: يكرر بضع جمل في الأجزاء المتجاورة. ويحافظ على السياق القريب فقط، ويزيد حجم الفهرس.
- نماذج إعادة الترتيب: تعيد ترتيب العناصر المرشحة المسترجعة باستخدام نموذج أقوى بعد البحث الأول، وتتكامل جيدًا مع التقسيم المتأخر.
متى يكون التقسيم المتأخر مفيدًا#
تكون المكاسب أكبر عندما تعتمد الأجزاء على نص سابق، كما في الضمائر والاختصارات التي عُرّفت مرة واحدة والسرد مثل التقارير والأدلة؛ وتكون أقل ما يمكن في السجلات القصيرة المكتفية بذاتها، مثل عناوين المنتجات. تتطلب الطريقة نموذج تضمين يحسب التجميع بمتوسط الرموز، ويتيح الوصول إلى المخرجات على مستوى الرمز، كما يجب إعادة ترميز المستند كاملًا كلما تغير أي جزء منه. تُدرج متجهات الأجزاء الناتجة عن التقسيم المتأخر في قاعدة بيانات متجهية عادية من دون تغيير. وتتيح واجهة التضمين البرمجية من Jina الطريقة عبر المعلمة late_chunking التي تضمّن قائمة من الأجزاء المتتالية بوصفها مستندًا واحدًا.










