去年夏天,一个做法律AI的工程师在GitHub上吐槽:用了OpenAI最贵的嵌入模型,检索结果还是像"开盲盒"——用户问"劳动合同解除赔偿",返回的第一条是"劳动合同签订注意事项"。
他后来发现了问题所在:嵌入模型把"解除"和"签订"当成了近义词。这不是模型不够贵,是架构本身的盲区。
语义搜索的主流方案叫双编码器(bi-encoder,将查询和文档分别编码为向量后比对)。它快、便宜、能扩展,但有个致命缺陷——查询和文档在压缩成向量之前,从未真正"见过面"。
就像让两个陌生人各自写一张自我介绍卡片,然后凭卡片判断他们合不合适。卡片上写满了关键词匹配,却少了最关键的:放在一起读一遍,才知道搭不搭。
双编码器的盲区:500美元怎么算"便宜"
作者Ian Ho举了个扎心的例子。你搜"东京便宜酒店",系统返回三条结果:
第一条:"东京豪华酒店,每晚500美元起"——匹配了"酒店"和"东京",语义得分很高。
第二条:"东京经济型旅馆,每晚30美元"——"经济型"和"便宜"在向量空间里隔得有点远。
第三条:"东京胶囊旅馆,20美元一晚"——"胶囊"这个词可能根本没进过训练语料。
双编码器看不到"500美元"和"便宜"之间的矛盾。它只比较压缩后的向量,而压缩过程已经丢弃了这种细粒度的交互信号。
交叉编码器(cross-encoder,将查询和文档拼接后一次性编码)的做法完全不同:它把查询和文档连成一句话喂给模型,让注意力机制直接计算每个词之间的关系。
代价是慢——不能预计算文档向量,每次查询都要实时推理。但好处是准:它能捕捉到"cheap"和"$500/night"的冲突,也能理解"hostel"在特定语境下就是用户想要的"cheap hotel"。
两阶段架构:先用渔网,再用镊子
生产环境的解法很务实,不搞二选一。Stage 1用双编码器或BM25快速召回Top-K候选,Stage 2用交叉编码器精排。
这个模式在一线团队早已普及。Cohere的Rerank API、Jina AI的Reranker、甚至Azure的语义排序器,底层都是这套逻辑。只是很多开发者卡在Stage 1就以为做完了。
作者开源的代码库验证了一个关键数字:在MS MARCO数据集上,纯双编码器的NDCG@10是0.387,加入交叉编码器重排后直接冲到0.568——提升47%,而延迟控制在可接受范围。
更隐蔽的收益是长尾查询的稳定性。双编码器对训练时没见过的表达方式很脆弱,交叉编码器的鲁棒性来自它保留了完整的词汇交互,而不是依赖压缩后的语义近似。
微调交叉编码器:你的数据比通用模型更懂业务
Hugging Face的sentence-transformers库把微调流程打包得很干净。核心就三步:准备(查询,文档,标签)三元组,标签通常是0-1相关度或0-5分级;加载预训练交叉编码器(如cross-encoder/ms-marco-MiniLM-L-6-v2);用MultipleNegativesRankingLoss或自定义损失函数训练。
作者强调了一个反直觉的点:负样本的质量比正样本更重要。如果训练时的负样本太简单(明显不相关),模型学不到区分细微差异的能力。好的负样本应该是"看起来有点相关,实际不对"的那种——也就是双编码器会错排的那些。
具体操作上,可以用双编码器先召回一批候选,把排名靠后但语义得分不太低的作为硬负样本(hard negatives)。这种"用双编码器的错误来教交叉编码器"的策略,能让微调效果提升一截。
代码示例里有个细节:作者建议评估时不仅看NDCG,还要盯MRR(Mean Reciprocal Rank,平均倒数排名)。后者对首位正确率更敏感,而RAG场景下用户通常只看前1-3条。
再往前一步:交叉编码器的变体玩法
基础方案之外,作者列了几条进阶路线。多向量交叉编码器——不输出单一相关性分数,而是为文档不同段落分别打分,适合长文档场景。列表式重排(Listwise Reranking)——不逐对比较,而是一次性看整个候选列表,捕捉结果间的冗余和互补性。蒸馏到双编码器——用交叉编码器当教师模型,训练一个更快的学生模型来近似其排序行为。
最后这条在延迟敏感的场景很关键。某电商搜索团队的实践是:白天用蒸馏后的双编码器扛流量,夜间用交叉编码器重新标注数据、迭代教师模型。精度损失控制在3%以内,TPU成本降了80%。
还有一个被低估的方向:交叉编码器不只是排序工具,它可以作为数据质量探针。定期抽样让交叉编码器给双编码器的召回结果打分,能发现 embedding 模型在哪些查询类型上系统性失效——这比盲目换模型更有针对性。
作者Ian Ho在文末留了句话:「我见过太多团队把预算砸在更大的嵌入模型上,却不愿花两天时间搭一个重排流水线。」
如果你现在的RAG结果还像开盲盒——是继续赌下一个嵌入模型,还是先试试把查询和文档放在一起读一遍?
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.