Retrieval-Augmented Generation (RAG)

بهینه‌سازی کیفیت بازیابی: استراتژی‌های پیشرفته تکه‌بندی برای سیستم‌های RAG

تولید افزوده با بازیابی (RAG) به معماری استاندارد برای اتصال مدل‌های زبانی بزرگ (LLM) به داده‌های اختصاصی تبدیل شده است. با این حال، کیفیت تولید به‌شدت به کیفیت بازیابی گره خورده است. اگر سیستم زمینه‌ای نامرتبط، تکه‌تکه یا ناقص بازیابی کند، مدل دچار توهم (Hallucination) می‌شود یا پاسخ‌های ضعیفی تولید می‌کند. مهم‌ترین متغیر در این خط لوله که اغلب نادیده گرفته می‌شود، تکه‌بندی (Chunking) است.

تکه‌بندی فرآیند تقسیم اسناد بزرگ به قطعات کوچک‌تر و قابل مدیریت است که می‌توانند در فضای برداری (Vector Space) جاسازی (Embed) شوند. اگرچه تقسیم متن ممکن است مانند یک مرحله پیش‌پردازش ساده به نظر برسد، اما در واقع یک تعادل پیچیده بین چگالی اطلاعات، انسجام معنایی و محدودیت‌های محاسباتی است. در این مقاله، استراتژی‌های پیشرفته تکه‌بندی را بررسی می‌کنیم که فراتر از محدودیت‌های ساده کاراکتر می‌روند تا قطعاتی غنی از زمینه ایجاد کنند.

مشکل تکه‌بندی ثابت اندازه ساده

ساده‌ترین رویکرد برای تکه‌بندی، تقسیم با اندازه ثابت است. این روش شامل برش متن به قطعاتی به طول $N$ کاراکتر (یا توکن) با یک همپوشانی اختیاری است. اگرچه پیاده‌سازی آن آسان است، اما این روش از تکه‌تکه شدن شدید معنایی رنج می‌برد.

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

تقسیم کاراکترهای بازگشتی

یک خط پایه (Baseline) مقاوم‌تر تقسیم کاراکترهای بازگشتی (Recursive Character Splitting) است. به جای برش کورکورانه بر اساس کاراکترها، این روش تلاش می‌کند متن را با استفاده از جداکننده‌های طبیعی در یک سلسله‌مراتب تقسیم کند. هدف این است که جملات، پاراگراف‌ها و بخش‌ها هر جا که ممکن است دست‌نخورده باقی بمانند.

الگوریتم معمولاً با تعریف یک لیست از جداکننده‌ها (مثلاً `"\n\n"`, `"\n"`, `" "`) و تقسیم بازگشتی متن بر اساس اولین جداکننده عمل می‌کند. اگر تکه‌های حاصل همچنان بزرگ‌تر از حداکثر مورد نظر باشند، به جداکننده بعدی می‌رود. این اطمینان حاصل می‌کند که تکه‌ها با مرزهای زبانی طبیعی هم‌راستا هستند.

from langchain.text_splitter import RecursiveCharacterTextSplitter

# Define the splitter
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200,
    length_function=len,
    is_separator_regex=False,
    separators=["\n\n", "\n", " ", ""]
)

text = """
Section 1: Introduction
The history of AI is long.

Section 2: Current State
Modern LLMs rely on transformers."""

chunks = text_splitter.split_text(text)
# Resulting chunks respect paragraph breaks before splitting further

تکه‌بندی معنایی و پنجره جمله

برای کاربردهای سطح بالا، تکه‌بندی معنایی (Semantic Chunking) از جاسازی‌ها (Embeddings) برای تعیین محل تقسیم متن استفاده می‌کند. با محاسبه شباهت کسینوسی بین جاسازی‌های جملات متوالی، الگوریتم نقاطی را شناسایی می‌کند که در آن‌ها موضوع به‌طور قابل توجهی تغییر می‌کند. کاهش شباهت نشان‌دهنده مرز بین مفاهیم متمایز است و امکان تشکیل تکه‌ها حول موضوعات منسجم را فراهم می‌کند.

یک رویکرد ترکیبی قدرتمند دیگر تکه‌بندی پنجره جمله (Sentence-Window Chunking) است. در این استراتژی، متن ابتدا به جملات تقسیم می‌شود. با این حال، وقتی جمله‌ای به عنوان تکه «اصلی» برای جاسازی انتخاب می‌شود، همراه با یک پنجره زمینه شامل $K$ جمله قبلی و $K$ جمله بعدی قرار می‌گیرد. این کار به پایگاه داده برداری زمینه محلی مورد نیاز برای درک جمله اصلی را ارائه می‌دهد، در حالی که LLM می‌تواند از این پنجره برای پاسخ به سؤالاتی که نیاز به تغییرات جزئی در زمینه دارند، استفاده کند.

تنظیم همپوشانی و دانه‌بندی (Granularity)

صرف‌نظر از استراتژی، همپوشانی (Overlap) یک پارامتر حیاتی است. همپوشانی اطمینان حاصل می‌کند که اطلاعات در مرزهای تکه‌ها از دست نرود. یک همپوشانی معمول ۱۰ تا ۲۰ درصد از اندازه تکه است. همپوشانی کم خطر از دست دادن اطلاعات پل‌ساز را دارد؛ همپوشانی زیاد هزینه‌های ذخیره‌سازی و تأخیر بازیابی را بدون افزایش قابل توجه دقت افزایش می‌دهد.

علاوه بر این، دانه‌بندی (Granularity) اهمیت دارد. تکه‌های کوچک‌تر (مثلاً ۱۲۸ تا ۲۵۶ توکن) معمولاً بازیابی دقیق‌تری ارائه می‌دهند زیرا جاسازی روی موضوعی باریک‌تر متمرکز است. تکه‌های بزرگ‌تر (مثلاً ۵۱۲ تا ۱۰۲۴ توکن) زمینه بیشتری ارائه می‌دهند اما ممکن است نمایش برداری را رقیق کنند. بهترین عمل، آزمایش هر دو بُعد با استفاده از مجموعه داده و مجموعه پرسش‌های خاص شماست.

نتیجه‌گیری

تکه‌بندی مؤثر یک راه‌حل یک‌سایز-برای-همه نیست. این کار نیاز به درک ساختار داده‌های منبع شما و ماهیت پرسش‌های کاربر شما دارد. برای اسناد عمومی با تقسیم کاراکترهای بازگشتی شروع کنید، اما برای متن‌های فنی یا حقوقی که پیوستگی زمینه در آن‌ها حیاتی است، به استراتژی‌های معنایی یا مبتنی بر پنجره روی بیاورید. با در نظر گرفتن تکه‌بندی به عنوان یک جزء اصلی خط لوله RAG خود به جای یک یادآوری پس از پیش‌پردازش، هوش و قابلیت اعتماد پاسخ‌های تولیدی خود را به‌طور قابل توجهی افزایش می‌دهید.

Share: