混合检索的详细剖析
向量检索是RAG的核心,但它不是万能的。
来看一个真实场景:你搭了一个技术文档问答系统,知识库里存了几百篇Spring相关的文档。用户问"SpringBoot 3.2.1的启动流程有什么变化",向量检索返回了什么?大概率是一堆关于"SpringBoot启动流程"的通用文档,但版本号"3.2.1"这个关键信息被忽略了。
为什么?因为向量检索的工作方式是把文本转成一串数字(向量),然后比较数字之间的距离。它理解的是"语义"——知道"启动流程"和"启动过程"是一回事。但它对精确的关键词不敏感,"3.2.1"和"3.1.0"在向量空间里的距离可能很近,因为它们都是版本号。
这不是个例。以下几类查询,纯向量检索都容易翻车:
| 查询类型 | 示例 | 翻车原因 |
|---|---|---|
| 精确版本号/编号 | "JDK 21的虚拟线程" | 版本号在向量空间中区分度低 |
| 专有名词和缩写 | "GraalVM Native Image" | 专有名词的embedding质量不稳定 |
| 包含数字的查询 | "配置最大连接数为200" | 数字在语义空间中几乎没有区分度 |
| 中英文混合 | "Kafka的consumer group机制" | 中英混合的embedding效果打折 |
关键词检索:老技术但没过时
在向量检索出现之前,搜索引擎用的都是关键词检索。最经典的算法就是BM25。
BM25到底在算什么
BM25的核心思想用一句话概括:一个词在某篇文档里出现得越多、在整个文档库里出现得越少、这篇文档又不是特别长,那这篇文档就越可能是你要找的。
拆开来看三个因素:
词频(TF)——出现越多越相关,但有上限
一个词在文档里出现了10次,比出现1次更可能相关。但出现100次不会比出现10次相关10倍——BM25用了一个饱和函数,让词频的贡献有上限。这防止了某些文档因为疯狂重复某个词而霸占排名。
逆文档频率(IDF)——越稀有越有价值
"的""是""在"这些词几乎每篇文档都有,搜索价值为零。而"GraalVM""虚拟线程"这些词只在少数文档中出现,搜索价值很高。IDF就是用来衡量一个词的稀有程度的。
文档长度归一化——长文档不能占便宜
一篇10000字的文档,某个词出现5次很正常。但一篇100字的文档里出现5次,说明这篇文档和这个词高度相关。BM25会根据文档长度做归一化,防止长文档仅仅因为"字多"而排名靠前。
向量检索 vs 关键词检索
两种检索方式各有所长,谁也替代不了谁:
| 维度 | 向量检索 | 关键词检索(BM25) |
|---|---|---|
| 核心能力 | 语义理解 | 精确匹配 |
| "汽车"能匹配"轿车"吗 | 能,语义相近 | 不能,词不一样 |
| "JDK 21"能精确匹配吗 | 不太行,版本号区分度低 | 能,精确匹配 |
| 对拼写错误的容忍度 | 较高 | 很低 |
| 对专有名词的处理 | 取决于embedding质量 | 精确匹配,很稳定 |
| 计算成本 | 高(需要embedding模型) | 低(倒排索引) |
| 适合的场景 | 概念性问题、语义搜索 | 精确查找、关键词定位 |
看出来了吧?它们是互补关系。向量检索擅长的,关键词检索不行;关键词检索擅长的,向量检索也不行。
那为什么不两个都用呢?这就是混合检索的思路。
付费内容提示
该文档的全部内容仅对「JavaUp项目实战&技术讲解」知识星球用户开放
加入星球后,你可以获得:
- 超级八股文:100万+字的全栈技术知识库,涵盖技术核心、数据库、中间件、分布式等深度剖析的讲解
- 讲解文档:超级AI智能体、黑马点评Plus、大麦、大麦pro、大麦AI、流量切换、数据中台的从0到1的详细文档
- 讲解视频:超级AI智能体、黑马点评Plus、大麦、大麦pro、大麦AI、流量切换、数据中台的核心业务详细讲解
- 1 对 1 解答:可以对我进行1对1的问题提问,而不仅仅只限于项目
- 针对性服务:有没理解的地方,文档或者视频还没有讲到可以提出,本人会补充
- 面试与简历指导:提供面试回答技巧,项目怎样写才能在简历中具有独特的亮点
- 中间件环境:对于项目中需要使用的中间件,可直接替换成我提供的云环境
- 面试后复盘:小伙伴去面试后,如果哪里被面试官问住了,可以再找我解答
- 远程的解决:如果在启动项目遇到问题,本人可以帮你远程解决
