RAG 中的 Embedding 算法:从 Word2Vec 到 BGE / Qwen3,为什么第三代才是检索标配?

RAG 中的 Embedding 算法:从 Word2Vec 到 BGE / Qwen3,为什么第三代才是检索标配?

01|RAG 里的 Embedding,不是越“聪明”越好,而是越适合检索越好

很多人第一次回答“Embedding 算法有哪些”时,容易只说 Word2Vec 或 BERT。这个回答不算错,但会暴露一个问题:没有把 NLP 表示学习和 RAG 检索工程区分开。

RAG里真正需要的 Embedding,必须满足三件事:第一,能把语义相近的 Query 和文档 Chunk 拉近;第二,能把文档向量提前算好并存进向量库;第三,在线查询时只算一次 Query 向量,就能在百万甚至千万级文档里快速召回。

要点:Embedding 算法大致经历了三代:第一代是静态词向量,第二代是上下文相关向量,第三代是句子级检索向量。RAG 主要用第三代。

02|为什么 Embedding 算法要一代代演进?

先看一个非常接地气的问题:用户问“苹果手机怎么截图”,知识库里写的是“iPhone 如何截屏”。如果只做关键词匹配,这两句话几乎没有共同词,很容易错过。但人一看就知道它们问的是同一件事。

Embedding 的作用,就是把文本变成向量。向量空间里的距离,代表语义距离。这样“苹果手机怎么截图”和“iPhone 如何截屏”虽然字面不同,但向量距离很近,就能被召回。

但是,把文本变成向量这件事并不简单。早期模型只会给每个词一个固定向量,后来模型能理解上下文,再后来模型才真正开始针对“语义检索”做训练。

03|第一代:静态词向量 Word2Vec / GloVe / FastText

第一代 Embedding 的核心思想很朴素:一个词的含义,可以通过它周围经常出现什么词来学习。比如“国王”常和“王后、王室、男人、国家”一起出现,“女王”常和“王室、女人、国家”一起出现,模型就能学到它们之间的语义关系。Word2Vec 论文提出了 CBOW 和 Skip-gram 两种高效学习词向量的架构。

Word2Vec 的价值在于,它第一次让大量词语拥有了可计算的向量表示。比如经典的“king - man + woman ≈ queen”,本质上就是向量空间里的语义关系。

GloVe 和 Word2Vec 的方向类似,但它更强调全局词共现统计。FastText 则进一步把词拆成字符 n-gram 子词,从而缓解未登录词问题。比如一个新词“苹果手机壳”没有在训练集中出现过,也可以通过“苹果、手机、机壳”等子片段估算向量。

第一代最大问题:一个词只有一个向量

第一代静态词向量有一个致命短板:同一个词不管出现在什么上下文里,向量都是固定的。“我吃了苹果”里的苹果是水果,“苹果手机发布了”里的苹果是品牌,但静态词向量会把它们压成同一个点。

要点:第一代算法解决了“词可以变成向量”,但没有解决“词在不同上下文里含义不同”。

04|第二代:上下文相关向量 ELMo / BERT

第二代算法要解决的核心问题,就是让词的向量跟着上下文变化。ELMo 用双向 LSTM 建模上下文,BERT 则用 Transformer 和 Masked Language Model 预训练,把上下文理解能力推上了一个新台阶。

用 BERT 看“苹果”,它不会只看“苹果”两个字,而会看周围词。如果周围是“吃了、很甜”,向量更接近水果;如果周围是“手机、发布、系统”,向量更接近科技品牌。

为什么 BERT 很强,但不适合直接做大规模召回?

很多人会误以为:BERT 理解能力强,所以 RAG 直接用 BERT 检索就好了。真正落地时会发现,这个想法很危险。

传统 BERT 更适合 Cross-Encoder 方式:把 Query 和 Doc 拼在一起,让模型判断它们是否相关。这样精度很高,因为 Query 和 Doc 的 token 可以深度交互。但问题是,知识库里有一百万个 Chunk,就要把 Query 和一百万个 Chunk 分别拼接、分别跑模型。用户等不起,服务器也扛不住。

所以,BERT 解决了多义词问题,但没有天然解决大规模检索问题。RAG 需要的是能提前把文档向量算好、在线只算一次查询向量的方案。

05|第三代:句子级检索向量 SBERT / SimCSE / BGE / E5 / Qwen3

第三代的关键变化是:不再只做词级表示,也不再把 Query 和 Doc 每次都拼在一起跑,而是让每段文本独立生成一个句子级向量。

SBERT 使用 Siamese / Triplet 网络结构,把两个句子分别编码成向量,再用余弦相似度比较。这样,文档向量可以提前离线计算,用户查询时只需要计算 Query 向量,再去向量库做最近邻检索。Sentence-BERT 论文中提到,BERT 做 1 万句相似度搜索可能需要约 6500 万次计算,而 SBERT 可以把类似任务降到秒级量级。

SimCSE 进一步把“对比学习”这件事做得非常简洁:无监督版本把同一句话过两次 dropout 得到两个不同表示作为正样本,同时把 batch 里的其他句子当作负样本;监督版本则利用 NLI 数据里的 entailment / contradiction 信号。它的核心价值是让语义空间更好用:相似文本更近,不相关文本更远。

对比学习训练的目标:正样本拉近,负样本推远。

对比学习还能改善句向量空间分布,让向量更可区分。

06|现代检索模型:BGE、E5、Qwen3 为什么更适合 RAG?

第三代 Embedding 模型不止 SBERT 和 SimCSE。真正做中文 RAG 或企业知识库时,经常会看到 BGE、E5、Qwen3-Embedding 这些模型。它们不是“换个名字的 BERT”,而是围绕检索任务做了更强的训练和工程适配。

E5 通过弱监督对比学习构造大规模文本对,目标是让文本向量适用于检索、聚类、分类等多类任务。BGE-M3 强调 Multi-Linguality、Multi-Functionality、Multi-Granularity,支持多语言、dense/sparse/multi-vector 多种检索方式,以及长文档输入。Qwen3-Embedding 系列则在 2025 年发布,面向文本 embedding 和 reranking,强调多尺寸、多语言、长文本理解和任务指令感知能力。

现代 Embedding 模型的定位不能只看名字,要看任务、语言和工程成本。

要点:中文 RAG 场景,BGE-M3 和 Qwen3-Embedding 都值得评估;英文场景可以评估 E5、OpenAI Embedding、SBERT 等。模型最终是否好用,必须用自己的业务数据测。

07|RAG 里 Embedding 的真实工作流

理解了算法演进,再看 RAG 工程就很清楚了。离线阶段,系统把文档清洗、切块、编码成向量,连同 metadata 一起写入向量库。在线阶段,用户问题先被编码成 Query 向量,然后去向量库召回 TopK 文档,再进入 rerank 和 prompt 组装。

这套架构能跑起来,靠的就是第三代句子级 Embedding 的 Bi-Encoder 机制:文档向量提前算,查询向量在线算。

08|代码示例:最小可运行的句子向量相似度

下面这段代码演示了第三代句子级 Embedding 的基本用法:查询和文档分别独立编码,然后用余弦相似度比较。实际生产中,doc_vec 会提前写入向量库,而不是在线每次重算。

from sentence_transformersimportSentenceTransformer from sklearn.metrics.pairwiseimportcosine_similarity model=SentenceTransformer("BAAI/bge-m3")query="苹果手机怎么截图"doc_1="iPhone 截屏方法"doc_2="苹果怎么削皮更方便"# RAG 在线阶段:只需要实时计算 Query 向量query_vec=model.encode([query],normalize_embeddings=True)# RAG 离线阶段:文档向量应该提前计算并写入向量库doc_vecs=model.encode([doc_1, doc_2],normalize_embeddings=True)scores=cosine_similarity(query_vec, doc_vecs)[0]fordoc, scoreinzip([doc_1, doc_2], scores): print(f"{score:.4f} {doc}")

如果使用 E5 / BGE / Qwen3 这类模型,要特别注意模型说明里的 query/passsage 前缀、instruction 格式、是否需要 normalize、最大长度和 embedding 维度。很多线上检索效果差,并不是模型不行,而是输入格式没有按模型训练方式来。

09|工程选型:不要迷信排行榜,要看你的业务数据

Embedding 模型选型,不能只看 MTEB 排名。MTEB 很重要,它覆盖了检索、分类、聚类、重排等多个任务,是横向比较模型的重要参考。但真实业务里,用户问法、文档风格、行业术语、数据噪声、Chunk 策略都会影响最终效果。

一个靠谱的选型流程是:先选 3 到 5 个候选模型,再准备业务标注集,评估 Recall@K、MRR、nDCG、延迟、吞吐、存储成本。最后结合线上失败样本做归因:到底是没召回、召回错、重排错,还是生成阶段答偏。

Embedding 效果评估不是一次性跑分,而是持续闭环。

10|面试怎么回答?

如果面试官问“Embedding 有哪些算法”,不要只背模型名。更好的回答方式是按三代演进来讲,再落到 RAG 工程取舍。

可以这样回答:第一代是 Word2Vec、GloVe、FastText 这类静态词向量,解决了词向量问题,但处理不了多义词;第二代是 ELMo、BERT 这类上下文向量,解决了多义词,但直接做大规模检索太慢;第三代是 SBERT、SimCSE、BGE、E5、Qwen3-Embedding 这类句子级检索向量,支持 Bi-Encoder 独立编码,能提前把文档向量存入向量库,是 RAG 的标配。

如果结合项目经验,可以补一句:中文知识库我会优先评估 BGE-M3 和 Qwen3-Embedding,英文场景可以评估 E5 和 OpenAI Embedding;上线前会用业务标注集评估 Recall@K、MRR、nDCG,并观察线上无答案率、误召回率和延迟。