什么是 Hybrid Search?
Hybrid Search(混合检索)是一种在信息检索和 RAG(检索增强生成)系统中同时使用多种搜索算法的技术。最常见的组合是将捕获上下文和概念含义的**密集向量检索(Dense Vector Retrieval)**与专注于精确词汇匹配和特定实体查找的**稀疏关键词检索(Sparse Keyword Retrieval,通常指 BM25 算法)**融合在一起。系统分别运行这两路搜索,然后通过融合算法(如 RRF,倒数排名融合)将它们的结果合并,从而在理解用户意图的同时,确保不会漏掉包含特定产品名称、ID 或行业黑话的关键文档。
快速了解
| 全称 | Hybrid Search in Information Retrieval |
|---|---|
| 创建时间 | 随着大模型落地,2023-2024 年迅速成为 RAG 系统中提升召回质量的标配技术。 |
工作原理
随着大模型和 RAG 的兴起,向量数据库成为了主流。向量检索(Dense Search)的优势在于它能理解语义,比如搜索“苹果手机”,它能找出包含“iPhone”的文档,即使文档中根本没有“苹果”这个词。但它也存在致命缺陷:对于专有名词、缩写、长数字 ID(如“错误码 502”或“型号 XJ-9000”)极不敏感,因为这些罕见词的向量表示在训练时往往没有学好,导致完全匹配的文档反而排在后面。传统的关键词检索(如 Elasticsearch 中的 BM25)恰好弥补了这一点,它基于词频统计(TF-IDF),非常擅长大海捞针寻找特定字符串,但缺乏上下文理解能力(无法将“开心”等同于“快乐”)。 为了获得两者的优点,业界提出了 Hybrid Search。在用户输入查询后,系统会同时将其转化为向量并执行关键词分词。两路召回(多路召回)各自返回一组 Top-K 结果。随后,系统使用倒数排名融合(Reciprocal Rank Fusion, RRF)等算法对两份榜单进行打分合并,确保既有语义相关的宽泛匹配,也有关键词精准命中的硬性匹配。在实际的生产级 RAG 架构中,混合检索配合 Rerank 重排,几乎成为了不可或缺的黄金组合。
主要特点
- 多路召回:同时利用向量检索的语义泛化能力和 BM25 的关键词精确打击能力
- 互补性极强:解决了纯向量检索对专有名词、ID、特定缩写不敏感的痛点
- 融合算法:通常采用 RRF (Reciprocal Rank Fusion) 或加权求和来合并不同检索方式打分尺度不一致的结果
- 广泛支持:主流向量数据库(如 Weaviate, Milvus, Qdrant, Pinecone)和 Elasticsearch 均已原生支持混合检索
- RAG 最佳实践:是提高召回率(Recall)最具成本效益的方法之一
常见用途
- 电商多模态搜索:同时匹配用户对“红色轻薄笔记本”的意图描述,以及确保不会漏掉确切包含品牌型号“ThinkPad X1”的商品
- 技术文档与代码库问答:在回答“如何解决超时”语义问题的同时,精确匹配诸如“Error 408”或“connection_timeout”的报错代码
- 医疗病例检索:既能理解“肚子痛”和“腹痛”的语义关联,又能精准定位罕见病名“肌萎缩侧索硬化症”
- 企业级 RAG 知识库:处理员工模糊的口语化提问,同时通过关键词命中确切的部门规章制度文档
- 法律法规查询:语义理解“关于辞退员工的规定”,关键词锁定“劳动法第三十九条”
示例
Loading code...常见问题
既然向量检索是 AI 时代的代表,为什么还要退回去用 BM25 关键词?
因为向量模型在训练时对高频词汇(如日常用语)学习得很好,但对于低频、罕见词汇(如特定的产品序列号、公司内部代号、具体的报错代码)缺乏足够的上下文。当你搜索“XJ-9000 路由器”时,向量检索可能会给你返回很多其他路由器,因为“XJ-9000”的向量表示可能非常模糊。而传统的 BM25 算法通过词频和逆文档频率计算,能像手术刀一样精准地把包含“XJ-9000”的文档切出来。
混合检索中的 RRF(倒数排名融合)是什么?
RRF 是一种非常经典的排序合并算法。因为向量相似度(如 0.85)和 BM25 得分(如 12.4)的数值范围完全不同,无法直接相加。RRF 不看具体分数,只看排名。它将每个结果在两份榜单中的排名取倒数并相加(如 1/排名1 + 1/排名2)。这样,在两个榜单中都排在前列的文档,其最终得分就会最高,有效解决了分数尺度不一致的问题。
实现混合检索复杂吗?
以前需要自己维护一个 Elasticsearch 查关键词,再维护一个 FAISS 查向量,然后在代码里手动写 RRF 合并,非常痛苦。但现在主流的向量数据库(如 Milvus, Weaviate, Pinecone)都已经内置了混合检索功能,只需要在 API 调用时设置一个参数(如 `alpha=0.5`)即可自动完成双路召回和融合打分。