检索模型cross-encoder笔记
文章目录计算句子对相似度搜索结果的“重排序”cross-encoder一种检索模型和双路召回机制不一样各有优缺点。cross-encoder最大的特点就是会将query(问题)和document(候选文本)一起分析。一般的流程是双路召回先粗排cross-encoder再精排。计算句子对相似度代码fromsentence_transformersimportCrossEncoder# 1. 加载预训练模型# 这里使用微软开源的 MiniLM 模型速度快且效果好modelCrossEncoder(cross-encoder/ms-marco-MiniLM-L-6-v2)# 2. 准备句子对# 假设我们要判断“查询”和“文档”的相关性pairs[[如何重置路由器密码,忘记路由器管理密码了怎么办],# 语义高度相关[如何重置路由器密码,路由器指示灯闪烁的含义],# 语义相关性低[如何重置路由器密码,最新的iPhone价格是多少]# 完全无关]# 3. 预测分数scoresmodel.predict(pairs)# 4. 输出结果forpair,scoreinzip(pairs,scores):print(f查询:{pair[0]})print(f文档:{pair[1]})print(f相关性分数:{score:.4f})print(-*30)输出结果查询: 如何重置路由器密码 文档: 忘记路由器管理密码了怎么办 相关性分数:7.0266------------------------------ 查询: 如何重置路由器密码 文档: 路由器指示灯闪烁的含义 相关性分数:3.6690------------------------------ 查询: 如何重置路由器密码 文档: 最新的iPhone价格是多少 相关性分数:3.6907解读第一组的文档很明显更贴近查询所以给了高分和我们预期的效果一致。搜索结果的“重排序”fromsentence_transformersimportSentenceTransformer,CrossEncoder,utilimporttorch# --- 第一步双编码器召回 (Bi-Encoder Retrieval) ---# 模拟从海量数据库中快速检索bi_encoderSentenceTransformer(multi-qa-MiniLM-L6-cos-v1)query如何治疗感冒# 假设这是数据库中的文档片段corpus[感冒通常由病毒引起建议多休息多喝水。,Python 是一种高级编程语言。,治疗流感的特效药需要医生处方。,感冒和流感的区别在于症状的严重程度。,今天天气真不错适合出去野餐。]# 将文档转换为向量实际项目中通常预先计算好corpus_embeddingsbi_encoder.encode(corpus,convert_to_tensorTrue)query_embeddingbi_encoder.encode(query,convert_to_tensorTrue)# 计算余弦相似度并获取 Top 3 结果cos_scoresutil.cos_sim(query_embedding,corpus_embeddings)[0]top_resultstorch.topk(cos_scores,k3)print(f--- 双编码器召回结果 (Top 3) ---)forscore,idxinzip(top_results.values,top_results.indices):print(f[{score:.4f}]{corpus[idx]})# --- 第二步交叉编码器重排序 (Cross-Encoder Reranking) ---# 将召回的 3 个结果交给 Cross-Encoder 进行精准判断rerankerCrossEncoder(cross-encoder/ms-marco-MiniLM-L-6-v2)# 构建待重排序的句子对rerank_pairs[[query,corpus[idx]]foridxintop_results.indices]# 获取精准分数rerank_scoresreranker.predict(rerank_pairs)# 将分数和原文重新组合并排序final_resultssorted(zip(rerank_scores,[corpus[idx]foridxintop_results.indices]),reverseTrue)print(f\n--- Cross-Encoder 重排序结果 ---)forscore,textinfinal_results:print(f[{score:.4f}]{text})输出结果--- 双编码器召回结果(Top3)---[0.8146]治疗流感的特效药需要医生处方。[0.3674]感冒和流感的区别在于症状的严重程度。[0.3576]感冒通常由病毒引起建议多休息多喝水。 --- Cross-Encoder 重排序结果 ---[7.2241]治疗流感的特效药需要医生处方。[4.5378]感冒通常由病毒引起建议多休息多喝水。[4.3828]感冒和流感的区别在于症状的严重程度。解读双编码器可能会因为关键词匹配如“感冒”和“流感”给出较高的初步分数但 Cross-Encoder 能更精准地判断“治疗感冒”和“治疗流感”的区别从而给出更符合用户意图的排序。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2459048.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!