چیت‌شیت

امبدینگ‌ها و جستجوی برداری

Embeddings and Vector Search

انکود متن، انتخاب متریک، تعیین ابعاد بردارها، انتخاب نمایه و رفع بازخوانی ضعیف. Python، NumPy و FAISS.

  • ۱۲ بخش
  • ۹ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. بازیابی، سپس بازرتبه‌بندی
  2. انکود، جستجو، کوتاه‌سازی
  3. وظایف
  4. ریاضیات شباهت
  5. جستجوی HNSW
  6. انتخاب نمایه
  7. اندازه و فشرده‌سازی
  8. پیش‌فرض‌ها در کد
  9. عیب‌یابی
  10. اختصارات
  11. پرسش‌ها
  12. نکات

بازیابی، سپس بازرتبه‌بندی

معماری
چانک‌هاامبدافزودنجستجو10 تای برتراسنادتقسیم به چانک‌هابای‌ان‌کودرمتن به بردارنرمال‌سازی L2طول واحدنمایه‌ی برداریHNSW یا flatپرس‌وجوهمان مدل، پیشوند پرس‌وجو10 تای برتربه خوانندهکراس‌ان‌کودرامتیازدهی به جفت‌ها100 تای برترجستجوی ANN

انکود، جستجو، کوتاه‌سازی

کد
python
encoder = SentenceTransformer("BAAI/bge-small-en-v1.5")         # ابعاد 384
embeddings = encoder.encode(corpus, normalize_embeddings=True)  # بردارهای واحد
q_emb = encoder.encode([query], normalize_embeddings=True)
sims = (embeddings @ q_emb.T).flatten()                         # ضرب معادل کسینوس
order = np.argsort(-sims)[:top_k]                               # بهترین‌ها در ابتدا
def truncate(vectors, dim):                                     # برش ماتریوشکا
    out = vectors[:, :dim]
    return out / np.linalg.norm(out, axis=1, keepdims=True)     # نرمال‌سازی مجدد
emb_256 = truncate(emb, 256)
index = faiss.IndexFlatL2(dimension)                            # جستجوی دقیق
index.add(embeddings)
distances, indices = index.search(query_vectors, k=5)

وظایف

کار و کد
وظیفهکد
کوتاه‌سازی یک بردارtruncate_matryoshka(vec, 64)
دودویی‌سازی یک بردارbinarize(vec)
جستجو بر اساس فاصله‌ی همینگengine.index.search(query_vec, top_k=5, metric="hamming")
ترکیب رتبه‌های متراکم و پراکندهrrf_fuse([dense_ranked[:5], sparse_scores[:5]])
بارگذاری BGE-M3BGEM3FlagModel("BAAI/bge-m3", use_fp16=True)
اجرای قیاسanalogy(vocab, W, "man", "king", "woman")
بردار برای کلمه‌ی دیده‌نشدهfasttext_vector(word, ngram_table)
ارزیابی روی وظایف MTEBevaluation.run(encoder, output_folder="./mteb-results")

ریاضیات شباهت

مفهوم‌ها
کسینوس
$\cos(a, b) = \frac{a \cdot b}{\lVert a \rVert \, \lVert b \rVert}$. بازه 1- تا 1. نادیده گرفتن طول.
فاصله‌ی کسینوسی
$1 - \cos(a, b)$. بازه 0 تا 2.
ضرب داخلی
$\sum_i a_i b_i$. معادل کسینوس روی بردارهای واحد.
L2
$\sqrt{\sum_i (a_i - b_i)^2}$. کمتر یعنی نزدیک‌تر.
بردارهای واحد
$\lVert a - b \rVert^2 = 2 - 2 \cos(a, b)$.
همینگ
تعداد بیت‌های متفاوت پس از دودویی‌سازی.
بیشینه‌ی شباهت
بهترین توکن سند به ازای هر توکن پرس‌وجو، سپس جمع.
RRF
$\sum \frac{1}{k + \text{rank} + 1}$ روی رتبه‌بندی‌ها، رتبه از 0.

جستجوی HNSW

گام‌به‌گام
  1. ساختقرار دادن هر بردار در گرافی چندلایه، متصل به همسایگان تقریبی.
  2. لایه‌های بالاپراکنده، با پیوندهای بلند بین خوشه‌های دوردست.
  3. لایه‌ی پایینمتراکم، شامل تمام بردارها با پیوندهای کوتاه.
  4. ورودپرس‌وجو از بالاترین لایه شروع می‌شود.
  5. فرودحرکت‌های حریصانه به گره‌های نزدیک‌تر، سپس یک لایه پایین‌تر.
  6. خروجیk تای برتر تقریبی در $O(\log n)$، نه $O(n)$.
  7. هزینهمعمولاً 95 تا 99 درصد بازخوانی. میلی‌ثانیه‌ای در 10 میلیون بردار.

انتخاب نمایه

دستورها
دستورعملکرد
IndexFlatIPضرب داخلی دقیق. کسینوس روی بردارهای واحد. حدود 100k بردار
IndexFlatL2L2 دقیق، بدون آموزش. تا حدود 1M بردار
IndexIVFFlatK سلول، جستجوی نزدیک‌ترین‌ها. نیازمند آموزش. حدود 10M
IndexIVFPQIVF به همراه کوانتیزه‌سازی ضربی. 100M و بیشتر
IndexHNSWنمایه‌ی گرافی. سریع‌ترین برای پرس‌وجوهای متعدد. نمایه‌ی حجیم
LSHتصویرهای هش تصادفی. تشخیص تقریباً تکراری‌ها
KD-trees, ball treesدقیق. فقط ابعاد کم و متوسط

اندازه و فشرده‌سازی

مفهوم‌ها
float32، ابعاد 1536
6٬144 بایت به ازای هر بردار. 61 گیگابایت برای 10 میلیون.
ابعاد 3,072
12 کیلوبایت به ازای هر بردار با دقت کامل.
دودویی
192 بایت به ازای هر بردار، 32 برابر کوچک‌تر. 5 تا 10 درصد افت بازخوانی.
امتیازدهی مجدد
عبور اول دودویی، سپس دقت کامل روی 1000 تای برتر.
ماتریوشکا 256 از 1536
6 برابر ذخیره‌سازی کمتر، حدود 3 تا 5 درصد افت.
برش امن
1536 به 256 معمولاً امن است. 1536 به 64 خیر.

پیش‌فرض‌ها در کد

پیش‌فرض‌ها
تنظیمپیش‌فرضتوضیح
chunk_size200کلمات در هر چانک، chunk_text
overlap50کلمات مشترک دو چانک
top_k5نتایج در هر جستجو
metric"cosine"همچنین dot، euclidean، hamming
RRF `k`60rrf_fuse
`hash_embed` dim256امبدینگ‌ساز نمایشی ترفند هش
n_min3n-gramهای FastText، n_max برابر 6
x_max100وزن‌دهی GloVe، alpha برابر 0.75

عیب‌یابی

عیب‌یابی
  • بازخوانی bge 3 تا 5 نمره پایین است

    علت
    عدم وجود پیشوند پرس‌وجو
    راه‌حل
    افزودن پیشوند از کارت مدل به ابتدای متن
  • رتبه‌بندی ضعیف بردارهای کوتاه‌شده

    علت
    عدم نرمال‌سازی مجدد پس از برش
    راه‌حل
    تقسیم مجدد بر نُرم
  • افت بازخوانی پس از کوتاه‌سازی

    علت
    برش بیش از حد، یا عدم آموزش ماتریوشکا
    راه‌حل
    اعتبارسنجی روی مجموعه‌ی ارزیابی خودتان
  • تغییر نزدیک‌ترین همسایه‌ها

    علت
    تداخل قراردادهای کسینوسی و L2
    راه‌حل
    مطابقت با متریک زمان آموزش
  • پرس‌وجو و سند همخوانی ندارند

    علت
    مدل نامتقارن
    راه‌حل
    بررسی کارت مدل
  • cosine: dim mismatch

    علت
    بردارها با اندازه‌های متفاوت
    راه‌حل
    یک مدل و یک بعد یکسان برای هر دو
  • اسناد طولانی با هیچ‌چیز تطابق ندارند

    علت
    یک بردار همه‌ی موضوعات را میانگین می‌گیرد
    راه‌حل
    چانک‌بندی 256 تا 512 توکن، 50 همپوشانی
  • کلمه‌ی دیده‌نشده فاقد بردار است

    علت
    Word2Vec و GloVe فاقد طرح پشتیبان هستند
    راه‌حل
    استفاده از n-gramهای FastText

اختصارات

اصطلاح‌ها
ANN
همسایه‌ی تقریبی نزدیک‌ترین. افت اندک دقت، جهش بزرگ سرعت.
HNSW
گراف چندلایه‌ی ناوبر دنیای کوچک. نمایه‌ی گرافی سلسله‌مراتبی.
IVF
نمایه‌ی فایل معکوس. فقط جستجوی چند خوشه.
PQ
کوانتیزه‌سازی ضربی. جستجو در فضای فشرده.
LSH
درهم‌سازی حساس به مکان. تصویرهای هش تصادفی.
MTEB
بنچمارک عظیم امبدینگ متن. 56 وظیفه در عرضه، 100+ وظیفه در نسخه دوم.
BEIR
18 وظیفه‌ی بازیابی zero-shot.
OOV
خارج از واژگان. کلمه‌ای که در آموزش دیده نشده است.

پرسش‌ها

پرسش و پاسخ
کسینوس یا ضرب داخلی؟
روی بردارهای L2 نرمال‌شده تفاوتی ندارد.
چرا ANN؟
جستجوی جامع در 1M بردار 1536 بعدی یعنی 1.5 میلیارد ضرب و جمع در هر پرس‌وجو.
چرا بازرتبه‌بندی؟
کراس‌ان‌کودر پرس‌وجو و سند را با هم می‌خواند؛ کندتر است اما دقیق‌تر.
چرا RRF و نه مجموع امتیازات؟
BM25 بی‌کران است. کسینوس در بازه 1- تا 1 است. رتبه‌ها مقایسه‌پذیرند.
کدام معیار برای بازیاب RAG؟
معیار Recall@K؛ بدون بخش درست، پاسخی در کار نیست.

نکات

نکته‌ها
  • همیشه normalize_embeddings=True را تنظیم کنید.
  • روی پرس‌وجوهای خودتان بنچمارک بگیرید. رتبه در تابلوی امتیازات کافی نیست.
  • تعویض مدل فقط در صورتی که در دامنه‌ی شما بیش از 3 نمره برتر باشد.
  • مقادیر recall@1، @5 و @10 را کنار هم گزارش کنید.
  • تاخیر صدک p99 را بسنجید؛ امتیازات MTEB آن را پنهان می‌کنند.
  • برای پرس‌وجوهای ناموفق، تفاوت‌های بازنگری رتبه‌بندی متراکم و پراکنده را بررسی کنید.