Embeddings یکی از پایهایترین مفاهیم AI مدرن است. هر چیزی که در دنیای AI «معنایی» اتفاق میافتد — جستجوی هوشمند، recommendation در نتفلیکس، چتبات پشتیبانی، RAG، تشخیص spam — همه بر پایهی embedding هستند. در این مقاله یاد میگیریم embedding چیست، چطور کار میکند، کدام مدل برای فارسی بهتر است، چه vector database انتخاب کنیم، و یک مثال عملی Python برای پیادهسازی semantic search.
Embedding چیست؟
Embedding تبدیل یک تکه داده (متن، تصویر، صدا، حتی کد) به یک بردار عددی است — مثلاً ۱۵۳۶ عدد اعشاری. این بردار «معنای» داده را در فضای چندبُعدی نشان میدهد. دو متن با معنای شبیه، بردارهای نزدیک به هم دارند — حتی اگر کلمات مشترکی نداشته باشند.
مثلاً embedding «گربه دوستداشتنی» با «بچهگربه ناز» نزدیک است، چون معنای مشابه دارند. ولی با «الگوریتم binary search» فاصلهی زیادی دارد.
چرا embedding مهم است؟ کاربردها
- Semantic Search: بهجای جستجوی keyword، جستجوی معنا. کاربر بنویسد «بهترین رستوران شام» و سیستم «شبنشینی غذای ایتالیایی» را هم پیدا کند.
- RAG (جزئیات): پیدا کردن chunkهای مرتبط در پایگاه دانش برای LLM.
- Recommendation: به مشتری که محصول X خریده، محصول Y پیشنهاد بده چون embed مشابهی دارند.
- Classification: دستهبندی متن (مثل تشخیص اسپم، اخبار جعلی).
- Clustering: گروهبندی خودکار اسناد مشابه.
- Deduplication: حذف محتوای تقریباً تکراری.
چطور کار میکند؟ تاریخچه و معماری
تاریخچهی embedding یک سفر ۱۰ ساله است:
- ۲۰۱۳ — Word2Vec (Google): اولین بار نشان داد میتوان کلمات را به بردار تبدیل کرد طوری که
پادشاه - مرد + زن ≈ ملکه. - ۲۰۱۸ — BERT (Google): context-aware embedding — کلمهی «شیر» در «شیر جنگل» و «شیر گاو» بردارهای مختلف دارد.
- ۲۰۲۲ — text-embedding-ada-002 (OpenAI): embedding سطح document با کیفیت بسیار بالا.
- ۲۰۲۴ — text-embedding-3 (OpenAI): هزینهی ۵ برابر کمتر، دقت بهتر، با Matryoshka representation.
مدلهای امروزی یک شبکهی عصبی Transformer هستند که آخرین لایهاش بردار خروجی را تولید میکند.
سه روش اندازهگیری شباهت
| روش | فرمول | کاربرد |
|---|---|---|
| Cosine Similarity | cos(θ) بین دو بردار | پرکاربردترین — معیار زاویه است نه طول |
| Euclidean Distance | √(Σ(a-b)²) | فاصلهی مستقیم — حساس به طول |
| Dot Product | Σ(a × b) | سریعترین — برای بردارهای نرمالایزشده |
برای اکثر embedding مدرن (که نرمالایزشدهاند)، Cosine = Dot Product. توصیه: همیشه Cosine استفاده کن.
بهترین مدلهای Embedding برای فارسی
| مدل | ابعاد | پشتیبانی فارسی | هزینه |
|---|---|---|---|
| OpenAI text-embedding-3-small | 1536 | عالی | $0.02/1M tokens |
| OpenAI text-embedding-3-large | 3072 | عالیتر | $0.13/1M tokens |
| Cohere embed-multilingual-v3 | 1024 | خوب | $0.10/1M tokens |
| multilingual-E5-large (open) | 1024 | خیلی خوب | رایگان (self-host) |
| BGE-M3 (open) | 1024 | خوب | رایگان (self-host) |
برای production و کیفیت بالا: text-embedding-3-large. برای پروژهی self-hosted ایرانی: multilingual-E5-large.
ابعاد بردار — کوچک یا بزرگ؟
ابعاد بیشتر = دقت بالاتر، ولی حافظهی بیشتر و جستجوی کندتر. trade-off ها:
- 256 ابعاد: برای پروژههای ساده، سرعت بالا، حافظهی کم. (Matryoshka روی text-embedding-3-large)
- 1024-1536 ابعاد: sweet spot برای اکثر پروژهها.
- 3072 ابعاد: فقط برای کاربردهای high-precision (جستجوی حقوقی، پزشکی).
یک ترفند مدرن: Matryoshka representation اجازه میدهد یک embedding 3072-بعدی را به 256 بعدی truncate کنی، با کمتر از ۱۰٪ افت دقت.
Vector Databases — کدام را انتخاب کنیم؟
| DB | نوع | برای چه پروژهای |
|---|---|---|
| Chroma | Open-source, in-memory | پروژههای کوچک، prototype |
| pgvector | Postgres extension | اگر Postgres داری — ارزان، قابلخود-هاست |
| Qdrant | Open-source, Rust | production متوسط، قابل self-host |
| Weaviate | Open-source, hybrid | پروژههای پیچیده با جستجوی hybrid |
| Pinecone | Cloud (managed) | production بزرگ، scale آسان، گران |
| Milvus | Open-source, enterprise | میلیاردها بردار |
توصیه برای ایران: pgvector — Postgres با extension، روی Chabokan یا هر VPS قابل اجراست، بدون نیاز به VPN، رایگان.
کد Python — semantic search فارسی
from openai import OpenAI
import numpy as np
client = OpenAI()
def embed(text: str) -> list[float]:
return client.embeddings.create(
model="text-embedding-3-small",
input=text
).data[0].embedding
# دیتابیس کوچک از مقالات
docs = [
"مهندسی پرامپت یعنی نوشتن دستورات بهینه برای AI",
"RAG اتصال LLM به دانش خارجی است",
"Few-shot Learning یعنی دادن چند مثال در پرامپت",
"Function Calling اتصال AI به توابع برنامهنویسی"
]
# embed همهی مقالات (یک بار)
doc_embs = [embed(d) for d in docs]
# جستجو
query = "چطور AI رو با کد وصل کنم؟"
q_emb = embed(query)
# Cosine similarity
def cos_sim(a, b):
a, b = np.array(a), np.array(b)
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
scores = [(cos_sim(q_emb, e), docs[i]) for i, e in enumerate(doc_embs)]
scores.sort(reverse=True)
for s, d in scores[:2]:
print(f"{s:.3f}: {d}")
# خروجی: Function Calling مرتبطترین جواب است
ترکیب با RAG
Embedding ستون فقرات RAG (Retrieval-Augmented Generation) است. در RAG:
- اسناد را به chunkهای ۲۰۰-۸۰۰ کلمهای تقسیم میکنی
- هر chunk را embed میکنی و در vector DB ذخیره میکنی
- سوال کاربر را embed میکنی
- ۳-۵ chunk نزدیکترین را پیدا میکنی
- chunkها را بهعنوان context به LLM میدهی
- LLM با اطلاعات context پاسخ تولید میکند
این الگو مشکل hallucination را حل میکند و امکان بهروزرسانی دانش بدون retraining را میدهد.
هزینه و latency
هزینهی embed یک مقاله ۲۰۰۰ کلمهای (~۲۵۰۰ توکن):
- text-embedding-3-small: $0.00005 (تقریباً مجانی)
- text-embedding-3-large: $0.0003
Latency: ~۱۰۰-۳۰۰ms برای embed، ~۵-۲۰ms برای جستجو در vector DB با ۱۰۰هزار بردار.
برای صرفهجویی: همیشه embed را cache کن (مقالهی ثابت یک بار embed میشود).
سوالات متداول
Embedding چیست به زبان ساده؟
تبدیل متن به یک سری عدد که معنای آن متن را نشان میدهد. متنهای با معنای شبیه، اعداد نزدیکی دارند.
برای فارسی چه مدلی استفاده کنم؟
text-embedding-3-small (OpenAI) برای اکثر پروژهها بهترین trade-off است. اگر میخوای self-host کنی، multilingual-E5-large.
چه vector DB برای ایران بهتر است؟
pgvector — extension روی Postgres که روی Chabokan و هر VPS ایرانی قابل اجراست، بدون نیاز به VPN.
تفاوت Cosine و Euclidean؟
Cosine زاویه بین بردارها را میسنجد، Euclidean فاصله مستقیم. برای embedding نرمالایزشده، Cosine استاندارد است.
چقدر باید chunk کنم؟
۲۰۰-۸۰۰ کلمه. کمتر = خیلی dependent به context؛ بیشتر = embed کیفیت پایین میآید.
هزینهی embed یک مقاله چقدر؟
~$0.00005 برای ۲۰۰۰ کلمه با text-embedding-3-small. تقریباً مجانی.
میخوای پروژهی واقعی embedding بسازی؟
در دورهی جامع یک ماژول کامل به vector AI، RAG و ساخت چتبات پشتیبانی اختصاصی ایرانی اختصاص داریم.
شروع دوره