Retrieval-Augmented Generation (RAG)
RAG راهی است برای اینکه به یک مدل زبانی، دانشی فراتر از چیزی که در آموزشش دیده بدهیم — بدون نیاز به آموزش مجدد مدل.
RAG چیست؟
Retrieval-Augmented Generation یعنی «تولید متن تقویتشده با بازیابی». بهجای اینکه فقط به دانش داخلی مدل تکیه کنیم، ابتدا اسناد مرتبط با سوال کاربر را از یک پایگاهدانش بیرونی بازیابی میکنیم، سپس آنها را بهعنوان کانتکست اضافه، همراه سوال اصلی به مدل میدهیم تا پاسخ را بر همان اساس تولید کند.
چرا RAG؟
- کاهش Hallucination — پاسخ بر پایهی سند واقعی است، نه فقط حافظهی پارامتری مدل
- دانش بهروز — بدون فاینتیون مجدد، کافی است سند جدید را به پایگاهدانش اضافه کنید
- دانش اختصاصی — مدل عمومی میتواند دربارهی دادههای خصوصی سازمان شما (که هرگز در آموزش عمومیاش ندیده) پاسخ دهد
- قابل استناد — میتوانید منبع دقیق هر پاسخ را نشان دهید
پایپلاین RAG
Chunking و Embedding
اسناد بزرگ ابتدا به قطعات کوچکتر (Chunk) شکسته میشوند تا هر قطعه بهاندازهی کافی متمرکز و در پنجره کانتکست جا شود. سپس هر قطعه با یک مدل Embedding به یک بردار عددی (نمایش معنایی) تبدیل میشود؛ متنهایی با معنای نزدیک، بردارهایی نزدیک به هم دارند.
پایگاهداده برداری (Vector DB)
این بردارها در یک پایگاهداده برداری ذخیره میشوند که برای جستوجوی «نزدیکترین همسایهها» (Nearest Neighbor Search) بهینه شده. وقتی پرسش کاربر هم به بردار تبدیل شود، پایگاهداده میتواند در میان میلیونها سند، نزدیکترینها را در چند میلیثانیه پیدا کند.
جستوجوی ترکیبی (Hybrid Search) و Re-ranking
جستوجوی برداری بهتنهایی همیشه بهترین انتخاب نیست: برای عبارات دقیق مثل نام مدل یا کد محصول (مثلاً SKU-4471)،
جستوجوی کلیدواژهای سنتی (BM25) اغلب دقیقتر از جستوجوی معنایی عمل میکند، چون بردارها برای «شباهت مفهومی» بهینه شدهاند نه تطابق دقیق.
- Hybrid Search — نتایج جستوجوی برداری و جستوجوی کلیدواژهای هر دو گرفته میشوند و با یک فرمول وزندهی ترکیب میشوند؛ این ترکیب معمولاً دقت را نسبت به هرکدام بهتنهایی بالا میبرد.
- Re-ranking — مرحلهی دوم و اختیاری: بعد از بازیابی اولیهی N نتیجه (مثلاً ۵۰ سند)، یک مدل کوچکتر و دقیقتر (Cross-Encoder) این نتایج را دوباره امتیازدهی میکند تا فقط K مورد برتر (مثلاً ۴ سند) واقعاً به مدل زبانی اصلی داده شود. این مرحله کندتر از جستوجوی برداری است، به همین دلیل فقط روی مجموعهی کوچکشده اجرا میشود، نه کل پایگاهداده.
نمونه کد: یک پایپلاین ساده
def answer_with_rag(question, vector_db, llm):
query_vector = embed(question)
top_chunks = vector_db.similarity_search(query_vector, k=4)
context = "\n\n".join(chunk.text for chunk in top_chunks)
prompt = f"با استفاده از متن زیر به سوال پاسخ بده:\n\n{context}\n\nسوال: {question}"
return llm.generate(prompt)
محدودیتها
- کیفیت پاسخ کاملاً وابسته به کیفیت بازیابی است؛ اگر سند مرتبط پیدا نشود، مدل یا حدس میزند یا اشتباه میگوید
- RAG ساده هر بار فقط یک جستوجو انجام میدهد؛ برای سوالات چندمرحلهای کافی نیست — به همین دلیل Agentic RAG شکل گرفت
سوالات متداول
آیا RAG جایگزین Fine-tuning میشود؟
معمولاً نه جایگزین، بلکه مکمل. RAG برای دانش «تازه و قابلتغییر» عالی است؛ Fine-tuning برای تغییر سبک یا رفتار مدل مناسبتر است.
RAG چه ارتباطی به تجارت عاملمحور دارد؟
یک ایجنت خرید میتواند از RAG برای جستوجوی معنایی در کاتالوگ محصولات استفاده کند — همان کاری که در پسزمینهی قابلیت search_offers در UCP هم رخ میدهد.