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-v2、BAAI/bge-large-en这些名字 - 为什么 embedding 模型也开始吃 scaling law——E5-large fine-tune 后能打过参数量 40 倍的 GTR-XXL
- 为什么后来的 multilingual-e5、E5-Mistral 用同一套两阶段配方就能扩到多语言、扩到 7B 底座
它的贡献是把 embedding 模型从”每个任务自己训”推到”一个通用底座 + 少量微调”——和 BERT 当年对 NLP 做的事类似。
核心要点
E5 的训练分两步,缺一不可:
-
弱监督对比预训练:从 CCPairs(CommonCrawl + Reddit + StackExchange + Wikipedia 等爬出来的 13 亿对)里随机抽 batch,每对算 InfoNCE loss——同 batch 里其他对的另一半全当负样本。底座用 BERT 或 MiniLM 初始化,跑一遍预训练。
-
监督微调:在 MS MARCO、NQ、NLI 这些有人标的高质量集子上(合计约 150 万对)继续训,用 hard negative 挖掘 + 知识蒸馏让对比信号更锋利。
两步都用同一个 InfoNCE 目标:把正样本对的相似度推高、把同 batch 其他对推低。区别是阶段一靠”量大噪声大”找通用语义结构,阶段二靠”少而精”贴齐下游任务。
还有一个看似不起眼但关键的细节:输入要加前缀——查询前面加 query:,文档前面加 passage:。这是告诉同一个模型”我现在是问还是答”,方便不对称检索。省掉这两个前缀,零样本性能直接掉几个点。
实践案例
案例 1:用 E5 给两段话打相似度
from sentence_transformers import SentenceTransformermodel = 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 Turing↔paragraph: 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 npfrom 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”从论文跌到框架默认值。
踩过的坑
-
弱监督数据噪声大:CCPairs 里有大量”标题党”、广告、模板化文本。E5 用一致性过滤——先训一个初步模型,让它判断每对的相似度,把分数太低的剔掉再重训。这步省不得。
-
前缀不能省:很多人以为
query:passage:是文档化噱头,省掉发现性能掉。原因是 E5 训练时就这么对齐的,推理时不加等于用了一个它没见过的输入分布。 -
MTEB 平均分迷信:榜单看的是 56 任务平均,单看你的具体任务(比如代码检索、医学检索)可能被专用模型超过。E5 是”全能型”,不是”全能最强”。
-
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——不是性能孤峰,是范式转折。
学到什么
- 数据范式比模型架构更重要——E5 没动 BERT 一行架构,只换了训练数据来源和阶段划分,效果就甩开同行
- 互联网本身是个对比学习数据集——只要你能识别”自然成对”的结构,标注成本可以归零
- 两阶段是个可迁移配方:海量弱监督预训练 + 少量监督微调,这套思路不止用于 embedding,多模态、code retrieval 都能套
- 小细节决定地板:前缀、一致性过滤、cross-batch negatives,每个单独看不起眼,少一个掉一点
- 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,免费扩大负样本池
延伸阅读
- 论文 PDF:arXiv 2212.03533
- HuggingFace 模型:intfloat/e5-large-v2
- MTEB 榜单:huggingface.co/spaces/mteb/leaderboard
- BGE 论文(E5 配方的中文/多语言后继):C-Pack: Packaged Resources To Advance General Chinese Embedding
- dpr-2020 —— 稠密检索开山,对比 E5 看监督到弱监督的演化
- ance-2020 —— hard negative 挖掘,E5 fine-tune 阶段沿用思路
- cocondenser-2021 —— 另一条路线:在预训练让 [CLS] 学会聚合
关联
- 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 — 让神经网络学出稀疏向量,直接复用倒排索引