محول الوثائق

يقوم محول الوثائق في لانج تشين أساسًا بتقسيم محتوى النص، حيث يقوم بتقسيم مقالة كبيرة إلى عدة مقاطع نصية صغيرة. يتم ذلك لأن النماذج الكبيرة عادة ما تكون لها حدود في طول الاستفسارات ولا يمكن إطعام كل المحتوى إلى الذكاء الاصطناعي. حتى إذا سمحت بعض النماذج الكبيرة بطول استفسار كبير جدًا، فإنه من منظور التكلفة، من غير العملي تمرير مثل هذا المحتوى الطويل إلى الذكاء الاصطناعي. بعد كل شيء، كلما زاد طول المحتوى، زادت تكلفة الاستدعاء لواجهة برمجة التطبيقات (حتى بالنسبة للنماذج مفتوحة المصدر المنشورة محلياً، يتطلب المحتوى الطويل مساحة ذاكرة GPU أكبر وعمليات استنتاج أبطأ). النهج العقلاني هو دمج مقاطع المحتوى ذات الصلة كمعلومات خلفية واستفسارات عند طلب نموذج الذكاء الاصطناعي.

لانج تشين لديه العديد من محولات الوثائق المدمجة التي يمكنها بسهولة تقسيم ودمج وتصفية محتوى الوثيقة.

مقسم النص

عند التعامل مع كتل كبيرة من النص، يجب عليك تقسيم النص إلى قطع. على الرغم من أن الأمر يبدو بسيطًا، إلا أن هناك العديد من التعقيدات المحتملة هنا. في الأفضلية، تريد الاحتفاظ بقطاعات النص ذات الصلة معنويًا معًا. قد تعتمد مصطلح "ذات الصلة من الناحية المعنوية" هنا على نوع النص.

على مستوى عالٍ، يعمل مقسم النص على النحو التالي:

  1. تقسيم النص إلى قطع صغيرة ذات معانٍ معنوية (عادةً جمل).
  2. بدء دمج هذه القطع الصغيرة في قطع أكبر حتى الوصول إلى حجم معين (يتم قياسه بواسطة بعض الدوال).
  3. بمجرد الوصول إلى هذا الحجم، يتم التعامل مع القطعة على أنها قطاعة نص خاصة بها وبدء إنشاء قطاعة نص جديدة بتداخل مع بعض القطع (للحفاظ على السياق بين القطع).

وهذا يعني أنه يمكنك تخصيص مقسم النص على ذروتين مختلفتين:

  1. كيفية تقسيم النص.
  2. كيفية قياس حجم القطع.

مثال

مقسم النص الموصى به افتراضيًا هو RecursiveCharacterTextSplitter. يقبل هذا المقسم قائمة من الأحرف. يحاول إنشاء قطع استنادًا إلى الحرف الأول، ولكن إذا كانت أي قطعة كبيرة جدًا، فسيستمر في التحرك إلى الحرف التالي، وهكذا. بشكل افتراضي، يحاول تقسيم الأحرف هي ["\\\\n\\\\n", "\\\\n", " ", ""].

بالإضافة إلى التحكم في أي الأحرف يمكن تقسيمها، يمكنك أيضًا التحكم في عدة أمور أخرى:

  • length_function: كيفية حساب طول القطعة. بشكل افتراضي، يتم احتساب عدد الأحرف فقط، ولكن من المعتاد تمرير عدادات الرموز هنا.
  • chunk_size: الحجم الأقصى لقطعك (يتم قياسه بواسطة دالة الطول).
  • chunk_overlap: التداخل الأقصى بين القطع. الاحتفاظ ببعض التداخل يمكن أن يساعد في الحفاظ على استمرارية بين القطع (على سبيل المثال، أداء نافذة منزلقة).
  • add_start_index: ما إذا كان يجب تضمين الموضع البدء لكل قطعة في الوثيقة الأصلية في البيانات الوصفية.
مع open('../../state_of_the_union.txt') كما f:
    state_of_the_union = f.read()
من langchain.text_splitter استيراد RecursiveCharacterTextSplitter
مقسم_النص = RecursiveCharacterTextSplitter(
    chunk_size = 100,
    chunk_overlap  = 20,
    length_function = len,
    add_start_index = True,
)
النصوص = مقسم_النص.إنشاء_وثائق([state_of_the_union])
print(النصوص[0])
print(النصوص[1])
محتوى_الصفحة='.. يتم تجاهل النص ..' metadata={'start_index': 0}
    محتوى_الصفحة='.. يتم تجاهل النص ..' metadata={'start_index': 82}

تحويلات أخرى

تصفية الوثائق الزائدة، ترجمة الوثائق، استخراج البيانات الوصفية، والمزيد

بالإضافة إلى تقسيم الوثائق، يمكننا أيضًا القيام بتحويلات أخرى على محتوى الوثيقة. باستخدام EmbeddingsRedundantFilter، يمكننا تحديد الوثائق المماثلة وتصفية المحتوى الزائد. من خلال التكاملات مثل doctran، يمكننا القيام بعمليات مثل ترجمة الوثائق من لغة إلى أخرى، استخراج الخصائص المطلوبة وإضافتها إلى البيانات الوصفية، وتحويل المحادثات إلى مجموعة من الوثائق بتنسيق سؤال/جواب.