سیستمهای تولید تقویتشده با بازیابی (RAG) سنتی اغلب فرض میکنند که اسناد بازیابیشده همیشه مرتبط با پرسش کاربر هستند. با این حال، در سناریوهای واقعی، بازیابها ممکن است به دلیل پرسشهای مبهم، انبارهای برداری منقضیشده یا همراستایی ضعیف جاسازیها شکست بخورند. وقتی یک سیستم RAG بر اساس زمینهای نامرتبط پاسخ تولید میکند، نتیجه اغلب یک توهم است. RAG اصلاحی (CRAG) با معرفی یک لایه ارزیابی خودکار که کیفیت تکههای بازیابیشده را ارزیابی میکند و در صورت نیاز مکانیزمهای جایگزین، مانند جستجوی وب، را فعال میکند، به این مشکل میپردازد.
معماری CRAG
فلسفه اصلی پشت CRAG «ارزیابی، سپس اقدام» است. به جای عبور کورکورانه اسناد بازیابیشده به مدل زبانی بزرگ (LLM)، CRAG از یک طبقهبند سبکوزن یا خود LLM برای قضاوت درباره مرتبط بودن نتایج برتر-k استفاده میکند. این قضاوت معمولاً بازیابی را به سه حالت تقسیم میکند:
- درست: اسناد بازیابیشده حاوی اطلاعات کافی برای پاسخ به پرسش هستند. سیستم با RAG استاندارد ادامه میدهد.
- مبهم: اسناد ممکن است مفید باشند اما از کامل بودن برخوردار نیستند. سیستم ممکن است جستجو را اصلاح کند یا پرامپت را تقویت کند.
- نادرست: اسناد نامرتبط هستند. سیستم زمینه محلی را دور میریزد و یک جستجوی وب را برای یافتن اطلاعات تازه و قابل اعتماد فعال میکند.
پیادهسازی ارزیابی مرتبط بودن
اگرچه میتوان از مدلهای طبقهبندی اختصاصی استفاده کرد، اما یک رویکرد رایج و مؤثر برای CRAG، استفاده از LLM برای انجام طبقهبندی بدون نمونه (zero-shot) یا با چند نمونه (few-shot) از کیفیت بازیابی است. در زیر یک مثال پایتون با استفاده از LangChain آورده شده است که نشان میدهد چگونه میتوانید این منطق را ساختار دهید.
from langchain_community.llms import OpenAI
from langchain.prompts import ChatPromptTemplate
def assess_relevance(query: str, context: str, llm: OpenAI) -> str:
"""
از یک LLM برای ارزیابی اینکه آیا زمینه بازیابیشده مرتبط با پرسش است یا خیر، استفاده میکند.
'درست'، 'مبهم' یا 'نادرست' را برمیگرداند.
"""
prompt_template = ChatPromptTemplate.from_template(
"""
شما یک طبقهبند مرتبط بودن هستید. پرسش و زمینه بازیابیشده زیر را تحلیل کنید.
پرسش: {query}
زمینه: {context}
مرتبط بودن زمینه با پرسش را تعیین کنید.
- درست: زمینه مستقیماً به پرسش پاسخ میدهد.
- مبهم: زمینه تا حدی مرتبط است اما جزئیات کلیدی را ندارد.
- نادرست: زمینه کاملاً بیربط است.
فقط با یک کلمه پاسخ دهید: درست، مبهم یا نادرست.
"""
)
chain = prompt_template | llm
return chain.invoke({"query": query, "context": context}).content.strip()
# منطق نمونه استفاده
query = "آخرین وضعیت توافقنامه پاریس چیست؟"
retrieved_context = "زمین سومین سیاره از خورشید است..."
relevance_score = assess_relevance(query, retrieved_context, llm)
if relevance_score == "نادرست":
# فعالسازی جایگزین جستجوی وب
print("بازیابی شکست خورد. جستجوی وب فعال میشود...")
# web_search_results = search_engine(query)
# final_context = web_search_results
elif relevance_score == "مبهم":
print("بازیابی مبهم است. با منابع اضافی تقویت میشود...")
else:
print("بازیابی موفق بود. از زمینه محلی استفاده میشود.")
مکانیزم جایگزین جستجوی وب
وقتی ارزیابی نتیجه «نادرست» را تولید میکند، CRAG بار یافتن اطلاعات را از پایگاه داده برداری ایستا به APIهای جستجوی وب پویا منتقل میکند. این کار اطمینان حاصل میکند که LLM به دادههای بهروز و دقیق از نظر واقعیت دسترسی دارد و نرخ توهم را به طور قابل توجهی کاهش میدهد. بسیار حیاتی است که برای مدیریت مؤثر هزینهها و سهمیههای API، محدودیت نرخ و کشینگ را برای این جستجوهای وب پیادهسازی کنید.
نتیجهگیری
RAG اصلاحی یک گام مهم به جلو در ساخت برنامههای پایدار LLM است. با اعتماد نکرده به فرآیند بازیابی به صورت کورکورانه، توسعهدهندگان میتوانند سیستمهایی بسازند که خوداصلاحشونده هستند و به پرسشهای پیچیده کاربر سازگار میشوند. پیادهسازی CRAG نیاز به محاسبات اضافی برای مرحله ارزیابی دارد، اما معامله آن دقت و قابلیت اعتماد به مراتب بهبود یافته پاسخهاست، که آن را به یک الگوی ضروری برای خطوط لوله RAG درجه تولید تبدیل میکند.