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
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/84070.shtml
英文地址,請注明出處:http://en.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. 全場景兼容 三、編譯器與開發工具四、語言相似性對比五、行業應用實例總結 最近經常看到這個東西,于是搜了一下,整理了一些內容,水一篇,以后慢慢研…