当前位置: 首页 > news >正文

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,并观察线上无答案率、误召回率和延迟。

http://www.jsqmd.com/news/1080849/

相关文章:

  • 3个必知技巧:如何用Bibisco免费小说创作软件写出你的第一本畅销书
  • MC10B8CV1电机控制器PWM模式详解:从寄存器配置到步进电机驱动实战
  • MC68331 EVK开发平台硬件配置、调试与内存映射深度解析
  • 【C语言】1.C语言常见概念
  • MCP16251/2同步升压芯片:高效低功耗DC-DC转换器设计指南
  • Python的__get__描述符的instance参数为None时的行为
  • 嵌入式USB中断与错误处理实战:以S08USBV1为例的寄存器级解析
  • 市面上知名的VI设计公司有哪些
  • 浏览器指纹追踪防御实战:Heimdallr方案配置与WebRTC泄露防护
  • Burp Suite Professional 从零到精通的Web安全测试实战指南
  • VMware Tanzu Kubernetes Grid(TKG)落地困局破解:5类典型网络插件冲突场景及官方未公开的绕过方案
  • 嵌入式GUI开发实战:从零掌握emWin对话框编程与优化技巧
  • MC9S08SF4 ADC模块配置与低功耗应用实战指南
  • VCP认证备考周期从120天压缩至28天,资深认证讲师亲测有效:3阶段冲刺法+真题拆解日历
  • VMware蓝屏故障排查实战(2024最新避坑清单):从ESXi底层驱动到Guest OS兼容性深度拆解
  • 深入解析MCU低功耗唤醒机制:以NXP LLWU模块为例的实战指南
  • Unreal Engine实时音频处理架构深度解析:RuntimeAudioImporter高性能异步音频导入引擎
  • 600V半桥栅极驱动器MCP14H2103/04:原理、设计与应用全解析
  • 高斯混合模型与EM算法:从原理到图像分割的实战应用
  • 漏洞挖掘实战指南:从攻击者视角到系统化安全测试
  • MuleSoft与大语言模型深度集成:企业级AI编排实战指南
  • 从零到一:编程语言如何成为安全漏洞挖掘的基石与实战路径
  • macOS菜单栏的终极解放:用Ice重新定义你的工作空间效率
  • 如何快速搭建个人专属Web邮箱系统:Roundcube Mail完整实战指南
  • 高性能B站视频解析引擎:分布式架构下的异步处理方案
  • MC9S12HY/HA ADC与CAN模块实战:从寄存器配置到系统调试
  • 从脚本小子到专业渗透测试师:体系化学习路线与Kali实战指南
  • Gemma-3n:2GB内存CPU原生大模型实战指南
  • 仅限内部团队使用的VMware蓝屏自动化诊断脚本(PowerShell+LogParser双引擎),5秒定位Faulting Module
  • 对抗训练中的非局部总变差正则化:原理、优化与工程实践