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

📅 2026/6/26 10:21:16
RAG 中的 Embedding 算法:从 Word2Vec 到 BGE / Qwen3,为什么第三代才是检索标配?
01RAG 里的 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 等。模型最终是否好用必须用自己的业务数据测。07RAG 里 Embedding 的真实工作流理解了算法演进再看 RAG 工程就很清楚了。离线阶段系统把文档清洗、切块、编码成向量连同 metadata 一起写入向量库。在线阶段用户问题先被编码成 Query 向量然后去向量库召回 TopK 文档再进入 rerank 和 prompt 组装。这套架构能跑起来靠的就是第三代句子级 Embedding 的 Bi-Encoder 机制文档向量提前算查询向量在线算。08代码示例最小可运行的句子向量相似度下面这段代码演示了第三代句子级 Embedding 的基本用法查询和文档分别独立编码然后用余弦相似度比较。实际生产中doc_vec 会提前写入向量库而不是在线每次重算。from sentence_transformersimportSentenceTransformer from sklearn.metrics.pairwiseimportcosine_similarity modelSentenceTransformer(BAAI/bge-m3)query苹果手机怎么截图doc_1iPhone 截屏方法doc_2苹果怎么削皮更方便# RAG 在线阶段只需要实时计算 Query 向量query_vecmodel.encode([query],normalize_embeddingsTrue)# RAG 离线阶段文档向量应该提前计算并写入向量库doc_vecsmodel.encode([doc_1, doc_2],normalize_embeddingsTrue)scorescosine_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 个候选模型再准备业务标注集评估 RecallK、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上线前会用业务标注集评估 RecallK、MRR、nDCG并观察线上无答案率、误召回率和延迟。