در چشمانداز بهسرعت در حال تحول تولید تقویتشده با بازیابی (RAG)، کیفیت مرحله بازیابی، تعیینکننده عملکرد سیستم است. یک دام رایج برای توسعهدهندگان، فرض این است که پرسوجوی خام کاربر با اصطلاحات پایگاه دانش شما مطابقت کامل دارد. با این حال، پرسوجوهای دنیای واقعی اغلب مبهم، مختصر یا فاقد اصطلاحات تخصصی خاص هستند. اینجاست که
گسترش پرسوجو وارد میدان میشود—نه به عنوان یک لوکس، بلکه به عنوان ضروری برای معماریهای RAG با دقت بالا.
گسترش پرسوجو فرآیند غنیسازی پرسوجوی اصلی کاربر با اصطلاحات، مترادفها یا مفاهیم مرتبط اضافی پیش از انجام جستجوی برداری یا تطبیق کلیدواژه است. با گسترش دامنه معنایی جستجو، خطر «شکست در فراخوانی» (recall failure) را کاهش میدهیم؛ حالتی که اسناد مرتبط به دلیل عدم اشتراک در تطبیقهای واژگانی دقیق با پرامپت، از قلم میافتند.
مکانیکهای گسترش پرسوجو
گسترش پرسوجوی مؤثر بر سه سطح اصلی عمل میکند که هر کدام تعادل متفاوتی بین هزینه محاسباتی و کیفیت بازیابی ارائه میدهند.
1. گسترش مترادف واژگانی
این رویکرد از دیکشنریها یا واژهنامههای ثابت برای جایگزینی یا الحاق مترادفها به اصطلاحات کلیدی استفاده میکند. برای مثال، اگر کاربر درباره «خودروهای اتوماتیک» بپرسد، گسترش پرسوجو برای شامل کردن «خودرو»، «وسایل نقلیه» و «ماشین» تضمین میکند که اسنادی که از اصطلاحات استاندارد استفاده کردهاند، همچنان بازیابی شوند.
2. غنیسازی معنایی از طریق مدلهای زبانی بزرگ (LLMs)
خط لولههای RAG مدرن از مدلهای زبانی بزرگ برای درک نیت پشت یک پرسوجو استفاده میکنند. به جای صرفاً تعویض کلمات، یک LLM میتواند مجموعهای از پرسوجوهای مرتبط را تولید کند یا پرامپت را بازنویسی کند تا دقیقتر شود. این رویکرد برای مفاهیم انتزاعی بهویژه قدرتمند است. اگر کاربر بپرسد: «چگونه یک کامپیوتر کند را تعمیر کنم؟»، یک LLM ممکن است این پرسوجو را با شامل کردن اصطلاحاتی مانند «بهینهسازی رجیستری»، «پاکسازی فایلهای موقت»، «تراز کردن هارد دیسک» و «بررسی مصرف رم» گسترش دهد.
3. تجزیه
برای پرسوجوهای پیچیده و چندبخشی، گسترش پرسوجو میتواند شامل شکستن پرسوجوی واحد به چندین زیرپرسوجو باشد. هر زیرپرسوجو سپس بهطور مستقل به پایگاه داده برداری ارسال میشود و نتایج ادغام میگردند. این امر به سیستم اجازه میدهد تا قطعات اطلاعاتی متمایزی را که ممکن است در اسناد مختلف پراکنده باشند، بازیابی کند.
استراتژی پیادهسازی با LangChain
پیادهسازی گسترش پرسوجو در پایتون با استفاده از کتابخانههایی مانند LangChain ساده شده است. در زیر یک مثال عملی با استفاده از
SynonymQueryExpander و یک بازنویس مبتنی بر LLM مفهومی آورده شده است.
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import EmbeddingsFilter
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.llms import OpenAI
# فرض کنید که ذخیره برداری 'vectorstore' شما از قبل راهاندازی شده است
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_texts(["متن پایگاه دانش شما در اینجا"], embeddings)
# ایجاد یک بازیاب
base_retriever = vectorstore.as_retriever()
# اعمال فشردهسازی زمینهای برای شبیهسازی نوعی گسترش/فیلتر
# در تنظیمات پیشرفته، شما از یک کلاس خاص QueryExpander در اینجا استفاده میکنید
# که پیش از بازیابی، یک LLM را برای بازنویسی پرسوجو فراخوانی میکند.
from langchain.retrievers import BM25Retriever, EnsembleRetriever
# ترکیبی از برداری (معنایی) و BM25 (کلیدواژه) اغلب به عنوان گسترش ضمنی عمل میکند
bm25_retriever = BM25Retriever.from_documents(your_documents)
ensemble_retriever = EnsembleRetriever(retrievers=[base_retriever, bm25_retriever], weights=[0.7, 0.3])
در یک محیط تولید، شما معمولاً یک کلاس سفارشی
BaseQueryExpander ایجاد میکنید که پرسوجوی ورودی را دریافت میکند، آن را به یک LLM با پرامپتی که دستور «۵ کلیدواژه مرتبط و نسخه دقیقتری از این پرسوجو را تولید کن» را صادر میکند، ارسال مینماید و سپس این اصطلاحات را به رشته جستجوی اصلی الحاق میکند.
ملاحظات عملی و دامها
در حالی که گسترش پرسوجو فراخوانی را بهطور قابل توجهی بهبود میبخشد، چالشهای جدیدی نیز ایجاد میکند. خطر اصلی
کاهش دقت است. با افزودن تعداد زیادی اصطلاحات با ارتباط ضعیف، ممکن است اسناد نویزی یا نامرتبطی را بازیابی کنید که پاسخ نهایی تولید شده توسط LLM را رقیق میکنند. برای مقابله با این موضوع، اجرای مراحل رتبهبندی مجدد قوی پس از بازیابی ضروری است. مدلهایی مانند Cohere Reranker یا Cross-Encoders میتوانند ارتباط نتایج گسترشیافته را ارزیابی کنند و اطمینان حاصل کنند که تنها اسناد مرتبطترین به مرحله تولید ارسال میشوند.
علاوه بر این، پیامدهای تأخیر زمانی را در نظر بگیرید. هر پرسوجوی اضافی یا مرحله گسترش، میلیثانیههایی به زمان پاسخ کلی اضافه میکند. برای برنامههایی که به تأخیر حساس هستند، گسترش واژگانی سبک ممکن است نسبت به بازنویسی سنگین مبتنی بر LLM ترجیح داده شود.
نتیجهگیری
گسترش پرسوجو اهرم قدرتمندی در جعبه ابزار توسعهدهنده RAG است. با عبور از تطبیق ساده کلیدواژه و پذیرش غنیسازی معنایی، میتوانیم سیستمهایی بسازیم که واقعاً نیت کاربر را درک میکنند. چه از طریق دیکشنریهای ساده مترادف و چه از طریق تجزیه پیچیده مبتنی بر LLM، هدف یکسان است: پر کردن شکاف بین نحوه پرسیدن سوالات توسط کاربران و نحوه ذخیره اطلاعات. همانطور که خط لوله RAG خود را اصلاح میکنید، استراتژیهای گسترشی را که تعادل بین فراخوانی و دقت را حفظ میکنند، در اولویت قرار دهید تا اطمینان حاصل کنید دستیار هوش مصنوعی شما هر بار پاسخهای دقیق و آگاه از بافت ارائه میدهد.