تولید تقویتشده با بازیابی (RAG) به معماری استاندارد برای مستندسازی مدلهای زبانی بزرگ (LLM) در دادههای اختصاصی تبدیل شده است. با این حال، یک گلوگاه رایج در پایپلاینهای RAG، مرحله بازیابی اولیه است. موتورهای جستجوی برداری استاندارد که به الگوریتمهای همسایه نزدیک تقریبی (ANN) تکیه دارند، سریع اما تقریبهای کارآمد از نظر محاسباتی هستند. آنها اغلب اسنادی را بازیابی میکنند که از نظر موضوعی مرتبط اما از نظر معنایی سطحی هستند، که منجر به سناریوهای «ورودی زباله، خروجی زباله» میشود؛ جایی که LLM توهمات یا پاسخهای نامرتبط تولید میکند.
اینجاست که بازرتبهبندی (Re-ranking) وارد عمل میشود. با معرفی یک لایه فیلتر کردن دوم و سختگیرانهتر، توسعهدهندگان میتوانند دقت زمینه ارائهشده به LLM را به طور چشمگیری بهبود بخشند بدون اینکه سرعت بازیابی اولیه قربانی شود.
معماری بازیابی دو مرحلهای
برای درک بازرتبهبندی، تجسم معماری مدرن RAG به عنوان یک قیف دو مرحلهای ضروری است:
- مرحله ۱: بازیابی کاندیداها (Recall). این مرحله از روشهای سبکوزن و پرسرعت مانند جستجوی برداری پراکنده (BM25) یا جستجوی برداری متراکم (شباهت کسینوسی) استفاده میکند. هدف، بازیابی یک مخزن بزرگ از کاندیداها (مثلاً ۱۰۰ سند) از یک کلانداده وسیع است.
- مرحله ۲: بازرتبهبندی (Precision). این مرحله پرسوجو و N کاندیدای برتر از مرحله ۱ را دریافت کرده و یک مدل پیچیدهتر را برای امتیازدهی دقیقتر به میزان مرتبط بودن آنها اعمال میکند. K نتیجه برتر (مثلاً ۵ سند) به LLM ارسال میشود.
بدون بازرتبهبندی، ممکن است بپرسید «چگونه یک لوله نشتکننده را تعمیر کنم؟» و سیستم مقالاتی درباره «نشت آب در نرمافزار» یا «زهکشی آب باران» را بازگرداند. با بازرتبهبندی، سیستم تشخیص میدهد که «لوله نشتکننده» به لولهکشی فیزیکی اشاره دارد و محتوای مرتبط با نرمافزار را به رتبههای پایینتر میبرد.
چرا کراس-انکودرها (Cross-Encoders)؟
استاندارد صنعت برای بازرتبهبندی شامل کراس-انکودرها است. برخلاف بیانکودرها (که در مرحله ۱ استفاده میشوند) که پرسوجوها و اسناد را به صورت مستقل به بردارها تبدیل میکنند، کراس-انکودرها پرسوجو و سند را با هم در یک گذشت رو به جلو پردازش میکنند. این به مدل اجازه میدهد تا بر تعاملات خاص بین کلمات پرسوجو و کلمات سند توجه کند و روابط معنایی ظریف را به دام بیندازد.
برای مثال، در یک بیانکودر، «سیب» (میوه) و «سیب» (شرکت) ممکن است اگر در زمینههای مشابهی ظاهر شوند، نمایشهای برداری مشابهی داشته باشند. یک کراس-انکودر که پرسوجوی «تغذیه میوه» و سند «قیمت سهام فناوری» را بررسی میکند، تقریباً هیچ تعاملی را مشاهده نخواهد کرد که منجر به امتیاز مرتبط بودن پایین میشود.
پیادهسازی یک بازرتبهبند با پایتون
پیادهسازی بازرتبهبندی با استفاده از کتابخانههایی مانند sentence-transformers یا pyserini ساده است. در زیر یک مثال عملی با استفاده از کتابخانه محبوب sentence-transformers آورده شده است که مدلهای بهینهشده کراس-انکودر را فراهم میکند.
from sentence_transformers import CrossEncoder
# مقداردهی اولیه مدل کراس-انکودر
# 'cross-encoder/ms-marco-MiniLM-L-6-v2' یک انتخاب سریع و موثر است
model = CrossEncoder('cross-encoder/ms-marco-MiniLM-L-6-v2')
# پرسوجو و لیستی از اسناد کاندیدا که از مرحله ۱ بازیابی شدهاند
query = "How to implement OAuth2 in Python?"
candidates = [
"Python is a programming language.",
"A step-by-step guide to implementing OAuth2 authentication in Python applications using Flask.",
"Understanding the basics of HTTP requests.",
"OAuth2 specification document version 2.0."
]
# کدگذاری جفتهای پرسوجو-سند
# مدل برای هر جفت یک امتیاز مرتبط بودن باز میگرداند
scores = model.predict([(query, doc) for doc in candidates])
# جفت کردن امتیازها با اسناد و مرتبسازی بر اساس مرتبط بودن
ranked_results = sorted(zip(candidates, scores), key=lambda x: x[1], reverse=True)
# چاپ نتیجه برتر
print("Top Ranked Result:")
print(f"Document: {ranked_results[0][0]}")
print(f"Score: {ranked_results[0][1]:.4f}")
در این مثال، سند دوم که صراحتاً به «OAuth2» و «Python» اشاره میکند، امتیاز بسیار بالاتری نسبت به اسناد عمومی «Python» یا «HTTP» دریافت خواهد کرد، که تضمین میکند LLM اطلاعات زمینهای دقیقتری را دریافت میکند.
تعادل بین تأخیر و دقت
کراس-انکودرها از نظر محاسباتی پرهزینه هستند زیرا جفتهای متن را به صورت متوالی و نه موازی پردازش میکنند. اگر کلانداده شما عظیم است و حجم پرسوجوها بالا است، اجرای یک کراس-انکودر روی هزاران کاندیدا غیرممکن است. به همین دلیل است که رویکرد دو مرحلهای حیاتی است: مرحله اول فضای جستجو را از میلیونها به صدها کاهش میدهد و مرحله دوم آن مجموعه کوچک را اصلاح میکند.
برای محیطهای تولید، در نظر بگیرید که از APIهای اختصاصی بازرتبهبندی یا مدلهای بهینهشده مانند ms-marco-TinyBERT-L-2-v2 برای استنتاج سریعتر، یا استراتژیهای کش برای پرسوجوهای پرکاربرد استفاده کنید.
نتیجهگیری
بازرتبهبندی تنها یک بهینهسازی نیست؛ بلکه ضروری برای ساخت برنامههای RAG قابل اعتماد و در سطح تولید است. با جداسازی فراخوانی (Recall) از دقت (Precision)، توسعهدهندگان میتوانند از سرعت پایگاههای داده برداری بهره ببرند در حالی که دقت درک معنایی عمیق را حفظ میکنند. پیادهسازی یک بازرتبهبند کراس-انکودر یکی از تغییرات با بالاترین بازده سرمایهگذاری (ROI) است که میتوانید برای بهبود کیفیت پاسخهای LLM خود انجام دهید، که توهمات را کاهش داده و اعتماد کاربر را افزایش میدهد.