两年前做RAG知识库检索项目时,embedding 模型这件事几乎不用讨论,中文场景直接上 bge-large-zh,多语言就用 bge-m3。知名 RAG 基座框架 RAGFlow 的早期版本甚至直接内置了 bge-large-zh。那时候大家默认的共识很简单:
embedding 模型,就该是 BERT 这种 encoder-only 架构。
但最近我重新去翻 MTEB 排行榜时,突然发现榜单前排已经几乎全变成了 Qwen、Gemma、Mistral 这类 decoder-only 模型。曾经统治 embedding 领域的 encoder 模型,如今很多已经掉到几十名开外。

embedding 领域其实已经悄悄完成了一次架构迁移。
到底是什么时候开始这样的转变呢?本篇文章将从头梳理文本向量化的发展历程,让读者能从历史的角度来理解这场架构迁移究竟是怎么发生的,以及它对实际工程选型意味着什么。
一、词袋时代:有统计,无语义
BERT 出来之前,文本嵌入的主流方案是**词袋模型(Bag of Words)**和 TF-IDF。做法很直接:把文档表示成一个超高维的稀疏向量,维度等于词典大小,每个位置记录词频或者加权后的词频。
这套方案最大的问题是没有语义。"猫"和"猫咪"在向量空间里是完全独立的两个维度,"好"和"棒"没有任何关联。维度可能达到几十万,但几乎全是零。
LSA(潜在语义分析,1990) 是第一次真正碰"语义"的尝试。它对词-文档共现矩阵做 SVD 降维,把高维稀疏表示压缩成几百维的稠密向量。经常出现在相同上下文里的词,会在低维空间里自然靠近,同义词的问题因此缓解了一些。
这是 NLP 领域第一次真正接近后来 embedding 的核心思想:"语义相近"的词,在向量空间中也应该彼此接近。
但 LSA 的计算代价很高,处理不了大规模语料,也不能捕捉一词多义——"苹果"不管出现在什么语境,都只有一个全局向量。
二、Word2Vec:语义第一次变得"可计算"
2013 年,Mikolov 等人在 Google 发布了 Word2Vec,这是 embedding 历史上最重要的转折之一。
训练目标特别简单:用一个浅层神经网络,让模型预测一个词的上下文(或者反过来,用上下文预测词)。训练完成后,每个词得到一个几百维的稠密向量。这些向量展示出一些很神奇的代数性质:
vec("国王") - vec("男人") + vec("女人") ≈ vec("女王")
vec("巴黎") - vec("法国") + vec("日本") ≈ vec("东京")
人们第一次发现:语义关系居然真的能被"几何化"。 向量空间里真的编码了语义关系,而不只是统计共现。
同期 Stanford 发布的 GloVe(2014) 思路略有不同——直接对全局共现矩阵做加权分解,效果差不多但训练更稳定。
Word2Vec 的局限也很明显:每个词只有一个静态向量,处理不了多义词;无法表示相同单词组合成不同顺序表达的不同含义,比如"我吃了饭"和"饭吃了我"在 Word2Vec 中的表达是完全一致的。
三、上下文表示:ELMo 过渡与 Transformer 的黎明
Word2Vec 最大的问题,是"一个词永远只有一个向量"。到 ELMo(2018) 这个问题才被正面解决。
ELMo 用双向 LSTM 训练语言模型,把正向和反向的 hidden state 拼接起来作为词的表示。这样"苹果很甜"和"苹果发布会"里的"苹果"就有了不同的向量——上下文感知(contextual embedding) 的概念就这么确立了。这是 embedding 历史上第一次,一个词在不同语境下能拥有不同的表示。
但 ELMo 是特征提取式的用法,作为外挂特征拼在下游模型前面,架构上不够干净。而且 LSTM 的长距离依赖捕捉能力还是有限。
它更像是一个过渡。直到 2017 年 Transformer 架构被提出,用自注意力机制彻底打通了全序列信息双向交互的路,才为后来的飞跃提供了底层基础。
四、BERT 与 encoder 的黄金时代
2018 年底,Google 发布了 BERT,把 Transformer encoder 和掩码语言模型(MLM)预训练结合起来,一次性解决了之前的几个核心问题:双向上下文、强表示能力、端到端微调。
BERT 天然适合做 embedding,因为预训练目标和 embedding 任务高度契合。MLM 要求模型根据上下文双向推断被遮掉的词,这和"理解语义"几乎是同一件事的两种说法。每个 token 经过双向注意力之后,已经融合了全序列的信息,mean pooling 或者取 [CLS] 都能得到合理的句子表示。
但"合理"不等于"适合检索"。BERT 虽然会语言理解,但它从来没有被训练过"让语义相似的句子在向量空间中更近"这件事。Sentence-BERT(2019) 用孪生网络结合对比学习解决了这个问题,奠定了现代 embedding 模型的训练范式。
从此,encoder + 对比学习成了标准方案,大量工作在这个框架内推进:更好的训练数据、更强的难负样本挖掘、多阶段训练策略、指令微调……
五、bge-m3:encoder 路线的集大成者
如果说 encoder 时代有一个最能代表这条路线成熟度的模型,那应该是 BAAI 在 2024 年初发布的 bge-m3。
我在 RAGFlow 做开发的时候,bge-m3 是我们支持的核心 embedding 模型之一。它的设计目标用三个"M"概括:Multi-Linguality(100+ 语言)、Multi-Granularity(最长 8192 token)、Multi-Functionality。最后这个 M 是 bge-m3 真正的技术亮点——它在一个模型里同时实现了三种检索范式:
- Dense retrieval:传统的稠密向量相似度检索,负责"语义像不像"
- Sparse retrieval:类似 BM25 的词汇匹配,输出稀疏权重向量,负责"关键词有没有"
- Multi-vector retrieval:ColBERT 风格,保留 token 级别向量做细粒度匹配,负责"局部细节匹不匹配"
bge-m3 想做的是:用一个模型,同时兼顾三种原本独立的检索范式。底层架构是 XLM-RoBERTa,参数量 570M——还是 encoder。
对我们来说,bge-m3 的吸引力在于它把工程上能要求的东西几乎打包齐了:多语言、长文本、混合检索、570M 参数在 GPU 上跑起来完全没有压力。目前在 MTEB 排行榜中,它仍然是排名较高的 encoder-only 架构 embedding 模型之一,排在第 48 位。今天它依然是很多知识库项目(尤其是国产项目)主要支持的模型,开源模型 API 供应商通常也都会提供 bge-m3 的 API。
六、从 encoder 到 decoder:什么时候变的?为什么变?
在 2023 年之前,业界其实长期默认:embedding 天然就应该由 encoder 来做。原因也很直观——embedding 的目标是把整句话"压缩"成一个全局语义向量,而 encoder 的双向注意力几乎天然就是为这件事设计的。反过来看,decoder 的 causal attention 只能看左边,本质是自回归生成,更擅长"续写"而不擅长"压缩全局语义"。很多人甚至认为:causal attention 从结构上就不适合生成稳定的句向量。所以很长一段时间,"embedding = encoder"几乎是行业共识。
2023 年底,微软相关团队发布了 E5-Mistral-7B,这是 embedding 领域从 encoder 转向 decoder 的重要转折点。 在此之前,encoder 几乎垄断了 embedding 任务;在此之后,decoder 系模型迅速占据 MTEB 榜单前排。
然而 decoder 结构上做 embedding 有明显劣势,它凭什么后来居上?从结构上,encoder 用双向注意力,每个 token 都能看到全序列,mean pooling 出来的向量天然就是全局语义的融合,而 decoder 用单向注意力,每个 token 只能看到前面的内容,只有序列末尾的 [EOS] token 才看过全部上下文——而且它的训练目标从来不是"压缩语义",而是"预测下一个词"。
Encoder vs Decoder 注意力机制
【Encoder 双向注意力】 【Decoder 因果注意力】 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 ↕ ↕ ↕ ↕ ↓ ↘ ↘ ↘ ↕ ↕ ↕ ↕ ↓ ↘ ↘ ↕ ↕ ↕ ↕ ↓ ↘ ↕ ↕ ↕ ↕ ↓ (所有词互相看见,信息全局融合) (只能看左边,仅Q4看到全序列)
早期用 decoder 做 embedding 时,直接拿 [EOS] 的 hidden state,效果确实不稳定。但真正发生的变化不是 decoder 突然变得适合做 embedding 了,而是 foundation model 的语言理解能力强到可以迁移了。
理解这一点,需要先想清楚 encoder 的表示能力从哪里来。encoder 也不是天生就擅长做 embedding,它的能力来自大量精心设计的对比学习训练——需要构造正负样本对、设计难负例挖掘策略、做多阶段的对比预训练,才能让向量空间变得"语义有序"。这个过程数据依赖高、工程复杂,积累的是"如何让语义相似的句子向量更近"这件特定的事。
而 decoder LLM 积累的东西不同。Mistral、Qwen 这类模型经过了数万亿 token 的自回归预训练,学的是"如何对语言建模"——覆盖语法、语义、常识、跨语言迁移,是对语言本身更深层的理解。这种理解是通用的,迁移到 embedding 任务上只需要很少的对比学习微调,就能激活模型内部已经形成的语义结构。
也就是说,基于 encoder 的 embedding 模型,如 bge-m3,是"为 embedding 而训练的专用模型";而基于 decoder 的 embedding 模型,更像是"被大规模语料喂出来的通用模型,顺便也能做 embedding"。当 foundation model 的语言理解能力强到一定程度后,embedding 不再一定需要从零训练一个专用 encoder——很多时候,只需要少量对比学习微调,就能把 decoder 模型内部已经形成的语义结构"激活"出来。
但由于 decoder 的 causal attention 天然不适合做 embedding,所以后来的很多工作,本质上都在修补 causal attention 对 embedding 任务的不适配,并且涌现了一批很巧妙的工程解法:
Decoder 做 Embedding 的工程修补方案
方案 核心思路 如何解决"单向盲区" 代表模型 基线取 [EOS] 直接取序列末尾 token 末尾 token 天然看过全序列,但信息压缩有损 E5-Mistral-7B Echo Embeddings 输入文本重复拼接两次 第二次出现的文本左侧已包含完整上下文,缓解盲区 Echo Embeddings 改造注意力 去掉 causal mask 将单向注意力改造为双向,强制"环顾四周" LLM2Vec,GemmaEmbedding 双向+池化优化 去掉 causal mask + 可学习池化 双向化 + Latent Attention Pooling 替代取 [EOS] NV-Embed
不过,早期的基于decoder的embedding模型方案有一个共同背景——它们都基于 7B-8B 量级的 LLM,推理成本远高于传统的 570M encoder。这在当时让很多人产生了一个印象:用 decoder 做 embedding,意味着更高的精度但也更高的成本。
但这个印象在 2025 年被打破了。Qwen3-Embedding 系列直接覆盖了从 0.6B 到 8B 的完整谱系,其中 0.6B 版本仅有 600M 参数,和 bge-m3 的 568M 几乎在同一量级。decoder 做 embedding 也不再天然意味着更高的推理开销。
七、Jina:一部浓缩的 embedding 模型发展史
如果想从厂商视角验证一遍这段历史,Jina AI 是最合适的参照。它是少数几家把 embedding 模型作为核心商业产品持续迭代的公司,每一代模型几乎都踩在那个时期的技术节点上。看它的版本演化,能看到整个领域的缩影:
| 版本 | 发布时间 | 骨干架构 | 关键变化 |
|---|---|---|---|
| v1 | 2023-06 | BERT 系 | 标准对比学习方案 |
| v2 | 2023-10 | JinaBERT (长文本) | 512 训练,8192 推断,解决分块痛点 |
| v3 | 2024-09 | jina-XLM-RoBERTa | 多任务 Task LoRA,维度截断 MRL |
| v4 | 2025-06 | Qwen2.5-VL-3B-Instruct | 转向 decoder 多模态架构 |
| v5-text | 2026-02 | Qwen3 / EuroBERT | 基于 0.6B 骨干训练,回归轻量性价比 |
前三代都是 encoder。v1 是标准 encoder 方案;v2 回应了 RAG 落地后"长文档怎么嵌入"的真实痛点,用 ALiBi 的位置编码改造实现 8192 token 外推;v3 用 Task LoRA 解决了"一个模型同时服务检索、分类、聚类"的多任务冲突。
v4 是明确的技术转折。 骨干换成 Qwen2.5-VL-3B-Instruct,decoder + 视觉编码器的多模态架构。文本和图像走同一条处理路径——这已经不是传统 embedding 模型的思路,而是"统一语义空间"的思路了。
v5 又是一次策略转向: 回归轻量,基于 Qwen3-0.6B-Base 骨干模型训练,用 677M 参数在 MTEB 多语言榜上击败了所有 1B 以下的竞争对手。
回看 Jina 的这几年:v1→v3 是在 encoder 框架内把长文本、多任务、多语言依次解决;v4 借多模态完成架构迁移;v5 用小参数量 decoder 骨干验证了轻量化路线。这条路线几乎就是整个 embedding 领域演化的缩影。
八、当学术结论撞上工业惯性
但如果你今天走进一家做 RAG 工程的公司,大概率会发现他们线上跑的仍然是 bge-m3。bge-m3 之所以还在大量部署,正是因为它两年前就已经足够好,好到整个系统围绕它建了起来:向量库里存着几亿条用它生成的 embedding,检索阈值调的也是针对它的最优参数,回归测试用例更是和它深度绑定。换一个新模型,哪怕新模型在 MTEB 上高出一截,也要承受全量重新向量化的代价——而且换完之后,下游效果到底提升多少,通常没有人能说清楚。
说到底,研究的奖励函数是"更高、更新",工程的奖励函数是"别出事"。
标题:一场静悄悄的架构革命:Embedding 模型为何从 Encoder 转向 Decoder
作者:aopstudio
地址:https://neusoftware.top/articles/2026/05/21/1779293464515.html