Knowledge Bases

تسلط بر گزارش‌های چندستونه و جداول برای پایپ‌لاین‌های RAG مستحکم

سیستم‌های تولید تقویت‌شده با بازیابی (RAG) به اندازه داده‌هایی که مصرف می‌کنند خوب هستند. در حالی که پردازش اسناد متنی ساده نسبتاً straightforward است، مدیریت اسناد ساختاریافته یا نیمه‌ساختاریافته—به‌ویژه گزارش‌های چندستونه و جداول پیچیده—هنوز یک گلوگاه بزرگ محسوب می‌شود. وقتی متن به صورت افقی در ستون‌ها جریان دارد یا وقتی داده‌های جدولی در حین تجزیه، بافت ساختاری خود را از دست می‌دهند، امبدینگ‌های حاصل نویزی می‌شوند که منجر به توهم و نتایج بازیابی نامرتبط می‌گردد.

چالش ساختارهای متن غیرخطی

تجزیه‌گرهای استاندارد اغلب اسناد را به صورت خطی، ستون به ستون یا خط به خط می‌خوانند. در یک چیدمان چندستونه، این رویکرد منجر به جملات تکه‌تکه می‌شود. برای مثال، یک جمله ممکن است در پایین ستون اول شروع شود و در بالای ستون دوم ادامه یابد. اگر به درستی مدیریت نشود، موتور تکه‌تکه کردن ممکن است این جمله را به دو نیم تقسیم کند و معنای معنایی آن را از بین ببرد. علاوه بر این، جداول در PDFها یا HTMLها اغلب فاقد سرستون‌های ردیف و ستون صریحی هستند که در هر صفحه تکرار شوند، که درک بافت داده توسط مدل‌های زبانی بزرگ (LLM) را بدون پیش‌پردازش قابل توجهی دشوار می‌سازد.

استراتژی ۱: تکه‌تکه کردن معنایی با همپوشانی زمینه‌ای

برای رفع مشکل جملات تکه‌تکه، باید فراتر از تکه‌تکه کردن مبتنی بر کاراکتر ساده حرکت کنیم. تکه‌تکه کردن معنایی شامل تقسیم متن بر اساس شکستگی‌های طبیعی، مانند پاراگراف‌ها یا جملات کامل است. هنگام پیاده‌سازی این روش، معرفی یک پنجره همپوشانی حیاتی است. این کار تضمین می‌کند که حتی اگر جمله‌ای شکسته شود، تکه‌های بعدی بافت را از تکه قبلی حفظ کنند.

در اینجا یک مثال عملی با استفاده از پایتون و 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 = """
نتایج مالی سه‌ماهه سوم نشان‌دهنده افزایش ۱۵ درصدی در درآمد است. 
با این حال، هزینه‌های عملیاتی نیز به دلیل 
اختلالات در زنجیره تأمین افزایش یافته است. 

حاشیه سود خالص ۱۲ درصد است که نسبت به ۱۴ درصد در سه‌ماهه دوم کاهش یافته است.
"""

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

استراتژی ۲: ساختاردهی جداول برای امبدینگ

جداول به دلیل اینکه معنا از ساختار شبکه‌ای آن‌ها مشتق می‌شود، به ویژه دشوار هستند. یک خروجی متنی ساده از یک جدول، آن را غیرقابل خواندن می‌کند. بهترین رویکرد تبدیل جداول به یک فرمت نیمه‌ساختاریافته، مانند JSON یا HTML، با حفظ سرستون‌های ردیف و ستون است. این کار به مدل امبدینگ اجازه می‌دهد تا درک کند که "درآمد" با مقادیر موجود در ستون زیر آن مرتبط است.

هنگام استفاده از ابزارهایی مانند PyPDF2 یا Tabula-py، جدول را به عنوان یک DataFrame استخراج کنید و سپس آن را به لیستی از رشته‌ها تبدیل کنید که هر رشته نماینده یک ردیف به همراه سرستون‌های آن باشد:

import pandas as pd

# فرض کنید 'df' یک DataFrame از پایداس است که از جدول 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', ...]

استراتژی ۳: پیش‌پردازش مبتنی بر 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: