标准回答
三层方法
字面相似度:Jaccard(词集合重叠)、编辑距离(Levenshtein)、TF-IDF/BM25(加权词频)。优点是快、可解释、无需训练,缺点是只看表面词形,无法识别「电脑 / 计算机」这类同义改写。
向量相似度:把句子编码成稠密向量(词向量平均,或句向量模型如 Sentence-BERT),用 cosine 衡量。能捕捉语义,且向量可预先计算、用向量库做大规模近似最近邻检索,是召回阶段主力。
交叉编码器:把两段文本拼接后一起送入模型联合建模,直接输出相似分。最准,但每对都要前向一次、无法预存向量,只适合对少量候选做精排。
选型
先判断是否需要语义(错别字/去重用字面即可)。大规模检索用双塔向量做召回,再用交叉编码器对 Top-K 重排兼顾精度与速度。最后按具体任务(问答/去重/检索)用标注数据微调,效果最好。
常见误区
⚠️ 常见踩坑
直接对原始词向量求平均当句向量并期望高精度——平均会丢语序与重点,且未针对相似度任务训练的向量空间各向异性严重;正式场景应用专门的句向量模型或对比学习微调。
追问
追问 1:双塔(bi-encoder)和交叉编码器(cross-encoder)如何配合?
双塔分别编码两段文本得到独立向量,可离线预计算、配合向量库做亿级快速召回,但两边不交互、精度有上限。交叉编码器联合编码、精度高但慢、不能预存。生产标准范式是「双塔召回 Top-K + 交叉编码器精排」,兼得速度与精度,也是 RAG 检索的常用结构。
追问 2:为什么不能直接用预训练 BERT 的 [CLS] 算 cosine?
原生 BERT 未针对相似度优化,其句表示在向量空间高度各向异性、cosine 区分度差,效果常不如 TF-IDF。需要像 Sentence-BERT 那样用句对数据做对比/孪生网络微调,把语义相近的句子拉近、相远的推开,得到适合 cosine 度量的句向量空间。
延伸学习
与本题相关的知识库文章、术语、工具与行业资讯。