RAG چیست؟ راهنمای ۱۴۰۵ با مثال ساده برای فارسی
RAG مخفف Retrieval-Augmented Generation است.
تیمِ فنیِ 1xAi گیتوی را میسازد و میگرداند — همانهایی که هر روز با APIهای OpenAI، Anthropic، Google و DeepSeek از داخلِ ایران کار میکنند. آنچه اینجا میخوانی از همان کارِ روزمره درآمده، نه از بازنویسیِ مستنداتِ انگلیسی. پروفایلِ نویسنده
در این مقالهCONTENTS
۱۷
- ۱. RAG چیست و چه فرقی با فاینتیونینگ دارد؟
- ۲. RAG در عمل چگونه کار میکند؟
- چهار نقطهٔ شکست رایج
- وکتور دیتابیس الزامی نیست
- ارزیابی را دو نیمه کنید
- ۳. چرا RAG برای متن فارسی چالشهای خاص خودش را دارد؟
- چالشها
- راهکار
- انتخاب مدل embedding
- ۴. چطور یک دستیار RAG روی مستندات شرکت بسازیم؟
- هزینهٔ مدلهای پیشنهادی روی گیتوی 1xAi
- سوالات متداول
- rag چیست؟
- rag مخفف چیست؟
- RAG با فاینتیونینگ چه فرقی دارد؟
- آیا RAG توهم مدل را از بین میبرد؟
- هزینهٔ ساخت RAG با API از ایران چقدر است؟
RAG مخفف Retrieval-Augmented Generation است. یعنی پیش از پاسخ، بخشهای مرتبط از اسناد خودتان پیدا میشود و کنار سؤال به مدل زبانی داده میشود تا پاسخ را از روی همانها بنویسد، بیآنکه مدل دوباره آموزش ببیند. این روش توهم را کم میکند ولی حذف نمیکند، و کیفیت نتیجه بیشتر به مرحلهٔ بازیابی بستگی دارد تا به خود مدل. ما در 1xAi گیتوی API را اداره میکنیم، برای همین نمونهها را برای دسترسی از داخل ایران نوشتهایم.
RAG مخفف Retrieval-Augmented Generation است؛ ابتدا بخشهای مرتبط از اسناد پیدا و کنار سؤال به مدل داده میشود و مدل از روی همانها پاسخ میدهد. RAG توهم را کم میکند ولی حذف نمیکند، و کیفیتش بیشتر به مرحلهٔ بازیابی بستگی دارد تا به خود مدل.
ما در 1xAi گیتوی API را اداره میکنیم؛ قیمتها و آمار این مقاله از دادههای زندهٔ خودمان است و ارجاع آن در صفحهٔ models هست.
۱. RAG چیست و چه فرقی با فاینتیونینگ دارد؟
RAG مخفف Retrieval-Augmented Generation است: پیش از پاسخ، متنهای مرتبط از منابع خودتان پیدا میشوند و همراه سؤال در پرامپت به مدل داده میشوند.
پس جواب «rag چیه» در عمل «اول جستوجو، بعد نوشتن» است. بخش بازیابی همان جستوجوی معمولی است و مدل فقط چیزی را میخواند که به دستش دادهاید (ai.developertools.io). «سیستم RAG» یا «rag ai» معمولاً همین خط لوله را میرساند: خرد کردن اسناد، نمایهسازی، بازیابی و تولید پاسخ.
اصطلاح از مقالهٔ ۲۰۲۰ با عنوان Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks آمده است (dev.to). امروز RAG بیشتر الگوی «بازیابی، سپس پرامپت» را میگوید، نه معماری آموزشدیدهٔ آن مقاله.
| فاینتیونینگ | RAG | |
|---|---|---|
| چه چیزی را عوض میکند | رفتار، لحن و قالب خروجی | دانشی که مدل هنگام پاسخ در اختیار دارد |
| بهروزرسانی دانش | آموزش دوباره | تعویض سند |
| وزنهای مدل | تغییر میکنند | دستنخورده میمانند |
این دو رقیب هم نیستند و ترکیبشان رایج است: فاینتیونینگ برای رفتار و RAG برای واقعیتها. مدلی را هم که در پایان پاسخ را مینویسد میتوانید با راهنمای دستیار هوش مصنوعی ۱۴۰۵ برای API، دانشآموز و تصویر انتخاب کنید.
یک محدودیت جدی هم هست: اگر بازیابی اشتباه کند، پاسخ مطمئن و با استناد به منبع غلط تحویل میگیرید. RAG خطا را کم میکند، اما حذفش نمیکند.
۲. RAG در عمل چگونه کار میکند؟
RAG در عمل یک خط لولهٔ چهارمرحلهای است که سند را آماده میکند، مرتبطترین بخشها را پیدا میکند و فقط همانها را به مدل میدهد.
- تکهتکه کردن (chunking): سند به بخشهایی کوچک میشود که هم در پرامپت جا شوند و هم بهتنهایی معنا بدهند. اندازهٔ تکه و انتخاب مدل embedding برای متن فارسی در راهنمای ساخت RAG فارسی: بهترین مدل embedding و chunking جدا بررسی شده است.
- embedding: هر تکه به یک بردار عددی تبدیل میشود.
- ذخیره در وکتور دیتابیس: بردارها همراه متن اصلی ایندکس میشوند.
- بازیابی و تولید پاسخ: پرسش کاربر هم بردار میشود، نزدیکترین تکهها بیرون میآیند و مدل با دستور «فقط از این متن و با ذکر منبع پاسخ بده» جواب مینویسد.
طبق توضیح developertools، سه مرحله از این چهار مرحله مهندسی جستوجوست، نه کار مدل. تیمهایی که RAG را مسئلهٔ مدل میبینند، ماهها پرامپت را روی ایندکس ضعیف تنظیم میکنند.
چهار نقطهٔ شکست رایج
- تکههایی که جدول یا تعریف را از تیترش جدا میکنند، پس هیچ تکهای پاسخ کامل را ندارد.
- جستوجوی صرفاً برداری بدون کلیدواژه؛ کد خطا، نام پارامتر و شمارهٔ نسخه همانجاهاییاند که کاربر دقیق میپرسد و جستوجوی برداری ضعیف عمل میکند.
- ایندکس کهنه، چون کسی صفحههای تغییرکرده را دوباره embedding نکرده است.
- تعداد زیاد تکه در پرامپت، که هزینه را بالا میبرد و تکهٔ درست را لابهلای نزدیکبهتکراریها گم میکند.
وکتور دیتابیس الزامی نیست
جستوجوی BM25 بهتنهایی خط پایهٔ معتبری است، مخصوصاً روی مستندات فنی پر از اصطلاح دقیق. pgvector روی Postgres بخش بزرگی از نیاز را پوشش میدهد و وکتور دیتابیس اختصاصی بیشتر پاسخ به نیاز مقیاس و فیلترگذاری است.
ارزیابی را دو نیمه کنید
اول بپرسید: «آیا تکهٔ حاوی پاسخ در پنج نتیجهٔ اول هست؟» (recall@5). بعد بپرسید: «آیا هر ادعای پاسخ به یک منبع برمیگردد؟» اگر recall@5 پایین باشد، تغییر پرامپت پاسخ را نجات نمیدهد.
۳. چرا RAG برای متن فارسی چالشهای خاص خودش را دارد؟
چون یک واژهٔ فارسی را میشود با چند املا و نویسه نوشت. جستوجوی کلمهبهکلمه و حتی برداری، این نوشتهها را گاهی دو متن جدا میبیند و پاسخ درست را پیدا نمیکند. پروژهٔ متنباز persian-rag پایپلاین خود را حول همین مشکلات ساخته است.
چالشها
- نیمفاصله: «میروم»، «می روم» و «میروم» سه رشتهٔ متفاوتاند، هرچند خواننده یک چیز میفهمد.
- «ي/ی» و «ك/ک»: نسخهٔ عربی و فارسی این حروف کد یونیکد متفاوتی دارند. «كتاب» با «کتاب» در جستوجوی دقیق یکی حساب نمیشود.
- ارقام: عدد ۱۴۰۵ ممکن است با رقم فارسی، عربی یا لاتین ثبت شده باشد.
- PDF معکوس: بعضی PDFها هنگام استخراج، متن را وارونه تحویل میدهند و چنین متنی هرگز با سؤال کاربر تطبیق نمیخورد.
راهکار
مستندات persian-rag نرمالسازی حروف عربی/فارسی، نیمفاصله، ارقام و علائم و نیز ترمیم متن معکوسشدهٔ PDF را بخشی از پایپلاین میداند. نرمالسازی باید پیش از تکهکردن انجام شود و هم روی سند و هم روی سؤال اعمال شود، وگرنه دو طرف تطبیق به زبانهای متفاوت حرف میزنند.
برای بازیابی هم persian-rag جستوجوی ترکیبی BM25 و برداری را با reciprocal rank fusion به کار میگیرد. بخش BM25 در تطبیق دقیق اصطلاحات و کدها کمک میکند و بخش برداری معنای نزدیک را میگیرد.
انتخاب مدل embedding
این یک راهنمای عمومی است، نه نتیجهٔ بنچمارک، و ما نام یا امتیاز مدلی را پیشنهاد نمیکنیم. ۲۰ تا ۳۰ سؤال واقعی فارسی از اسناد خودتان بسازید و برای هر کدام مشخص کنید جواب در کدام تکه است. سپس چند مدل چندزبانه را با همان نرمالسازی و همان تکهها اجرا کنید و recall@5 را مقایسه کنید، یعنی سهم سؤالهایی که تکهٔ درست میان پنج نتیجهٔ اول آمده است. مدلی که روی دادههای خودتان بالاتر باشد، برای شما بهتر است.
۴. چطور یک دستیار RAG روی مستندات شرکت بسازیم؟
ساخت یک دستیار RAG برای مستندات داخلی با Python و API سازگار با OpenAI در کمتر از ۱۰۰ خط کد امکانپذیر است.
نمونهٔ زیر سه مرحلهٔ اصلی را پوشش میدهد: نرمالسازی متن فارسی، تکهکردن اسناد، و بازیابی بدون embedding. این کد نمونهٔ آموزشی است؛ در محیط تولید، بازیابی را با embedding و BM25 ترکیبی جایگزین کنید.
# نیازمندی: pip install openai>=1.0
import re
from openai import OpenAI
# --- مرحله ۱: نرمالسازی متن فارسی ---
def normalize_fa(text: str) -> str:
text = text.replace("ي", "ی").replace("ك", "ک")
# یکسانسازی ارقام عربی به فارسی
ar_to_fa = str.maketrans("٠١٢٣٤٥٦٧٨٩", "۰۱۲۳۴۵۶۷۸۹")
text = text.translate(ar_to_fa)
# یکدستسازی نیمفاصله
text = re.sub(r"\u200c+", "\u200c", text)
return text.strip()
# --- مرحله ۲: تکهکردن ساده ---
def chunk_text(text: str, size: int = 300, overlap: int = 50) -> list[str]:
words = text.split()
chunks = []
for i in range(0, len(words), size - overlap):
chunks.append(" ".join(words[i : i + size]))
return chunks
# --- [شبهکد — مرحلهٔ embedding؛ نام مدل embedding در دوسیه موجود نیست] ---
# embeddings = [embedding_model.encode(chunk) for chunk in chunks]
# index = VectorStore(embeddings, chunks)
# retrieved = index.search(query_embedding, top_k=5)
# -------------------------------------------------------------------
# --- مرحله ۳: بازیابی با امتیاز همپوشانی کلمات (بدون embedding) ---
def retrieve(query: str, corpus: list[str], top_k: int = 3) -> list[str]:
q_words = set(normalize_fa(query).split())
scored = []
for chunk in corpus:
c_words = set(normalize_fa(chunk).split())
score = len(q_words & c_words)
scored.append((score, chunk))
scored.sort(key=lambda x: x[0], reverse=True)
return [c for _, c in scored[:top_k] if _ > 0]
# --- مرحله ۴: فراخوانی مدل ---
client = OpenAI(
base_url="https://1xai.ir/v1",
api_key="YOUR_1XAI_KEY",
)
raw_docs = """
سیاست مرخصی: هر کارمند ۲۰ روز مرخصی سالانه دارد.
فرآیند درخواست: فرم مرخصی را در سامانه HR پر کنید.
تأیید مدیر: درخواست باید ۴۸ ساعت قبل ارسال شود.
"""
docs_normalized = normalize_fa(raw_docs)
corpus = chunk_text(docs_normalized)
query = "چند روز مرخصی دارم؟"
context_chunks = retrieve(query, corpus)
if not context_chunks:
print("پاسخ: اطلاعات مرتبط در منابع یافت نشد.")
else:
context = "\n---\n".join(context_chunks)
response = client.chat.completions.create(
model="gpt-4.1",
messages=[
{
"role": "system",
"content": (
"فقط بر اساس متن زیر پاسخ بده. "
"اگر پاسخ در متن نبود، بگو: «در منابع موجود نیست».\n\n"
f"متن:\n{context}"
),
},
{"role": "user", "content": query},
],
)
print(response.choices[0].message.content)
# خروجی مورد انتظار:
# «طبق سیاست شرکت، هر کارمند ۲۰ روز مرخصی سالانه دارد.»
هزینهٔ مدلهای پیشنهادی روی گیتوی 1xAi
قیمتها از صفحهٔ مدلها بازیابی میشوند و هر روز ساعت ۹:۰۰ تهران با نرخ بازار همگام میشوند. برای مثال، gpt-4.1 با ۶۵۵٬۲۰۰ تومان به ازای هر ۱M توکن ورودی و مارکآپ ۲۰٪ ارائه میشود — گزینهای متعادل برای RAG با حجم متوسط.
| مدل | ورودی / ۱M توکن | خروجی / ۱M توکن | مارکآپ | درخواست ۳۰ روزه (موفق) |
|---|---|---|---|---|
| gpt-4.1 | ۶۵۵٬۲۰۰ تومان | ۲٬۶۲۰٬۸۰۰ تومان | ۲۰٪ | ۱۰۲ / ۱۰۰٪ |
| gpt-5 | ۴۰۹٬۵۰۰ تومان | ۳٬۲۷۶٬۰۰۰ تومان | ۲۰٪ | ۱۱۵ / ۱۰۰٪ |
| deepseek-reasoner | ۹۸٬۲۸۰ تومان | ۳۹۳٬۱۲۰ تومان | ۲۰٪ | ۱۴۸ / ۱۰۰٪ |
پژوهش و نگارش: code-nest.dev
سوالات متداول
rag چیست؟
RAG یعنی ابتدا بخشهای مرتبط از اسناد شما پیدا شود و کنار سؤال به مدل زبانی داده شود، سپس مدل از روی همانها پاسخ بدهد. برای تازه نگه داشتن دانش لازم نیست مدل را دوباره آموزش دهید؛ فقط سندها را عوض میکنید. کیفیت پاسخ بیشتر به مرحلهٔ بازیابی بستگی دارد تا به خود مدل.
rag مخفف چیست؟
RAG مخفف Retrieval-Augmented Generation است، یعنی «تولید پاسخ با کمک بازیابی». ریشهٔ آن مقالهٔ ۲۰۲۰ با عنوان Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks است. امروز معمولاً منظور از آن الگوی «بازیابی، سپس پرامپت» است، نه معماری آموزشدیدهٔ همان مقاله.
RAG با فاینتیونینگ چه فرقی دارد؟
فاینتیونینگ رفتار، لحن و قالب پاسخ مدل را تغییر میدهد. RAG دانش را در لحظهٔ پاسخ به مدل میرساند و بهروزرسانیاش فقط تعویض سند است. این دو رقیب هم نیستند و ترکیبشان رایج است؛ مثلاً فاینتیونینگ برای لحن و RAG برای محتوای بهروز.
آیا RAG توهم مدل را از بین میبرد؟
خیر، فقط آن را کم میکند. اگر بازیابی بخش اشتباهی را برگرداند، مدل ممکن است با اطمینان و با استناد به همان منبع غلط جواب بدهد. برای همین باید کیفیت بازیابی را جداگانه روی سؤالهای فارسی واقعی خودتان آزمایش کنید.
هزینهٔ ساخت RAG با API از ایران چقدر است؟
چون متن بازیابیشده به ورودی هر درخواست اضافه میشود، هزینهٔ توکن ورودی مهم است. طبق قیمتهای زندهٔ 1xAi، با ۲۰٪ مارکآپ برای هر دو مدل، هر یک میلیون توکن ورودی برای deepseek-reasoner برابر ۹۸٬۲۸۰ تومان و برای gpt-4.1 برابر ۶۵۵٬۲۰۰ تومان است. این قیمتها هر روز صبح ساعت ۹ بهوقت تهران با نرخ بازار دلار هماهنگ میشوند، پس عدد نهایی را همیشه از صفحهٔ مدلها بخوانید.
1xAi
تیمِ 1xAi پروکسیِ تخصصیِ مدلهای OpenAI، Claude، Gemini و DeepSeek — و همچنین Grok، Kimi، GLM، Qwen، MiniMax و Hunyuan — برای کاربرانِ ایرانی را اداره میکند — از زیرساختِ شبکه تا صورتحسابِ تومانی. هرچه اینجا مینویسیم بر اساسِ تجربهٔ روزانه با APIهای OpenAI، Anthropic و Google و نیازهای واقعیِ توسعهدهندگانِ داخلِ ایران است.
