一、是什么
什么是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向量数据库