تولید تقویتشده با بازیابی (RAG) به استاندارد طلایی برای یکپارچهسازی مدلهای زبانی بزرگ (LLMs) با دادههای اختصاصی یا خصوصی تبدیل شده است. با این حال، رویکرد «ساده» RAG—شامل تقسیم ساده متن، ایجاد امبدینگ برداری و جستجوی شباهت کسینوسی—اغلب در سناریوهای پیچیده سازمانی ناکافی است. با پیشرفت قابلیتهای مدلها، گلوگاه از کیفیت تولید به دقت بازیابی تغییر میکند. در این پست، ما تکنیکهای پیشرفتهای را برای تبدیل یک پایپلاین RAG پایه به یک سیستم مقاوم و آماده تولید بررسی خواهیم کرد که قادر به مدیریت استدلال چندمرحلهای و پرسوجوهای معنایی متراکم است.
چرا RAG پایه شکست میخورد
محدودیت اصلی RAG پایه این است که به یک فضای برداری واحد برای ثبت هم معنای متن و هم مرتبط بودن کلمات کلیدی تکیه دارد. این موضوع اغلب منجر به موارد زیر میشود:
- انحراف معنایی: بازگرداندن اسنادی که از نظر مفهومی مشابه هستند اما از نظر واقعیات نامرتبطاند.
- عدم تطابق کلمات کلیدی: از دست دادن موجودیتهای خاص (مانند کدهای محصول، نامها) که در دادههای آموزش مدل امبدینگ نادر هستند.
- از دست دادن زمینه: تکهتکه کردن با اندازه ثابت اغلب زمینههای حیاتی را قطع میکند یا نویزهای نامرتبط را شامل میشود.
جستجوی ترکیبی: ترکیب بهترینهای هر دو جهان
برای رفع این مشکلات، جستجوی ترکیبی بازیابی برداری متراکم را با بازیابی مبتنی بر کلمات کلیدی پراکنده (مانند BM25) ترکیب میکند. بردارهای متراکم معنای متن را ثبت میکنند، در حالی که بردارهای پراکنده تطبیقهای دقیق را ثبت میکنند. سپس نتایج هر دو با استفاده از الگوریتمهایی مانند ادغام رتبه متقابل (RRF) ترکیب میشوند.
در اینجا نحوه پیادهسازی یک بازیاب ترکیبی ساده با استفاده از LangChain آمده است:
from langchain.retrievers import BM25Retriever, EnsembleRetriever
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
# Initialize your vector store
vectorstore = FAISS.from_texts(["Your corpus here..."], OpenAIEmbeddings())
vector_retriever = vectorstore.as_retriever(search_kwargs={"k": 10})
# Initialize BM25 retriever for keyword matching
bm25_retriever = BM25Retriever.from_texts(["Your corpus here..."])
bm25_retriever.k = 10
# Combine them using RRF
retriever = EnsembleRetriever(
retrievers=[vector_retriever, bm25_retriever],
weights=[0.6, 0.4]
)
docs = retriever.get_relevant_documents("What is the policy for Q3 refunds?")
این رویکرد به طور قابل توجهی فراخوانی (recall) برای موجودیتهای خاص را افزایش میدهد و همزمان مرتبط بودن معنایی را برای پرسوجوهای کلی حفظ میکند.
تکهتکهسازی هوشمند و فیلتر کردن متادیتا
همه تکهها برابر نیستند. به جای تقسیم تصادفی بر اساس کاراکتر، تکهتکهسازی معنایی یا سلسلهمراتبی را در نظر بگیرید. تکهتکهسازی معنایی از شباهتهای امبدینگ برای تشخیص شکستگیهای طبیعی در متن استفاده میکند و یکپارچگی پاراگراف را حفظ مینماید. علاوه بر این، بهرهگیری از متادیتا حیاتی است. با فیلتر کردن اسناد بر اساس متادیتا (مانند تاریخ، نوع سند، نویسنده) قبل یا حین بازیابی، فضای جستجو و نویز را به شدت کاهش میدهید.
برای مثال، اگر کاربری درباره «گزارشهای مالی سال ۲۰۲۳» سوال کند، باید نمایه متادیتای خود را طوری فیلتر کنید که تنها اسناد مربوط به آن سال را قبل از انجام جستجوی برداری شامل شود.
بازمرتبسازی برای دقت
حتی با جستجوی ترکیبی، بازیابی اولیه ممکن است نامزدهای با کیفیت پایین را بازگرداند. یک بازمرتبکننده متقاطع (cross-encoder) میتواند جفت پرسوجو-سند را مستقیماً بررسی کند. برخلاف مدلهای امبدینگ که پرسوجو و سند را به صورت جداگانه کدگذاری میکنند، cross-encoderها آنها را با هم پردازش میکنند که امکان امتیازدهی مرتبط بودن بسیار ظریفتری را فراهم میسازد.
اگرچه از نظر محاسباتی پرهزینهتر است، اما افزودن مرحله بازمرتبسازی در انتهای پایپلاین بازیابی (بازمرتبسازی top-k) اغلب موثرترین راه برای بهبود دقت پاسخ است. کتابخانههایی مانند sentence-transformers مدلهای cross-encoder کارآمدی را ارائه میدهند که میتوانند نتایج اولیه top-50 شما را به ۵ نتیجه مرتبطترین مورد کاهش دهند.
نتیجهگیری
RAG پیشرفته به معنای جایگزینی LLMها نیست، بلکه به معنای فراهم کردن زمینه با کیفیت بالاتر برای آنهاست. با پیادهسازی جستجوی ترکیبی، تکهتکهسازی هوشمند، فیلتر کردن متادیتا و بازمرتبسازی cross-encoder، توسعهدهندگان میتوانند سیستمهایی بسازند که نه تنها هوشمند، بلکه قابل اعتماد باشند. با تحولات در فضای هوش مصنوعی، تسلط بر این تکنیکهای بازیابی کلید تمایز بین یک دمو و یک راهحل سازمانی قابل استقرار خواهد بود.