前言:无语了,被GPT怼了一顿,说整这些花里胡哨的检索优化作用不大,然后我知道了
最重要的是数据清洗 ,但我感觉还是学学吧,不用但是得知道,面试吹水也可以吹吹嘛。
好啦,这次讲的是混合检索,我们要引入的是BM25检索器,他是基于关键词匹配 ,比如我们用的搜索引擎这样子。 刚开始我们用的是向量检索的方式,但这种也会遇到点小问题。这里举个例子
1 2 3 4 5 用户查询:"怎么让手机省电?" 文档内容:"如何延长移动设备电池续航时间" - BM25:几乎得0分(关键词完全不匹配) - 向量检索:高分匹配(语义相近)
反之
1 2 3 4 5 6 用户查询:"Kimi K2.5 发布日期" 文档内容:"Kimi K2.5 was released on 2025-01-20" - BM25:精确匹配 "Kimi K2.5" - 向量检索:可能因"发布日期"和"released on"语义相近而匹配, 但不如BM25精确
我们要做的就是取这两个检索方式互补~
初始化词匹配器 好啦接下来说说这个检索器怎么用吧。向量检索器的话,我们可以知道,他由向量数据库的一个接口 vectorstore.as_retriever()来实现的。 这个的话,
BM25Retriever.from_texts(docs) 他接收的是一个list[str],我这里放的doc也是
1 2 3 4 5 6 7 8 9 10 11 12 13 14 from langchain_community.retrievers import BM25Retrieverdocs = [ "Remote sensing for landslide detection using SegFormer." , "Construction waste identification via deep learning." , "YOLOv11 architecture for object detection in satellite imagery." ] bm25_retriever = BM25Retriever.from_texts(docs)
混合检索器 我们需要把向量检索器和上面写的词匹配检索器融合在一块,还需要一个混合检索器 使用方法如下
1 2 3 4 5 6 7 8 9 10 from langchain_community.retrievers import EnsembleRetrieverensemble_retriever = EnsembleRetriever( retrievers=[bm25_retriever, vector_retriever], weights=[0.5 , 0.5 ] ) docs = ensemble_retriever.invoke("你的查询" )
原理
和之前学的rag融合一样。