基于LangChain 實現 Advanced RAG-后檢索優化(上)-Reranker

摘要

????????Advanced RAG 的后檢索優化,是指在檢索環節完成后、最終響應生成前,通過一系列策略與技術對檢索結果進行深度處理,旨在顯著提升生成內容的相關性與質量。在這些優化手段中,重排序優化(Reranker)作為核心技術之一,憑借其對檢索結果的二次篩選與優先級調整能力,成為提升 RAG 系統性能的關鍵。以下將圍繞重排序優化(Reranker)的理論基礎、算法原理及實踐應用展開詳細闡述。

重排序(Reranker)

Reranker 在 RAG 中的作用位置

????????Reranker 是信息檢索(IR)生態系統中的一個重要組成部分,用于評估搜索結果,并進行重新排序,從而提升查詢結果相關性。在 RAG 應用中,主要在拿到向量查詢(ANN)的結果后使用 Reranker,能夠更有效地確定文檔和查詢之間的語義相關性,更精細地對結果重排,最終提高搜索質量。

????????目前,Reranker 類型主要有兩種——基于統計和基于深度學習模型的 Reranker:

  • 基于統計的 Reranker :匯總多個來源的候選結果列表,使用多路召回的加權得分或倒數排名融合(RRF)算法來為所有結果重新算分,統一將候選結果重排。這種類型的 Reranker 的優勢是計算不復雜,效率高,因此廣泛用于對延遲較敏感的傳統搜索系統中。

  • 基于深度學習模型的 Reranker:通常被稱為 Cross-encoder Reranker。由于深度學習的特性,一些經過特殊訓練的神經網絡可以非常好地分析問題和文檔之間的相關性。這類 Reranker 可以為問題和文檔之間的語義的相似度進行打分。因為打分一般只取決于問題和文檔的文本內容,不取決于文檔在召回結果中的打分或者相對位置,這種 Reranker 既適用于單路召回也適用于多路召回。

RRF 倒數排名融合

????????倒數排名融合(Reciprocal Rank Fusion,RRF)是一種用于融合多個檢索結果列表的算法,常用于信息檢索、RAG 混合檢索等領域,它將不同檢索方法得到的排名結果進行結合,生成更全面、準確的最終排名。它考慮了每個文檔在不同檢索結果列表中的排名位置,通過計算排名的倒數來賦予不同文檔相應的權重,從而綜合評估文檔的重要性。

  • 計算步驟
    • 最大化檢索召回率:在初始檢索階段,通過增加向量數據庫返回的文檔數量(即增加 top_k 值),可以提高檢索的召回率。這意味著盡可能多地檢索相關文檔,確保不會遺漏任何可能有助于 LLM 形成高質量回答的信息。

    • 計算每個文檔的 RRF 分數:對于每個文檔,計算它在每個檢索結果列表中的排名的倒數,并將這些倒數相加。

    • 重新排序:根據 RRF 分數對所有文檔進行降序排序,得到最終的融合結果。

  • 優點
    • 低門檻高效融合:RRF 具備極強的 “即插即用” 特性,無需復雜調優過程,也無需提前協調不同檢索方法相關性指標的一致性。

    • 排名導向的簡潔性:RRF僅依據文檔在各檢索結果中的排名進行計算。這種簡潔的設計不僅大幅簡化了融合流程,還減少了數據處理量,使得 RRF 在計算資源有限或實時性要求高的場景下,依然能夠穩定高效運行 。

    • 檢索性能友好:與其他需要額外重排序步驟、可能導致響應延遲顯著增加的融合算法不同,RRF 不會對檢索系統的響應速率造成明顯影響。

  • 缺點
    • RRF 存在明顯的 “上游依賴” 問題,其性能表現高度依賴前置檢索排序步驟的質量。若初始檢索排序因算法缺陷、數據偏差等原因出現錯誤,例如誤將相關性低的文檔排在前列,RRF 會基于錯誤的排名信息進行融合計算,不僅無法修正錯誤,反而可能進一步放大偏差,導致最終檢索結果嚴重失真,使得融合后的排序完全偏離實際相關性,難以滿足用戶真實需求。

  • RRF代碼實現
    • RRF 算法
def rrf_rank(documents: list[list[Document]], k=60) -> list[Document]:# 初始化rrf字典(key=文檔id,value={"rrf_score":累計分數,"doc":文檔對象})rrf_scores = {}# 遍歷每個檢索結果列表(每個查詢對應的結果)for docs in documents:# 為每個文檔列表計算排名(從1開始)for rank, doc in enumerate(docs,1):# 計算當前文檔的RRF分數rrf_score = 1 / (k + rank)# 如果文檔已經在字典中,累加RRF分數if doc.id in rrf_scores:rrf_scores[doc.id]['rrf_score'] += rrf_scoreelse:rrf_scores[doc.id] = {'rrf_score': rrf_score,'doc': doc}# 將字典轉換為列表,并根據字段value:RRF分數排序sorted_docs = sorted(rrf_scores.values(),key=lambda x: x['rrf_score'],reverse=True  # 降序排列:從大到小)for item in sorted_docs:print(item)result = [item['doc'] for item in sorted_docs]return resultrrf_rank(documents)
  • LangChain 框架使用 RRF

from langchain.retrievers import MultiQueryRetriever
from typing import List
from langchain_core.documents import Document
from langchain_core.callbacks import CallbackManagerForRetrieverRunimport logging
# 打開日志
logging.basicConfig()
logging.getLogger("langchain.retrievers.multi_query").setLevel(logging.INFO)# 重寫MultiQueryRetriever類,取消unique_union去重,且保留每個問題檢索結果的
class RRFMultiQueryRetriever(MultiQueryRetriever):# 改寫retrieve_documents方法,返回rrf結果def retrieve_documents(self, queries: List[str], run_manager: CallbackManagerForRetrieverRun) -> List[Document]:documents = []for query in queries:docs = self.retriever.invoke(query, config={"callbacks": run_manager.get_child()})# 原代碼中extend修改為append,保持不同檢索系統的結構documents.append(docs)documents = self.rrf_documents(documents)return documentsdef rrf_documents(self,documents: list[list[Document]], k=60) -> List[Document]:# 初始化rrf字典(key=文檔id,value={"rrf_score":累計分數,"doc":文檔對象})rrf_scores = {}# 遍歷每個檢索結果列表(每個查詢對應的結果)for docs in documents:# 為每個文檔列表計算排名(從1開始)for rank, doc in enumerate(docs,1):# 計算當前文檔的RRF分數rrf_score = 1 / (k + rank)# 如果文檔已經在字典中,累加RRF分數if doc.id in rrf_scores:rrf_scores[doc.id]['rrf_score'] += rrf_scoreelse:rrf_scores[doc.id] = {'rrf_score': rrf_score,'doc': doc}# 將字典轉換為列表,并根據字段value:RRF分數排序sorted_docs = sorted(rrf_scores.values(),key=lambda x: x['rrf_score'],reverse=True  # 降序排列:從大到小)result = [item['doc'] for item in sorted_docs]return resultrrf_retriever = RRFMultiQueryRetriever.from_llm(retriever=retriever,llm=llm,include_original = True #是否包含原始查詢
)    rrf_docs = rrf_retriever.invoke("人工智能的應用")pretty_print_docs(rrf_docs)

? ? ? ? 我們采用自定義一個RRFMultiQueryRetriever檢索器的方法。這個檢索器繼承了LangChain 的MultiQueryRetriever 檢索器,并融合了RRF 算法。

Reranker模型

????????Reranker模型又稱交叉編碼器(Cross-Encoder)模型。它是信息檢索、推薦系統等場景中的關鍵組件,用于對初步召回的候選集進行精細化排序。與召回階段的快速篩選不同,Reranker通過復雜模型捕捉細粒度特征(如語義相關性、上下文信息、用戶偏好),顯著提升最終結果的準確性和個性化。

阿里魔搭Reranker模型

? ? ? ?

????????在中文 Reranker 應用場景中,我推薦選用國產 Reranker 模型。國產模型在訓練時使用了大量的中文語料,對中文語義的理解更為深刻、全面,能夠更精準地捕捉中文語境下的細微語義差別,因此在處理中文任務時可以帶來更出色的效果。

????????你可以前往阿里魔搭社區搜尋合適的 Reranker 開源模型。在該社區中,你可以重點關注那些下載量高或者喜歡數多的模型,例如 beg - reranker 相關模型,這些模型往往經過了大量用戶的實踐檢驗,具備較高的可靠性和實用性。

常見Reranker模型類型

  • 基于學習排序(Learning to Rank, LTR)

    • 原理:利用機器學習模型對文檔排序,分為三類:

      • Pointwise:直接預測文檔與查詢的絕對相關性(如線性回歸、GBDT)。示例:預測點擊率(CTR)作為排序依據。

      • Pairwise:比較文檔對的相對順序,最小化錯誤比較(如RankNet、RankSVM)。示例:判斷文檔A是否比文檔B更相關。

      • Listwise:優化整個排序列表的指標(如NDCG、MAP),直接端到端優化目標。示例:LambdaMART(GBDT+Listwise)、ListNet。

  • 基于預訓練語言模型(PLM)的Reranker

    • 核心:利用BERT、RoBERTa等預訓練模型捕捉深層語義交互。

    • 典型架構

      • Cross-Encoder:將查詢與文檔拼接輸入模型,直接計算相關性得分。

        • 示例:[CLS] Query: How to learn Python [SEP] Document: Python tutorial [SEP]?→ 輸出相關性分數。

        • 優點:捕捉細粒度語義交互,精度高。

        • 缺點:計算成本高(需逐對計算,適合小候選集)。

      • ColBERT:解耦查詢與文檔編碼,通過后期交互提升效率。

        • 流程:分別編碼查詢和文檔,計算最大相似度(MaxSim)作為得分。

        • 優點:比Cross-Encoder快,適合較大候選集。

  • 多模態Reranker

    • 適用場景:融合文本、圖像、視頻、用戶行為等多模態特征。

    • 示例:電商場景中,結合商品標題(文本)、圖片(視覺)、用戶歷史點擊(行為)綜合排序。

    • 模型:多模態Transformer(如CLIP擴展)、特征拼接+深度學習。

Reranker 模型代碼實現
  • 本地Reranker模型

from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import CrossEncoderReranker
from langchain_community.cross_encoders import HuggingFaceCrossEncoder# reranker
model = HuggingFaceCrossEncoder(model_name=model_path, model_kwargs={'device': 'cpu'})
# 取前3個
compressor = CrossEncoderReranker(model=model, top_n=3)compression_retriever = ContextualCompressionRetriever(base_compressor=compressor, base_retriever=retriever # retriever = 混合檢索 或 multi-query
)compressed_docs = compression_retriever.invoke("人工智能的應用")
pretty_print_docs(compressed_docs)
  • 阿里Reranker模型

from langchain_community.document_compressors.dashscope_rerank import DashScopeRerank# https://bailian.console.aliyun.com/?tab=api#/api/?type=model&url=https%3A%2F%2Fhelp.aliyun.com%2Fdocument_detail%2F2780056.html
# gte-rerank 
compressor = DashScopeRerank()compression_retriever = ContextualCompressionRetriever(base_compressor=compressor, base_retriever=retriever
)compressed_docs = compression_retriever.invoke("人工智能的應用")
pretty_print_docs(compressed_docs)

LongContextReorder

  • 論文基礎:Lost in the Middle: How Language Models Use Long Contexts

[2307.03172] Lost in the Middle: How Language Models Use Long Contexts

? ? ? ? 根據論文描述,當關鍵數據位于輸入上下文的開頭或者結尾時,大模型的回答通常會獲得最佳的效果。為了減輕"lost in the middle"的影響,我們可以在檢索后重新排序文檔,使最相關的文檔位于最佳位置(如上下文的第一和最后部分),將不相關的文檔置于中間。

代碼實現

????????LangChain 框架提供了LongContextReorder思想的代碼封裝:

from langchain_community.document_transformers import LongContextReorder
# 5,4,3,2,1 
# 倒排:1,2,3,4,5
# index%2=0: 往第一個放,index%2=1 往最后放documents = ["相關性:5","相關性:4","相關性:3","相關性:2","相關性:1",
]reordering = LongContextReorder()
reordered_docs = reordering.transform_documents(documents)print(reordered_docs)

總結

排序方法說明案例
RRF根據文檔在不同列表排名重排序優點:計算簡單、處理大數據快;無需大量訓練數據;
缺點:僅依排名,忽略文檔內容與語義,精準度欠佳;
Reranker基于深度學習,根據查詢與文檔語義重排序優點:能深入理解語義,精準重排提升檢索精度;
缺點:對新查詢和文檔泛化能力有限,易出現過擬合情況
Lost in the Middle根據相關性降序排列后的文檔再次排序,將相關的文檔置于極值(開頭與結尾)依賴重排精準度

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

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

相關文章

【云備份】熱點管理模塊

目錄 1.熱點管理文件的基本思路 2.熱點管理類的設計 3.熱點管理類的實現 1.熱點管理文件的基本思路 服務器端的熱點文件管理是對上傳的非熱點文件進行壓縮存儲,節省磁盤空間。 而熱點文件的判斷在于上傳的文件的最后一次訪問時間是否在熱點判斷時間之內。 實…

LeetCode 560. 和為 K 的子數組 | 前綴和與哈希表的巧妙應用

文章目錄 方法思路:前綴和 哈希表核心思想關鍵步驟 代碼實現復雜度分析示例解析總結 題目描述 給定一個整數數組 nums 和一個整數 k,請統計并返回該數組中和為 k 的子數組的數量。 子數組是數組中連續的非空元素序列。 示例 輸入:nums …

Windows配置grpc

Windows配置grpc 方法一1. 使用git下載grph下載速度慢可以使用國內鏡像1.1 更新子模塊 2. 使用Cmake進行編譯2.1 GUI編譯2.2 命令行直接編譯 3. 使用Visual Studio 生成解決方法 方法二1. 安裝 vcpkg3.配置vckg的環境變量2. 使用 vcpkg 安裝 gRPC3. 安裝 Protobuf4. 配置 CMake…

【算法基礎】快速排序算法 - JAVA

一、算法基礎 1.1 什么是快速排序 快速排序(Quick Sort)是一種高效的分治排序算法,由英國計算機科學家Tony Hoare于1960年提出。它的核心思想是: 選擇一個基準元素(pivot)將數組分成兩部分:小…

Linux用戶管理命令和用戶組管理命令

一、用戶管理命令 1.1、adduser 添加新用戶 1、基本語法 adduser 用戶名 (功能描述:添加新用戶) 應用場景1:企業開發,多人協同(也會有多人使用相同的一個低權限用戶)。 應用場景2&#x…

記錄兩個免費開源又好用的后臺模版vue3

一.element-plus-admin 一套基于vue3、element-plus、typesScript、vite的后臺集成方案 1.簡介 vue-element-plus-admin 是一個基于 element-plus 免費開源的中后臺模版。使用了最新的 Vue3,Vite,Typescript等主流技術開發,開箱即用的中后…

Flip PDF Plus Corp7.7.22電子書制作軟件

flip pdf plus corporate7.7.22中文版由FlipBuilder官方出品的一款企業級的翻頁電子書制作軟件,擁有豐富的模板,主題和動畫場景,每本書最大頁數1000頁,每本書的最大大小1GB,即可以幫助企業用戶制作好豐富的電子書籍。 …

C語言藍橋杯真題代碼

以下是不同屆藍橋杯C語言真題代碼示例,供參考: 第十三屆藍橋杯省賽 C語言大學B組 真題:卡片 題目:小藍有很多數字卡片,每張卡片上都是數字1-9。他想拼出1到n的數列,每張卡片只能用一次,求最大的…

[Windows] Kazumi番劇采集v1.6.9:支持自定義規則+在線觀看+彈幕,跨平臺下載

[Windows] Kazumi番劇采集 鏈接:https://pan.xunlei.com/s/VOPLMhEQD7qixvAnoy73NUK9A1?pwdtu6i# Kazumi是一款基于框架; 開發的輕量級番劇采集工具,專為ACG愛好者設計。通過;自定義XPath規則; 實現精準內容抓取,支持多平臺(An…

探秘數據結構:構建高效算法的靈魂密碼

摘要 數據結構作為計算機科學的基石,其設計與優化直接影響算法效率、資源利用和系統可靠性。本文系統闡述數據結構的基礎理論、分類及其核心操作,涵蓋數組、鏈表、棧、隊列、樹、圖、哈希表與堆等經典類型。深入探討各結構的應用場景與性能對比&#xf…

機器人--架構及設備

機器人的四大組成部分 控制系統 驅控系統 執行系統 電機屬于執行系統的設備。 傳感系統 傳感系統分為內部傳感系統和外部傳感系統。 內部傳感系統(內部傳感器): 用于獲取機器人內部信息,比如IMU,力傳感器等。 外部傳感系統(外部傳感器):…

人工智能:如何快速篩選出excel中某列存在跳號的單元格位置?

前提: 電腦上必須提前安裝好了【office AI】軟件工具 方法如下: 1、打開要操作的excel表格,點擊上方的【officeAI】,再點擊左邊的【右側面板】按鈕,就會出現如下右側的【OfficeAI助手】 2、在OfficeAI助手的聊天框…

Spring MVC入門

介紹了Spring MVC框架的概念、特征及核心功能,通過案例詳細介紹了Spring MVC開發所需要的開發環境以及基本的開發步驟。 一、Spring MVC框架概述 Spring MVC是Spring框架的一個模塊,是一個基于Java的實現了MVC設計模式的輕量級Web框架。它通過一套注解和…

貪心算法求解邊界最大數

貪心算法求解邊界最大數(拼多多2504、排列問題) 多多有兩個僅由正整數構成的數列 s1 和 s2,多多可以對 s1 進行任意次操作,每次操作可以置換 s1 中任意兩個數字的位置。多多想讓數列 s1 構成的數字盡可能大,但是不能比…

Ubuntu ZLMediakit的標準配置文件(rtsp->rtmp->hls)

最近在工作中遇到不生成hls資源的問題,后面發現是配置文件有誤,特此記錄正確的config.ini配置文件,方便查閱。 最終解決方案,通過下面這種格式可以訪問到flv視頻,具體為什么不太清楚,rtmp格式:rtmp://39.113.48.113:8089/live/1744168516937396175 記錄最終解決方案:ht…

# LeetCode 1007 行相等的最少多米諾旋轉

LeetCode 1007 行相等的最少多米諾旋轉 原題英文:Minimum Domino Rotations For Equal Row 難度:中等 | 標簽:數組、貪心 1?題目重述 給定兩行長度相同的多米諾骨牌: tops[i] 表示第?i?張骨牌上面的數字;bottoms[…

大數據技術:從趨勢到變革的全景探索

??個人主頁??:一ge科研小菜雞-CSDN博客 ????期待您的關注 ???? 在數字化時代的浪潮下,大數據已經不再是一個陌生的概念。從日常生活中的社交媒體,到企業決策支持系統,再到公共管理的大數據應用,它正在改變著我們的工作和生活方式。隨著技術的進步,傳統的數據…

前端八股Day5——XHS某中廠實習前端一面

沒寫完,睡醒補 CSS盒模型 //出現頻率好高,感覺每次寫面經都遇到 W3C標準盒模型(content-box):盒子寬高width/heightpaddingbordermargin IE怪異盒模型(border-box):盒子寬高width/heigth(包括padding和border)margin 默認標準切換…

INP指標

什么是INP(Interaction to Next Paint) 參考網站:webVital-INP文檔 定義與核心目標 INP 是一項穩定的 Core Web Vitals 指標,通過統計用戶訪問期間所有符合條件的互動約定時間,評估網頁對用戶操作的總體響應能力。最…

剖析擴散模型(Denoising Diffusion Probabilistic Models)

文章目錄 1. 前言2. 前向擴散過程(Forward Diffusion)3. 反向生成過程(Reverse Process)4. 訓練和推理過程中的偽代碼5. 訓練過程代碼實現(Training)5.1 時間嵌入模塊——TimeEmbedding5.2 前向擴散過程——GaussianDiffusionTrai…