چیتشیت
امبدینگها و جستجوی برداری
Embeddings and Vector Search
انکود متن، انتخاب متریک، تعیین ابعاد بردارها، انتخاب نمایه و رفع بازخوانی ضعیف. Python، NumPy و FAISS.
فهرست مطالب
بازیابی، سپس بازرتبهبندی
معماریانکود، جستجو، کوتاهسازی
کد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-M3 | BGEM3FlagModel("BAAI/bge-m3", use_fp16=True) |
| اجرای قیاس | analogy(vocab, W, "man", "king", "woman") |
| بردار برای کلمهی دیدهنشده | fasttext_vector(word, ngram_table) |
| ارزیابی روی وظایف MTEB | evaluation.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
گامبهگام- ساختقرار دادن هر بردار در گرافی چندلایه، متصل به همسایگان تقریبی.
- لایههای بالاپراکنده، با پیوندهای بلند بین خوشههای دوردست.
- لایهی پایینمتراکم، شامل تمام بردارها با پیوندهای کوتاه.
- ورودپرسوجو از بالاترین لایه شروع میشود.
- فرودحرکتهای حریصانه به گرههای نزدیکتر، سپس یک لایه پایینتر.
- خروجیk تای برتر تقریبی در $O(\log n)$، نه $O(n)$.
- هزینهمعمولاً 95 تا 99 درصد بازخوانی. میلیثانیهای در 10 میلیون بردار.
انتخاب نمایه
دستورها| دستور | عملکرد |
|---|---|
IndexFlatIP | ضرب داخلی دقیق. کسینوس روی بردارهای واحد. حدود 100k بردار |
IndexFlatL2 | L2 دقیق، بدون آموزش. تا حدود 1M بردار |
IndexIVFFlat | K سلول، جستجوی نزدیکترینها. نیازمند آموزش. حدود 10M |
IndexIVFPQ | IVF به همراه کوانتیزهسازی ضربی. 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_size | 200 | کلمات در هر چانک، chunk_text |
overlap | 50 | کلمات مشترک دو چانک |
top_k | 5 | نتایج در هر جستجو |
metric | "cosine" | همچنین dot، euclidean، hamming |
RRF `k` | 60 | rrf_fuse |
`hash_embed` dim | 256 | امبدینگساز نمایشی ترفند هش |
n_min | 3 | n-gramهای FastText، n_max برابر 6 |
x_max | 100 | وزندهی 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 آن را پنهان میکنند.
- برای پرسوجوهای ناموفق، تفاوتهای بازنگری رتبهبندی متراکم و پراکنده را بررسی کنید.