miniCOIL EN-ES: Sparse Neural Retrieval Across the Language Barrier
TL;DR · AI 摘要
miniCOIL EN-ES: Sparse Neural Retrieval Across the Language Barrier - Qdrant Back to Embedding Research miniCOIL EN-ES:...
核心要点
- 主题聚焦:miniCOIL EN-ES: Sparse Neural Retrieval Across t
- 来源:Qdrant,建议结合原文判断细节。
- AI 分析暂不可用,本条为保底评分与摘要。
miniCOIL EN-ES:跨越语言障碍的稀疏神经检索 - Qdrant
返回嵌入研究
miniCOIL EN-ES:跨越语言障碍的稀疏神经检索
Juan Pablo Sotelo 和 Evgeniya Sukhodolskaya
·
2026年10月8日
稀疏神经检索终于开始获得更多关注(SPARSEUP、MILCO、Sentence Transformers 中的稀疏编码器等)。太棒了,我们很喜欢这种关注!
我们的 miniCOIL v1 稀疏神经检索器文章以一个承诺结尾:将继续深入研究这个稀疏神经检索器,提升模型质量,并在"宽度"方向扩展,"将其应用到其他密集编码器和除英语以外的语言中"。
这是 miniCOIL 传奇故事的下一个"宽度"进展:尝试跨越语言障碍,即让模型适用于多语言检索。这是一个有趣的挑战,因为稀疏检索器很难适应这种场景:跨语言文本搜索中的精确匹配通常意味着需要翻译。
与 Pento 团队合作,我们推出了 miniCOIL EN-ES:一个双语稀疏神经检索器,其中"home"和"casa"会落在稀疏向量的相同位置,这些位置代表一个概念。这样,一个倒排索引即可同时服务于英语和西班牙语查询及文档,无需中间翻译步骤。
miniCOIL EN-ES:"home"和"casa"落在稀疏向量的相同位置。
我们正在分享设计思路和初步结果。我们非常期待您的反馈:您是否希望使用类似方案?该方法对您是否有效?如果答案是肯定的,我们将扩展模型的词汇量和训练规模,看看接下来会发生什么:这个想法很容易扩展到其他语言。
同一词汇,不同语言
基于词汇的稀疏检索存在一个限制,仅靠相关性加权无法解决:它基于精确术语匹配:"bat"和"murciélago"可能表示相同的事物,但对 BM25 等算法来说并非如此:它们是两个不同语言中的不同词元,分别位于不同的倒排列表中。
#### 先翻译,再搜索
最常见的方法是对文档或查询(甚至两者)进行翻译。例如,如果您想继续使用 BM25,可以将查询通过机器翻译模型,然后在语料库语言中进行 BM25 检索。
这种方法有效,但会将翻译模型置于查询处理的关键路径上,增加依赖项,并导致为每种语言对管理单独的索引(或语料库的单独翻译副本)。
#### 多语言密集检索
多语言密集编码器通过构造解决了跨语言匹配问题:"She won a prize"和"Ella ganó un premio"在嵌入空间中会紧密聚集。(至少在理论上:许多多语言编码器会按语言和语义对文本进行分组,正如我们最近关于语言偏见的博客所示。)
然而密集检索并不是全文搜索的直接替代方案。相反,在许多用例中,它更适合与更可控、召回范围更集中的方法结合使用,因为有时您只是需要"文档中必须包含这个特定关键词"。
#### 让稀疏向量具备多语言能力
我们希望实现无需翻译步骤、不依赖密集检索的跨语言匹配。
相反,我们希望复用 miniCOIL 的方案:保留 BM25 的可靠信号,词在文档中的重要性(按文档长度归一化的词频)及其在整个语料库中的稀有性(IDF),并在其上添加一个小型学习组件,用于捕捉词在上下文中的含义。
然而,在 miniCOIL v1 中,词汇的单位是英文单词:在 miniCOIL v1 的稀疏向量中,没有表示“murciélago”的单元格,即使存在,也不会与“bat”使用相同的单元格。
因此,定义 miniCOIL 系列下一版本“miniCOIL EN-ES”的问题是:如果稀疏向量的单元格不表示单词,那它应该表示什么?
从单词到概念
正是这样,一个“概念”的概念诞生了(掌声):一组相互翻译的英文和西班牙语单词,例如 {cat, gato} 或 {bat, murciélago, bate}。
概念不仅限于英文和西班牙语;这种方法可以扩展到其他语言。
#### 每个概念一个单元格
在 miniCOIL v1 中,30k 词汇表中的每个英文单词都拥有自己的可训练层模型和稀疏向量中连续的 4 个单元格维度。而在 miniCOIL EN-ES 中,每个概念以类似方式获得一个可训练的头部。
当英文文档中出现“bat”,而西班牙语查询中出现“murciélago”时,两者都会映射到相同的概念 ID,由相同的头部进行投影,并写入稀疏向量中的同一块区域(在此模型中为 8 个连续维度)。这使得单语和跨语言匹配可以同时进行,同时保留了 miniCOIL 在上下文语义解析方面的能力。
每个概念一个单元格:在 miniCOIL EN-ES 中,“bat”、“murciélago”和“bate”会写入相同的单元格,值会根据语义变化;未解析的单词则回退到 BM25。
#### 再次站在 BM25 的肩膀上(我们已经习惯了)
此时,我们像一个黏人的幼儿一样,舒适地站在这些肩膀上。
稀疏向量 miniCOIL EN-ES 的评分公式借鉴了 miniCOIL v1 的方法。对于查询词映射到的每个概念 $c_i$,我们寻找那些词映射到相同概念的文档(无论文档使用哪种语言):
$$ \text{score}(D,Q) = \sum_{c_i \in \text{concepts}(Q)} \text{IDF}(c_i) \cdot \text{Importance}^{c_i}_{D} \cdot {\color{YellowGreen}\text{Meaning}^{c_i(Q) \times c_i(D)}} $$
其中 $c_i(Q)$ 和 $c_i(D)$ 分别是查询和文档针对概念 $c_i$ 的向量;如果某文本的多个词映射到同一概念,它们会在评分前合并为一个向量。
- 重要性部分是概念出现的 BM25 词频权重($k$、$avg\_len$ 和 $b$ 应根据概念的语料库统计数据调整;但请将此版本视为 miniCOIL-EN-ES-let’s-check-how-it-goes,使用常规默认值)。
- 语义部分是两个低维(此模型为 8 维)miniCOIL 向量的点积,与 v1 的方式一致。
注意:BM25 公式不仅适用于单词:其背后的概率相关性框架指出“该模型不限于词频或词项——文档或文档-查询对的任何属性、特征,只要我们合理预期其能提供相关性证据,均可纳入”(Robertson & Zaragoza, 2009,第 2.4 节)。
对于不在概念词表中的每个单词,我们沿用 v1 的方法:回退到基础的 BM25。
在理想情况下,所有不属于该词汇表的内容都应是命名实体、特定术语或代码:某种“不可翻译”的内容。我们希望这些内容能实现一对一的精确匹配,无论语言如何。当然,这是一个较弱的假设,我们希望尝试其他解决词汇表外跨语言匹配的方法,例如 MILCO 中的 LexEcho 头部;不过这将留到后续迭代中。
构建概念词汇表
在我们能够为每个概念训练头部模型之前,需要先获得这些概念本身,也就是它们的词汇表。
#### 词典作为图
为了构建概念词汇表,我们使用了 MUSE 双语词典:约 112,000 个英-西语对,以及数量相当的西-英语对。每对词构成一个二分图的边,英语和西班牙语词分别位于图的两侧,而一个概念则是该图中紧密连接的社区。
对上述词典图运行社区检测(Louvain)算法,可以得到候选概念聚类:
- 我们只保留包含每种语言至少一个词的聚类。
- 我们也限制聚类大小:Louvain 的分辨率参数控制社区的粒度(更高分辨率会生成更小、更紧密的社区),因此对于任何过大聚类,我们会提高分辨率参数重新运行 Louvain,直到聚类词数符合上限。
#### “bajo”问题
我们第一次未限制大小的尝试生成了包含数百个词的聚类,数量略多。罪魁祸首是多义性:西班牙语“bajo”可以表示“低”、“低音”、“短”和“在...之下”;每个对应的英文词都有自己的翻译,而单个词就足以将数十个弱相关术语缝合成一个巨大的概念团。
我们采用的解决方案并不华丽(作为任何启发式方法,我的专业意见是它足够好):MUSE 按频率列出翻译,因此在构建图之前,我们只保留每个源词的前两个高频翻译。结合最大聚类大小限制为 20,这产生了约 80,000 个干净概念,中位数大小为 2(典型概念就是词和翻译的组合,如 {cat, gato}),99 百分位大小为 9。
概念是双语词典图中的 Louvain 社区。多义词如西班牙语“bajo”会将许多不相关术语缝合在一起,因此我们不得不限制概念大小。
#### 80,000 个概念是 30 倍过多
为了验证方法是否有效,保留 80,000 个概念并为每个训练一个层似乎没有必要(例如,我们完全可以不需要 {mockingjay, sinsajo} 这个概念)。
为了精简概念词汇表,我们流式处理了英语和西班牙语维基百科,将文章拆分为句子,并统计每种语言中每个概念在多少句子中出现,只保留两种语言中都有足够证据的概念。这留下了约 12,000 个概念,每个概念在两种语言中都有足够句子,使每个概念的头部模型能够学习点亮其概念的正确语义区域。
在发布的模型中,我们进一步筛选,只保留 12,000 个概念中那些在 mMARCO dev.small(MS MARCO 段落排序数据集的机器翻译版本,我们同样用它进行评估)的实际查询中被使用的概念。当我们按概念捕获的查询词出现次数排序时,前 2,398 个概念占据了完整 12,000 词汇表的 90%。
因此,这个最初的、原始的、小型 miniCOIL EN-ES 只训练了 2,398 个概念头部。
训练 miniCOIL EN-ES
v1版本的方案是:从仅限英语的密集编码器中获取上下文词表示,然后学习一个单层投影到一个微型词义空间中,该投影通过更大教师编码器如何安排包含该词的句子进行校准。我们保留了这个方案,但改变了“关于海鲜饭和墨西哥卷饼的爸爸笑话”这一具体实现。
#### miniCOIL EN-ES 主干模型
对于miniCOIL EN-ES,我们需要一个多语言输入编码器,该编码器已经“掌握”英语和西班牙语,这样可训练的头部可以专注于词义,而无需从零开始学习翻译。
我们在平行的EN/ES句子对上测试了多语言e5系列模型。所有尺寸的模型都能100%检索到对应的平行句子,跨语言余弦相似度平均在0.91到0.93之间。因此,出于便利性考虑(包括Qdrant Cloud提供的免费推理服务),我们选择了最小的主干选项:intfloat/multilingual-e5-small,输出维度为384,参数量为118M。
因此,每个miniCOIL EN-ES头部是一个384 -> 8的投影:3,072个权重(相比之下,v1版本的逐词层是512 -> 4,共2,048个权重)。
#### 四象限(非Qdrant的),五点采样
v1模型基于三元组进行训练:一个包含目标词的锚点句子,一个具有相同词义的正样本句子,以及一个该词具有不同词义的负样本句子。教师编码器决定正样本和负样本中哪个更接近锚点。
在双语设置中保持该目标不变时,其中没有任何内容强制两种语言混合:大多数采样的三元组都是同语言的,因此头部可以通过将英语句子归为英语区域、西班牙语句子归为西班牙语区域,使损失趋近于零。这样,“bat”(蝙蝠)的句子永远不会接近“murciélago”(蝙蝠)的句子。
因此我们决定为每个训练样本采样五个点(五元组!),覆盖四个象限。以下示例使用概念{award, prize, premio, galardón}:
| 象限 | 损失项 | 示例 | 教学目标 | |------|--------|------|----------| | 同语言,相似 | sl_pos | “won the Nobel prize” ~ “received an award for her research” | 在语言内压缩相同词义 | | 同语言,不相似 | sl_neg | vs “the bounty was claimed by the hunters” | 在语言内区分不同词义 | | 跨语言,相似 | xl_pos | “ganó el premio Nobel” | 跨语言对齐等价词义 | | 跨语言,不相似 | xl_neg | “recompensa por su captura” | 跨语言区分不同词义 |
“相似”和“不相似”由教师编码器Qwen/Qwen3-Embedding-0.6B决定,我们将其句子嵌入存储在Qdrant中,与每个句子一同保存。负样本是半硬负样本:距离锚点比正样本至少远一个边距的最近候选。
每个训练样本有五个点:锚点周围的同语言和跨语言正负样本,其中“相似”和“不相似”由教师编码器决定。
损失函数是对这四个关系的余弦三元组损失之和:一个在锚点语言内的三元组(sl,同语言)和一个跨语言的三元组(xl,跨语言),各自使用不同的边距:
$$ \text{loss} = \text{relu}\big(d(a, \text{sl}_{\text{pos}}) - d(a, \text{sl}_{\text{neg}}) + \text{margin}_{\text{sl}}\big) + \text{relu}\big(d(a, \text{xl}_{\text{pos}}) - d(a, \text{xl}_{\text{neg}}) + \text{margin}_{\text{xl}}\big) $$
Here a is the anchor sentence, sl_pos / sl_neg are the similar and dissimilar sentences in the anchor’s language, xl_pos / xl_neg are the similar and dissimilar sentences in the other language, and d is cosine distance on the head’s 8D output.
对于所有三元组(同语言和跨语言),边距不是一个固定的超参数:它是教师模型在该三元组上测量的差距,即 margin = d_teacher(anchor, negative) − d_teacher(anchor, positive)。目标是“至少像教师模型那样将这两个分开”。两个约束条件:
- 同语言和跨语言三元组使用不同的边距( margin_sl , margin_xl ),因为教师模型的跨语言距离与单语距离处于不同的尺度范围。
- 候选三元组(无论是同语言还是跨语言)只有在教师模型的差距达到余弦距离0.1的基准值时才会被使用,对于教师模型已将句子分开较远的概念,该基准值会按比例放大。
#### 实现细节
训练代码在 pentoai/minicoil-en-es 仓库中开源。
模型和训练配置
组件 | 描述 --- | --- Backbone | multilingual-e5-small,384维,对概念的子词token进行token-pooled miniCOIL向量大小 | 每个概念8维( Linear(384 → 8, bias=False) + tanh ) 词汇 | 通过Louvain聚类从MUSE词典构建的修剪词表中提取的2,398个双语概念 训练数据 | 英语和西班牙语维基百科的切片:每种语言前400k篇文章,流式处理,每概念每语言保留最多800个句子(总计约2.3M句子),存储在Qdrant中并使用教师模型嵌入 教师编码器 | Qwen3-Embedding-0.6B(句子嵌入,1024D),仅用于挖掘训练数据和设置边距 采样 | 每个epoch重新挖掘5点双语样本;半硬负样本;来自教师模型的每样本边距;EN/ES锚点各占50% 增强 | 句子截断为概念词周围±5词的窗口 训练参数 | Epochs | 每个概念80个 Optimizer | Adam,lr 2e-3, ReduceLROnPlateau ,dropout 0.1 验证集 | 20%
最终模型包含2,398个头和约7.4M参数(约为骨干编码器的6%),以约29.5 MB的safetensors文件形式发布。
构建检索器
获取每个概念的mini向量只是实现多语言稀疏神经检索的一半。另一半是将它们转换为一个稀疏向量,用于检索时能根据相关性对多语言结果进行排序。
#### 每个人都分到一份BM25
用于检索的最终稀疏向量构建方式与miniCOIL v1相同,仅在多语言设置中添加了最小的调整:
- 无法映射到训练概念的token使用纯BM25回退机制加权,该机制使用与FastEmbed的Qdrant/bm25相同的英文分词器、词干提取器和停用词列表及默认参数。我们在稀疏向量中保留了专门用于处理词汇外(OOV)token的独立区域。
- 回退机制中的英文停用词无法覆盖西班牙语中的停用词(如 de 或 la)。在英文语料库中这些词出现频率较低,因此 BM25 会赋予它们较高的权重,导致西班牙语查询在匹配英文文档时产生噪声。我们采取了一个简单但不够优雅的解决方案:在查询端移除查询语言自身的停用词,而保持文档内容不变。未来实验中,我们应该找到一种方法,使 BM25 回退机制具备双语能力(而非始终使用英文),让停用词、分词和词干提取等操作能根据语言特性进行差异化处理。
- 原始的 tanh 输出(即 miniCOIL EN-ES 概念块的 8 个数值)远小于典型 BM25 单词权重(它们的向量范数平均约为 0.15),因此概念匹配在初始词的 BM25 基础匹配面前会处于劣势。我们对每个概念的 8D 向量块进行单位长度归一化,并将其按初始词(概念的一部分)原本应具有的 BM25 权重进行缩放。这样,相同语义的匹配可以达到与词法项相当的得分,而错误语义的匹配则会被抑制。
#### 匹配所有词形变体
概念词表是基于词典形式构建的,因此在经过检索编码的文本中,复数形式和变位形式(如 "gatos"、"injections"、"corrieron")无法通过精确查找找到对应的概念。
我们添加了一个词形还原回退机制(simplemma):仅当某个词本身不在词表中时,才会查找其词根形式("gatos" → "gato" → 找到概念)。
该词形还原回退机制受到停用词列表的限制,会同时检查词本身及其词根。如果没有这个限制,辅助动词会通过其词根形式(is/are → be,es → ser)进入概念中,而由于 {be, ser, estar} 本身是词表中的一个概念,这个近似停用词的概念几乎会在索引中的每个句子中被触发。
在验证数据集上,启用词形还原回退机制可使所有检索方向的 MRR@10(前 10 个结果中首个相关段落的倒数排名均值)提升约 +0.01,尤其在西班牙语和跨语言检索中效果更显著,而召回率保持不变:它不会检索出更多结果,而是让概念头能够对原本已被找到的段落进行打分。该机制在发布的模型中默认启用,后续所有结果均使用该机制。
结果
发布的模型检查点位于 Jocana/minicoil-en-es。
许可证说明:检查点和训练代码均采用 CC BY-NC 4.0 协议发布:概念词表基于 MUSE 词典构建,模型继承其许可证。在将模型扩展为生产级多语言检索器时,我们计划从许可宽松的来源重新构建词表并重新授权;在此之前,检查点和代码仅允许非商业使用。
#### 评估设置
我们验证了模型在 mMARCO(机器翻译的 MS MARCO 段落排序数据集)上的有效性,该数据集包含英文和西班牙语版本。由于相同查询和段落 ID 在两种语言中均存在,我们可以测试所有四种检索方向:EN→EN、ES→ES、EN→ES 和 ES→EN。
语料库使用的是人工评估的 dev.small 段落池:当我们获取某种语言的测试查询及其相关性判断时,我们仅索引这些判断所指向的约 7,500 个段落,而非完整的 880 万个段落集合,以加快评估速度。通过构造,每个查询的相关段落都会出现在语料库中;任务是将该段落排在其他查询的段落之前。
评估数据集是基于概念覆盖的。我们仅保留那些我们的2,398个训练概念能够对排序产生影响的查询:查询与黄金段落至少共享一个训练概念。这保留了约78%的查询。数据集划分已固定;最终模型仅在测试集上评估一次。
因此,此次评估回答的是“当概念机制适用时,是否有效”,而非“这个检索器在任意查询上的表现如何”。
注意:数字与公开的mMARCO基准不一致,因为评估集构建方式不同。请将表格视为在统一设置下系统间的相对比较,即对机制效果的直观感受。
##### 我们进行的对比
- BM25:使用FastEmbed的Qdrant/bm25默认参数(k=1.2, b=0.75, avg_len=256)作为单语基线(EN→EN, ES→ES)。
- miniCOIL v1:使用FastEmbed的Qdrant/minicoil-v1,仅支持英语。
- translate-then-BM25:查询使用NLLB-200-distilled-600M翻译,然后在语料库语言中使用BM25(默认参数),作为miniCOIL EN-ES在不使用翻译模型时需匹配的跨语言基线。
##### 我们衡量的指标
排序质量(MRR@10 和 nDCG@10)和检索广度(Recall@100)。
#### 单语检索
方向 | 检索器 | MRR@10 | nDCG@10 | R@100 --- | --- | --- | --- | --- EN→EN | BM25 | 0.880 | 0.898 | 0.991 | miniCOIL v1 | 0.892 | 0.909 | 0.993 | miniCOIL EN-ES | 0.889 | 0.905 | 0.995 ES→ES | 0.809 | 0.830 | 0.968 | 0.840 | 0.861 | 0.988
在英语中,增益幅度与v1在BEIR基准上的表现相当:模型与v1的差距在0.004以内,但携带了2,398个概念而非v1的30,000个词。
在西班牙语中,增益幅度稍大:西班牙语的词形丰富,基于词形的概念匹配能找回词干提取遗漏的匹配项。增益可能更大:虽然BM25的ES→ES基线是为西班牙语设计的,但miniCOIL当前的BM25回退方案不够灵活,使用英语词干提取器处理所有输入,这使其仅适合匹配专有名词或数字。按语言设置回退方案可提升指标。
#### 跨语言检索
系统 | EN→ES | ES→EN --- | --- | --- translate-then-BM25 | 0.730 | 0.774 | 0.757 | 0.798 | 0.941 | 0.949 miniCOIL EN-ES | 0.711 | 0.715 | 0.743 | 0.746 | 0.963 | 0.963
在两种跨语言方向上,miniCOIL EN-ES在Top-10排序上均落后于translate-then-BM25;但Recall@100指标则相反:概念机制能跨语言边界找到相关段落,而翻译后的精确匹配则更优排序。
两个因素使这一结果更值得肯定:translate-then-BM25需要在每个查询的主路径中使用翻译模型,而miniCOIL EN-ES可通过一个索引实现跨语言检索,无需翻译,且使用高度精简的概念词表。此外,当前miniCOIL EN-ES自身的BM25回退方案对所有输入(包括西班牙语)都使用英语词干提取器,其性能差距部分源于配置缺陷。
总结
本文描述了一个初步实验。这些表格背后的模型从约12,000词的词表中训练出2,398个概念,每个概念和语言最多使用800个句子,数据来自维基百科的小规模切片。在该范围内,评估结果证明了该模型的潜力。
#### 保持miniCOIL品牌特性
我们忠实保留了miniCOIL方法的某些特性:
自监督。无需相关性标签。训练数据来自维基百科句子,监督信号来自于更大编码器的几何结构,因此添加一种语言或领域并不等同于“标注查询”。
基于BM25。所有不在词汇表中的词会回退到BM25,因此模型会退化为已知的基线。然而在多语言场景中,配置这种回退机制会变得复杂,这也是许多改进空间可能隐藏的地方。
轻量且模块化。每个概念出现时使用8个浮点数,不包含主干模型时占用30MB磁盘空间。每个概念的头部是独立的:我们可以单独检查某个头部、重新训练某个头部或添加新的头部,而无需影响其他部分。
#### 后续计划
- 更多概念。训练剪枝后词汇表中剩余的10k个头部。
- 但需优化它们。拆分包含大量不连贯词语的噪声聚类,防止错误语义向顶部注入排序噪声。
- 更多训练数据。扩展训练集并超越维基百科,使每个概念头部能接触到更多句子、更多语域和更多领域。概念词汇表尾部的稀有概念需要这个过程,以获得足够的训练证据。
- 在词干上训练。在训练时使用与推理相同的token→词干→概念路径,使概念头部能学习到各种词形变化。
- 解决多语言BM25回退。确定如何在BM25回退中处理语言感知的停用词和词干化,并正确将概念统计信息传播到BM25参数(k, b, avg_len)。
与v1版本一样:在决定或采用任何方案前,请先在自己的数据上测试模型。没有任何基准能100%保证模型在您语料库上的性能。
如果您正在Discord上构建多语言流水线,请与我们分享!