Reranker + BM25 + FAISS 构建高效的多阶段知识库检索系统一

一、什么是知识库检索?

在构建基于大语言模型的问答系统(如 RAG)中,知识库检索(Retrieval) 是第一步,也是影响最终回答质量的关键环节。它负责从大规模文档中快速定位与用户问题最相关的 top-k 段落。下面提供的是一个思路方向,包括代码的大概实现步骤。

本文介绍一种经典的三段式检索流程:

  1. BM25:粗排召回
  2. FAISS:向量相似度排序
  3. Reranker:精排打分

二、为什么使用多阶段检索?

阶段技术功能
第一阶段BM25基于关键词匹配,召回相关文档
第二阶段FAISS基于语义向量,进行高效近似最近邻搜索
第三阶段Reranker基于交叉注意力机制,精准排序候选结果

这种“先快后准”的策略既保证了效率又提升了准确性。


三、实现思路概述

[Query] ↓
BM25 → [Top-50 Candidates]↓
FAISS → [Top-10 Semantically Similar]↓
Reranker → [Top-3 最佳匹配段落]

四、环境依赖安装

pip install rank_bm25 faiss-cpu sentence-transformers torch transformers

五、第一阶段:BM25 召回

from rank_bm25 import BM25Okapi
import jieba  # 中文分词示例# 模拟知识库
corpus = ["大模型训练需要大量数据和高性能计算资源","RAG 系统通过外部知识提升回答能力","Faiss 是 Facebook 开发的高效向量检索库","BM25 是一个基于统计的语言模型"
]tokenized_corpus = [list(jieba.cut(doc)) for doc in corpus]
bm25 = BM25Okapi(tokenized_corpus)# 查询
query = list(jieba.cut("如何提升问答系统的准确性?"))
top_n_docs = bm25.get_top_n(query, corpus, n=3)print("BM25召回结果:")
for doc in top_n_docs:print(" -", doc)

六、第二阶段:FAISS 向量检索

from sentence_transformers import SentenceTransformer
import faiss
import numpy as np# 加载预训练语义编码器
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')# 编码文档
doc_embeddings = model.encode(corpus)
query_embedding = model.encode(["如何提升问答系统的准确性?"])# 构建 FAISS 索引
dimension = doc_embeddings.shape[1]
index = faiss.IndexFlatL2(dimension)
index.add(np.array(doc_embeddings))# 检索 top-3
_, indices = index.search(np.array(query_embedding), k=3)
faiss_results = [corpus[i] for i in indices[0]]print("FAISS语义检索结果:")
for doc in faiss_results:print(" -", doc)

七、第三阶段:Reranker 精排打分

from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch# 加载 reranker 模型(中文)
tokenizer = AutoTokenizer.from_pretrained("BAAI/bge-reranker-base")
model = AutoModelForSequenceClassification.from_pretrained("BAAI/bge-reranker-base")def rerank(query, candidates):pairs = [[query, doc] for doc in candidates]inputs = tokenizer(pairs, padding=True, truncation=True, return_tensors='pt')with torch.no_grad():scores = model(**inputs).logits.squeeze().cpu().numpy()return sorted(zip(candidates, scores), key=lambda x: x[1], reverse=True)reranked = rerank("如何提升问答系统的准确性?", faiss_results)print("Reranker 排序结果:")
for doc, score in reranked:print(f" - {doc} (Score: {score:.2f})")

八、完整流程整合

你可以将上述三个阶段串联成完整的检索 pipeline:

def multi_stage_retrieval(query, corpus, bm25_top_k=10, faiss_top_k=5, rerank_top_k=3):# 1. BM25召回tokenized_query = list(jieba.cut(query))bm25_candidates = bm25.get_top_n(tokenized_query, corpus, n=bm25_top_k)# 2. FAISS语义排序query_emb = model.encode([query])doc_embs = model.encode(bm25_candidates)_, indices = index.search(query_emb.reshape(1, -1), k=faiss_top_k)faiss_candidates = [bm25_candidates[i] for i in indices[0]]# 3. Reranker 打分reranked = rerank(query, faiss_candidates)return reranked[:rerank_top_k]# 调用
result = multi_stage_retrieval("如何提升问答系统的准确性?", corpus)
for doc, score in result:print(f"✅ {doc} (Rerank Score: {score:.2f})")

九、总结

方法优点缺点
BM25快速、无需训练不支持语义理解
FAISS支持高维向量检索无法处理复杂语义关系
Reranker精准排序计算开销略大

推荐组合使用:BM25 + FAISS + Reranker,既能保证效率又能提升准确率。


十、结语

本文介绍了如何结合 BM25、FAISS 和 Reranker 实现一个高效的多阶段知识库检索系统。这种方案非常适合用于本地化 RAG 应用、企业级问答系统或智能客服平台。

📌 欢迎点赞、收藏,并关注我,我会持续更新更多关于 AI、LLM、RAG、向量数据库等内容!


十一、导出 Markdown 文件

以下是完整的 .md 格式内容,请你复制保存为 knowledge_retrieval_guide.md 即可用于发布或归档。


# 🔍 使用 Reranker + BM25 + FAISS 构建高效的多阶段知识库检索系统## 一、什么是知识库检索?在构建基于大语言模型的问答系统(如 RAG)中,**知识库检索(Retrieval)** 是第一步,也是影响最终回答质量的关键环节。它负责从大规模文档中快速定位与用户问题最相关的 top-k 段落。本文介绍一种经典的三段式检索流程:1. **BM25:粗排召回**
2. **FAISS:向量相似度排序**
3. **Reranker:精排打分**---## 二、为什么使用多阶段检索?| 阶段 | 技术 | 功能 |
|------|------|------|
| 第一阶段 | BM25 | 基于关键词匹配,召回相关文档 |
| 第二阶段 | FAISS | 基于语义向量,进行高效近似最近邻搜索 |
| 第三阶段 | Reranker | 基于交叉注意力机制,精准排序候选结果 |这种“先快后准”的策略既保证了效率又提升了准确性。---## 三、实现思路概述

[Query]

BM25 → [Top-50 Candidates]

FAISS → [Top-10 Semantically Similar]

Reranker → [Top-3 最佳匹配段落]


---## 四、环境依赖安装```bash
pip install rank_bm25 faiss-cpu sentence-transformers torch transformers

五、第一阶段:BM25 召回

from rank_bm25 import BM25Okapi
import jieba# 模拟知识库
corpus = ["大模型训练需要大量数据和高性能计算资源","RAG 系统通过外部知识提升回答能力","Faiss 是 Facebook 开发的高效向量检索库","BM25 是一个基于统计的语言模型"
]tokenized_corpus = [list(jieba.cut(doc)) for doc in corpus]
bm25 = BM25Okapi(tokenized_corpus)# 查询
query = list(jieba.cut("如何提升问答系统的准确性?"))
top_n_docs = bm25.get_top_n(query, corpus, n=3)print("BM25召回结果:")
for doc in top_n_docs:print(" -", doc)

六、第二阶段:FAISS 向量检索

from sentence_transformers import SentenceTransformer
import faiss
import numpy as np# 加载预训练语义编码器
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')# 编码文档
doc_embeddings = model.encode(corpus)
query_embedding = model.encode(["如何提升问答系统的准确性?"])# 构建 FAISS 索引
dimension = doc_embeddings.shape[1]
index = faiss.IndexFlatL2(dimension)
index.add(np.array(doc_embeddings))# 检索 top-3
_, indices = index.search(np.array(query_embedding), k=3)
faiss_results = [corpus[i] for i in indices[0]]print("FAISS语义检索结果:")
for doc in faiss_results:print(" -", doc)

七、第三阶段:Reranker 精排打分

from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch# 加载 reranker 模型(中文)
tokenizer = AutoTokenizer.from_pretrained("BAAI/bge-reranker-base")
model = AutoModelForSequenceClassification.from_pretrained("BAAI/bge-reranker-base")def rerank(query, candidates):pairs = [[query, doc] for doc in candidates]inputs = tokenizer(pairs, padding=True, truncation=True, return_tensors='pt')with torch.no_grad():scores = model(**inputs).logits.squeeze().cpu().numpy()return sorted(zip(candidates, scores), key=lambda x: x[1], reverse=True)reranked = rerank("如何提升问答系统的准确性?", faiss_results)print("Reranker 排序结果:")
for doc, score in reranked:print(f" - {doc} (Score: {score:.2f})")

八、完整流程整合

你可以将上述三个阶段串联成完整的检索 pipeline:

def multi_stage_retrieval(query, corpus, bm25_top_k=10, faiss_top_k=5, rerank_top_k=3):# 1. BM25召回tokenized_query = list(jieba.cut(query))bm25_candidates = bm25.get_top_n(tokenized_query, corpus, n=bm25_top_k)# 2. FAISS语义排序query_emb = model.encode([query])doc_embs = model.encode(bm25_candidates)_, indices = index.search(query_emb.reshape(1, -1), k=faiss_top_k)faiss_candidates = [bm25_candidates[i] for i in indices[0]]# 3. Reranker 打分reranked = rerank(query, faiss_candidates)return reranked[:rerank_top_k]# 调用
result = multi_stage_retrieval("如何提升问答系统的准确性?", corpus)
for doc, score in result:print(f"✅ {doc} (Rerank Score: {score:.2f})")

九、总结

方法优点缺点
BM25快速、无需训练不支持语义理解
FAISS支持高维向量检索无法处理复杂语义关系
Reranker精准排序计算开销略大

推荐组合使用:BM25 + FAISS + Reranker,既能保证效率又能提升准确率。


📌 欢迎点赞、收藏,并关注我,我会持续更新更多关于 AI、LLM、视觉-语言模型等内容!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/84070.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Walle-Web:打造轻量级高效的DevOps自动化部署平台

在当今快速迭代的开发环境中,高效的代码部署工具已成为团队不可或缺的基础设施。Walle-Web作为一款免费开源的DevOps平台,专注解决"部署难、管理乱"的痛点问题,为开发团队提供了简洁而强大的自动化部署解决方案。 1. 什么是Walle-Web? Walle-Web是一款专注于代码…

力扣LeetBook数组和字符串--二维数组

1.旋转矩阵 题目链接 想了那么久的各种旋转,对角线,其实把问题搞复杂了。 旋转90度的本质无非就是转置镜像对称 转置是什么?:将矩阵的行和列互换。 镜像对称:把矩阵从中间对折,互换位置 矩阵 A A [ 1 3 0…

图论水题2

div2 361 D. Tree Requests 题意 对于一颗 n n n节点的树,每个节点有一个字母,有 m m m次询问,每次询问求对于顶点 v v v的子树中深度为 h h h的结点能否组成一个回文串$ (1 \leq n \leq m \leq 5 \cdot 10^5) $ 思路 关于 v v v的子树结…

Redis 过期了解

Redis 版本:5.0 : 一:过期监听: Spring Data Redis 封装了 Redis 的 Pub/Sub 功能,提供了对 key 过期事件的监听支持。 1. 核心类:KeyExpirationEventMessageListener 这个抽象类是 Spring 提供的&#x…

OA工程自动化办公系统 – 免费Java源码

概述 功能完备的OA工程自动化办公系统Java源码,采用主流技术栈开发,无论是学习SpringBoot框架还是开发企业级应用,都是不可多得的优质资源。 主要内容 技术架构 ​​后端技术栈​​: 核心框架:SpringBoot 2.xORM框…

嵌入式SDK技术EasyRTC音视频实时通话助力即时通信社交/教育等多场景创新应用

一、引言​ 在数字化时代,即时通信已成为人们生活和工作中不可或缺的部分。音视频功能作为即时通信的核心,能实现更加直观、高效的信息传递。EasyRTC作为一款强大的实时通信框架,具备诸多优势,为即时通信的音视频应用提供了优质解…

BEV和OCC学习-5:数据预处理流程

参考:自定义数据预处理流程 — MMDetection3D 1.4.0 文档 数据预处理流程的设计 预处理流程中的各项操作主要分为数据加载、预处理、格式化、测试时的数据增强。 接下来将展示一个用于 PointPillars 模型的数据集预处理流程的例子。 train_pipeline [dict(type…

OGG 23ai for DAA 部署与补丁升级

创建ogg 用户 /usr/sbin/groupadd -g 1002 dba /usr/sbin/groupadd -g 1001 oinstall /usr/sbin/groupadd -g 1003 oper useradd -u 1001 -g oinstall -G dba,oper oracle echo "oracle" |passwd oracle --stdin创建ogg安装目录 mkdir -p /u01/app/ogg/soft mkdir …

【LangchainAgent】Agent基本构建与使用

目录 一、功能简述 代码功能概括 🎯 核心能力 二、运作流程 三、核心代码 四、运行结果 五、代码功能拆解 ✅ 1. 环境准备与依赖导入 ✅ 2. 加载网页文档并处理为向量 ✅ 3. 创建检索工具与搜索工具 ✅ 4. 初始化语言模型与 Agent ✅ 5. 封装支持多轮记…

【云安全】以Aliyun为例聊云厂商服务常见利用手段

目录 OSS-bucket_policy_readable OSS-object_public_access OSS-bucket_object_traversal OSS-Special Bucket Policy OSS-unrestricted_file_upload OSS-object_acl_writable ECS-SSRF 云攻防场景下对云厂商服务的利用大同小异,下面以阿里云为例 其他如腾…

完成一个可交互的k8s管理平台的页面开发

使用deepseek完成设计一个k8s管理平台,关键词如下: 完成一个可交互的k8s管理平台的页面开发Kubernetes 管理平台页面设计 下面是一个基于现代Web技术的可交互Kubernetes管理平台的页面设计方案,使用React作为前端框架,配合Ant De…

TDengine 支持的平台汇总

TDengine 服务端支持的平台列表 注:1) ● 表示经过官方测试验证, ○ 表示非官方测试验证,E 表示仅企业版支持。 2) 社区版仅支持主流操作系统的较新版本,包括 Ubuntu 18/CentOS 7/CentOS Stream/RedHat/Debian/CoreOS/FreeBSD/Op…

使用 HTML + JavaScript 实现文章逐句高亮朗读功能

在这个信息爆炸的时代,我们每天都要面对大量的文字阅读。无论是学习、工作还是个人成长,阅读都扮演着至关重要的角色。然而,在快节奏的生活中,我们往往难以找到足够的安静时间专注于阅读。本文用 HTML JavaScript 实现了一个基于…

理解非结构化文档:将 Reducto 解析与 Elasticsearch 结合使用

作者:来自 Elastic Adel Wu 演示如何将 Reducto 的文档处理与 Elasticsearch 集成以实现语义搜索。 Elasticsearch 与业界领先的生成式 AI 工具和提供商有原生集成。欢迎观看我们的网络研讨会,了解如何超越 RAG 基础,或使用 Elastic 向量数据…

从Copilot到Agent,AI Coding是如何进化的?

编程原本是一项具有一定门槛的技能,但借助 AI Coding 产品,新手也能写出可运行的代码,非专业人员如业务分析师、产品经理,也能在 AI 帮助下直接生成简单应用。 这一演变对软件产业产生了深远影响。当 AI 逐步参与代码生成、调试乃…

UGUI Text/TextMeshPro字体组件

UGUI Text组件的不当使用及其性能瓶颈与优化 在Unity UGUI系统中,Text 组件(或其升级版 TextMeshPro)是显示文本信息的核心元素。然而,如果不当使用,它极易成为UI性能瓶颈的罪魁祸首,尤其是在预制体、属性…

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…

【个人笔记】数据库原理(西电)

写在前面:文中提到的页面指向(如“p45”),除特别说明,都是指对应ppt上的页面,非同款ppt的友友可忽略 第一章 ER图和关系分解见课本p69 ER图是常用的 概念模型 方形:实体圆形:属性…

SDC命令详解:使用set_propagated_clock命令进行约束

相关阅读 SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm1001.2014.3001.5482 目录 指定端口列表/集合 简单使用 注意事项 传播时钟是在进行了时钟树综合后,使用set_propagated_clock命令可以将一个理想时钟转换为传播时钟&#x…

关于华为仓颉编程语言

文章目录 一、基本概况二、技术特点1. 多范式编程2. 原生智能化3. 高性能与安全4. 全场景兼容 三、编译器与开发工具四、语言相似性对比五、行业应用实例总结 最近经常看到这个东西,于是搜了一下,整理了一些内容,水一篇,以后慢慢研…