一、是什么
什么是BGE向量算法?先說說網上的概念吧。本文不講解太深的算法知識,主要講解如何用!
BGE(BAAI General Embedding)是北京智源研究院開源的“通用語義向量模型”。一句話:把中文或英文句子變成一個 512 維或 1024 維的數字向量(embedding),讓語義相近的句子在向量空間里也挨得近。目前也可以當做最強語義向量模型。
在做問答系統的工作中,我們需要我們的內容素材存成向量也就是經常說的embedding過程。但是在工作中為啥選擇了這個向量算法呢?很簡單,因為免費且開源,大家牢記,工作中用的東西都大差不差,效果好壞可以后期調整但是一定要開源和免費,否則你的項目立項都困難,因為還需要考慮成本問題。目前很多做RAG的團隊都用這個。我們用了,效果確實還不錯,沒啥毛病目前。
它能把任何一句話,無論中文還是英文,統統翻譯成一串只有機器才看得懂的「數字密碼」(專業叫“向量”)。語義越接近的兩句話,得到的密碼就越像,機器就能憑這個找到最相關的句子。
下面用 3 個畫面幫你秒懂:
-
先“借眼睛”
把 BGE 看成戴了副神奇眼鏡的翻譯官。
? 它先讀遍海量網頁、書籍、對話,像人類一樣學會了“蘋果≈水果”、“函數≈代碼片段”這些語義關系。
? 但和人類不同,它把學到的所有知識壓縮成固定 512 或 1024 個數字——這就是它的“母語”。 -
再“畫地圖”
? 每句話經過這副眼鏡,都會在世界地圖上留下一個“點”。
? 含義相近的句子點挨得近,風馬牛不相及的句子點離得遠。
例子:
“如何給貓洗澡?”和“貓咪清潔步驟”幾乎重疊;
“Python 循環寫法”則跟它們隔了十萬八千里。 - 最后“指方向”
? ? ? ??? 當你提問時,翻譯官先把你這句話也變成地圖上的一個點。
? ? ? ??? 然后拿尺子量一量,離誰最近就把誰拽出來——這就是“檢索”。
? ? ? ?? 把拽出來的原文連同你的問題一起丟給大模型,大模型就能答得更準確。
一句話總結
BGE 的魔法只有兩步:
-
把文字變成數字點;
-
在“語義地圖”里量距離找鄰居。
RAG 的檢索、推薦、問答,全靠這兩步跑得快又準。
RAG的效果好不好,最核心依賴兩點:文本embedding語義提取的好不好,rerank的排序效果好不好
大概說說使用和調研后感覺吧。優缺點就涉及到一些官話了。
一、優點(為什么要用)
-
中文效果頂尖
在官方 C-MTEB 榜單上,BGE-large-zh 的檢索精度 ≈ 同類開源模型的 1.4 倍。 -
免費 + 開源 + 商用友好
Hugging Face 一鍵下載,Apache-2.0 許可證,改都不用改就能上線。 -
尺寸可選
small / base / large 三檔,顯存從 1 GB 到 6 GB 都能跑;輕量場景用 small,精度要求高就上 large。 -
訓練配方好
RetroMAE 預訓練 + 難負樣本微調,讓它在“領域外”數據上也不易掉鏈子。 -
工具鏈成熟
官方腳本、ONNX 導出、Faiss/Milvus/Vespa 都直接支持,基本“開箱即用”。
二、缺點(要知道的坑)
-
長文本吃虧
最大 512 token(large 版 1024),超長文檔必須切塊,否則信息截斷。 -
英文或代碼場景不是最強但也算第一梯隊
英文 MTEB 上略遜于 E5-v2、SFR 等新模型;代碼檢索現在有 BGE-Code-v1 專用版,普通 BGE 并不擅長。因為我們的內容主要是中文的,所以選擇一個中文友好的就行了。 -
向量維度偏高
large 版 1024 維,百萬級文檔內存 ≈ 4 GB,對輕量級部署不算友好。 -
需要 GPU 才能“跑爽”
CPU 也能推理,但每秒幾十條,離線建大索引會等到懷疑人生。 -
解釋性一般
屬于 dense embedding,不像 BM25 能直接看出“哪個詞”命中,調錯時只能憑實驗。
二、什么時候用 / 什么時候不用
用:
? 中文知識庫、企業 FAQ、客服對話記錄等典型 RAG 場景;
? 團隊缺算法人力,想“下下來就能用”;
? 需要商用閉源,怕許可證踩坑。
不用或換:
? 超長文檔(>2k token)為主,可考慮 M3-E5、Nomic 等支持更長上下文的模型;
? 純英文或代碼檢索,直接上 E5-v2、SFR-Embedding、BGE-Code-v1 更合適;
? 極端資源受限,連個GPU都沒有,可試更小量化模型(e.g. MiniLM-Chinese)。
一句話總結
做中文 RAG,先把 BGE 當成“默認選項”基本不會錯;真遇到場景特殊,再按上面的缺點換更合適的模型。
可以參考:bge-large-zh · 模型庫
三、算法原理
這個東西本人認為應用工程師沒必要深入了解,當然了解沒壞處。看個人的時間和精力吧。關鍵是一堆數據公式,你編程的時候有現成工具包都不需要自己實現。
BGE 的“算法”其實分兩層——
1、怎樣把一句話變成 1024 個數字(向量生成算法);
2、怎樣在訓練時讓“語義相近的句子向量更靠近”(對比學習算法)。
下面用“做菜”類比,我盡力把核心公式也翻譯成大白話。
-
向量怎么來的?——Transformer 抽特征,在機器翻譯中,Transformer可以將一種語言翻譯成另一種語言,通過不斷的encode和decode。
? 原料:句子先被切成“詞”或“子詞”(token)。
? 炒鍋:多層 Transformer(12 層或 24 層),每層都在問“這個詞和前后詞啥關系?”
? 出鍋:把最后一層所有詞的向量取平均(叫 mean pooling),得到 1024 個數字——這就是 BGE 輸出的“語義指紋”。
(公式層面就是標準的 Transformer + pooling) -
?怎樣讓指紋“靠得近”?——RetroMAE + 對比學習
BGE 訓練分兩階段:階段 A:RetroMAE 預訓練——先學會“填空”
-
隨機把句子遮住 60% 的詞(mask)。
-
用一個小網絡把殘缺的句子壓成一個向量 z。
-
再用 z 去還原原句。
目的:逼模型把整句含義擠進 z,練成“壓縮高手”。
階段 B:對比微調——讓“問題”挨“答案”
? 數據格式:(查詢 q,正例 p?,負例 p??, p?? …)
例如:
q = “怎么給貓洗澡?”
p? = “貓咪洗澡步驟”
p? = “Python 循環寫法”
? 目標函數:InfoNCE(溫度縮放版)
L = – log [ e^(sim(q,p?)/τ) / Σ e^(sim(q,·)/τ) ]
白話:讓 sim(q,p?) 越大越好,sim(q,負例) 越小越好。
? 技巧:
– 先用 BM25 挖一批“硬負例”,再讓模型“啃硬骨頭”;
– 訓練時 32K 批次,大批量才能拉開距離。
3. 推理時怎么算相似度?
把 q 和 p 都過一遍 BGE → 得到兩個 1024 維向量 → 直接點積或余弦距離即可。
用 Faiss / Milvus 把幾百萬向量做成索引,毫秒級就能找最鄰居。
下一章介紹FAISS向量數據庫