مقسّم النصوص للتضمينات و RAG — التقسيم بالرموز

قسّم نصًّا طويلًا إلى مقاطع مقيسة بالرموز مع تداخل، للتضمينات و RAG. يقطع عند حدود الجمل والفقرات، لا في منتصف كلمة، ويُظهر كل قطع.

تقطيع النص للتضمينات: موضع القطع هو ما يحدّد ما تسترجعه

أنظمة الاسترجاع تفشل بصمت. تُضمّن مجموعة نصوص، وتوصل بحثًا، وتسأل سؤالًا، فيعود إليك شيء مجاور في الموضوع لا يجيب عنه. والغريزة أن تلوم نموذج التضمين أو مقياس التشابه. لكن المشكلة في الغالب وقعت قبلهما معًا: قُطّع النص إلى قطع لا تحوي كل واحدة منها فكرة كاملة، ولا يستعيد أي ترتيب ذكيّ معنًى أُتلف لحظة القطع.

تقسّم هذه الأداة النص إلى قطع محدودة بعدد الـ tokens مع تداخل بينها، وتقطع عند أفضل حدّ متاح دلاليًا لا عند إزاحة ثابتة. وتعرض عليك كل حدّ، لأن القطع السيئ لا يُرى إلا بقراءة موضع انتهاء قطعة وبداية التالية. وكل ذلك يجري في تبويب المتصفح هذا.

التقسيم التراجعي عند الحدود

المقاربة الساذجة أن تقطع كل N من الـ tokens. سريعة وخاطئة، لأن حدّ الـ token لا علاقة له بحدّ المعنى — ستقطع في منتصف جملة، وأحيانًا في منتصف كلمة، فيصف المتّجه الناتج شذرة لم يكتبها أحد.

والطريقة هنا تنزل سلّمًا من الفواصل، وتستعمل أول فاصل ينتج قطعًا تصغر بما يكفي. بالترتيب: قبل عنوان Markdown، ثم الأسطر الفارغة، ثم أي فاصل سطر، ثم حدود الجمل، ثم حدود العبارات عند الفواصل والفواصل المنقوطة، ثم المسافات بين الكلمات. ولا ترجع إلى القطع بفهرس الـ token إلا إن لم يوجد أيٌّ من ذلك — حزمة مصغّرة، أو كلمة واحدة هائلة.

والأثر العملي أن البنية تُصان كلما كان في النص بنية. فالمستند ذو العناوين ينقسم عند الأقسام. والنثر ينقسم عند الفقرات، أو عند الجمل إن طالت الفقرة. والجدار النصّي المتصل ينقسم عند الكلمات. وتنتهي كل قطعة حيث كان الإنسان لينهيها، ما لم يكن النص خاليًا من أي فرصة كهذه.

ما الغرض الحقيقي من التداخل

التداخل يكرّر ذيل قطعة في رأس التالية. وهو موجود لأن الحقيقة وما تشير إليه يقعان غالبًا على جانبين من حدّ. «جرت الترحيلة طوال الليل. وفشلت عند الجدول الثالث.» اقطع بين الجملتين وستحوي القطعة الثانية فشلًا بلا فاعل، وتحوي الأولى ترحيلة بلا نتيجة. ولا واحدة منهما تُسترجع بفائدة. ومع التداخل تحمل القطعة الثانية مرجع الضمير معها.

والكلفة تكرار: فالـ tokens المتداخلة تُخزَّن وتُضمَّن ويُبحث فيها أكثر من مرة. وعشرة إلى خمسة عشر بالمئة من حجم القطعة هي التسوية المعتادة، وعندها تقف الإعدادات الجاهزة. وتُبلّغ لوحة الإحصاءات بعدد الـ tokens التي أضافها التداخل بالضبط، فتصير المفاضلة رقمًا لا إحساسًا.

وحماية واحدة تستحقّ المعرفة: تداخل يساوي حجم القطعة أو يزيد عليه يعني أن كل قطعة تبدأ بكل ما انتهت به السابقة، فلا تتقدّم العملية أبدًا. وهذا يُقيَّد بدل أن يُترك ليُعلِّق الصفحة.

كيف تختار الحجم

حجم القطعة مفاضلة بين الدقة والسياق، ولا توجد إجابة صحيحة على الإطلاق:

  • القطع الصغيرة، نحو 256 token، تعطي تطابقات حادّة. فالمتّجه فوق جملتين أو ثلاث يهيمن عليه ما تقوله تلك الجمل. جيدة للإجابة عن أسئلة فوق مادة مرجعية مكثّفة. والخطر قطع تتطابق جيدًا لكنها تفتقر إلى السياق المحيط اللازم للإجابة فعلًا.
  • القطع المتوسطة، نحو 512، هي الافتراضي الشائع وحيث تكون معظم نماذج التضمين في أفضل حالاتها. أي ما يعادل فقرة معتبرة.
  • القطع الكبيرة، 1024 فما فوق، تحمل سياقًا أكثر لكل نتيجة لكنها تخفّف المتّجه. فالقطعة التي تغطّي أربعة موضوعات تجلس في متوسط الأربعة ولا تتطابق مع أيّها بقوة.
  • القطع الضخمة جدًا، بضعة آلاف token، تكفّ عن كونها وحدة استرجاع وتصير وحدة ترحيل صفحات — لتمرير مستند طويل عبر نموذج على دفعات متتالية بدل البحث فيه.

أربع استراتيجيات للتقسيم

التقسيم الذكي هو السلّم التراجعي الموصوف أعلاه، وهو الصواب لمعظم النثر. والفقرات تحزم فقرات كاملة ولا تقسّم فقرة أبدًا، وهو ما يناسب نصًّا صارت الفقرة فيه وحدة الفكرة أصلًا وتفضّل فيه أحجامًا متفاوتة على قطعة مكسورة. وعناوين Markdown تعطي قطعة لكل قسم، وهو الخيار الطبيعي للتوثيق حيث يسمّي العنوان بالضبط ما تحته. والأسطر تحزم أسطرًا كاملة، للسجلّات ومقتطفات CSV والقوائم حيث يستقلّ كل صفّ بنفسه.

وفي كل الأوضاع، تُصغَّر أي وحدة ما زالت تتجاوز الحدّ بالمقسّم التراجعي قبل الحزم، فلا ينتج اختيار الاستراتيجية قطعة زائدة عن الحجم أبدًا.

العدّ، وماذا يعني الرقم

تُعدّ الـ tokens بالمُقطِّع نفسه الذي يقيس به هذا الموقع أحجام المستودعات، من العائلة التي تستعملها نماذج OpenAI. وأرقام Claude وGemini تختلف بعض الشيء — فالمفردات المختلفة تقطّع النص نفسه تقطيعًا مختلفًا — لكنها تتقارب بما يكفي لقياس قطعة أمام حدّ. وإن كانت ميزانيتك ضيّقة فاترك هامشًا بدل التعامل مع الرقم كأنه دقيق.

ولاحظ أيضًا أن الحدّ المعلن لنموذج التضمين نقطة قطع قاسية لا هدف. تجاوزه ويُسقَط الذيل بصمت، وهو نمط فشل لا يُنتج خطأً ويُدهور الاسترجاع بطريقة يصعب تشخيصها فعلًا.

مخرجات تصلح لإطعام شيء آخر

ثلاث صيغ للتنزيل. نصّ عادي مع رؤوس --- Chunk n/N --- اختيارية، للقراءة والفحص. وJSON كمصفوفة كائنات فيها الفهرس وعدد الـ tokens والنص، لنصّ برمجي يبتلع الكلّ. وJSONL بكائن في كل سطر، وهو ما تتوقعه عمليات الإدخال التدفقية ومعظم نقاط نهاية التضمين الدفعية، وما تريده حين تكون المجموعة أكبر من أن تُحفظ في الذاكرة مصفوفةً واحدة.

ويتكامل هذا طبيعيًا مع بقية الموقع: حوّل مستودعًا أو ملف PDF أو صفحة ويب أو نصّ ترجمة إلى نص أولًا، ثم قطّع الناتج هنا. ولا يُرفع شيء في أي من الخطوتين.