Embedding 检索:双塔、对比学习与困难负样本
从双塔打分和 InfoNCE 解释语义检索,说明困难负样本、假负例、归一化与检索模型选型。
发布于 2026-09-07 · 更新于 2026-09-07
本文目录
图:向量表示将对象映射到可比较的空间;检索质量还取决于训练目标、样本与距离定义。 来源:Projection into a lower-dimensional space,作者 Aston Zhang、Zachary C. Lipton、Mu Li、Alexander J. Smola(D2L.ai),许可 CC BY-SA 4.0。
学习目标
能从训练目标解释“语义相近”为什么不总是“能回答问题”,并判断该换 embedding、调索引还是训练 reranker。应用岗应该会算一个相似度,能说清训练数据如何构造及如何避免测试污染。
前置知识
Softmax 与交叉熵、句段 embedding 与 token embedding 的区别。把文档切成片段后,检索目标是寻找与当前问题相关且可作为证据的片段,不只是寻找主题相同的文章。
心智模型
双塔分别编码查询 q 与文档 d,得到 f(q)、g(d),用内积或余弦打分。文档向量可以离线计算,因此在线只需编码查询并搜索。Cross-Encoder 将查询和文档一起送入模型,允许更细的交互,但难以预先为每个查询计算所有文档分数,通常放在小候选集上重排。
“年假余额如何计算”和“年假不可结转”的向量可能接近,却不是同一个问题的充分证据。检索系统要保留实体、时间、组织和否定条件;语义模型不自动拥有这些业务约束。
正式定义
余弦相似度 cos(q,d)=q·d/(‖q‖‖d‖)。非零向量归一化后,内积就是余弦。归一化向量间平方欧氏距离为 2−2cos,因此在此条件下排名对应;零向量不能直接这样归一化。
一个正例 d⁺ 与若干负例 dⱼ 的对比目标可写为: L=−log[exp(s(q,d⁺)/τ)/Σⱼexp(s(q,dⱼ)/τ)], 分母包含正例,τ>0 是温度。正确证据相对负例得分越高,损失越小。温度小会强化分数差异及梯度集中,但不能脱离数据噪声和训练稳定性一味调小。
注意训练标签的含义:语义相似、问题—答案相关、证据支持是不同监督信号。一个通用相似度模型不一定适合企业政策问答。
关键性质
手算一次排序
查询 q=(1,0),文档 A=(10,1),B=(1,1)。内积分别为 10、1;余弦约为 0.995、0.707。若文档 C=(100,100),它与 B 方向相同,内积却变为 100,说明不归一化时长度会影响排名。应按模型训练与检索约定选择距离,不能只在数据库里任意切换。
假设正例与两个负例分数为 [2,1,0]、温度为 1,正例概率约 0.665,损失约 0.408。若一个不相关但形式相似的片段得分升到 3,它就会成为训练需要纠正的困难负例。
负例决定模型学会区分什么
随机负例通常很容易;困难负例来自 BM25、当前 embedding 或线上误召回,例如同一产品的另一版本、同名制度的另一地域。训练它们能迫使模型区分细粒度条件,但前提是确实不相关。
批内负例把其他样本的正例当成当前查询负例。如果两道问题都能由同一制度回答,就可能是假负例。可以按文档家族去重、标注多正例、屏蔽冲突样本;不能只扩大 batch 而不检查标签。
改善检索的实验顺序
先验证原始语料有证据且解析正确,再做精确向量搜索,评估模型本身的相关性;然后比较 ANN 是否丢失精确搜索结果。若精确搜索已差,调 HNSW 参数不能修好表示。若精确搜索好而 ANN 差,则优先调搜索参数、过滤方式和索引构建。
微调 embedding 需要 query—正例—负例数据,训练测试按文档家族或时间隔离。上线新模型需重建文档向量,并将 query 编码与新索引一起切换。维度一致不是兼容性证明。
边界与反例
余弦 0.8 不是“80% 正确概率”。阈值需要在具体模型、语料和任务上校准;检索分数与可回答性之间还隔着证据完整性、时间与权限。
多语言或缩写查询可能需要领域模型、词法召回或词典扩展;微调不是唯一解。表格数字比较、跨文档聚合等任务,即使相关片段都召回,仍可能需要结构化查询或程序计算。
知识检查
- 为什么双塔快? 文档侧计算可预先完成,在线搜索向量;不是因为向量维度越小就永远越好。
- 为什么 reranker 更精细? 可以对查询与候选做联合交互,但只能重排已召回的候选。
- 怎样判断 embedding 真提升? 固定语料、切分、过滤、候选预算和评测集,看按查询类型分组的证据 Recall 及最终任务结果。
- 为什么困难负例可能伤害模型? 如果它其实也是有效证据,训练会惩罚正确相关性。