در چشمانداز بهسرعت در حال تحول تولید تقویتشده با بازیابی (RAG)، کیفیت مرحله بازیابی مستقیماً به کیفیت امبدینگهای شما وابسته است. برای سالها، توسعهدهندگان به تکهتکهسازی ثابت و با اندازه مشخص متکی بودند—تقسیم اسناد به بلوکهای دلخواه ۵۰۰ یا ۱۰۰۰ توکنی. اگرچه این روش ساده است، اما اغلب معنای معنایی را خرد میکند که منجر به دقت بازیابی ضعیف و پاسخهای گیجکننده مدل میشود. در اینجا تکهتکهسازی تطبیقی و پویا وارد میشود: استراتژی پیچیدهای که از مدلهای زبانی بزرگ (LLMs) برای تعیین مرزهای بهینه تکهها بر اساس ساختار سند و چگالی محتوا استفاده میکند.
چرا تکهتکهسازی ثابت شکست میخورد
یک قرارداد حقوقی یا یک مقاله علمی را تصور کنید. یک تقسیمکننده با اندازه ثابت ممکن است یک پاراگراف را نصف کند یا یک تعریف را از بند مرتبط با آن جدا کند. وقتی این قطعات شکسته را امبدینگ میکنید، زمینه معنایی از بین میرود. پایگاه داده برداری قطعاتی را بازیابی میکند که فاقد معنا هستند و منجر به توهم یا پاسخهای نامرتبط در حین تولید میشود. تکهتکهسازی ثابت تمام متن را به یک اندازه مهم میداند و سلسلهمراتب طبیعی عناوین، پاراگرافها و فهرستها را نادیده میگیرد.
ورود تکهتکهسازی معنایی مبتنی بر LLM
تکهتکهسازی تطبیقی از یک LLM برای تحلیل چگالی محتوا و یکپارچگی ساختاری یک سند استفاده میکند. به جای شمارش کاراکترها، LLM تغییرات معنایی را شناسایی میکند. برای مثال، ممکن است تشخیص دهد که یک بخش جدید با یک عنوان آغاز میشود یا اینکه یک پاراگراف از توضیح یک مفهوم به ارائه یک مثال تغییر میکند. با احترام به این مرزهای طبیعی، تکههای حاصل انسجام معنایی بالاتری را حفظ میکنند.
این فرآیند معمولاً شامل ارسال بخشهایی از متن به LLM با یک دستور خاص است که به آن دستور میدهد نقاط شکست را شناسایی کند. LLM فهرستی از شاخصها یا شناسههایی را برمیگرداند که سند باید در آنجا تقسیم شود. سپس از این شاخصها برای برش متن اصلی به واحدهای کامل از نظر زمینهای استفاده میشود.
استراتژی پیادهسازی
پیادهسازی این روش نیازمند تعادلی بین عملکرد و دقت است. شما نمیتوانید هر جمله را به دلیل تأخیر و هزینه به یک LLM ارسال کنید. یک رویکرد هیبریدی رایج شامل تقسیم اولیه متن بر اساس واحدهای ساختاری بزرگتر (مانند پاراگرافها) و سپس استفاده از LLM برای ادغام یا تقسیم آن واحدها بر اساس شباهت معنایی است.
در اینجا یک مثال مفهومی از نحوه ساختاردهی دستور برای یک LLM جهت تعیین نقاط شکست آورده شده است:
import openai
def determine_chunk_boundaries(text, model="gpt-4"):
prompt = f"""
متن زیر را تحلیل کنید و مرزهای بهینه برای تکهتکهسازی معنایی را شناسایی کنید.
فهرستی از شاخصها را برگردانید که متن باید برای حفظ حداکثر انسجام زمینهای در آنجا تقسیم شود.
در صورت امکان جملات را تقسیم نکنید. فقط در شکستهای پاراگراف یا بخش که موضوع به طور قابل توجهی تغییر میکند، تقسیم کنید.
متن:
{text}
قالب خروجی: یک آرایه JSON از اعداد صحیح که نشاندهنده شاخصهای کاراکتری برای تقسیم در آن نقاط است.
"""
response = openai.ChatCompletion.create(
model=model,
messages=[{"role": "user", "content": prompt}]
)
return response.choices[0].message.content
در عمل، شما خروجی JSON را تجزیه کرده و از برش رشتهای پایتون برای ایجاد تکههای خود استفاده میکنید. این روش تضمین میکند که هر تکهای که به مدل امبدینگ ارسال میشود، حاوی یک فکر کامل است و به طور قابل توجهی نسبت سیگنال به نویز را در فروشگاه برداری شما بهبود میبخشد.
مزایای عملی
مزیت اصلی تکهتکهسازی تطبیقی، دقت بازیابی بهبود یافته است. با نگه داشتن مفاهیم مرتبط در کنار هم، سیستم RAG شما میتواند پاسخهای دقیقتر و جامعتری ارائه دهد. علاوه بر این، این روش با انواع مختلف اسناد بهتر برخورد میکند. یک راهنمای فنی، یک رمان و یک پست وبلاگ همگی دارای هنجارهای ساختاری متفاوتی هستند و تکهتکهسازی تطبیقی به طور خودکار با این تفاوتها سازگار میشود.
اگرچه سربار محاسباتی آن بیشتر از تکهتکهسازی ثابت است، اما این سرمایهگذاری در کاهش توهم و افزایش رضایت کاربر بازدهی دارد. با بالغ شدن سیستمهای RAG، حرکت از قواعد خشک و ثابت به سمت پردازش هوشمند و آگاه از زمینه، نه تنها یک بهینهسازی بلکه ضروری برای برنامههای سطح تولید است.