前言:无语了,被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也是
image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from langchain_community.retrievers import BM25Retriever

# 1. 准备你的文档(假设你已经有了一些遥感论文的文本)

docs = [
    "Remote sensing for landslide detection using SegFormer.",
    "Construction waste identification via deep learning.",
    "YOLOv11 architecture for object detection in satellite imagery."
]

# 2. 初始化 BM25 检索器(擅长关键词,比如 "YOLOv11")
# bm25_retriever不需要语义向量模型,初始化方式是.form_text

bm25_retriever = BM25Retriever.from_texts(docs)

混合检索器

我们需要把向量检索器和上面写的词匹配检索器融合在一块,还需要一个混合检索器
使用方法如下

1
2
3
4
5
6
7
8
9
10
from langchain_community.retrievers import EnsembleRetriever

# 组合多个检索器(如BM25 + 向量检索)
ensemble_retriever = EnsembleRetriever(
retrievers=[bm25_retriever, vector_retriever], # 多个检索器列表
weights=[0.5, 0.5] # 可选:每个检索器的权重
)

# 使用
docs = ensemble_retriever.invoke("你的查询")

原理

image.png
和之前学的rag融合一样。