ساخت RAG فارسی: مدل embedding بهترین
برای ساخت RAG فارسی که واقعاً جواب درست بدهد، دو انتخاب مهمتر از بقیه است: مدل embedding و روش chunking، چون خطای هرکدام مستقیم در دقت بازیابی خودش را نشان…
تیمِ فنیِ 1xAi گیتوی را میسازد و میگرداند — همانهایی که هر روز با APIهای OpenAI، Anthropic، Google و DeepSeek از داخلِ ایران کار میکنند. آنچه اینجا میخوانی از همان کارِ روزمره درآمده، نه از بازنویسیِ مستنداتِ انگلیسی. پروفایلِ نویسنده
در این مقالهCONTENTS
۱۵
- H2 ۱: مدلهای embedding فارسی: کدام یک برای RAG بهترین است؟
- مدلهای embedding خانوادهٔ OpenAI: text-embedding-3-small و text-embedding-3-large
- ParsBERT و Tooka: جایگزین متنباز
- H2 ۲: چالشهای chunking و tokenization برای فارسی
- مشکل نیمفاصله و فاصله
- اندازهٔ chunk مناسب برای فارسی
- Milvus: مقیاسپذیری برای حجم بالای داده
- H2 ۴: پیادهسازی عملی: چتبات پشتیبانی فارسی
- معماری کلی سیستم
- کد نمونه
- سوالات متداول
- RAG فارسی چیست و چرا با ChatGPT معمولی فرق دارد؟
- کدام مدل embedding برای متن فارسی بهتر است؟
- آیا برای ساخت RAG فارسی نیاز به کارت بانکی خارجی یا VPN دارم؟
- هزینهٔ ساخت یک چتبات RAG فارسی چقدر تومان میشود؟
برای ساخت RAG فارسی که واقعاً جواب درست بدهد، دو انتخاب مهمتر از بقیه است: مدل embedding و روش chunking، چون خطای هرکدام مستقیم در دقت بازیابی خودش را نشان میدهد. این راهنما نشان میدهد کدام embedding برای متن فارسی جواب میدهد، چگونه از طریق 1xai.ir بدون کارت خارجی و بدون VPN به آن متصل شوید، و هزینهٔ واقعی به تومان چقدر میشود (طبق 1xai.ir/pricing، قیمتها هر روز ساعت ۹ صبح بهوقت تهران با نرخ بازار بهروزرسانی میشوند).
ما در 1xAi یک گیتوی LLM را برای توسعهدهندگان ایرانی اداره میکنیم و این متن را از دل همان تجربهٔ عملیاتی نوشتهایم، نه صرفاً معرفی مفهومی RAG. ساخت RAG فارسی معمولاً به سه انتخاب معماری متفاوت از نسخهٔ انگلیسی نیاز دارد: یک مدل embedding فارسی که ریختشناسی زبان را میفهمد، یک استراتژی chunking متن فارسی که با نیمفاصله و پسوندهای چسبیده سازگار باشد، و یک vector database که این بردارها را در مقیاس واقعی نگه دارد.
این راهنما مسیر عملی ساخت یک چتبات پشتیبانی یا موتور جستجوی هوشمند فارسی را نشان میدهد — انتخاب مدلها، هزینهٔ واقعی هر مرحله (بر اساس فهرست مدلها و قیمتهای زندهٔ 1xai.ir/models)، و کدهایی که میتوانید همین امروز امتحان کنید، نه فقط توضیح اینکه RAG چیست.
H2 ۱: مدلهای embedding فارسی: کدام یک برای RAG بهترین است؟
برای rag فارسی، دقت بازیابی بهطور مستقیم به کیفیت embedding وابسته است — انتخاب بین مدلهای انگلیسیمحور OpenAI و مدلهای متنباز فارسی مثل ParsBERT یا Tooka، تفاوت محسوسی در نتیجهٔ نهایی سیستم ایجاد میکند. ما در 1xAi این gateway را اداره میکنیم و دسترسی به مدلهای OpenAI را از طریق یک اندپوینت اختصاصی سازگار با API خود OpenAI فراهم کردهایم، بنابراین این بخش را هم از زاویهٔ کسی مینویسیم که این مسیر را عملیاتی میکند.
مدلهای embedding خانوادهٔ OpenAI: text-embedding-3-small و text-embedding-3-large
برای بیشتر پروژههای تجاری RAG فارسی، انتخاب اصلی بین دو مدل embedding خانوادهٔ OpenAI است: نسخهٔ small با هزینهٔ کمتر و نسخهٔ large با دقت بازیابی بالاتر. هر دو مدل روی متون فارسی هم آموزش دیدهاند و اکثر پروژههای تجاری همچنان از همین دو مدل استفاده میکنند. text-embedding-3-large با ۳۰۷۲ بعد بردار خروجی، دقت بازیابی بالاتری نسبت به نسخهٔ small میدهد اما حجم محاسبات و ذخیرهسازی بردار در vector database فارسی هم بیشتر میشود. اگر بودجهٔ محاسباتی محدود است یا حجم اسناد زیاد است، text-embedding-3-small معمولاً کافی است؛ برای بهترین embedding فارسی از نظر دقت، text-embedding-3-large ارجحتر است.
نمونهٔ سازگار با کلاینتهای OpenAI-compatible از طریق 1xAi، با همان base_url که برای سایر مدلهای چت هم استفاده میکنید (بسته به نسخهٔ SDK نصبشدهٔ شما، سینتکس دقیق ممکن است کمی متفاوت باشد):
from openai import OpenAI
client = OpenAI(
api_key="your-1xai-key",
base_url="https://1xai.ir/v1"
)
response = client.embeddings.create(
model="text-embedding-3-large",
input="متن فارسی برای embedding و بازیابی در سیستم RAG"
)
vector = response.data[0].embedding
قیمت لحظهای هر مدل embedding — چه small چه large — و فهرست کامل مدلهای در دسترس در 1xai.ir/models و 1xai.ir/pricing قابل بررسی است، چون این اعداد با نرخ روزانهٔ دلار همگام میشوند.
ParsBERT و Tooka: جایگزین متنباز
ParsBERT و Tooka دو embedding model فارسی متنباز هستند که بدون نیاز به API خارجی و روی زیرساخت داخلی قابل اجرا هستند.
H2 ۲: چالشهای chunking و tokenization برای فارسی
مهمترین چالش chunking متن فارسی این است که اگر ساختار ریختی زبان —پسوندها، پیشوندها، نیمفاصلهها و ضمایر متصل— با tokenizer نامناسب بریده شود، پارهای از کلمه در یک chunk و باقیاش در chunk بعدی میافتد و بردار embedding معنای درستی نمیگیرد. این مسئله مستقیماً روی کیفیت بازیابی در هر سیستم rag فارسی اثر میگذارد، چون قبل از هر چیز باید متن درست تکهتکه شود.
مشکل نیمفاصله و فاصله
مشکل اصلی نیمفاصله در فارسی این است که اگر tokenizer آن را نادیده بگیرد، یک کلمهٔ واحد به دو توکن بیمعنا تبدیل میشود. فارسی کلماتی مثل «میروم» را با نیمفاصله (کاراکتر U+200C) مینویسد، و اگر tokenizer عمومی این کاراکتر را با فاصلهٔ معمولی یکسان بگیرد، «می» و «روم» دو توکن جدا از هم میشوند. راهکار عملی استفاده از یک tokenizer فارسیشناس مثل Hazm است که نیمفاصله را بهدرستی بخشی از یک کلمه میشناسد؛ نمونهٔ زیر سادهشده است تا فقط منطق کار را نشان دهد:
from hazm import Tokenizer
tokenizer = Tokenizer()
text = "میروم به خانه"
tokens = tokenizer.tokenize
# خروجی: ['میروم', 'به', 'خانه']
اندازهٔ chunk مناسب برای فارسی
انتخاب اندازهٔ chunk برای متن فارسی معمولاً با بازهٔ رایج در متون انگلیسی فرق دارد؛ بازهٔ ۳۰۰ تا ۵۰۰ کلمه میتواند نقطهٔ شروع خوبی باشد، چون فارسی بهخاطر پسوند و پیشوندهای چسبیده اطلاعات را نسبتاً متراکمتر حمل میکند. این عدد یک قاعدهٔ تجربی است، نه استاندارد ثابت؛ بهتر است آن را روی دادهٔ خودتان بسنجید و تنظیم کنید. عدد ۴۰۰ کلمه بهعنوان نقطهٔ شروع، هم زمینهٔ کافی برای embedding میسازد و هم از پر شدن بیمورد context window جلوگیری میکند؛ همپوشانی حدود ۵۰ کلمه هم کمک میکند جملهای بین دو chunk قطع نشود:
from hazm import Tokenizer
def chunk_persian_text(text, chunk_size=400, overlap=50):
tokenizer = Tokenizer()
words = tokenizer.tokenize
chunks = []
step = chunk_size - overlap
for i in range(0, len(words), step):
chunk = words[i:i + chunk_size]
if chunk:
chunks.
## H2 ۳: انتخاب Vector Database برای RAG فارسی
انتخاب vector database برای rag فارسی یعنی پیدا کردن تعادل بین سرعت جستجو، دقت بازیابی و هزینهٔ نگهداری؛ سه گزینهٔ رایج Pinecone، Weaviate و Milvus هستند. هیچکدام ذاتاً «برای فارسی» طراحی نشدهاند — کیفیت جستجو بیشتر به embedding model فارسی که انتخاب میکنید بستگی دارد تا به خود دیتابیس، اما معماری هرکدام تجربهٔ توسعه را متفاوت میکند.
### Pinecone: سریعترین مسیر برای MVP
Pinecone برای پروژههایی که میخواهند سریع یک نمونهٔ اولیه بسازند مناسبترین گزینه است، چون یک سرویس کاملاً ابری و مدیریتشده است و نیازی به راهاندازی و نگهداری سرور ندارید. هزینهٔ آن بر اساس تعداد بردار ذخیرهشده محاسبه میشود. **نکتهٔ کلیدی: اگر هدف MVP سریع است، Pinecone زمان راهاندازی را کوتاه میکند، اما کنترل زیرساخت را از دست میدهید.**
### Weaviate: کنترل بیشتر و پشتیبانی از hybrid search
Weaviate برای تیمهایی که میخواهند هزینه و داده را کنترل کنند مناسبتر است، چون متنباز است و میتوان آن را هم محلی و هم روی ابر اجرا کرد. ویژگی مهم Weaviate برای معماری rag فارسی پشتیبانی از hybrid search است — ترکیب جستجوی کلیدواژهای با جستجوی معنایی که در متون فارسی با اشکال نوشتاری متفاوت یک کلمه کمک زیادی میکند.
```python
import weaviate
client = weaviate.Client("http://localhost:8080")
# ایجاد کلاس
class_obj = {
"class": "PersianDocument",
"properties": [
{"name": "content", "dataType": ["text"]},
{"name": "source", "dataType": ["text"]}
]
}
client.schema.create_class
Milvus: مقیاسپذیری برای حجم بالای داده
Milvus برای دیتاستهای بزرگ و ترافیک جستجوی سنگین طراحی شده است، چون متنباز است و معماری توزیعشده دارد؛ اگر آرشیو اسناد فارسی شما به میلیونها chunk میرسد، این معماری گزینهٔ واقعبینانهتری نسبت به راهاندازی چند نمونه از Weaviate است.
برای تیمهایی که میخواهند پایپلاین کامل RAG — از تولید embedding تا اتصال به یک vector database — را بدون ساخت از صفر پیادهسازی کنند، ما در 1xAi از طریق فرم درخواست سفارشی پروژههای یکپارچهسازی اختصاصی میپذیریم.
H2 ۴: پیادهسازی عملی: چتبات پشتیبانی فارسی
ساخت یک چتبات پشتیبانی فارسی با RAG یعنی زنجیرهای از شش مرحله را به هم وصل کنید: chunking متن فارسی، تولید embedding، ذخیره در vector database، جستوجوی برداری و در نهایت فراخوانی LLM برای تولید پاسخ. پیش از شروع کد، شفاف بگوییم: 1xAi همان گیتوی LLM را که در این نمونه به کار میبریم خودمان اداره میکنیم، پس ارقام قیمتی که در ادامه میآید دادههای عملیاتی خودمان است نه یک منبع بیطرف بیرونی.
معماری کلی سیستم
معماری rag فارسی برای این سناریو از شش گام تشکیل میشود؛ این ترتیب همان الگوی استاندارد بازیابی-افزودن-تولید (RAG) است که با ابزارهای فارسی پیادهسازی میشود.
۱. دادههای پشتیبانی (تیکتها، مستندات، پرسشهای متداول) را با Hazm chunk کنید. ۲. برای هر تکه متن، embedding تولید کنید — با یک مدل embedding از فهرست 1xai.ir/models. ۳. بردارها را در یک vector database فارسی مثل Weaviate ذخیره کنید. ۴. سؤال کاربر را با همان مدل embedding به بردار تبدیل کنید. ۵. نزدیکترین بردارها را از Weaviate بازیابی کنید. ۶. متن بازیابیشده را همراه سؤال به LLM بدهید تا پاسخ نهایی تولید شود.
کد نمونه
کد زیر یک نمونهٔ سادهشدهٔ مفهومی است تا منطق زنجیره را نشان دهد؛ بسته به نسخهٔ SDK و کتابخانههای نصبشده ممکن است لازم باشد جزئیات فراخوانی را با مستندات همان نسخه تطبیق دهید.
import [openai](/kharid/openai)
import weaviate
from hazm import Tokenizer
# تنظیم اتصال به 1xAi (سازگار با کلاینتهای OpenAI-compatible)
client = openai.OpenAI(
base_url="https://1xai.ir/v1",
api_key="your-1xai-key"
)
# Weaviate بهعنوان vector database
weaviate_client = weaviate.Client("http://localhost:8080")
# Tokenizer فارسی برای chunking دقیقتر
tokenizer = Tokenizer()
def chunk_text(text, chunk_size=500):
words = tokenizer.tokenize # فراخوانی روی متن، نه ارجاع به خود تابع
return [" ".join(words[i:i+chunk_size]) for i in range(0, len(words), chunk_size)]
def embed: # نام دقیق را از 1xai.ir/models بردارید
resp = client.embeddings.
This article was researched and written by the IT Master content engine.
سوالات متداول
RAG فارسی چیست و چرا با ChatGPT معمولی فرق دارد؟
RAG قبل از پاسخدهی مدل زبانی، اطلاعات مرتبط را از یک پایگاه دانش اختصاصی (مثل مقالات سایت یا تیکتهای پشتیبانی شما) بازیابی میکند و به پرامپت اضافه میکند. برخلاف ChatGPT معمولی که فقط از دانش عمومی آموزشدیده استفاده میکند، RAG پاسخها را بر اساس دادههای واقعی و بهروز کسبوکار شما پایهگذاری میکند و توهم را کاهش میدهد (تعریف کاملتر در [ویکیپدیای فارسی: تولید افزوده با بازیابی](https://fa.wikipedia.org/wiki/%D8%AA%D9%88%D9%84%DB%8C%D8%AF_%D8%A7%D9%81%D8%B2%D9%88%D8%AF%D9%87_%D8%A8%D8%A7_%D8%A8%D8%A7%D8%B2%DB%8C%D8%A7%D8%A8%DB%8C)).
کدام مدل embedding برای متن فارسی بهتر است؟
انتخاب مدل embedding به بودجهٔ محاسباتی و سطح دقت موردنیاز شما بستگی دارد؛ مدلهای OpenAI مثل text-embedding-3-small (اقتصادی) و text-embedding-3-large (دقت بالاتر، ۳۰۷۲ بعد) روی متن فارسی معمولاً عملکرد خوبی دارند و پشتیبانی گستردهتری نسبت به مدلهای متنباز فارسی مثل ParsBERT دارند. برای هر مدل embedding که انتخاب میکنید، حتماً پیش از استفاده در فهرست مدلهای در دسترس در [1xai.ir/models](https://1xai.ir/models) بررسی کنید که همان نام دقیقاً پشتیبانی میشود.
آیا برای ساخت RAG فارسی نیاز به کارت بانکی خارجی یا VPN دارم؟
خیر، با استفاده از درگاههایی مثل 1xai.ir میتوانید بدون کارت خارجی و بدون VPN به API مدلهای OpenAI، Gemini و DeepSeek دسترسی داشته باشید و هزینه را به تومان پرداخت کنید. کافی است `base_url` کلاینت سازگار با OpenAI را به آدرس `https://1xai.ir/v1` تغییر دهید و از کلید API همان سرویس استفاده کنید (جزئیات دقیق فراخوانی ممکن است بسته به نسخهٔ SDK کمی تفاوت داشته باشد).
هزینهٔ ساخت یک چتبات RAG فارسی چقدر تومان میشود؟
هزینه به مدل انتخابی بستگی دارد؛ مثلاً طبق قیمت زندهٔ 1xAi هر ۱ میلیون توکن ورودی gemini-2.
1xAi
تیمِ 1xAi پروکسیِ تخصصیِ مدلهای OpenAI، Claude و Gemini برای کاربرانِ ایرانی را اداره میکند — از زیرساختِ شبکه تا صورتحسابِ تومانی. هرچه اینجا مینویسیم بر اساسِ تجربهٔ روزانه با APIهای OpenAI، Anthropic و Google و نیازهای واقعیِ توسعهدهندگانِ داخلِ ایران است.
