你的检索器其实在"假装"听指令——Snowflake 用一个反转技巧把 305M 小模型拉到 SOTA

上周帮朋友看一个企业搜索的 case,他抱怨说:embedding 模型明明 MTEB 跑得挺好看,但用户在 query 后面追加一句"只要 2024 年之后的"或者"排除掉营销稿",召回结果几乎纹丝不动。那种感觉就像——模型懂"VLM 推理"是什么意思,但完全不在乎你说"只要 ICLR 2025 的"。

这个现象在去年的 FollowIR Benchmark 里被量化得很清楚了:用 p-MRR 这个指标一测,市面上一票"自称支持 instruction"的检索器,分数贴着 0 跳,有些直接掉进负值——意思是给它换了相反的指令,它的排序还是按老的来,相当于装作在听指令,实际上根本没听

Snowflake 这篇刚挂上 arXiv 的新论文给了一个特别"几何感"的解法:给同一个 query、同一对正负文档,再合成一条"反过来"的指令——让原本的正样本变负、原本的负样本变正。这样训出来的检索器没法靠"query 跟哪个 doc 看着像"作弊,它必须真的把 instruction 读进去。

仅凭这一招,305M 的小编码器在 FollowIR 上 p-MRR 涨了 45%,反过来比 EmbeddingGemma-300M 和 Qwen3-Embedding-0.6B 这种同级或更大的通用模型还要高一截。但更让我皱眉的,反而是它顺手扔出来的另一个发现——往指令检索训练里掺通用检索数据,效果会塌。这个观察对很多正在做"通用检索器加指令支持"的团队,可能比那个 +45% 还更值钱。


核心摘要

指令跟随检索(IF-IR)这一两年很火——不光要找跟 query 主题相关的文档,还得满足用户写在指令里的硬约束(时间、风格、长度、来源……)。但 FollowIR 这个 benchmark 揭穿了一个尴尬的事实:多数模型只在做主题匹配,对指令几乎完全不敏感,p-MRR 经常贴 0 甚至为负。

这篇论文的解法非常干净:把现有的"指令负样本"——那些"跟 query 主题相关、但被指令排除掉"的文档——重新看待。作者发现:一个指令负样本其实只是"在当前指令下负",换一条互补的指令,它就该是正样本。于是他们让 Qwen3-Next-80B 合成这条互补指令,让一对文档在两条指令下"调换正负",这就是 Dual-View(双视图)。

效果上:305M 的 gte-multilingual-mlm-base 编码器,FollowIR 的 p-MRR 从 5.21 涨到 7.57(+45%),InfoSearch 长度子集 +122%、关键词子集 +172%。最致命的对比是 All-orig vs All-DV——把 50% 训练数据换成"非指令"通用数据时,InfoSearch 直接掉到 -23.22 / -49.65(模型在按指令"反着排"),而换成 DV 数据则同时把指令敏感性和通用检索质量都拉到了全场最高。

我的判断:方法本身不复杂,甚至可以说有点显然——但它把"指令负样本"这个概念用足了,而且实验设计相当克制(数据量严格 size-matched),结论可信。对在做带指令的企业搜索/RAG 的团队,价值在于两条:(1) DV 这个数据合成 pipeline 几乎是即插即用的;(2) "通用数据稀释指令信号"这个发现会改变你怎么混合训练数据。


论文信息

  • 标题:Dual-View Training for Instruction-Following Information Retrieval
  • 作者:Qingcheng Zeng, Puxuan Yu, Aman Mehta, Fuheng Zhao, Rajhans Samdani
  • 机构:Northwestern University(曾庆诚,Snowflake 实习期间完成),Snowflake Inc(其余作者)
  • 日期:2026-04-22
  • 链接arXiv:2604.18845

图1:Dual-View 极性反转的核心机制。同一个 query("哪种火山喷发没被观测过?"),原始指令要求"描述具体未被观测过的火山类型及其形成原理",正样本是讲冰下火山形成的文档。新合成的指令转向"讨论未观测喷发类型的环境影响、严格排除物理形成描述",于是同一对文档的正负标签整个翻转——讲气候影响的文档变正,讲冰下火山形成的文档变负。

图 1:Dual-View 数据合成示意。左下方的"新指令"是 LLM 合成的:它要做到的事情很微妙——既要语义上跟 query 还相关,又要把约束维度从"形态/形成机制"切换到"环境影响/研究价值",让两个文档的角色精准对调,同时不能误伤其他指令负样本。这个图是整篇论文的灵魂,把"为什么这能强迫模型读指令"讲得非常直观。


为什么"指令跟随检索"这事不好做?

先把问题说清楚,因为很多做 RAG 的同学其实没意识到这是个真问题。

传统的 dense retriever(DPR、Contriever、bge、gte 这一系列),训练目标都是"query 和 positive doc 在 embedding 空间靠近"。InfoNCE loss 一砸下去,模型学到的几乎全是主题相似性:query 提到了"transformer attention",召回里就全是讲注意力机制的论文。

但用户的实际需求经常带显式约束。比如:

  • "找 transformer attention 的论文,只要 2024 年之后的"
  • "Python 内存管理,给我代码示例,别给概念解释"
  • "黑色素瘤治疗最新进展,只要临床试验结果,不要综述"

这些"只要……"、"不要……"、"必须……",对人类来说是硬约束,对当前的 dense retriever 来说……基本听不进去。

p-MRR:揭穿"假装听指令"的指标

FollowIR 那篇 paper(Weller et al. 2025a)干的核心一件事,就是设计了 p-MRR 指标。机制很简单:

给同一个 query 配两条"互相矛盾"的指令——指令 A 下文档 X 是相关的,指令 B 下文档 X 是不相关的。看模型在两条指令下,是否能把 X 的 rank 调过来。

如果模型完全没听指令,rank 不变,p-MRR ≈ 0;如果模型反应正确,p-MRR > 0;如果模型甚至搞反了(可能是因为某些 instruction 关键词污染了 embedding),p-MRR < 0。

p-MRR 范围是 -100 到 100。直觉上你会觉得 30、40 应该不难拿吧?现实是——多数 SOTA 检索模型在 FollowIR 上 p-MRR 是个位数甚至负数。这就是这条研究路线的起点:很多模型只是把 instruction 当成额外的 query 词嵌进去,并没有真正"按指令重排候选集"。

Promptriever 的尝试:引入"指令负样本"

去年 ICLR 的 Promptriever(Weller 2025b)走出了第一步:把指令负样本(instruction negatives)写进训练数据。

什么叫指令负样本?文档 D 跟 query 主题上很相关,但被指令的某个约束排除了——比如 query 是"transformer attention",D 讲的就是 transformer attention,但写于 2020 年,用户指令是"只要 2024 年之后的",那 D 就成了"指令负样本"。

Promptriever 把这种样本作为 hard negative 灌进 InfoNCE,强迫模型学到"光主题相关不够"。这条路确实有效,但有个我一开始没意识到的问题——Promptriever 把指令负样本当作"永远的反派"用了:每个 instruction negative 在训练里只扮演一个角色,就是被推远。

而这篇 Dual-View 论文的关键洞察是:这个文档"被推远"只是因为当前这条指令排除了它。换一条指令,它就该被拉近

这就有了腾挪空间。


方法核心:极性反转,让同一对文档"换边坐"

整篇论文的方法部分,其实就是图 1 那张图加一段流程描述。简单到让人怀疑"就这?"——但实验数据告诉你它就是 work。

数据合成:让 LLM 写一条互补的指令

形式化讲:给定一个 query \(q\)、一个原指令 \(I_{orig}\)、一个正样本 \(D^+\)、一个指令负样本 \(D^-\),让 LLM 合成一条新指令 \(I_{new}\),要求是:

  • \(I_{new}\)\(q\) 还得在主题上对得上
  • \(I_{new}\) 下,\(D^-\) 变成正样本,\(D^+\) 变成负样本
  • 不能误伤其他指令负样本(如果它们在 \(I_{new}\) 下也变正了,就破坏了对比的"干净度")

这个 prompt 在论文 Appendix A 里写得很细,分了 5 步——profile passages、choose reversal levers、diversity requirement、sanity checks、conciseness——核心思路是:找一个能"既正向选中 \(D^-\) 的某个属性、又用一个硬约束排除 \(D^+\)"的角度。

可用的"反转杠杆"包括:领域收窄、地域、时间窗口、受众层级、风格/格式("只要等式"、"只要项目清单")、方法论、要求的工件类型("必须有可运行的 X 语言代码")、显式排除等。

听起来很难合成?作者用 Qwen3-Next-80B-A3B-Instruct 跑了一遍,人工抽查 100 个样本,99% 以上可用,于是干脆没做额外过滤。这个数据相当能打,说明"极性反转"对当下的开源 LLM 已经不是什么 hard task。

训练目标:一对文档,两条指令,同时拉近又同时推远

在对比训练阶段,每个 query 配一个正样本和一组负样本(30 个 hard negative,其中 1-3 个是指令负样本)。对于 DV 增强的样本,同一对正负文档会被以"原视图"和"反转视图"两次喂给模型——也就是 \(D^+\)\(D^-\) 在两条不同指令下交换标签。

模型必须做到:

  • \(\text{sim}(q \oplus I_{orig}, D^+) \gg \text{sim}(q \oplus I_{orig}, D^-)\)
  • \(\text{sim}(q \oplus I_{new}, D^-) \gg \text{sim}(q \oplus I_{new}, D^+)\)

注意这里 \(\oplus\) 表示拼接,query 和 instruction 拼接后一起编码(document 单独编码)。

为什么这个目标会逼模型读 instruction?想想看:如果 query 编码器对 \(q \oplus I_{orig}\)\(q \oplus I_{new}\) 几乎输出同一个向量(即"我不关心你 instruction 部分写了啥"),那它就不可能同时让 \(D^+\) 在第一组里更近、又在第二组里更远。这是一个数学上不可能的约束——除非编码器真的把 instruction 的语义吃进了输出向量。

这就是这个方法最漂亮的地方:它不靠 loss 正则、不靠新架构、不靠多任务,直接用数据结构让模型"无法偷懒"

架构本身:什么都没改

backbone 用了两个:

  • gte-multilingual-mlm-base(305M,主实验)——Snowflake 自家 Arctic-Embed 2.0 medium 版本的基础编码器,Alibaba 出的多语言模型
  • bge-m3-retromae(更大)——用来做 cross-backbone 验证

训练框架是 Snowflake 自家开源的 ArcticTraining。InfoNCE loss,温度 \(\tau = 0.02\),30 个 hard negative,max length 512。所有 DV 实验跟 baseline 严格 size-matched——这一点很重要,待会儿讲实验部分会展开。


实验:从一个数字开始——FollowIR p-MRR 涨 45%

实验设计相当干净,就两张表,分别在两个 backbone 上跑同一组对照。先看主表(gte-multilingual-mlm-base, 305M):

训练数据 FollowIR p-MRR ↑ FollowIR Score ↑ InfoSearch Length ↑ InfoSearch Keyword ↑ MAIR IFEval ↑ MAIR InstructIR ↑
Ins-orig 5.21 21.33 4.06 2.06 32.14 89.16
Ins-DV(本论文) 7.57 19.73 9.02 5.61 36.13 87.97
All-orig 5.27 20.85 -23.22 -49.65 24.33 85.54
All-DV(本论文) 8.30 21.38 31.91 12.13 34.08 90.74

四条对比:

  • Ins-orig:480k 条 Promptriever 原始指令样本
  • Ins-DV:240k 原指令 + 240k DV 合成样本(总量 = Ins-orig)
  • All-orig:440k 原指令 + 440k 对应的非指令版本(总量 = ~880k)
  • All-DV:440k 原指令 + 440k DV 合成样本(总量 = ~880k)

第一组对比:Ins-orig vs Ins-DV——指令信号的纯粹增益

同样 480k 数据,把一半换成 DV 样本,FollowIR p-MRR 从 5.21 → 7.57(+45%),InfoSearch 两个子集 +122% / +172%,MAIR IFEval 从 32.14 → 36.13。所有跟"指令敏感性"相关的指标全涨

参照系:EmbeddingGemma-300M 在 FollowIR 上 p-MRR 是 5.61,Qwen3-Embedding-0.6B 是 5.09。305M 的 Ins-DV 模型 7.57,把这两个通用大模型都打过了

但代价也清楚——FollowIR Score 从 21.33 掉到 19.73。Score 是 MAP@1000 / nDCG@5 这种"传统检索质量"指标,掉 1.6 个点不算小。论文给的解释是:DV 样本是"用同一文档对生成的不同指令",所以训练里的 unique context 减少了,多样性降低。

这给了下一步实验一个很清晰的假设——多样性是维持通用检索质量的关键

第二组对比:All-orig vs All-DV——"加通用数据反而崩了"

如果你信"多样性能救通用质量",那么把训练集 scale 到 880k,加 440k 非指令通用数据应该是合理的——这就是 All-orig。

结果是灾难。

指标 Ins-orig All-orig Δ
FollowIR p-MRR 5.21 5.27 +0.06
InfoSearch Length 4.06 -23.22 -27.28
InfoSearch Keyword 2.06 -49.65 -51.71
MAIR IFEval 32.14 24.33 -7.81

注意那两个加粗的负数。p-MRR 是负的,意思是模型把指令读反了——给它说"只要 X 类型",它把 X 类型的 doc 排得更靠后。

这太反直觉了。你只是加了一倍的通用检索数据,居然把指令跟随能力打成负的?

论文给的解释(在 Discussion 里有一段我特别喜欢的"梯度视角"):非指令样本提供的梯度信号在奖励"跟 query 相关就拉近",当混合比例到 50/50,这个信号会压过指令信号。指令敏感性不是"训练数据量多就涨"的能力,它是个脆弱的、需要持续监督才能维持的属性。

我的第一反应是——这跟我之前调多任务训练时碰到的 catastrophic interference 简直一模一样。两个目标如果在 representation 上互相矛盾,更"容易"的那个目标会赢。"忽略 instruction 只看 query" 显然比"读懂 instruction 再判断"容易得多。

All-DV:DV 怎么把这个塌方救回来

把那 440k 通用数据换成 440k DV 数据,相同的 880k 总量:

指标 All-orig All-DV Δ
FollowIR p-MRR 5.27 8.30 +3.03
FollowIR Score 20.85 21.38 +0.53
InfoSearch Length -23.22 31.91 +55.13
InfoSearch Keyword -49.65 12.13 +61.78
MAIR IFEval 24.33 34.08 +9.75
MAIR InstructIR 85.54 90.74 +5.20

所有指标全涨,且每一个都是全场最高。FollowIR p-MRR 8.30 是全表第一,Score 21.38 也是全表第一。

更值得品的是 All-DV 跟 Ins-DV 的对比——All-DV 数据量翻倍但都是带 instruction 的(要么原始要么合成),Score 从 19.73 涨到 21.38(+1.65),同时 p-MRR 从 7.57 涨到 8.30。这说明 Ins-DV 的 Score 下降的"罪魁祸首"确实是数据多样性不足,而不是 DV 方法本身有问题。

把这个发现翻译成工程语言:

数据量确实是通用检索质量的主要驱动,但前提是每个训练样本都带 instruction 信号——你不能为了凑量去掺非指令数据,那会把指令敏感性彻底干废。

跨 backbone 验证:bge-m3-retromae

Table 2 在更强的 bge-m3 编码器上做了同一组对照,结论完全复制:

训练数据 FollowIR p-MRR InfoSearch Keyword
Ins-orig 9.40 4.18
Ins-DV 11.47 48.42
All-orig 8.84 -62.04
All-DV 13.92 49.62

InfoSearch Keyword 子集上从 4.18 直接拉到 48.42,All-orig 那个 -62.04 也很惨烈。两个发现(DV 提升 IF / 混合非指令数据塌方)都是 backbone-agnostic 的

这给我的信心是——这不是某个特定模型的偶然现象,而是个范式级的观察。


我对这篇论文的判断

亮点:方法-实验-发现三个层面都有真东西

方法层:极性反转这个 idea 真的漂亮。它把"指令负样本"从一次性的反派变成了"双视图训练对"的一半,每个数据点的信息密度直接翻倍——而且不是简单复制,是结构上的对偶。这种"用数据结构强迫模型不能偷懒"的思路,比加新的 loss 项要 elegant 很多。

实验层:size-matched 这条原则做得非常严格。Ins-DV 不是"在 Ins-orig 基础上加 DV",而是"用 DV 替换掉一半 Ins-orig",这样你才能区分出"是 DV 信号有用"还是"单纯数据多了所以好"。All-orig vs All-DV 也是同一个数据预算下的公平对比。这种克制在很多 paper 里其实做不到,多数论文喜欢"加点东西总会涨"的乐观对比。

发现层:那个"50/50 混合非指令数据导致 p-MRR 变负"的观察,在我看来比 +45% 还更有冲击力。它解释了一个长期困扰的现象——为什么大厂一直在堆通用 embedding 模型的规模,但在 FollowIR 这种 benchmark 上始终上不去:因为它们的训练数据里指令信号被通用数据稀释了。这个观察是有政策意义的,会改变很多团队怎么混合数据。

问题:边界条件没探得很清

但说实话,这篇论文也有几个我会皱眉的地方。

第一,DV 比例没消融。论文只跑了 50%/50% 一种混合比例(Ins-DV 是 240/240,All-DV 是 440/440 替换非指令)。如果把 DV 的占比从 10% 一路扫到 90%,曲线长什么样?最优点在哪?这是个很自然的消融,但论文没做。我猜是出于算力预算,但缺了这个,工程落地时怎么调比例只能靠盲试。

第二,"互补指令"的合成质量假设。整个方法的根基是 LLM 能合成出"语义合理且能反转极性"的指令。论文说人工 check 了 100 条,99% 可用,但 100 条样本量挺小,而且没有给"哪些场景容易失败"的细分。我猜对那些约束维度本身就很窄的 query(比如纯数值类、纯日期类),合成空间会很有限。

第三,跟 InF-IR(Zhuang 2025)的对比缺位。论文 Discussion 里提到 InF-IR 用 38k 特化三元组就达到了"竞争性的"IF 表现,并把这个引用为"信号纯度比数据量更重要"的支持证据。但 Table 1/2 里没把 InF-IR 跑一遍做直接对比。我会很想看到 Ins-DV vs InF-IR 的 head-to-head,毕竟两条路线哲学不同——InF-IR 是"少而精",DV 是"用现有数据榨取双视图"。

第四,仅限 bi-encoder。论文坦诚说了这一点,但 cross-encoder 上是不是同一回事,会不会因为 cross-encoder 本来就更擅长"细粒度交互"而效果变小?这是个开放问题。

工程启发:能直接抄回去用的两条

如果你正在做带指令的检索/RAG 系统,这篇论文有两条直接可落地的:

第一条,DV 数据合成 pipeline 可以直接拷贝。Appendix A 那个 prompt template 就是现成的,换成你领域的 LLM(哪怕是 GPT-4o-mini 这个量级)应该都能复现 99% 的可用率。如果你已经有指令负样本(很多 RAG 评测数据集里有),加个 LLM 调用就能把数据集"翻倍"成 DV 版本。

第二条,重新审视你的训练数据混合策略。如果你在做"通用检索 + 指令理解"的 dual-purpose 模型,不要无脑混合通用数据和指令数据。要么全指令(可能损失通用质量),要么用 DV 让通用数据本身也带 instruction 信号——后者明显是更优解。50/50 混合可能是最差的选择。

这篇论文在赛道上的位置

往大了说,这篇论文不是底层突破,它是在 Promptriever / FollowIR / InF-IR 这条路线上的一个漂亮的工程整合。它没有发明新的 loss、新的架构、新的 metric,但它把"指令负样本"这个已有概念用足了,做了一个之前没人做的"对偶视图"操作。

我觉得这种"小而锋利"的论文在 LLM 时代会越来越多——不再是"我有一个新算法",而是"我看到了一个数据/训练上没人注意的角度,做对了它"。这种工作的价值在于它跑得通、好复现、容易迁移到工业系统里。

对于做企业搜索、RAG、多模态检索的团队,FollowIR 这条路线值得跟。指令跟随检索很可能是下一个被卷起来的 embedding 子方向——就跟两年前 long-context 一样。Snowflake 这边明显在押注这个方向,从 Arctic-Embed 2.0 到这篇 DV 训练,是一个很清晰的产品级 roadmap。


结尾的一点延伸思考

这篇论文给我最大的启发其实不是 +45% 那个数字,而是它揭示的一个更深层的现象——模型能力的"出现"和"消失"是不对称的

你想想看:

  • 加 50% DV 数据 → 指令敏感性涨 45%(提升是渐进的、可叠加的)
  • 加 50% 非指令数据 → 指令敏感性塌方到负值(破坏是断崖式的、压倒性的)

这跟我们在 RLHF / SFT 里看到的"对齐税"特别像——某些能力一旦被竞争性的训练信号干扰,就不是"少一点"而是"几乎为零"。

这意味着,对于某些"脆弱的能力",我们需要的不是更多数据,而是更纯净的数据信号。Dual-View 的本质是把数据扩增的方式从"加更多样本"换成了"让每个样本都携带正确的信号"。

这条思路其实可以推广到很多场景。比如多模态对齐、工具调用、长程推理——任何一个"模型容易偷懒走捷径"的能力,是不是都能找到一个"对偶视图"的设计,让模型无法偷懒?

我猜接下来一两年会看到这类"对偶式数据合成"的工作铺开。值得跟。


参考资料


觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我