RAG的Embedding模型選取大有門道
Retrieval-Augmented Generation (RAG) 現在是最受歡迎的框架,用來構建 GenAI 應用。企業和組織特別喜歡它,因為它能讓他們用自己的專有數據來回答用戶問題。它讓 LLM 給出準確、及時、和用戶問題相關的答案。
從我這幾年構建 RAG 應用的經驗來看,你的響應質量很大程度上取決于檢索到的上下文。 而提升 RAG 檢索上下文的一個關鍵方式,就是把數據切分成合適的大小,選擇合適的 embedding 模型,還有選一個有效的檢索機制。
Embeddings 是 LLMs 的骨干。當你讓 LLM 幫你調試代碼時,你的詞和 token 會被轉化成高維向量空間,在那里語義關系變成數學關系,這靠的就是 embedding 模型。如果你用了錯的 embedding 模型,你的 RAG 應用可能會拉來不相關或亂七八糟的數據。這會導致糟糕的答案、更高的成本,還有不開心的用戶。
在這篇博客里,我會解釋 embeddings 是什么,為什么它們重要,以及你在選擇時該考慮什么。我們還會看看不同的 embedding 模型,以及哪些適合特定情況。到最后,你會清楚怎么挑對 embedding 模型,來提升準確性,讓你的 RAG 應用跑得順順的。
Embeddings 是什么?
Embeddings 是捕捉語言含義和模式的數字表示。這些數字幫你的系統找到和問題或主題緊密相關的信息。
這些 embeddings 是用 embedding 模型創建的。Embedding 模型把詞、圖像、文檔,甚至聲音,轉成一系列叫向量(vector)的數字。

你可能是在 large language models 的語境下學到 embeddings 的,但 embeddings 其實歷史更悠久。
這些 embeddings 是怎么計算的?
現在,大多 embeddings 是用 language models 創建的。 不是用靜態向量表示每個 token 或詞,language models 創建上下文化的詞 embeddings,根據上下文用不同的 token 表示詞/句子/塊。這些向量然后可以被其他系統用于各種任務。
有多種方式產生 text embedding vector。最常見的方式之一,是平均模型產生的所有 token embeddings 的值。但高質量的 text embedding 模型通常是專門為 text embedding 任務訓練的。
我們可以用 sentence-transformers 這個流行包,來用預訓練 embedding 模型產生 text embeddings。
from sentence_transformers import SentenceTransformer
# 加載模型
model = SentenceTransformer("sentence-transformers/all-mpnet-base-v2")
# 把文本轉成 text embeddings
vector = model.encode("Best movie ever!")embedding vector 的值數量,或者說維度,取決于底層的 embedding 模型。可以用 vector.shape 方法找到 embedding vector 的維度。
為什么 Embeddings 在 RAG 中重要?
Embeddings 在 Retrieval-Augmented Generation (RAG) 系統里扮演關鍵角色。來看看為什么:
語義理解:Embeddings 把詞、句子或文檔轉成向量(數字列表),讓相似含義的靠近在一起。這幫系統理解上下文和含義,不只是匹配確切的詞。
高效檢索:RAG 需要快速找到最相關的段落或文檔。Embeddings 讓搜索更快更容易,通常用像 k-nearest neighbors (k-NN) 這樣的算法。
更好準確性:用 embeddings,模型能找出和問題相關的信息,哪怕沒用一樣的詞。這意味著你得到更準確、更相關的答案。
Embeddings 的類型
Embeddings 有幾種形式,取決于你的系統需要處理什么信息。

1.根據你想讓系統理解的信息種類:
1.1 Word Embeddings
Word embeddings 把每個詞表示成多維空間里的一個點。含義相似的詞,比如 “dog” 和 “cat”,最后會靠近在一起。這幫電腦理解詞之間的關系,不只是拼寫。
熱門 word embedding 模型包括:
Word2Vec:從大量文本學習詞關系。
GloVe:關注詞一起出現的頻率。
FastText:把詞拆成更小部分,讓它更好處理稀有或拼錯的詞。

1.2 Sentence Embeddings
有時,含義只能從整個句子學到,不是單個詞。Sentence embeddings 把句子的整體含義捕捉成一個向量。
知名 sentence embedding 模型有:
Universal Sentence Encoder (USE):對各種句子都行,包括問題和陳述。
SkipThought:學習預測周圍句子,幫模型理解上下文和意圖。
1.3 Document Embeddings
文檔可以是從一段到整本書。Document embeddings 把所有文本轉成單個向量。這讓搜索大集合文檔更容易,幫找到和查詢相關的內容。
領先 document embedding 模型包括:
Doc2Vec:基于 Word2Vec,但設計用于更長文本。
Paragraph Vectors:類似 Doc2Vec,但專注更短文本部分,比如段落。
1.4 Image Embeddings:
文本不是 RAG 系統唯一能處理的,系統還能處理圖像。Image embeddings 把圖片轉成描述顏色、形狀和模式的數字列表。
熱門 image embedding 模型是 Convolutional Neural Networks (CNNs)。它特別擅長識別圖像模式。
2.根據 embedding 的特性:
Embeddings 可以有不同品質,影響它們怎么工作和最適合什么。咱們用簡單解釋和例子分解這些特性:
2.1. Dense Embeddings
Dense embeddings 用向量,幾乎每個數字都有值。每個值都存一點關于詞、句子、圖像或文檔的信息。Dense vectors 緊湊高效。在小空間存很多細節。這讓電腦更容易比較東西,快速找到相似點。
2.2. Sparse Embeddings
Sparse embeddings 和 dense 相反。向量里大多數數字是零,只有少數地方有實際值。零不帶信息。Sparse embeddings 幫突出最重要的特征。它們讓突出什么讓東西獨特或不同更容易。

2.3 Long Context Embeddings
有時,你需要理解整個文檔或長對話,不是短句子。Long context embeddings 設計用來一次處理大量文本。
老模型只能看短文本。如果你給它們大文章,它們得拆成小部分。這可能讓它們錯過重要連接或丟掉主思路。新模型,像 BGE-M3,能一次處理成千上萬詞(高達 8,192 tokens)。這幫電腦保持完整故事。
2.4 Multi-Vector Embeddings
通常,一個項目(像詞或文檔)只得一個向量。Multi-vector embeddings 為每個項目用幾個向量。每個向量能捕捉不同特征或方面。
用不止一個向量,電腦能注意到更多細節和關系。這帶來更豐富、更準確的結果。
選擇最佳 Text Embedding 模型的參數
在挑模型前,你該知道看什么。有幾個關鍵因素要考慮:

1.Context Window
Context window 是模型一次能處理的最大文本量。比如,如果模型 context window 是 512 tokens,它一次只能讀 512 個詞或詞片。更長文本必須拆分。有些模型,像 OpenAI 的 text-embedding-ada-002 (8192 tokens) 和 Cohere 的 embedding 模型 (4096 tokens),能處理更長文本。
為什么重要?
更大 context window 讓你處理更大文檔而不丟信息。這對像搜索長文章、研究論文或報告的任務有幫助。
2.Tokenization Unit
Tokenization 是模型把文本拆成更小部分,叫 tokens。不同模型用不同方法:
Subword Tokenization (Byte Pair Encoding, BPE):把詞拆成更小片。比如,“unhappiness” 變成 “un” 和 “happiness。” 這幫處理稀有或新詞。WordPiece:類似 BPE,但常用于像 BERT 的模型。
Word-Level Tokenization:把文本拆成整詞。不太適合稀有詞。
為什么重要?
模型 tokenization 的方式影響它怎么理解不同詞,尤其是 unusual 的。大多現代模型用 subword tokenization 來更好靈活。
3.Dimensionality
Dimensionality 是模型為每塊文本創建的數字列表(vector)大小。比如,有些模型產生 768 個數字的向量,其他是 1024 甚至 3072。
為什么重要?
更高維向量能存更多細節信息,但需要更多電腦功率。更低維向量更快,但可能錯過一些細節。
4.Vocabulary Size
這是模型知道的獨特 tokens 數量。更大詞匯庫處理更多詞和語言,但用更多內存。更小詞匯庫更快,但可能不懂稀有或專業詞。
比如:大多現代模型有 30,000 到 50,000 tokens 的詞匯庫。
5.Training Data
Training data 是模型學的東西。
訓練于 General-Purpose:當訓練于很多類型文本,像網頁或書,模型變得適用于一般用途。適合廣任務。
Domain-Specific:當訓練于專業文本,像醫療或法律文檔,模型變得特定領域專家。這些適合 niche 任務。
為什么重要?
訓練于特定數據的模型在那些領域做得更好。但可能不適合一般任務。
6.Cost
Cost 包括用模型需要的錢和電腦資源。根據你計劃怎么訪問 LLM 模型,cost 結構會變。
API-Based Models:按使用付費,像 OpenAI 或 Cohere。
Open-Source Models:免費用,但你需要硬件(像 GPUs)和技術技能自己跑它們。
為什么重要?
API 模型容易用,但如果你數據多,可能貴。Open-source 模型省錢,但需要更多設置和知識。
選擇 Embedding 時關鍵因素
1.了解你的數據領域
從我的經驗,當設計 RAG 應用時,我第一個問的是,“我的 RAG 系統要處理什么數據?”
如果我們處理一般知識或客戶 FAQs,一般用途 embeddings 像 OpenAI 的 text-embedding-3-small 通常夠。但對專業領域像醫學、法律或金融,domain-specific 模型如 BioBERT、SciBERT 或 Legal-BERT 是最佳。這些模型訓練來理解那些領域的獨特語言和上下文。
如果 RAG 工具需要處理產品圖像或語音查詢,去用 multimodal embeddings。CLIP 是處理文本和圖像的可靠選擇。
2.Embedding 大小和模型復雜度
接下來我會評估我的查詢和文檔是短還是長,結構化還是非結構化。有些模型更適合簡短片段,其他擅長處理更長、自由形式文本。
Embedding dimensionality 很重要。高維向量 (1536 或 4096 維度) 捕捉更多細微差異和上下文。它們一般提升檢索準確性,但需要更多計算資源和存儲。
低維向量 (384 或 768 維度) 更快更輕,如果你擴展到百萬文檔,這很關鍵。權衡簡單:更多維度意味更好準確但更高成本;更少維度意味速度和效率但可能犧牲精度。
實踐中,最好從 384–768 范圍的向量開始。這給你性能和資源用的好平衡。
現代 vector databases 像 Pinecone、Weaviate 或 FAISS 能用 quantization 或 dimensionality reduction 壓縮 embeddings。這些 vector DBs 讓你用更大 embeddings 而不付全內存成本。
3.計算效率
速度關鍵,尤其是實時應用。
如果響應時間對你的應用超級重要,去用低 inference times 的模型。輕模型像 DistilBERT 或 MiniLM 快,還對大多任務夠準確。
4.上下文理解
接下來,我們該評估 RAG 系統該回答的查詢。知識內容/文檔的結構和長度。這些內容該基于應用切成合適最佳大小。得到用戶問題正確答案的一個關鍵因素是模型的 context window,就是它一次考慮的文本量。
更大 context windows 在處理長或復雜文檔時有幫助。能一次處理更多文本的模型傾向于為長查詢給出更準確答案。
5.集成和兼容性
最好選和現有基礎設施無縫集成的模型。
來自 TensorFlow、PyTorch 或 Hugging Face 的預訓練模型通常更容易部署,有強文檔和社區支持。
6.Cost
最后,要估項目總權衡訓練和部署成本,如果你計劃 fine tune 模型并 host 你的模型。但大多 RAG 應用能用現成的好好工作。
更大模型訓練和跑更貴。Open-source 模型通常更預算友好,但可能需要額外設置和維護。Proprietary 模型提供更好支持和性能,但價格更高。
場景:為醫療研究論文選擇 Embedding 模型
假設你需要建一個 semantic search 系統,為醫療研究論文。你想讓用戶快速準確找到相關研究。你的數據集大,每個文檔長,介于 2,000 到 8,000 詞。你需要一個能處理這些長文本、提供有意義結果、并保持每月預算 300$ - 500$ 的模型。
你怎么為這個工作挑對 embedding 模型?咱們一步步走過程。
步驟 1: 專注領域相關性
醫療研究論文用復雜醫療術語和技術語言。你選的模型該訓練于科學或學術文本,不是只法律或一般內容。
所以,主要設計用于法律或生物醫學文檔的模型不會是更廣科學研究的合適。
步驟 2: 檢查 Context Window 大小
研究論文長。要完整處理它們,你需要大 context window 的模型。大多研究論文有 2,000 到 8,000 詞。大約 2,660 到 10,640 tokens (假設 1.33 tokens 每詞)。
8,192-token context window 的模型能一次蓋約 6,156 詞。
如果模型只能處理 512 tokens,它沒法處理整論文。
要跳過的模型:
Stella 400M v5
Stella 1.5B v5
ModernBERT Embed Base
ModernBERT Embed Large
BAAI/bge-base-en-v1.5
allenai/specter
m3e-base
步驟 3: 考慮 Cost 和 Hosting
你有預算。按 token 付費會快速加起來,尤其是大文檔和頻繁搜索。
來看些模型:
OpenAI text-embedding-3-large: $0.00013 每 1,000 tokens
OpenAI text-embedding-3-small: $0.00002 每 1,000 tokens
Jina Embeddings v3: Open-source 和 self-hosted,無 per-token 成本
算算數。如果你每月處理 10,000 文檔 (每個 8,000 tokens):
OpenAI text-embedding-3-large: $10.4/月 (預算內)
OpenAI text-embedding-3-small: $1.6/月 (遠低于預算)
Jina Embeddings v3: 無 per-token 成本。但你付 hosting/server 成本 (取決于服務器大小和你是否和另一個模型 host)
要跳過的模型:
Jina Embeddings v3
步驟 4: 比較性能 (MTEB Score)
現在,看剩下模型的實際性能。Massive Text Embedding Benchmark (MTEB) 提供分數幫比較。
OpenAI text-embedding-3-large: 強性能,好 MTEB 分 (~71.6),能處理高達 8191 tokens,且成本有效。
OpenAI text-embedding-3-small: 好性能,好 MTEB 分 (~69.42),能處理高達 8191 tokens,且成本有效。
Voyage-3-large: 好 MTEB 分 (~60.5),能處理高達 32,000 tokens,且成本有效。
NVIDIA NV-Embed-v2: 最高 MTEB 分 (72.31),處理高達 32,768 tokens,open-source 和 self-hosted。
我們的最終選擇:
縮小列表后,你剩下 open-source 模型像 OpenAI text-embedding-3-small、OpenAI text-embedding-3-large、Voyage-3-large 和 NVIDIA NV-Embed-v2。
這些模型能處理長醫療研究論文,提供強準確性,并適合你的預算。
NVIDIA NV-Embed-v2 以其高 MTEB 分和大 context window 脫穎而出,讓它成醫療 semantic search 的可靠選擇。
選擇對 embedding 模型需要仔細思考。看你的需要,比較選項,挑最適合你項目的那一個。
選擇對 Embeddings 的基準
新和改進 embedding 模型一直出來。但你怎么跟蹤它們?幸運,有大規模基準幫你保持信息。
Massive Text Embedding Benchmark (MTEB)
MTEB 是個社區跑的 leaderboard。它比較超 100 個 text 和 image embedding 模型,跨超 1,000 語言。一切都在一處——評估指標、不同任務類型,和廣泛領域。這讓它成你決定用哪個模型的有用起點。
鏈接:MTEB Dashboard(??https://huggingface.co/spaces/mteb/leaderboard??)

Massive Multilingual Text Embedding Benchmark (MMTEB)
大多傳統基準只蓋幾個語言或領域。MMTEB 走得更遠。它是 MTEB 的擴展版,現在包括超 500 個評估任務,超 250 語言。MMTEB 還測試更難挑戰,如指令跟隨、從長文檔檢索信息,甚至代碼檢索。它目前是最徹底的多語言 embedding 基準。
鏈接:研究論文(??https://arxiv.org/abs/2502.13595??)
什么時候用 Massive Text Embedding Benchmark (MTEB)?怎么用?
MTEB 是挑 embedding 模型的有用工具。不同模型在不同任務閃光。MTEB leaderboard 顯示每個模型跨廣泛任務的表現。這能幫你為特定需要縮小選擇。
但,別被 MTEB 分騙了。
MTEB 給你分,但不講全故事。頂模型間差異常很小。這些分來自很多任務,但你看不到任務間結果變多少。有時,leaderboard 頂的模型只有輕微優勢。統計上,幾頂模型可能表現一樣好。研究者發現平均分不總意味多,當模型這么近。
你該做什么?看模型在類似你用例的任務表現。這通常比只專注整體分更有幫助。你不用詳細研究每個數據集。但知道用什么文本——像新聞文章、科學論文或社交媒體帖子——能幫。你能在數據集描述或瞥幾例子找到這信息。
MTEB 是有幫助資源,但不完美。批判思考結果。別只挑最高分模型。深入找最適合你任務的。
考慮你應用的需要。沒有單一模型對一切最好。那是為什么 MTEB 存在,幫你為情況選對。當你瀏覽 leaderboard 時,記住這些問題:
你需要什么語言?模型支持嗎?
你用專業詞匯嗎,像金融或法律術語?
模型多大?它能在你硬件跑嗎,像筆記本?
你電腦有多少內存?模型能 fit 嗎?
最大輸入長度是多少?你文本長還是短?
一旦你知道什么對你項目最重要,你能在 MTEB leaderboard 上按這些特征過濾模型。這幫你找不只表現好,還適合你實際需要的模型。
結語:
為你的 RAG 應用選對 embedding 模型不是只挑基準上最高分的那個。像 MTEB 的工具有幫助,但它們不能告訴你一切。重要是看數字之外,考慮對你項目真重要的,像語言支持、專業詞匯、內存限,和文本長度。
花時間理解你用例。基于最相關任務比較模型。記住,對一個人應用好的模型可能不是你最好的。
最后,周到方法是平衡性能和實際需要。這會幫你找對模型。用點研究和仔細考慮,你會讓 RAG 應用成功。
本文轉載自??PyTorch研習社??,作者:AI研究生

















