Retrieval-Augmented Generation (RAG)

افزایش دقت RAG: بررسی عمیق تکنیک‌های گسترش کوئری

تولید تقویت‌شده با بازیابی (RAG) به معماری استاندارد برای ساخت برنامه‌های مدل زبانی بزرگ (LLM) آماده تولید تبدیل شده است. با مستندسازی مدل‌های تولیدی در پایگاه‌های دانش خارجی، سازمان‌ها می‌توانند توهم‌ها را کاهش داده و ارجاعات ارائه دهند. با این حال، یک گلوگاه حیاتی باقی مانده است: کیفیت مرحله بازیابی. اگر کوئری اولیه با معنای سمانتیک اسناد ذخیره‌شده مطابقت نداشته باشد، حتی قدرتمندترین LLM نیز نتایج ضعیفی تولید می‌کند.

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

چرا جستجوی وکتوری ساده شکست می‌خورد

فرض کنید کاربری می‌پرسد: "لپ‌تاپ من روشن نمی‌شود." یک جستجوی سمانتیک ساده ممکن است به دنبال اسنادی بگردد که حاوی آن کلمات دقیق یا همسایگان وکتوری نزدیک باشند. با این حال، راهنمای عیب‌یابی مرتبط در پایگاه دانش شما ممکن است با عنوان "عیب‌یابی مشکلات برق در هنگام شکست بوت دستگاه" نام‌گذاری شده باشد.

در این سناریو، شکاف واژگانی و سمانتیک بین کوئری غیررسمی کاربر و عنوان رسمی سند باعث شکست در بازیابی می‌شود. گسترش کوئری این شکاف را با تولید نسخه‌های متعدد از کوئری پر می‌کند که هر کدام بر جنبه‌ها یا مترادف‌های مختلف تمرکز دارند.

استراتژی‌های رایج گسترش کوئری

سه روش اصلی برای پیاده‌سازی گسترش کوئری در یک خط لوله RAG وجود دارد:

1. گسترش چند وکتوری (RQ-RAG)

این رویکرد از یک مدل اختصاصی برای تجزیه یک کوئری واحد به چندین وکتور سمانتیک استفاده می‌کند. هر وکتور دیدگاه متفاوتی از قصد کاربر را ثبت می‌کند. هنگام جستجو، سیستم یک جستجوی شباهت را برای تمام وکتورهای گسترش‌یافته انجام داده و نتایج را ادغام می‌کند.

2. گسترش مصنوعی مبتنی بر LLM

در اینجا، یک LLM با پرامپت برای بازنویسی کوئری اصلی تحریک می‌شود. این مدل ممکن است مترادف‌ها، سوالات مرتبط یا یک بیانیه گسترده‌تر تولید کند. این روش بسیار انعطاف‌پذیر است اما تأخیر و هزینه را افزایش می‌دهد.

3. گسترش کلمه کلیدی و خط تیره‌دار

ترکیب جستجوی وکتوری متراکم با جستجوی واژگانی پراکنده (مانند BM25). با استخراج کلمات کلیدی از کوئری و جستجو برای آن‌ها در کنار نمایش وکتوری، تطبیق‌های دقیقی را که جستجوی سمانتیک ممکن است از قلم بیندازد، به دست می‌آورید.

پیاده‌سازی گسترش کوئری مبتنی بر LLM

در زیر یک مثال عملی پایتون با استفاده از LangChain و یک LLM برای تولید variations متعدد کوئری آورده شده است. این تکنیک اغلب به عنوان "HyDE" (امبدینگ‌های سند فرضی) یا بازیابی چند کوئری نامیده می‌شود.

from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain

# تعریف پرامپت برای تولید کوئری‌های مرتبط
prompt_template = """You are an AI assistant tasked with improving search results. 
Given the following user query, generate 3 distinct variations that might retrieve more relevant documents. 
Focus on synonyms, related technical terms, and different phrasing.

User Query: "{query}"

Generated Variations:
1.
2.
3.
"""

llm_chain = LLMChain(
    llm=OpenAI(temperature=0), 
    prompt=PromptTemplate(
        input_variables=["query"], 
        template=prompt_template
    )
)

# مثال استفاده
original_query = "How to fix database connection timeout in Python?"
response = llm_chain.run(original_query)

# در یک خط لوله واقعی، شما باید پاسخ را به یک لیست از رشته‌ها تجزیه کنید
# و آن رشته‌ها را به retriever پایگاه داده وکتوری خود ارسال کنید.
print(response)

بهترین روش‌ها و ملاحظات

در حالی که گسترش کوئری به طور قابل توجهی فراخوانی (recall) را بهبود می‌بخشد، با ملاحظات همراه است. تأخیر افزایش می‌یابد زیرا شما تماس‌های API اضافی به LLM و جستجوهای چندگانه پایگاه داده انجام می‌دهید. هزینه نیز به دلیل مصرف توکن بالاتر افزایش می‌یابد.

برای کاهش این مشکلات، بهترین روش‌های زیر را در نظر بگیرید:

  • پنهان‌سازی (Caching): کوئری‌های گسترش‌یافته را پنهان کنید تا از محاسبات اضافی برای اصطلاحات جستجوی رایج جلوگیری شود.
  • بازرتبه‌بندی نتایج: از یک رنکرر متقاطع (cross-encoder) روی نتایج برتر-K از تمام کوئری‌های گسترش‌یافته استفاده کنید تا اطمینان حاصل شود که زمینه نهایی بسیار مرتبط است.
  • جستجوی هیبریدی: گسترش کوئری را با تطبیق کلمه کلیدی BM25 ترکیب کنید تا هم قصد سمانتیک و هم اصطلاحات دقیق را به دست آورید.

نتیجه‌گیری

گسترش کوئری فقط یک ویژگی اختیاری نیست؛ بلکه یک جزء اساسی از سیستم‌های RAG مستحکم است. با درک این واقعیت که کوئری‌های کاربر اغلب پراکنده و مبهم هستند، توسعه‌دهندگان می‌توانند استراتژی‌های گسترشی را پیاده‌سازی کنند که شکاف بین قصد انسان و بازیابی ماشین را پر می‌کنند. چه تجزیه چند وکتوری را انتخاب کنید و چه کوئری‌های مصنوعی هدایت‌شده توسط LLM، هدف یکسان است: ارائه زمینه دقیق مورد نیاز به LLM برای تولید پاسخ‌های دقیق، مفید و مستند.

همان‌طور که معماری‌های RAG تکامل می‌یابند، ادغام گسترش پویای کوئری برنامه‌های سطح تولید را از نمونه‌های آزمایشی متمایز خواهد کرد. ساده شروع کنید، معیارهای بازیابی خود را اندازه‌گیری کنید و تکرار نمایید.

Share: