Knowledge Bases

إتقان التقارير والجداول متعددة الأعمدة لبناء خطوط أنابيب RAG قوية

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

تحدي الهياكل النصية غير الخطية

غالبًا ما تقرأ المحللات القياسية المستندات بطريقة خطية، عمودًا تلو الآخر أو سطرًا تلو الآخر. في التخطيط متعدد الأعمدة، يؤدي هذا النهج إلى جمل مجزأة. على سبيل المثال، قد تبدأ جملة في أسفل العمود الأول وتستمر في أعلى العمود الثاني. إذا لم يتم التعامل معها بشكل صحيح، قد يقوم محرك التقسيم بتقسيم هذه الجملة إلى نصفين، مما يدمر معناها الدلالي. علاوة على ذلك، غالبًا ما تفتقر الجداول في ملفات PDF أو HTML إلى رؤوس الصفوف والأعمدة الصريحة التي تتكرر في كل صفحة، مما يجعل من الصعب على نموذج اللغة الكبير (LLM) فهم سياق البيانات دون معالجة مسبقة كبيرة.

الاستراتيجية 1: التقسيم الدلالي مع تداخل سياقي

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

إليك مثال عملي باستخدام Python وLangChain لتنفيذ التقسيم الدلالي مع التداخل:

from langchain.text_splitter import RecursiveCharacterTextSplitter

# تعريف محلل يحترم حدود الجمل
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50,
    length_function=len,
    separators=["\n\n", "\n", ". ", " ", ""],
)

# النص المدخل من تقرير متعدد الأعمدة
report_text = """
تشير نتائج الربع الثالث المالية إلى زيادة بنسبة 15٪ في الإيرادات. 
ومع ذلك، ارتفعت نفقات التشغيل أيضًا بسبب 
اضطرابات سلسلة التوريد. 

تبلغ هامش صافي الربح 12٪، مقارنة بـ 14٪ في الربع الثاني.
"""

chunks = text_splitter.split_text(report_text)
for i, chunk in enumerate(chunks):
    print(f"Chunk {i}: {chunk}")

الاستراتيجية 2: هيكلة الجداول للتضمين

تعد الجداول صعبة بشكل خاص لأن معناها مشتق من هيكلها الشبكي. يؤدي إخراج النص البسيط لجدول إلى جعله غير مقروء. أفضل نهج هو تحويل الجداول إلى تنسيق شبه مهيكل، مثل JSON أو HTML، مع الحفاظ على رؤوس الصفوف والأعمدة. يسمح هذا لنموذج التضمين بفهم أن "الإيرادات" ترتبط بالقيم في العمود الموجود أسفلها.

عند استخدام أدوات مثل PyPDF2 أو Tabula-py، استخرج الجدول كإطار بيانات (DataFrame) ثم حوله إلى قائمة من السلاسل النصية حيث يمثل كل سلسلة نصية صفًا مع رؤوسه:

import pandas as pd

# افترض أن 'df' هو إطار بيانات pandas مستخرج من جدول PDF
df = pd.DataFrame({
    'Category': ['A', 'B'],
    'Q1 Revenue': [100, 200],
    'Q2 Revenue': [150, 250]
})

# تحويل كل صف إلى سلسلة نصية غنية بالسياق
table_contexts = []
for index, row in df.iterrows():
    # إنشاء سلسلة نصية قابلة للقراءة لنموذج التضمين
    row_string = " | ".join([f"{col}: {val}" for col, val in row.items()])
    table_contexts.append(f"Row {index} Data: {row_string}")

print(table_contexts)
# المخرجات: ['Row 0 Data: Category: A | Q1 Revenue: 100 | Q2 Revenue: 150', ...]

الاستراتيجية 3: المعالجة المسبقة القائمة على HTML

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

from bs4 import BeautifulSoup
import html5lib

# تحليل HTML لاحترام هيكل DOM
soup = BeautifulSoup(html_content, "html5lib")

# استخراج النص مع الحفاظ على التلميحات الهيكلية
for div in soup.find_all('div', class_='column'):
    # معالجة محتوى العمود بالتسلسل
    print(div.get_text(separator=' ', strip=True))

الخاتمة

التعامل مع التخطيطات المعقدة ليس مجرد خطوة معالجة مسبقة؛ بل هو مكون أساسي لنجاح بنية RAG. من خلال تنفيذ التقسيم الدلالي، وهيكلة البيانات الجدولية في قوالب قابلة للقراءة، واستخدام محللات HTML قوية، يمكن للمطورين تحسين جودة تضميناتهم بشكل كبير. تضمن هذه التقنيات استرجاع نموذج اللغة الكبير (LLM) لمعلومات دقيقة واعية بالسياق، مما يؤدي في النهاية إلى تقديم إجابات أكثر دقة وموثوقية للمستخدمين النهائيين.

Share: