Embeddings و بردارهای معنایی
راهنمای کامل برای فارسی‌زبان‌ها

چطور AI «معنا» را به اعداد تبدیل می‌کند — مبنای semantic search و RAG

Embeddings یکی از پایه‌ای‌ترین مفاهیم AI مدرن است. هر چیزی که در دنیای AI «معنایی» اتفاق می‌افتد — جستجوی هوشمند، recommendation در نتفلیکس، چت‌بات پشتیبانی، RAG، تشخیص spam — همه بر پایه‌ی embedding هستند. در این مقاله یاد می‌گیریم embedding چیست، چطور کار می‌کند، کدام مدل برای فارسی بهتر است، چه vector database انتخاب کنیم، و یک مثال عملی Python برای پیاده‌سازی semantic search.

پاسخ کوتاه: Embedding تبدیل متن یا تصویر به برداری از اعداد است که معنای آن را نمایندگی می‌کند. متن‌های با معنای نزدیک، بردارهای نزدیک دارند. همین پایه‌ی جستجوی معنایی، سیستم‌های پیشنهاددهنده و RAG است — جایی که شباهت معنایی مهم‌تر از تطابق دقیق کلمات است.

Embedding چیست؟

Embedding تبدیل یک تکه داده (متن، تصویر، صدا، حتی کد) به یک بردار عددی است — مثلاً ۱۵۳۶ عدد اعشاری. این بردار «معنای» داده را در فضای چندبُعدی نشان می‌دهد. دو متن با معنای شبیه، بردارهای نزدیک به هم دارند — حتی اگر کلمات مشترکی نداشته باشند.

مثلاً embedding «گربه دوست‌داشتنی» با «بچه‌گربه ناز» نزدیک است، چون معنای مشابه دارند. ولی با «الگوریتم binary search» فاصله‌ی زیادی دارد.

تشبیه ساده: embedding مثل GPS کلمات است. هر کلمه یک «مختصات» در یک نقشه‌ی چندبُعدی دارد. کلمات هم‌خانواده در یک محله نزدیک هم زندگی می‌کنند.

چرا 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 Similaritycos(θ) بین دو بردارپرکاربردترین — معیار زاویه است نه طول
Euclidean Distance√(Σ(a-b)²)فاصله‌ی مستقیم — حساس به طول
Dot ProductΣ(a × b)سریع‌ترین — برای بردارهای نرمالایز‌شده

برای اکثر embedding مدرن (که نرمالایز‌شده‌اند)، Cosine = Dot Product. توصیه: همیشه Cosine استفاده کن.

بهترین مدل‌های Embedding برای فارسی

مدلابعادپشتیبانی فارسیهزینه
OpenAI text-embedding-3-small1536عالی$0.02/1M tokens
OpenAI text-embedding-3-large3072عالی‌تر$0.13/1M tokens
Cohere embed-multilingual-v31024خوب$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نوعبرای چه پروژه‌ای
ChromaOpen-source, in-memoryپروژه‌های کوچک، prototype
pgvectorPostgres extensionاگر Postgres داری — ارزان، قابل‌خود‌-هاست
QdrantOpen-source, Rustproduction متوسط، قابل self-host
WeaviateOpen-source, hybridپروژه‌های پیچیده با جستجوی hybrid
PineconeCloud (managed)production بزرگ، scale آسان، گران
MilvusOpen-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:

  1. اسناد را به chunkهای ۲۰۰-۸۰۰ کلمه‌ای تقسیم می‌کنی
  2. هر chunk را embed می‌کنی و در vector DB ذخیره می‌کنی
  3. سوال کاربر را embed می‌کنی
  4. ۳-۵ chunk نزدیک‌ترین را پیدا می‌کنی
  5. chunkها را به‌عنوان context به LLM می‌دهی
  6. 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 و ساخت چت‌بات پشتیبانی اختصاصی ایرانی اختصاص داریم.

شروع دوره
متین لب‌خندق

متین لب‌خندق

مهندس هوش مصنوعی و مدرس مهندسی پرامپت

۱۰ سال تجربه برنامه‌نویسی، ۵ سال تخصص اختصاصی در AI، semantic search و RAG. پروفایل کامل.

نویسنده: متین لب‌خندق — مهندس هوش مصنوعی با ۱۰ سال برنامه‌نویسی و ۵ سال تمرکز روی مدل‌های زبانی (LLM)؛ سازنده‌ی سیستم‌های واقعیِ production با ChatGPT، Claude و Gemini و بنیان‌گذار آکادمی متین لب‌خندق. مقاله‌ی پایه: راهنمای جامع مهندسی پرامپت.