跳到主要内容

混合检索的详细剖析

向量检索是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的问题提问,而不仅仅只限于项目
  • 针对性服务:有没理解的地方,文档或者视频还没有讲到可以提出,本人会补充
  • 面试与简历指导:提供面试回答技巧,项目怎样写才能在简历中具有独特的亮点
  • 中间件环境:对于项目中需要使用的中间件,可直接替换成我提供的云环境
  • 面试后复盘:小伙伴去面试后,如果哪里被面试官问住了,可以再找我解答
  • 远程的解决:如果在启动项目遇到问题,本人可以帮你远程解决
进入星球后,即可享受上述所有服务,保证不会再有其他隐藏费用。
知识星球二维码

1. 打开微信 -> 扫描左侧二维码 -> 加入「JavaUp项目实战&技术讲解」知识星球

2. 查看星球使用指导,获取完整项目讲解资料索引

👉 点击解锁全部付费内容
🎁优惠