跳转到内容

E5 — 用海量"自然出现的文本对"训通用 embedding

是什么

E5 是微软 2022 年放出的一组通用文本向量模型——你给它一段话,它给你一个 1024 维的向量;语义近的句子,向量也近。日常类比:像给每段文字发一张”指纹卡片”,卡片之间的相似度就代表内容相似度。

它在当时之所以炸场,不是因为模型新,而是因为训练配方新。在它之前,要训一个好的 embedding 模型,要么靠 SimCSE 那种”同一句话过两次 dropout 当正样本”的自监督,要么靠 DPR 那种”必须人标 query-passage 对”的监督。E5 走第三条路:去互联网上捡现成的近义对,比如 Reddit 帖标题和正文、StackExchange 问题标题和高赞答案——这些对天生语义相关,一捡就是 13 亿对。

名字 E5 是 EmbEddings from bidirEctional Encoder rEpresentations 的缩写——五个大写 E,作者自己也承认是个梗。

为什么重要

不理解 E5 的训练配方,没法解释 2023-2024 这两年发生的事:

  • 为什么 MTEB(Massive Text Embedding Benchmark)榜单前列长期被 BGE / GTE / jina-embeddings 占据,而它们的训练流程几乎是 E5 的复刻
  • 为什么 RAG 系统默认 embedding 候选清单里总有 intfloat/e5-large-v2BAAI/bge-large-en 这些名字
  • 为什么 embedding 模型也开始吃 scaling law——E5-large fine-tune 后能打过参数量 40 倍的 GTR-XXL
  • 为什么后来的 multilingual-e5、E5-Mistral 用同一套两阶段配方就能扩到多语言、扩到 7B 底座

它的贡献是把 embedding 模型从”每个任务自己训”推到”一个通用底座 + 少量微调”——和 BERT 当年对 NLP 做的事类似。

核心要点

E5 的训练分两步,缺一不可:

  1. 弱监督对比预训练:从 CCPairs(CommonCrawl + Reddit + StackExchange + Wikipedia 等爬出来的 13 亿对)里随机抽 batch,每对算 InfoNCE loss——同 batch 里其他对的另一半全当负样本。底座用 BERT 或 MiniLM 初始化,跑一遍预训练。

  2. 监督微调:在 MS MARCO、NQ、NLI 这些有人标的高质量集子上(合计约 150 万对)继续训,用 hard negative 挖掘 + 知识蒸馏让对比信号更锋利。

两步都用同一个 InfoNCE 目标:把正样本对的相似度推高、把同 batch 其他对推低。区别是阶段一靠”量大噪声大”找通用语义结构,阶段二靠”少而精”贴齐下游任务。

还有一个看似不起眼但关键的细节:输入要加前缀——查询前面加 query:,文档前面加 passage:。这是告诉同一个模型”我现在是问还是答”,方便不对称检索。省掉这两个前缀,零样本性能直接掉几个点。

实践案例

案例 1:用 E5 给两段话打相似度

from sentence_transformers import SentenceTransformer
model = SentenceTransformer('intfloat/e5-large-v2')
# 注意前缀!查询用 query:,文档用 passage:
sentences = [
'query: 北京天安门在哪里',
'passage: 天安门位于北京市中心,是中国的标志性建筑',
'passage: 巴黎埃菲尔铁塔每年接待超过七百万游客',
]
emb = model.encode(sentences, normalize_embeddings=True)
print(emb @ emb.T) # 余弦相似度矩阵

第一句和第二句相似度高(约 0.85),第一句和第三句相似度低(约 0.30)。模型从没”知道”这是中文地理问题,但 CCPairs 里的语义结构让它能跨语言、跨主题对齐。

案例 2:CCPairs 长什么样

举几条真实形态(论文 Table 1 改写):

  • Reddit 帖:title: How do I fix a leaking faucet?body: First turn off the water supply...
  • StackExchange:question: Why is Python's GIL bad?answer: The GIL means only one thread...
  • 维基锚文本:anchor: Alan Turingparagraph: Turing was a British mathematician...

这些对天然带语义关联,不需要人标。E5 的洞察是:互联网内容本身就是个巨型对比学习数据集,只要你会挑结构。

案例 3:MTEB 榜单上的连锁反应

E5 论文 2022-12 发布后:

  • 2023-08 智源 BGE 发布,训练流程基本是 E5 + 中文数据 + 更狠的过滤
  • 2023-08 阿里 GTE 发布,同样两阶段配方
  • 2024-01 微软自己出 E5-Mistral,把底座换成 Mistral-7B
  • 2024 年下半年起,MTEB 前 10 几乎全是这套配方的变体

案例 4:把 E5 嵌进 RAG 的最小代码

import faiss, numpy as np
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('intfloat/e5-base-v2')
docs = ['passage: ' + d for d in raw_docs]
doc_vecs = model.encode(docs, normalize_embeddings=True)
index = faiss.IndexFlatIP(doc_vecs.shape[1])
index.add(doc_vecs)
q = model.encode(['query: ' + user_question], normalize_embeddings=True)
scores, ids = index.search(q, k=5)

二十行不到就把检索建起来了。E5 让”通用 embedding”从论文跌到框架默认值。

踩过的坑

  1. 弱监督数据噪声大:CCPairs 里有大量”标题党”、广告、模板化文本。E5 用一致性过滤——先训一个初步模型,让它判断每对的相似度,把分数太低的剔掉再重训。这步省不得。

  2. 前缀不能省:很多人以为 query: passage: 是文档化噱头,省掉发现性能掉。原因是 E5 训练时就这么对齐的,推理时不加等于用了一个它没见过的输入分布。

  3. MTEB 平均分迷信:榜单看的是 56 任务平均,单看你的具体任务(比如代码检索、医学检索)可能被专用模型超过。E5 是”全能型”,不是”全能最强”。

  4. fine-tune 阶段数据量小但杠杆大:阶段二只用 ~150 万对(vs 阶段一的 13 亿),但贡献了榜单一半以上的提升。证明对比预训练学到的是”地基”,监督学到的是”贴脸”。

适用 vs 不适用场景

适用

  • RAG 系统里的稠密检索(query → passage 召回)
  • 文本聚类、分类、相似度计算的通用底座
  • 需要跨语言检索(用 multilingual-e5)
  • 没大算力但想要不错的 embedding——E5-base 只有 110M 参数

不适用

  • 极端长文档(>512 token)——E5 是 BERT 底座,长文本要切片
  • 需要细粒度交互的场景(用 ColBERT、cross-encoder reranker 更准)
  • 强领域专属任务(医学、法律)——通用 embedding 打不过领域微调
  • 需要解释相似度来源——单向量黑盒,不像 BM25 能看哪些词命中

历史小故事(可跳过)

  • 2019 年 Sentence-BERT(SBERT)出现,证明拿 BERT 加孪生网络微调能做句向量,但要监督数据
  • 2020 年 DPR 把 BERT 双塔搬到开放域问答,依然要 NQ 这种人标集子
  • 2021 年 SimCSE 用 dropout 做无监督正样本,证明对比学习不一定要人标——但只到句子级
  • 2022 年 12 月 E5 把”无监督对比”和”互联网现成对”两条线合一,并加上监督微调收尾。第一次让一个 embedding 模型同时打过 BM25(零样本)和参数大 40 倍的对手(监督)
  • 2023 起 BGE / GTE / jina / nomic 集体跟进,配方几乎照抄。MTEB 榜单进入”E5 时代”

E5 之于 embedding,类似 BERT 之于 NLP——不是性能孤峰,是范式转折。

学到什么

  1. 数据范式比模型架构更重要——E5 没动 BERT 一行架构,只换了训练数据来源和阶段划分,效果就甩开同行
  2. 互联网本身是个对比学习数据集——只要你能识别”自然成对”的结构,标注成本可以归零
  3. 两阶段是个可迁移配方:海量弱监督预训练 + 少量监督微调,这套思路不止用于 embedding,多模态、code retrieval 都能套
  4. 小细节决定地板:前缀、一致性过滤、cross-batch negatives,每个单独看不起眼,少一个掉一点
  5. scaling law 不只属于生成模型——E5 同一份配方从 small 到 large 单调变好,证明 embedding 也吃规模

关键概念词典

  • InfoNCE loss:对比学习里的”分类版”目标——把”哪个是真正的正样本”当多分类问题,分母是 batch 内所有候选
  • CCPairs:E5 的弱监督数据集名字,13 亿对自然出现的文本对,论文 Table 1 列了 8 个来源
  • MTEB:Massive Text Embedding Benchmark,56 个任务跨 8 类(分类、聚类、检索、相似度、重排、配对分类、双语挖掘、摘要),是 embedding 模型事实标准评测
  • BEIR:18 个零样本检索任务的合集,E5 是第一个零样本超过 BM25 的稠密模型
  • cross-batch negatives:把不同 GPU 的 batch 拼在一起算 InfoNCE,免费扩大负样本池

延伸阅读

关联

  • dpr-2020 —— DPR 必须靠人标 query-passage,E5 用互联网自然对替代
  • ance-2020 —— hard negative 思路被 E5 监督阶段直接继承
  • cocondenser-2021 —— 同样攻击”BERT [CLS] 没为检索准备”的痛点,路线不同
  • colbert-2020 —— late interaction 路线,和 E5 单向量是稠密检索两大流派
  • splade-2021 —— 稀疏向量路线,常被拿来和 E5 对比
  • rocketqa-2021 —— 监督端优化,E5 把它的经验下沉到弱监督
  • bert —— E5 的底座;E5 证明 BERT 配上对比预训练能直接做 embedding
  • clip —— 跨模态对比学习的灵感来源,E5 是”文本-文本”版本

反向链接

  • bert —— BERT — 双向 Transformer 预训练
  • clip —— CLIP — Contrastive Language-Image Pre-training
  • colbert-2020 —— ColBERT — 让 BERT 检索既准又能扛大规模
  • dpr-2020 —— DPR — 用 BERT 双塔把检索从 BM25 时代拉进稠密向量时代
  • rocketqa-2021 —— RocketQA — 把稠密检索的训练拧到工业级
  • splade-2021 —— SPLADE — 让神经网络学出稀疏向量,直接复用倒排索引