如何讓 RAG 檢索更高效?——大模型召回策略全解

如何讓 RAG 檢索更高效?——大模型召回策略全解


一、引子:RAG 的“強”靠得住嗎?

RAG(Retrieval-Augmented Generation)作為一種將文檔檢索與大語言模型結合的框架,已成為企業落地知識問答、搜索增強、智能客服的首選。

但現實中我們常聽到:

  • “模型答得不準”
  • “文檔檢索到的都不相關”
  • “返回的內容一堆沒用的廢話”

這些問題的核心,往往出在了檢索階段的“召回”環節。


二、什么是召回?RAG 的第一道門檻

在 RAG 中,“召回”指的是:

從海量文檔中選出一小批候選文檔,作為模型生成答案的“上下文”。

流程大致如下(見圖1):

  1. 用戶提問(Query)
  2. 檢索系統用 embedding(向量)或關鍵詞查找文檔
  3. 將 N 篇文檔拼接進 prompt,送入語言模型
  4. 模型基于這些上下文生成答案

如果第2步召回錯了,后面再強的大模型也無能為力。


三、常見召回方式有哪些?

RAG 的召回方式,按復雜度從低到高大致可分為以下幾類:

1. 基于關鍵詞的召回(BM25 等)

  • 最經典的搜索引擎方法
  • 基于詞頻、TF-IDF 計算相關性
  • 優點:快、無需訓練
  • 缺點:語義能力弱,容易漏召

適合冷啟動或低資源場景。


2. 基于向量的語義召回(Embedding 檢索)

  • 利用 embedding 模型(如 BGE、E5)將 query 和文檔轉換為向量
  • 用余弦相似度 / 點積進行匹配
  • 通常結合 Faiss、Milvus 等向量引擎使用

優點:

  • 語義匹配強,不拘泥于關鍵詞
  • 可擴展性好,支持十億級別文檔庫

缺點:

  • 需構建向量庫
  • 語義漂移風險(召回相關但不精確)

3. 多階段召回(Hybrid Retrieval)

結合多種召回方式,通常分為兩個階段:

第一階段用 BM25 等快速粗篩,
第二階段用向量匹配 / reranker 精排。

示意圖見圖2。

常見方式包括:

  • Union(并集): 關鍵詞 + 向量合并
  • Stacking: BM25 → Embedding → rerank
  • Embedding + rerank(推薦)

優點:召回率和精準率都更高
缺點:延遲更高,依賴 reranker 質量


四、提升召回效果的高級技巧 – 優化檢索質量

1. Query Rewriting(問題改寫)

對用戶 query 進行改寫,提高檢索相關性
如加上領域詞、消歧義、重構句式

例:

“他是誰?” → “曹操是誰?”


2. Query Expansion(問題擴展)

將 query 拓展為多個語義接近的問題,以召回更多候選文檔

例:

“中國主席是誰” → “中國國家領導人是誰”

可直接采用 LangChain 提供的 MultiQueryRetriever 部署該功能:

from langchain.retrievers.multi_query import MultiQueryRetriever
from langchain.vectorstores import FAISS
from langchain.llms import OpenAI# 加載向量數據庫(示例用 Faiss)
vectorstore = FAISS.load_local("faiss_index", embeddings)# 初始化 LLM(也可以換成其他如 ChatGLM)
llm = OpenAI(temperature=0)# 創建多查詢檢索器
retriever = MultiQueryRetriever.from_llm(  ## 這里,看這里 !!!!!!在這里啊啊啊 !retriever=vectorstore.as_retriever(),llm=llm
)# 輸入用戶問題
query = "中國主席是誰?"# 自動擴展多個語義相似 query 并執行召回
docs = retriever.get_relevant_documents(query)

LLM 自動將原始 query 改寫成多個相關問法, 各自檢索召回文檔, 之后聚合或融合多組結果


3. 多視角查詢(Multi-view Retrieval)

對 query 使用不同 embedding 模型(如 domain-specific、cross-lingual)同時召回

適合跨語言、多模態場景,如醫療報告、PDF等


4. Chunk 優化

RAG 中通常將文檔切分為小段(chunk)后進行召回
但:

  • 切太短容易丟上下文
  • 切太長又不便檢索與嵌入

常見做法:

  • 固定窗口滑動切分
  • 按語義段落切分(推薦)
  • 結合摘要進行“chunk pooling”

5. 使用 Reranker 精排模型

可對 top-K 召回結果重新排序 (重排排的是 – 問題和召回結果的相關程度),顯著提升 Top-1 命中率

在這里插入圖片描述

常見 Reranker 精排模型 如:

  • 【商用 API】Cohere Rerank
  • 【開源】BGE Reranker(下方有使用代碼示例)
# 安裝依賴(首次使用時運行一次)
# pip install transformers torchfrom transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch# 1. 加載 BGE-Reranker 模型和分詞器(首次運行會自動從 HuggingFace 下載)
model_name = "BAAI/bge-reranker-large"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)
model.eval()# 2. 輸入一個查詢 + 文檔對(可以用于 rerank 檢索結果)
pairs = [["what is panda?", "The giant panda is a bear species."]]# 3. 編碼并送入模型推理
inputs = tokenizer(pairs, padding=True, truncation=True, return_tensors="pt")
with torch.no_grad():scores = model(**inputs).logits.view(-1).float()print(scores)  # 輸出相關性得分,例如 tensor([4.95])# 高相關性:3.0~10.0
# 中等相關性:0.0~3.0
# 低相關性/不相關:負數(如-5.0以下)

6. 知識圖譜增強召回(KG-Augmented Retrieval)

利用外部或企業內部的知識圖譜(Knowledge Graph),將用戶查詢中的關鍵詞映射為圖譜中的實體,結合語義關系(上下位、同義詞、連接路徑)進行 query 擴展與實體增強,進一步提高文檔召回的準確性與泛化能力。

適合對實體識別要求高、推理路徑明確的任務(如金融、法律、醫療場景)。

常見方式包括:

  • 實體鏈接(Entity Linking)
  • 知識圖譜輔助 query 改寫
  • 基于圖譜的多跳路徑查詢

7. Small-to-Big 檢索策略(多文檔場景推薦)

當文檔較長或數量龐大時,可采用 Small-to-Big 策略提高檢索效率與精準度:

核心思想:先索引文檔中較短的結構(如摘要、關鍵句、段落標題),快速定位相關內容,再鏈接回對應的完整文檔獲取上下文。

適用場景:論文庫、PDF、多段落文檔、金融合規材料等結構清晰內容。

優勢:顯著減少冗余匹配,提升響應速度,同時增強大模型回答的上下文連貫性。

📌 簡單來說,就是先匹“小塊”,再補“大塊”。


五、召回失敗的常見原因排查清單

癥狀可能原因對策
召回內容完全無關Embedding 模型不匹配、未微調更換為領域專用模型或 fine-tune
文檔相關但答非所問Chunk 粒度太大 / 太碎優化切分策略
某些關鍵詞缺失Query 不完整、實體消歧失敗使用 Query Rewriting
多輪問答上下文缺失檢索不含對話歷史構造完整對話序列或長上下文支持
返回文檔太多 / 太慢無 top-K 控制、未加權排序控制召回數量、使用 reranker

六、實際工程建議

  • 新項目冷啟動:先上 BM25 或 embedding 檢索,配合簡單 rule-based rerank
  • 領域任務(金融、法律等):訓練專用 embedding 模型 + 加強 query 改寫
  • 性能敏感場景:多階段檢索+輕量化 reranker(如 BGE + Faiss + MonoT5)
  • 高精度要求:使用 reranker + chunk 聚合 + CoT 強化(結合 RAFT 訓練)

七、小結:好召回勝過大模型

在 RAG 中,“召回是輸入,生成是輸出”,而“輸入錯了,一切皆錯”。

高效召回系統的構建,并非靠堆算力,而是靠 工程細節 + 策略優化。在知識密集型任務中,它決定了整個 RAG 系統的下限。


推薦閱讀與工具資源

  • RAG 高級實踐手冊(知乎@逆流)
  • RAGathon (cohere)
  • BGE Embedding + Reranker 模型庫

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/91920.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/91920.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/91920.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Bilateral Reference for High-Resolution Dichotomous Image Segmentation

代碼來源 https://github.com/ZhengPeng7/BiRefNet 模塊作用 DIS 是一種旨在對高分辨率圖像中的目標物體進行精確分割的技術,尤其適用于具有復雜細微結構的物體,例如細長的邊緣或微小細節。傳統方法在處理這類任務時往往難以捕捉細微特征或恢復高分辨…

RAGFlow 0.20.0 : Multi-Agent Deep Research

Deep Research:Agent 時代的核心能力2025 年被稱為 Agent 落地元年,在解鎖的各類場景中,最有代表性之一,就是 Deep Research 或者以它為基座的各類應用。為什么這么講? 因為通過 Agentic RAG 及其配套的反思機制&#…

CMakeLists.txt學習

一:#是行注釋 ,[[ 塊注釋 ]]0.cmake_minimum_required: 指定使用的cmake的最低版本1.project() 定義工程名稱并可以指定工程的版本,工程描述,web主頁地址,支持的語言(默認情況支持所有語言)2.…

Pytorch-04 搭建神經網絡架構工作流

搭建神經網絡架構 在pytorch中,神經網絡被抽象成由一系列對數據執行特定操作的層或者模塊組成,比如下面的Attention實現,每個塊都是一個模塊或者層。 如果你想快速搭建網絡架構,torch.nn這個命名空間提供了所有很多開箱即用的層…

從“碎片化”到“完美重組”:IP報文的分片藝術

前言 在網絡通信中,當IP層需要傳輸的數據包大小超過數據鏈路層的MTU限制時,就必須進行分片處理。本文將完整解析IP分片的工作機制,包括分片字段的作用、如何減少分片,以及分片報文的組裝原理。 IP報頭解析請參考&#xff…

[GESP202306 四級] 2023年6月GESP C++四級上機題超詳細題解,附帶講解視頻!

本文為2023年6月GESP C四級的上機題目的詳細題解!覺得寫的不錯或者有幫助可以點個贊啦! (第一次講解視頻,有問題可以指出,不足之處也可以指出) 目錄 題目一講解視頻: 題目二講解視頻: 題目一: 幸運數 題目大意: …

內網穿透 FRP 配置指南

關鍵詞:內網穿透、FRP配置、frps、frpc、遠程訪問、自建服務器、反向代理、TCP轉發、HTTP轉發 在開發或部署項目時,我們經常遇到內網設備無法被公網訪問的問題,例如你想從外網訪問你家里的 NAS、遠程調試開發板,或是訪問本地測試環…

SpringBoot 信用卡檢測、OpenAI gym、OCR結合、DICOM圖形處理、知識圖譜、農業害蟲識別實戰

信用卡欺詐檢測通常使用公開數據集 數據準備與預處理 信用卡欺詐檢測通常使用公開數據集如Kaggle的信用卡交易數據集。數據預處理包括處理缺失值、標準化數值特征、處理類別特征。在Spring Boot中,可以使用pandas或sklearn進行數據預處理。 // 示例:使用Spring Boot讀取CS…

使用 Docker 部署 Golang 程序

Docker 是部署 Golang 應用程序的絕佳方式,它可以確保環境一致性并簡化部署流程。以下是完整的指南: 1. 準備 Golang 應用程序 首先確保你的 Go 應用程序可以正常構建和運行。一個簡單的示例 main.go: package mainimport ("fmt""net/http" )func ha…

從零開始的CAD|CAE開發: LBM源碼實現分享

起因:上期我們寫了流體仿真的經典案例: 通過LBM,模擬計算渦流的形成,當時承諾: 只要驗證通過,就把代碼開源出來;ok.驗證通過了,那么我也就將代碼全都貼出來代碼開源并貼出:public class LidDrivenCavityFlow : IDisposable{public LidDrivenCavityFlow(int width 200, int hei…

倉庫管理系統-17-前端之物品類型管理

文章目錄 1 表設計(goodstype) 2 后端代碼 2.1 Goodstype.java 2.2 GoodstypeMapper.java 2.3 GoodstypeService.java 2.4 GoodstypeServiceImpl.java 2.5 GoodstypeController.java 3 前端代碼 3.1 goodstype/GoodstypeManage.vue 3.2 添加菜單 3.3 頁面顯示 1、goodstype表設…

共識算法深度解析:PoS/DPoS/PBFT對比與Python實現

目錄 共識算法深度解析:PoS/DPoS/PBFT對比與Python實現 1. 引言:區塊鏈共識的核心挑戰 2. 共識算法基礎 2.1 核心設計維度 2.2 關鍵評估指標 3. PoS(權益證明)原理與實現 3.1 核心機制 3.2 Python實現 4. DPoS(委托權益證明)原理與實現 4.1 核心機制 4.2 Python實現 5. P…

3.JVM,JRE和JDK的關系是什么

3.JVM,JRE和JDK的關系是什么 1.JDK(Java Development Kit),是功能齊全的Java SDK,包含JRE和一些開發工具(比如java.exe,運行工具javac.exe編譯工具,生成.class文件,javaw.exe,大多用…

深度學習技術發展思考筆記 || 一項新技術的出現,往往是為了解決先前范式中所暴露出的特定局限

深度學習領域的技術演進,遵循著一個以問題為導向的迭代規律。一項新技術的出現,往往是為了解決先前范式中所暴露出的特定局限。若將這些新技術看作是針對某個問題的“解決方案”,便能勾勒出一條清晰的技術發展脈絡。 例如,傳統的前…

Promise的reject處理: then的第二個回調 與 catch回調 筆記250804

Promise的reject處理: then的第二個回調 與 catch回調 筆記250804 Promise 錯誤處理深度解析:then 的第二個回調 vs catch 在 JavaScript 的 Promise 鏈式調用中,錯誤處理有兩種主要方式:.then() 的第二個回調函數和 .catch() 方法。這兩種方…

Maven模塊化開發與設計筆記

1. 模塊化開發模塊化開發是將大型應用程序拆分成多個小模塊的過程,每個模塊負責不同的功能。這有助于降低系統復雜性,提高代碼的可維護性和可擴展性。2. 聚合模塊聚合模塊(父模塊)用于組織和管理多個子模塊。它定義了項目的全局配…

sqli-labs:Less-21關卡詳細解析

1. 思路🚀 本關的SQL語句為: $sql"SELECT * FROM users WHERE username($cookee) LIMIT 0,1";注入類型:字符串型(單引號、括號包裹)、GET操作提示:參數需以)閉合關鍵參數:cookee p…

大模型+垂直場景:技術縱深、場景適配與合規治理全景圖

大模型垂直場景:技術縱深、場景適配與合規治理全景圖??核心結論?:2025年大模型落地已進入“深水區”,技術價值需通過 ?領域縱深(Domain-Deep)?、數據閉環(Data-Driven)?、部署友好&#x…

Kotlin Daemon 簡介

Kotlin Daemon 是 Kotlin 編譯器的一個后臺進程,旨在提高編譯性能。它通過保持編譯環境的狀態來減少每次編譯所需的啟動時間,從而加快增量編譯的速度。 Kotlin Daemon 的主要功能增量編譯: 只編譯自上次編譯以來發生更改的文件,節…

鴻蒙南向開發 編寫一個簡單子系統

文章目錄 前言給設備,編寫一個簡單子系統總結 一、前言 對于應用層的開發,搞了十幾年,其實已經有點開發膩的感覺了,翻來覆去,就是調用api,頁面實現,最多就再加個性能優化,但對底層…