فاز 5 · درس 22

راهنمای جامع انتخاب مدل‌های امبدینگ در سال 2026

نوع
مفهومی
زمان
حدود 60 دقیقه
زبان‌ها
Python
پیش‌نیاز
فاز 5 · بخش 03 (Word2Vec)، فاز 5 · بخش 14 (بازیابی اطلاعات)
نمایی سه‌بعدی از یک جعبه ابزار مدرن با چندین لایه بردار متراکم، مشبک‌های تنک و عروسک‌های تودرتوی ماتریوشکا در پس‌زمینه‌ای مینیمال
فهرست مطالب
  1. صورت مسئله
  2. مفهوم
  3. تابلوی امتیازات MTEB تمام ماجرا را نشان نمی‌دهد
  4. الگوی سه‌لایه‌ای
  5. پیاده‌سازی
  6. گام 1: مدل پایه — امبدینگ‌های متراکم با Sentence-BERT
  7. گام 2: هرس ماتریوشکا
  8. گام 3: قابلیت‌های چندگانه BGE-M3
  9. گام 4: ارزیابی با MTEB روی یک تسک سفارشی
  10. گام 5: پیاده‌سازی دستی شباهت کسینوسی از صفر
  11. تله‌ها
  12. کاربرد عملی
  13. تحویل پروژه
  14. تمرین‌ها
  15. اصطلاحات کلیدی
  16. برای مطالعه بیشتر

در بیشتر پروژه‌های توسعه‌ی سیستم‌های RAG، علت اصلی بازیابی اشتباهِ اسناد نه به پرامپت مربوط است و نه به نوع پایگاه داده برداری، بلکه مستقیماً از انتخاب نادرست مدل امبدینگ آب می‌خورد. با رشد سریع مدل‌های بازنمایی متن، اکنون انتخاب مدل برداری فراتر از ابزارهای ساده گذشته است و ابعادی چون نوع بردار (متراکم، تنک یا چندبرداری)، پشتیبانی چندزبانه و هزینه‌ی ایندکس‌گذاری را شامل می‌شود.

اگر برای پروژه‌های خود به مدل‌های متنی نیاز دارید، استفاده از APIهای ابری خارجی به دلیل محدودیت‌های پرداخت ارزی یا مسدودسازی IPها چالش‌برانگیز است؛ هرچند گیت‌وی‌های واسط داخلی یا مدل‌های وزن‌باز محلی گزینه‌های در دسترس‌تری محسوب می‌شوند. از سوی دیگر، دانلود وزن مدل‌های حجیم از Hugging Face گاهی با کندی مواجه است و استفاده از میرورها یا اجرای مدل‌های سبک‌تر روی سخت‌افزار شخصی و پردازنده اصلی راهکار عملی‌تری خواهد بود.

در این درس یاد می‌گیرید چگونه مدل‌های امبدینگ مدرن مانند BGE-M3، رویکردهای هرس ابعاد ماتریوشکا و معیارهای ارزیابی MTEB را بشناسید و مدلی دقیق، بهینه و متناسب با محدودیت‌های پردازشی و زبان داده‌های خود انتخاب کنید.

مدل Word2Vec به ازای هر کلمه یک بردار به شما می‌داد. مدل‌های امبدینگ (Embedding) امروزی به ازای هر بند متن (passage) یک بردار چندزبانه تولید می‌کنند؛ با نماهای متراکم (dense)، تنک (sparse) و چندبرداری (multi-vector) که متناسب با اندازه ایندکس شما تنظیم می‌شوند. اگر در انتخاب مدل اشتباه کنید، سیستم RAG متن اشتباهی را بازیابی خواهد کرد.

صورت مسئله

سیستم RAG شما در 40% مواقع بند متنیِ اشتباهی را بازیابی می‌کند. مقصر اصلی به‌ندرت پایگاه داده برداری یا پرامپت (Prompt) است؛ مقصر واقعی همان مدل امبدینگ است.

انتخاب یک مدل امبدینگ در سال 2026 یعنی تصمیم‌گیری بر اساس پنج محور اساسی:

  1. متراکم در برابر تنک در برابر چندبرداری. یک بردار به ازای هر بند، یک بردار به ازای هر توکن (Token)، یا یک کیسه کلمات وزن‌دارِ تنک.
  2. پوشش زبانی. مدل‌های تک‌زبانه انگلیسی هنوز در تسک‌های صرفاً انگلیسی برنده میدان هستند. وقتی پیکره متنی (Corpus) چندزبانه باشد، مدل‌های چندزبانه دست بالا را دارند.
  3. طول زمینه (Context length). مقایسه 512 توکن با 8,192 یا 32,768 توکن؛ البته که ظرفیت مؤثر واقعی معمولاً 60 تا 70 درصد حداکثر ظرفیت تبلیغ‌شده است.
  4. بودجه ابعاد بردار. ذخیره 3,072 مقدار اعشاری (float) با دقت کامل (Full precision) برابر با 12 کیلوبایت برای هر بردار است. برای 100 میلیون بردار، هزینه ذخیره‌سازی به $1,300 در ماه می‌رسد. هرس ماتریوشکا (Matryoshka truncation) این هزینه را تا 4 برابر کاهش می‌دهد.
  5. وزن‌های باز در برابر سرویس‌های ابری (هاست‌شده). مدل با وزن‌های باز (Open-weight) یعنی کنترل کامل استک فنی و داده‌ها در دست شماست. سرویس‌های هاست‌شده یعنی از دست دادن بخشی از کنترل در ازای دسترسی همیشگی به آخرین نسخه‌ها.

در این درس این سبک‌سنگین‌کردن‌ها را شفاف بررسی می‌کنیم تا تصمیم‌گیری‌تان بر پایه شواهد (Evidence) باشد، نه صرفاً دنباله‌روی از ترند فصل گذشته.

مفهوم

Dense, sparse, and multi-vector embeddings

امبدینگ‌های متراکم (Dense embeddings). یک بردار برای هر بند متن (معمولاً بین 384 تا 3,072 بعد). با شباهت کسینوسی (Cosine Similarity)، بندها بر اساس نزدیکی معنایی رتبه‌بندی می‌شوند. مثل text-embedding-3-large از OpenAI، حالت متراکم BGE-M3 و Voyage-3. این گزینه، انتخاب پیش‌فرض است.

امبدینگ‌های تنک (Sparse embeddings). به سبک مدل SPLADE. یک ترنسفورمر (Transformer) برای هر توکنِ موجود در دایره واژگان وزنی تعیین می‌کند و سپس مقدار بیشتر آن‌ها را صفر می‌کند. نتیجه، یک بردار تنک به اندازه کل دایره واژگان (|vocab|) است. این رویکرد تطابق لغوی (مثل BM25) را پوشش می‌دهد، اما با وزن‌هایی که توسط مدل یاد گرفته شده‌اند. این حالت روی پرسمان‌های پر از کلمات کلیدی بسیار قوی عمل می‌کند.

چندبرداری یا تعامل متأخر (Multi-vector / Late interaction). مثل ColBERTv2 و Jina-ColBERT. یک بردار به ازای هر توکن. امتیازدهی با الگوریتم MaxSim انجام می‌شود: برای هر توکن پرسمان، شبیه‌ترین توکن سند را پیدا کرده و امتیازها را با هم جمع می‌کنیم. ذخیره‌سازی و امتیازدهی در این روش هزینه‌برتر است، اما در پرسمان‌های طولانی و مجموعه‌متن‌های تخصصی بهترین نتیجه را می‌دهد.

مدل BGE-M3: هر سه حالت در یک مدل. یک مدل واحد که هم‌زمان بازنمایی‌های متراکم، تنک و چندبرداری را خروجی می‌دهد. از هر کدام می‌توان مستقل پرسمان گرفت؛ در نهایت امتیازها با یک جمع وزن‌دار ترکیب می‌شوند. این مدل در سال 2026 گزینه پیش‌فرض برای زمانی است که انعطاف‌پذیریِ همه‌جانبه را از یک چک‌پوینت (Checkpoint) تکی بخواهید.

یادگیری بازنمایی ماتریوشکا (Matryoshka Representation Learning). طوری آموزش دیده که N بعد اول بردار، به‌تنهایی یک امبدینگ مستقل و کاربردی بسازند. می‌توانید یک بردار 1,536 بعدی را تا 256 بعد کوتاه کنید و در ازای کاهش تنها حدود 1% دقت، 6 برابر در هزینه ذخیره‌سازی صرفه‌جویی کنید. این قابلیت در OpenAI text-3، Cohere v4، Voyage-4، Jina v5، Gemini Embedding 2 و Nomic v1.5+ پشتیبانی می‌شود.

تابلوی امتیازات MTEB تمام ماجرا را نشان نمی‌دهد

معیار Massive Text Embedding Benchmark در زمان معرفی (سال 2022) شامل 56 تسک در 8 دسته‌بندی مختلف بود و در MTEB v2 به بیش از 100 تسک گسترش یافت. در اوایل سال 2026، مدل Gemini Embedding 2 در صدر بازیابی (67.71 MTEB-R) قرار دارد. مدل Cohere embed-v4 در تسک‌های عمومی پیشتاز است (65.2 MTEB) و BGE-M3 در میان مدل‌های چندزبانه با وزن باز رتبه اول را دارد (63.0). لیدربورد لازم است اما کافی نیست؛ همیشه باید مدل‌ها را روی دامنه تخصصی خودتان بنچمارک کنید.

الگوی سه‌لایه‌ای

مورد کاربرد الگو
فیلتر اولیه سریع انکودر دوگانه متراکم (BGE-M3، text-3-small)
افزایش بازخوانی (Recall) تنک (SPLADE، حالت تنک BGE-M3) + ادغام با RRF
دقت روی 50 نتیجه اول چندبرداری (ColBERTv2) یا بازرتبه‌بند انکودر متقاطع (Cross-encoder reranker)

بیشتر استک‌های سطح پروداکشن از هر سه لایه استفاده می‌کنند.

بُرش ماتریوشکاکاهش ابعاد
MATRYOSHKA TRUNCATIONA Matryoshka-trained embedding packs the most important information into its earliest dimensions. You can keep only a prefix of the vector, slicing 3072 floats down to a few hundred, and still retrieve well. Truncation cuts index storage several-fold while quality falls off gradually rather than collapsing, so you tune the dimension budget to your cost target.یک بردار ماتریوشکا، برش‌خورده به پیشوندی کوچک‌تر3072 بُعدپیشوند حفظ‌شدهحجم ذخیره‌سازی با ابعادِ مانده مقیاس می‌گیرد؛ افت کیفیت تدریجی است
امبدینگ آموزش‌دیده به روش ماتریوشکا، مهم‌ترین اطلاعات را در ابعاد ابتدایی خود فشرده می‌کند. می‌توانید تنها پیشوندی از بردار را نگه دارید، یعنی 3072 مقدار اعشاری را به چند صد بُعد برش دهید و باز هم بازیابی مناسبی داشته باشید. این برش، فضای ذخیره‌سازی ایندکس را چندین برابر کاهش می‌دهد در حالی که کیفیت به‌جای افت ناگهانی، به صورت تدریجی کاهش می‌یابد؛ بنابراین می‌توانید بودجه‌ی ابعاد را متناسب با هزینه‌ی مد نظر خود تنظیم کنید.

پیاده‌سازی

گام 1: مدل پایه — امبدینگ‌های متراکم با Sentence-BERT

from sentence_transformers import SentenceTransformer
import numpy as np

encoder = SentenceTransformer("BAAI/bge-small-en-v1.5")
corpus = [
    "The first iPhone launched in 2007.",
    "Apple released the iPod in 2001.",
    "Android is an operating system from Google.",
]
emb = encoder.encode(corpus, normalize_embeddings=True)

query = "When was the iPhone released?"
q_emb = encoder.encode([query], normalize_embeddings=True)[0]
scores = emb @ q_emb
print(sorted(enumerate(scores), key=lambda x: -x[1]))

گزینه normalize_embeddings=True باعث می‌شود حاصل ضرب داخلی (Dot product) برابر با شباهت کسینوسی شود. همیشه آن را فعال کنید.

گام 2: هرس ماتریوشکا

def truncate(vectors, dim):
    out = vectors[:, :dim]
    return out / np.linalg.norm(out, axis=1, keepdims=True)

emb_256 = truncate(emb, 256)
emb_128 = truncate(emb, 128)

بعد از هرس و کوتاه کردن بردارها، دوباره آن‌ها را نرمال‌سازی کنید. مدل‌هایی مثل Nomic v1.5، OpenAI text-3 و Voyage-4 طوری آموزش دیده‌اند که برای چند سطح اول، این کار عملاً بدون افت کیفیت انجام می‌شود. مدل‌های فاقد ماتریوشکا (مثل Sentence-BERT اولیه) با هرس شدن دچار افت شدید کیفیت می‌شوند.

گام 3: قابلیت‌های چندگانه BGE-M3

from FlagEmbedding import BGEM3FlagModel

model = BGEM3FlagModel("BAAI/bge-m3", use_fp16=True)

output = model.encode(
    corpus,
    return_dense=True,
    return_sparse=True,
    return_colbert_vecs=True,
)
# output["dense_vecs"]:    (n_docs, 1024)
# output["lexical_weights"]: list of dict {token_id: weight}
# output["colbert_vecs"]:  لیستی از آرایه‌های (n_tokens, 1024)

سه نوع ایندکس، تنها با یک فراخوانی استنتاج. ترکیب امتیازها:

dense_score = ... # cosine over dense_vecs
sparse_score = model.compute_lexical_matching_score(q_lex, d_lex)
colbert_score = model.colbert_score(q_col, d_col)
final = 0.4 * dense_score + 0.2 * sparse_score + 0.4 * colbert_score

وزن‌ها را بر اساس دامنه تخصصی خودتان تنظیم کنید.

گام 4: ارزیابی با MTEB روی یک تسک سفارشی

from mteb import MTEB

tasks = ["ArguAna", "SciFact", "NFCorpus"]
evaluation = MTEB(tasks=tasks)
results = evaluation.run(encoder, output_folder="./mteb-results")

مدل‌های کاندید خود را روی یک زیرمجموعه نماینده و متناسب از داده‌هایتان ارزیابی کنید. صرفاً به رتبه (Rank) مدل در لیدربورد اعتماد نکنید؛ دامنه تخصصی شما تعیین‌کننده است.

گام 5: پیاده‌سازی دستی شباهت کسینوسی از صفر

کد code/main.py را ببینید: امبدینگ‌های میانگین‌گیری‌شده با ترفند هشینگ (Hashing Trick) که صرفاً با کتابخانه استاندارد پایتون پیاده شده است. این روش در عمل با امبدینگ‌های ترنسفورمری رقابت نمی‌کند، اما مسیر کلی را نشان می‌دهد: توکن‌سازی ← تبدیل به بردار ← نرمال‌سازی ← ضرب داخلی.

تله‌ها

  • استفاده از مدل یکسان برای پرسمان و سند. برخی مدل‌ها (مثل Voyage یا Jina-ColBERT) از انکودینگ نامتقارن استفاده می‌کنند؛ یعنی پرسمان و سند از مسیرهای متفاوتی عبور می‌کنند. همیشه شناسنامه مدل (Model card) را بررسی کنید.
  • فراموش کردن پیشوند. مدل‌های خانواده bge-* نیاز دارند عبارت "Represent this sentence for searching relevant passages: " به ابتدای پرسمان اضافه شود. اگر این پیشوند را فراموش کنید، بازخوانی 3 تا 5 امتیاز افت می‌کند.
  • هرس بیش‌ازحد ماتریوشکا. کاهش از 1,536 به 256 بعد معمولاً بی‌خطر است، اما کاهش از 1,536 به 64 بعد این‌طور نیست. افت کیفیت را حتماً روی مجموعه ارزیابی خود بسنجید.
  • کوتاه شدن بی‌سرصدای زمینه. بیشتر مدل‌ها ورودی‌هایی را که از حداکثر طولشان بیشتر باشد، بی‌صدا کوتاه می‌کنند. اسناد طولانی حتماً باید تکه‌تکه (Chunking) شوند (درس 23 را ببینید).
  • نادیده گرفتن دم تأخیر (Latency tail). امتیازهای MTEB مقدار تأخیر در صدک 99 (p99 latency) را پنهان می‌کنند. ممکن است مدلی با 600 میلیون پارامتر نسبت به مدلی 335 میلیونی 2 امتیاز بالاتر بگیرد، اما در هر پرسمان 3 برابر کندتر باشد.

کاربرد عملی

استک پیشنهادی برای سال 2026:

شرایط انتخاب
فقط انگلیسی، پرسرعت، از طریق API text-embedding-3-large یا voyage-3-large
وزن باز، انگلیسی BAAI/bge-large-en-v1.5
وزن باز، چندزبانه BAAI/bge-m3 یا Qwen3-Embedding-8B
زمینه طولانی (32k به بالا) Voyage-3-large، Cohere embed-v4، Qwen3-Embedding-8B
اجرا فقط روی پردازنده اصلی (CPU-only) Nomic Embed v2 (با 137 میلیون پارامتر، معماری MoE)
محدودیت شدید فضای ذخیره‌سازی مدل‌های هرس‌شده ماتریوشکا + کوانتایزیشن int8
پرسمان‌های متکی بر کلمات کلیدی افزودن امبدینگ تنک SPLADE و ادغام با متراکم از طریق RRF

الگوی سال 2026: کار را با BGE-M3 یا text-3-large شروع کنید، با استفاده از MTEB روی دامنه کاری خود ارزیابی انجام دهید و اگر یک مدل تخصصی بیش از 3 امتیاز بالاتر به دست آورد، به سراغ آن بروید.

تحویل پروژه

این فایل را در مسیر outputs/skill-embedding-picker.md ذخیره کنید:

---
name: embedding-picker
description: Pick embedding model, dimension, and retrieval mode for a given corpus and deployment.
version: 1.0.0
phase: 5
lesson: 22
tags: [nlp, embeddings, retrieval]
---

Given a corpus (size, languages, domain, avg length), deployment target (cloud / edge / on-prem), latency budget, and storage budget, output:

1. Model. Named checkpoint or API. One-sentence reason.
2. Dimension. Full / Matryoshka-truncated / int8-quantized. Reason tied to storage budget.
3. Mode. Dense / sparse / multi-vector / hybrid. Reason.
4. Query prefix / template if required by the model card.
5. Evaluation plan. MTEB tasks relevant to domain + held-out domain eval with nDCG@10.

Refuse recommendations that truncate Matryoshka to <64 dims without domain validation. Refuse ColBERTv2 for corpora under 10k passages (overhead not justified). Flag long-document corpora (>8k tokens) routed to models with 512-token windows.

تمرین‌ها

  1. ساده. 100 جمله را با مدل bge-small-en-v1.5 در ابعاد کامل (384) و سپس در بعد 128 با ماتریوشکا انکود کنید. افت شاخص MRR را روی 10 پرسمان اندازه بگیرید.
  2. متوسط. سه حالت متراکم، تنک و colbert مدل BGE-M3 را روی 500 بند متن از دامنه تخصصی خود مقایسه کنید. کدام حالت در recall@10 برنده می‌شود؟ آیا ادغام به روش RRF از بهترین حالت تکی بهتر عمل می‌کند؟
  3. سخت. بنچمارک MTEB را برای سه مدل کاندید روی 2 تسک اصلی دامنه کاری‌تان اجرا کنید. امتیاز MTEB، تأخیر p99 در دسته‌های 100تایی پرسمان و هزینه به ازای هر 1 میلیون پرسمان را گزارش کنید. در نهایت مدل بهینه پارتو (Pareto-optimal) را انتخاب کنید.

اصطلاحات کلیدی

اصطلاح در گفتگوها چه می‌گویند معنای دقیق فنی
امبدینگ متراکم (Dense embedding) همان وکتور یک بردار با ابعاد ثابت به ازای هر متن. استفاده از شباهت کسینوسی برای رتبه‌بندی.
امبدینگ تنک (Sparse embedding) BM25 یادگرفته‌شده یک وزن برای هر توکن دایره واژگان؛ عمدتاً مقادیر صفر؛ آموزش‌دیده به‌صورت سرتاسری (End-to-end).
چندبرداری (Multi-vector) روش‌های شبیه ColBERT یک بردار به ازای هر توکن؛ امتیازدهی بر مبنای MaxSim؛ ایندکس بزرگ‌تر و بازخوانی بهتر.
ماتریوشکا (Matryoshka) ترفند عروسک‌های روسی N بعد ابتدایی به‌تنهایی یک امبدینگ مستقل و معتبر می‌سازند.
MTEB بنچمارک استاندارد Massive Text Embedding Benchmark — شامل 56 تسک در زمان انتشار و بیش از 100 تسک در نسخه دوم.
BEIR بنچمارک بازیابی 18 تسک بازیابی صفر-داده (Zero-shot)؛ مرجعی برای سنجش انعطاف‌پذیری در دامنه‌های مختلف.
انکودینگ نامتقارن (Asymmetric encoding) تفاوت مسیر پرسمان و سند مدل برای تصویر کردن (Projection) پرسمان و سند از مسیرهای متفاوتی استفاده می‌کند.

برای مطالعه بیشتر

خودآزمایی

به سؤال‌ها جواب بدهید تا ببینید چقدر از درس در ذهنتان مانده است.

  1. پیش از درسامبدینگ متراکم (dense embedding) چیست؟
  2. پیش از درسیادگیری بازنمایی ماتریوشکا (MRL) چه امکانی را فراهم می‌کند؟
  3. حین درسامبدینگ‌های چندبرداری (ColBERT) چگونه به جفت‌های پرس‌وجو-سند امتیاز می‌دهند؟
  4. حین درسمدل BGE-M3 چه خروجی‌هایی را به طور هم‌زمان ارائه می‌دهد؟
  5. حین درسچرا باید یک بردار برش‌خورده‌ی ماتریوشکا را پیش از محاسبه‌ی شباهت کسینوسی دوباره نرمال‌سازی کرد؟
  6. پس از درسچرا مدل‌های BGE اغلب به یک رشته‌ی پیشوند در سمت پرس‌وجو نیاز دارند؟
  7. پس از درسچرا بنچمارک MTEB برای انتخاب یک مدل امبدینگ ضروری است اما کافی نیست؟
  8. پس از درسچه زمانی باید بازیابی اسپارس SPLADE را در کنار امبدینگ‌های متراکم اضافه کرد؟

سؤالات متداول

یادگیری بازنمایی ماتریوشکا (Matryoshka) چیست و چه کاربردی دارد؟

تکنیکی است که در آن ابعاد ابتدایی بردار امبدینگ به‌تنهایی نمایانگر کل معنا هستند؛ در نتیجه می‌توانید ابعاد بردار را بدون افت شدید دقت کاهش داده و حجم ایندکس را چندین برابر کوچک کنید.

چه تفاوتی میان امبدینگ‌های متراکم و تنک وجود دارد؟

امبدینگ‌های متراکم (Dense) معنای کلی و شباهت معنایی بند متن را در یک بردار فشرده ذخیره می‌کنند، در حالی که امبدینگ‌های تنک (Sparse مثل SPLADE) وزن واژه‌ها را یاد می‌گیرند و برای پرسش‌های متکی بر کلمات کلیدی مناسب‌ترند.

چرا نباید تنها به رتبه‌بندی‌های تابلوی MTEB اکتفا کرد؟

بنچمارک MTEB عملکرد عمومی را می‌سنجد اما تأخیر پردازش p99 و خصوصیات دامنه‌ی متنی اختصاصی شما را پنهان می‌کند؛ بنابراین باید مدل‌ها را روی مجموعه‌داده‌ی خودتان محک بزنید.

ما رو توی گوگل بیشتر ببین

با افزودن نکست ادمین به «منابع ترجیحی» گوگل، درس‌ها و مطالب ما را در بخش اخبار برتر جستجو بیشتر می‌بینید.