RAG 章節定義了 retrieval + augmentation 的二段式結構、但 retrieval 階段背後的 embedding model 怎麼運作、怎麼選、什麼時候該換、什麼時候該自己 fine-tune、這些決策直接影響 RAG 品質。本章把 embedding model 的訓練機制、評估方法、實務選型展開。

本章目標

讀完本章後、你應該能:

  1. 解釋 embedding model 跟 base LLM 的訓練差異。
  2. 看到 MTEB / BEIR 分數時、知道對自己場景的意義。
  3. 對自己 domain 選對 embedding model(通用 vs code vs multilingual)。
  4. 判斷「需要 fine-tune 自己的 embedding model」的時機跟方法。

Embedding model vs LLM 的訓練差異

兩者底層架構可能類似(都用 Transformer)、但訓練 objective 完全不同:

維度LLM(如 Llama / Gemma instruct)Embedding model(如 bge-large、jina-v3)
訓練 objectiveNext-token prediction + RLHFContrastive learning
輸出形式一連串 token一個固定維度的向量(如 768、1024)
訓練資料Trillion-token 通用文字億級的 (query, doc) 正向對
用法Prompt → responseText → vector
Pretrained 起點從 scratch 或繼承 base通常從 base LLM 抽 hidden state 開始

關鍵理解:不能拿任意 LLM 的最後 hidden state 當 embedding — LLM hidden state 是為「預測下一個 token」優化、不為「相似度比較」優化。要再經過 contrastive learning fine-tune 才能當 embedding model 用。

Embedding model 的典型訓練 pipeline:

 1Stage 1: 從 base model 開始(如 BERT、RoBERTa、Mistral、Llama)
 2 3Stage 2: Contrastive pre-training
 4   用大量 weak supervised pair(如 Reddit title-body、StackExchange QA)
 5   InfoNCE loss、batch size 大、hard negative mining
 6 7Stage 3: Supervised fine-tune
 8   用標註好的 (query, relevant_doc) pair
 9   來源如 MSMARCO、Natural Questions
1011Stage 4(可選): Task-specific instruction tuning
12   讓模型懂「task description」、可針對不同 retrieval 任務切換
13   代表:bge-large、e5-mistral-7b-instruct

Stage 4 的「instruction-tuned embedding」是 2024 後流行的設計:query 前加「Represent this sentence for retrieving relevant passages:」這類前綴、embedding model 學會依任務調整向量。

選型維度

主流 embedding model 的選型維度:

1. Domain 相符

Domain推薦模型為什麼
通用英文bge-large-en-v1.5、mxbai-embed-large-v1通用 corpus、MTEB Retrieval 高分
通用多語jina-embeddings-v3、bge-m3、multilingual-e5多語 pretrain、中日韓阿等支援
Code(讀 / 寫 code)jina-embeddings-v2-base-code、voyage-code-3code corpus 訓練、語意(函式名、註解)+ syntax 結合
中文bge-large-zh、Conan-embedding中文 corpus 為主
跨語言(中英混合)jina-embeddings-v3、multilingual-e5跨語言對齊訓練、中英 query 找對方語言 doc

2. 大小(模型大小 / 向量維度)

Tier模型大小向量維度Latency / 記憶體適合場景
小(< 200M)nomic-embed (137M)、all-MiniLM (23M)384-768快、本機 CPU 可跑本地 RAG、簡單 retrieval
中(200-500M)bge-large (335M)、mxbai-embed-large1024中、需要 GPU 或 fast CPU主力 RAG、品質敏感場景
大(500M-7B)e5-mistral-7b、Linq-Embed-Mistral4096慢、需要 GPU高品質、雲端、Reranking 場景
雲端 APIOpenAI text-embedding-3、voyage-31024-3072網路 latency + API 成本雲端 RAG、高 QPS

3. Context window 上限

不同 embedding model 對單次 embed 的 token 上限不同:

模型Context limit
早期 sentence-transformers256-512 tokens
bge-large / mxbai-embed512 tokens
nomic-embed-text-v1.58192 tokens
jina-embeddings-v38192 tokens
voyage-332K tokens

事實查核註:本節所列具體型號(bge-large-en-v1.5、jina-embeddings-v3、nomic-embed-text-v1.5、voyage-3 等)、向量維度、context limit、訓練資料 domain、MTEB / BEIR 排名 — 都是 2026/5 主流版本的估計、各模型升級節奏快、引用前以 MTEB Leaderboard 跟對應 model card 當前狀態為準。

選擇影響 chunking 策略(見 4.1 RAG 的 chunking 段):短 context embedding 要切細、長 context embedding 可保留更完整段落、但內部 attention 對長段中段仍可能 lost-in-the-middle。

4. Cosine similarity 設計

部分 embedding model 訓練時就 L2-normalized、用 cosine = dot product;部分沒 normalize、要自己處理:

ModelNormalize 預設推薦 distance metric
bge-large、mxbai-embed已 L2-normalizeDot product(高效、結果同 cosine)
nomic-embed-text已 L2-normalizeDot product
OpenAI ada-002 / 3已 L2-normalizeDot product
自訓練 / 早期模型未 normalizeCosine similarity

詳細見 vector-normdot-product 卡片。

評估:MTEB 跟自己 domain 的對齊

MTEB 是現在挑選 embedding model 最常用的 leaderboard、但要正確讀:

  1. 看 Retrieval 子分數、不是 Overall:MTEB 含 8 大類、跟 RAG 最直接相關的是 Retrieval 跟 Reranking
  2. 跟自己 domain 對齊:MTEB 通用 corpus、自己 domain 可能跟 MTEB 落差大
  3. In-domain benchmark 才是 final test:用自己工作流的真實 query 跟 expected doc、自建小型評估集(如 100-200 對)、看候選 embedding model 的 hit rate / nDCG

In-domain 評估的最小可行流程:

1# 偽代碼
21. 蒐集 50-100  query + expected_doc已知答案的對
32.  candidate embedding models 各跑
4   - embed 所有 doc expected  distractor~1000  distractor
5   - embed 每個 query
6   -  query-doc similarity expected 是否在 top-5 / top-10
73. 比較 candidate  hit_rate@5 / hit_rate@10

跑完這個再決定用哪個 embedding model、比看 MTEB leaderboard 可靠很多。

實務選型的 constraint 優先序

上面四個維度(domain / 大小 / context / cosine 設計)跟 MTEB 評估是「品質軸」— 哪個 embedding model 最能解你的 retrieval 問題。但實際選型時,品質軸之前通常有一組工程 constraint 先砍掉大量選項,剩下的候選才進品質比較。

常見的工程 constraint 依砍選項力度排序:

  1. Runtime 可用性:推論伺服器支援哪些模型?Ollama 目前原生支援 nomic-embed-textmxbai-embed-largesnowflake-arctic-embed 等,但不支援所有 Hugging Face 模型。用 cloud API(OpenAI / Cohere / Voyage)則受 vendor 綁定跟成本約束。這一條通常砍掉最多選項。
  2. 體積 / 記憶體預算:個人機器常駐 embedding model 跟 chat model 共用記憶體。137M 的 nomic-embed-text 跟 7B 的 e5-mistral 在記憶體佔用上差一個數量級。
  3. 已有驗證基線:團隊或前期 demo 已用某個模型跑過、retrieval 品質已確認可用。換模型要重建 index + 重新驗證,成本不只是 MTEB 分數比較。
  4. 向量維度的 storage 成本:維度影響 index 大小(n × d × 4 bytes)跟 brute-force search 延遲。768 維 vs 1024 維在小規模無感,但 100K+ chunks 時差異開始有意義。詳見 4.22 RAG storage 工程

實務流程是:先用 constraint 1-3 收窄到 2-3 個候選,再跑 in-domain benchmark(上段的 hit rate 流程)做最終決定。直接從 MTEB leaderboard 挑最高分的模型、到實際場景才發現 runtime 不支援或體積太大,是常見的繞路。

何時該 fine-tune 自己的 embedding model

通常不該 fine-tune embedding model — 用現成的 bge-large、jina-v3 已經很好。但下列情境值得評估:

  1. Domain 跟通用 corpus 差距大

    • 醫療 / 法律 / 金融的專業術語、通用 embedding model 對「同義詞」「同概念不同表述」recall 差
    • In-domain term frequency 跟通用 corpus 差距大(如「IRA」在金融 vs 政治語境)
  2. In-domain benchmark hit rate 顯著低於通用 benchmark

    • 用 MTEB 高分模型、in-domain hit rate@5 仍 < 60%
    • 換多個候選 embedding model、所有都類似低分
  3. 有足夠 in-domain (query, doc) 對

    • Fine-tune 需要至少數千對、最好 1-10 萬對
    • 對少於 1000 對的場景、fine-tune 收益通常低於數據增強 / 提升 retrieval pipeline

Fine-tune 流程(詳細):

Step 1:蒐集 in-domain training data

三種主流形態:

Format結構蒐集難度
Positive pair(query, relevant_doc)容易(從 click log、QA pair)
Triplet(anchor, positive, negative)中(要明確 negative)
Score / label(query, doc, relevance_score)難(要人工標)

實務多從 positive pair 開始(InfoNCE loss 在 batch 內自動取其他樣本當 negative)、品質提升再進 triplet(hard negative mining)。

Step 2:選 base model

選擇看資料量跟硬體:

起始 base model適合資料量適合硬體
sentence-transformers MiniLM1K - 50K 對一般 CPU / 小 GPU
BGE-base / bge-small10K - 100K 對16GB+ GPU
BGE-large / jina-v3 / mxbai50K+ 對24GB+ GPU
E5-Mistral-7B-instruct100K+ 對多卡 / A100

選擇原則:base model 在 generic benchmark 越強、fine-tune 後上限越高、但訓練成本越高。

Step 3:Loss 選擇

Loss機制適合
MultipleNegativesRankingLossInfoNCE 變體、batch 內其他樣本當 negativePositive pair only、大 batch
Triplet loss直接比 (anchor, positive, negative) 距離有明確 triplet、傳統選擇
Cosine similarity loss預測相似度標籤Score / label data
Contrastive tension loss對比學習變體、效果好大規模 fine-tune

實務 default:MultipleNegativesRankingLoss + batch size 64-128(越大 negatives 越多、品質越高)。

Step 4:Hard negative mining

純隨機 negative(batch 內其他樣本)容易、但 hard negative(看似相關但實際無關)才能 push 模型品質:

11. 用初版 fine-tuned model 對每個 query 跑 retrieve top-50
22. 對每個 query 的 top-50:
3   - 真正 relevant doc(known positive)→ skip
4   - 其他 → 候選 hard negative
53. 篩 hard negatives(LLM-as-judge 或人工確認真的「看似相關但不對」)
64. 用 (query, positive, hard_negative) 重訓
75. Iterate 2-3 輪

Hard negative 是 embedding fine-tune 品質的關鍵差距 — 沒做的 fine-tune 通常 plateau 早、做了的可超越通用 model。

Step 5:LoRA fine-tune 而非 full fine-tune

跟 LLM fine-tune 一樣、embedding model fine-tune 也用 LoRA

方式訓練成本通用能力保留推論方式
Full fine-tunecatastrophic forgetting部署新權重
LoRA fine-tune保留好載入 base + adapter

主流 framework:sentence-transformers + PEFT、Hugging Face Transformers + LoRA library。

Step 6:Evaluate

不只看 training loss、要實測:

11. Build in-domain test set(held-out、跟 training 完全分開)
22. 算 [hit_rate@K](/llm/knowledge-cards/retrieval-recall/)(query 的 expected doc 是否在 top-K retrieval result)
33. 跟「base model 未 fine-tune」對比:
4   - Fine-tune 後 hit_rate@5 提升 ≥ 10 percentage point → 成功
5   - 提升 < 5pp → fine-tune 沒效益、不如優化 retrieval pipeline
64. 確認沒崩通用能力:在 MTEB 跑、看主流 retrieval 任務沒大降

失敗模式

失敗緩解
資料太少(< 1000 對)、模型沒學到數據增強(用 LLM 生 synthetic pair)、改用 prompt + RAG
訓練 loss 降但 hit_rate 沒升Hard negative 不夠、要重 mine
In-domain 提升但通用能力崩加 mixed dataset(80% domain + 20% MTEB)
Embedding dim 不能改Base model 已固定 dim、自己訓 from scratch 才能改
部署時跟 base model 衝突LoRA adapter merge 進 base 後部署、或同時 serve 兩版

跟 LLM 的整合:retrieval pipeline

完整 RAG pipeline 裡 embedding model 的位置:

 1[Ingestion 階段(離線)]
 2  Documents
 3    ↓ chunking
 4  Chunks
 5    ↓ embedding model
 6  Chunk vectors → 存進 vector DB
 7
 8[Query 階段(線上)]
 9  User query
10    ↓ embedding model
11  Query vector
12    ↓ vector DB ANN search
13  Top-K chunks
14    ↓ (optional) reranking
15  Top-N chunks
16    ↓ augment LLM prompt
17  LLM response

關鍵設計決策:

  1. Embedding model 一致性:ingestion 跟 query 必須用同個 model(換 model = 整批 re-embed);chunk vectors 存進 vector DB 之後的 index 結構、維度成本與生命週期見 4.22 RAG storage 工程
  2. Chunking 策略對齊 embedding context:見 4.1 RAG chunking
  3. Reranking model 通常用 cross-encoder:embedding model 是 bi-encoder(query 跟 doc 分開 embed)、reranker 是 cross-encoder(query + doc 一起算)、品質更高但慢、適合在 top-50 → top-5 之間做 reranking
  4. Hybrid retrieval:BM25(字面)+ embedding(語意)混用、用 RRF(Reciprocal Rank Fusion)合併、是 production 常見配置

本地 vs 雲端 embedding

維度本地(如 nomic-embed)雲端(如 OpenAI text-embedding-3)
隱私完全本地、no exfilAPI 送 doc、依政策 log
成本一次硬體 + 電費按 token 計費、長期可累積
品質bge-large / jina-v3 已接近雲端旗艦略高(旗艦如 voyage-3 仍領先)
Latency視硬體、本地 SSD 快網路 latency
多語 / domain開源選擇多、可挑 domain-specificAPI 是通用、不一定最佳 domain match

寫 code 場景的判讀:

  • codebase 內部 RAG(NDA / 機密 code):本地 embedding 必選
  • 個人開源專案 RAG:本地 embedding 是合理 default、簡單、free
  • 公司內部 RAG(需高品質、量大):評估 voyage-3 / OpenAI v3 vs 本地 bge-large
  • 產品級 production RAG:通常雲端 API + 自己 fine-tune 的 embedding(最佳品質)

何時過時 / 何時不過時

不會過時的部分

  • Contrastive learning 是 embedding model 的核心訓練 paradigm
  • MTEB 作為通用 embedding 評估的角色
  • 「跟自己 domain 對齊」的 in-domain benchmark 必要性
  • Bi-encoder vs cross-encoder 的分工(retrieval vs reranking)
  • Hybrid retrieval(BM25 + embedding)的設計

會變的部分

  • 具體 embedding model(bge → bge-v2 → …、jina-v3 → v4 → …)
  • MTEB leaderboard 排名(每月變)
  • Instruction-tuned embedding 的 prompt format(標準化中)
  • Embedding model 的 context window 上限(推升中)
  • Long-context embedding 的研究(如 ColBERT-style late interaction)

下一章

沒 backend 的靜態場景(個人 blog / docs site)做 embedding 搜尋的 deployment 選擇見 4.16 靜態 / serverless RAG deployment

下一章:4.13 Eval 設計座標系、看 eval 三軸八象限 meta 框架(先選軸再選工具)、再進 4.14 Benchmarking 與評估方法論 看具體 benchmark 設計。