檢索召回率優化探究一:基于 LangChain 0.3集成 Milvus 2.5向量數據庫構建的智能問答系統

背景

? ? ? ?基于 LangChain 0.3集成 Milvus 2.5向量數據庫構建的 NFRA(National Financial Regulatory Administration,國家金融監督管理總局)政策法規智能問答系統,第一個版本的檢索召回率是 79.52%,尚未達到良好、甚至是優秀的水平,有待優化、提升。

具體的代碼版本(可見);檢索評估召回率詳細說明(可見)

目標

? ? ? ? 檢索召回率 >= 85%

實現方法

? ? ? ?本次探究:把文件按法條逐條分塊,不考慮塊的大小,能否會提高分塊文本的檢索召回率。而本次探究實現的方法,則對應于 RAG系統整體優化思路圖(見下圖)的“文檔分塊”。

RAG系統整體優化思路圖

實現思路:

  1. 了解 LangChain 的文本切分器是否支持不考慮塊的大小,且使用正則表達式來分塊的;
  2. 若上述方法行不通,就考慮不使用 LangChain 的切分器,通過常規的 Python編碼來實現文件內容的分塊。

執行過程

LangChain 文本切分器

? ? ? ?一開始,嘗試看官網的文檔,發現它也不像平常看過的 Java幫助文檔那樣,具體介紹每一個類以及類中的方法等,它寫的更加簡單與實用。見下圖:

圖片來源:Text splitters | 🦜?🔗 LangChain

從圖中的右側可知,LangChain 文本切分器的實現分類有:

  1. 基于長度的切分;
  2. 基于文本結構的切分;
  3. 基于文件結構的切分;
  4. 基于語義的切分。

???????從上述分類來看,第一類基于長度,就不用考慮了;基于文本結構的切分,是可以考慮的,這類應該就有關于正則表達式。而至于其他兩類,顯然不符合本次探究的內容,也是不用考慮的。

而進一步了解基于文本結構切分實現,可見下圖:

圖片來源:Text splitters | 🦜?🔗 LangChain

(大家看這種英文技術文檔,不要畏懼,剛開始不熟悉時,可以使用瀏覽器翻譯插件來輔助,等熟悉其中的關鍵內容,不用翻譯也大致能看懂了,也是一種“熟能生巧”)

從上圖,可知實現文本結構分類的主要實現類是:RecursiveCharacterTextSplitter。

接著,再進一步了解這個類(具體內容可見)之后,大致上就覺得方法1(考慮基于 LangChain的文本切分器來實現)是行不通了。

? ? ? ?不過,還想看看源代碼,萬一項目所使用的版本是支持的呢?但是,當看到下圖的內容,方法1 就徹底放棄了。

???????TextSplitter 類是?RecursiveCharacterTextSplitter 的基類,后者是繼承前者實現的。因此,不考慮分塊大小是不可行的。

Python 編碼實現

? ? ? ? Python編碼實現,其實并不難,畢竟實現思路已比較明確。把從文件中讀取的文本內容,根據法條的形式逐條分塊。技術實現上,使用的是正則表達式。實現的過程,主要是在測試驗證中寫出合適的正則表達式來分塊處理。

主要代碼實現如下:

1. 根據文本內容按法條分塊:

def split_by_pattern(content: str, pattern: str = r"第\S*條") -> List[str]:"""根據正則表達式切分內容:param content: 文本內容:param pattern: 正則表達式,默認是:r"第\S*條""""# 匹配所有以“第X條”開頭的位置matches = list(re.finditer(rf"^{pattern}", content, re.MULTILINE))if not matches:return [content.strip()]result = []for i, match in enumerate(matches):start = match.start()end = matches[i + 1].start() if i + 1 < len(matches) else len(content)part = content[start:end].strip()if part:result.append(part)return result

2. 從目錄讀取文件并分塊:

class CustomDocument:def __init__(self, content, metadata):self.content = contentself.metadata = metadatadef load_and_split(directory: str) -> List[CustomDocument]:"""從指定文件目錄加載 PDF 文件并提取、切分文本內容:param directory: 文件目錄:return: 返回包含提取、切分后的文本、元數據的 CustomDocument 列表"""result = []# 從目錄讀取 pdf 文件pdf_file_list = get_pdf_files(directory)# 提取文本for pdf_file in pdf_file_list:document = fitz.open(pdf_file)text_content = ""for page_num in range(len(document)):page = document.load_page(page_num)text_content += page.get_text()# 去除無用的字符text_content = rm_useless_content(text_content)# 把文本保存為 txt 文件,便于優化output_path = os.path.join(config.FILE_OUTPUT_PATH, os.path.basename(pdf_file).replace('.pdf', '.txt'))save_text_to_file(text_content, output_path)# 切分文本內容split_list = split_by_pattern(text_content)# 元數據metadata = {"source": "《" + os.path.basename(pdf_file).replace('.pdf', '') + "》"}for split_content in split_list:result.append(CustomDocument(split_content, metadata))return result

代碼編寫完成之后,實現方法也就完成了。

???????接下來對所有的文件進行讀取分塊、嵌入、存儲到一個新的 Milvus 向量數據庫集合(Collection)中,用于檢索評估。(具體過程就不在這里展開了,感興趣的朋友,可以基于第一版項目代碼,再結合上述代碼實現,修改 config 配置類的集合名稱參數,就可以跑起來了。本次的代碼會在后續更新到 Gitee項目上,具體時間暫時無法確定)


這里通過 Milvus 向量數據庫可視化工具 Attu,可以看到分塊嵌入向量化存儲后的數據,如下圖:

看到這個圖,搞過開發的,應該有一種莫名的熟悉感吧…

安裝 Attu,直接到官網 github 倉庫下載下來,點擊安裝即可。

注意和自己代碼中所使用的版本要一致。

安裝成功后,運行如下圖:

檢索評估(召回率)

? ? ? ? 為了確定檢索召回率是否真的提高了,采用的對比評估。因此,就要控制好變量與不變量。本次變的是文件文本的分塊方式,其他的均保持不變,尤其是評估數據集,和上一版本檢索召回率統計所使用的數據集是一致的。評估數據集和檢索結果處理文件,均已上傳到項目中。

RAG 相關處理說明

變量是:切分策略。

切分策略:直接使用(Python)正則表達式,[r"第\S*條 "],不區分塊大小
嵌入模型:模型名稱: BAAI/bge-base-zh-v1.5 (使用歸一化)
向量存儲:向量索引類型:IVF_FLAT (倒排文件索引+精確搜索);

向量度量標準類型:IP(內積); 聚類數目: 100; 存儲數據庫: Milvus
向量檢索:查詢時聚類數目: 10; 檢索返回最相似向量數目: 2

檢索評估結果

數據表單

有效

問題個數

TOP1 個數

TOP1 平均相似度

TOP1

召回率

TOP2

個數

TOP2?平均相似度

TOP2

召回率

TOP N策略個數

TOP N策略召回率

通義

29

20

0.7305

68.97%

2

0.6551

6.90%

22

75.86%

元寶

33

14

0.7121

42.42%

9

0.7011

27.27%

23

69.70%

文心

21

18

0.6997

85.71%

2

0.6622

9.52%

20

95.24%

總計

83

52

0.7141

62.65%

13

0.6728

15.66%

65

78.31%

???????從表格數據來看,顯然TOP N 策略召回率:78.31%?小于目標檢索召回率:85%,而且它還比上一個版本的召回率 79.52%低。

???????為何檢索召回率,會出現不升反而還下降呢?

以下是在核對檢索結果的過程中發現的現象:

  • 原來檢索不到的法條,現在可以 top 1檢索出來(見下圖)。問題一樣,分塊變小,語義更集中,從而檢索相似度會越高;

  • 原來檢索出來的法條,現在檢索不出來(見下圖)。問題一樣,分塊變小,語義更集中,并不只是問題與真正所需的法條相似度提高,其他法條的相似度可能會更高。這是因為在某個章節中,里面的法條主題是比較集中的。

  • 原來檢索不出來的,現在還是未能檢索出來(見下圖)。單個問題檢索,不可避免會出現這樣子的問題——雙語義差(問題嵌入,語義損失;分塊嵌入,語義損失)。

檢索評估結論

???????本次實現方法檢索召回率:78.31% 小于目標檢索召回率:85%,同時小于上一次的檢索召回率:79.52%,按法條逐條分塊并不是一個能提升檢索召回率的好方法。

(上述檢索評估結論,僅代表文中提到的評估數據集,在文中提及的項目代碼的處理方式下得到的對比結果,遠不具備廣泛性。)

總結

? ? ? ? 盡管結果未達到預期的目標,但整個過程下來,也是有收獲的,至少知道把文件按條文分塊并不是自己所預期的那樣,會讓檢索召回率明顯提升。而重要的收獲應是:基于現有條件 -> 提出設想 -> 尋找實現方法 -> 實現并驗證設想 -> 在驗證中得出結論,這一整個流程下來所獲得的。

? ? ? ?接下來,會繼續按 RAG系統整體優化思路圖進行優化,提升檢索召回率。根據本次檢索結果所觀察到的現象,接下來會進行檢索前處理

?


文中基于的項目代碼地址:https://gitee.com/qiuyf180712/rag_nfra/tree/master

本文關聯項目的文章:RAG項目實戰:LangChain 0.3集成 Milvus 2.5向量數據庫,構建大模型智能應用-CSDN博客

?

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

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

相關文章

《整合Spring Cache:本地緩存、Redis與Caffeine對比實踐》

&#x1f680; 整合Spring Cache&#xff1a;本地緩存、Redis與Caffeine對比實踐 &#x1f4cc; 前言 在高并發、高性能的系統設計中&#xff0c;緩存始終扮演著不可替代的角色。Spring Cache 作為 Spring 框架原生提供的緩存抽象層&#xff0c;極大簡化了緩存接入的復雜度。…

easyexcel填充方式導出-合并單元格并設置邊框

填充的模板最后導出效果實體 /*** 賬戶實體類* author test* date 2025-07-28*/ Getter Setter class Test {/*** 賬戶類型*/private String accType;/*** 賬戶余額*/private String money; }導出邏輯 /*** 導出文件邏輯*/ public void exportReport(List<Test> data) { …

Jenkins + SonarQube 從原理到實戰一:基于 K8s 部署與使用(含中文插件與 Python 掃描)

前言 公司開發部門希望在 Jenkins 構建過程中自動集成 C/C 的代碼掃描&#xff0c;正好我也沒接觸過 SonarQube&#xff0c;于是記錄下從零開始部署 SonarQube 服務并集成到 CI/CD 的過程&#xff0c;供后來者參考。 一、SonarQube 原理與工作機制詳解 1.1 什么是 SonarQube&…

Linux(Centos 7.6)命令詳解:sz

1.命令作用使用ZMODEM/YMODEM/XMODEM協議發送文件(Send file(s) with ZMODEM/YMODEM/XMODEM protocol)注意: 需要yum install lrzsz (yum provides sz可以查看rz命令是什么rpm包提供的)2.命令語法Usage: sz [options] file ...or: sz [options] -{c|i} COMMAND3.參數詳解OPTION…

智能運維中的數據轉換

《智能運維實踐 蘇娜 孫琳 王鴿著 人工智能技術叢書 自然語言處理的常用算法 日志異常檢測 根因定位 網絡流量異常檢測 清華大學出版社》【摘要 書評 試讀】- 京東圖書 數據轉換是數據預處理中的關鍵步驟&#xff0c;用于將數據從原始格式轉換為適合分析和建模的形式。這一過程…

IAR編輯器如何讓左側的工具欄顯示出來?

在IAR編輯器中恢復左側工具欄顯示&#xff0c;可通過以下方法操作&#xff1a; 一、通過菜單欄啟用工具欄 ?進入視圖菜單? 點擊頂部菜單欄的 ?"View"? → 在彈出列表中勾選 ?"Workspace"? 若工具欄仍不顯示&#xff0c;查看菜單欄右側是否有 ?"…

ADB+Python控制(有線/無線) Scrcpy+按鍵映射(推薦)

要實現電腦通過鍵盤控制安卓平板屏幕點擊的功能&#xff0c;可以采用以下方案&#xff1a; 方案一&#xff1a;ADBPython控制&#xff08;有線/無線&#xff09; 準備工具&#xff1a; 安卓平板開啟開發者模式&#xff08;設置→關于平板→連續點擊版本號&#xff09;啟用USB調…

同態濾波算法詳解:基于頻域變換的光照不均勻校正

&#x1f3ad; 同態濾波&#xff1a;圖像頻域的調音師技術“如同調音師在音頻處理中分離并調節不同頻率成分&#xff0c;同態濾波能夠在圖像頻域中精確分離光照與細節信息。”&#x1f3af; 圖像頻域調音的技術挑戰 在數字圖像處理中&#xff0c;光照不均勻問題如同音頻中的混響…

Ubuntu簡述及部署系統

1.什么是Ubuntu1.1概述Ubuntu屬于Debian系列&#xff0c;Debian是社區類Linux的典范&#xff0c;是迄今為止最遵循GNU規范的Linux系統。Debain最早由lan Murdock于1993年創建&#xff0c;分為三個版本分支&#xff08;branch&#xff09;&#xff1a;stable&#xff0c;testing…

Claude Code安裝部署

1??安裝 Node.js&#xff08;已安裝可跳過&#xff09; 確保 Node.js 版本 ≥ 18.0 # Ubuntu / Debian 用戶 curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo bash - sudo apt-get install -y nodejs node --version# macOS 用戶 sudo xcode-select --install /b…

MATLAB近紅外光譜分析技術及實踐技術應用

專題一、MATLAB編程基礎與進階&#xff08;一&#xff09;1、MATLAB 安裝、版本歷史與編程環境2、MATLAB 基礎操作&#xff08;矩陣操作、邏輯與流程控制、函數與腳本文件&#xff09;3、MATLAB文件讀寫&#xff08;mat、txt、xls、csv、jpg、wav、avi等格式&#xff09;專題二…

SQLFluff

一、SQLFluff 是什么&#xff1f; SQLFluff 是一個??開源的 SQL 代碼質量工具??&#xff0c;專注于通過自動化方式提升 SQL 代碼的可讀性、一致性和規范性。其核心功能包括&#xff1a; ??代碼格式化??&#xff1a;自動調整縮進、空格、換行等格式問題&#xff0c;支…

盲盒抽卡機小程序系統開發:連接線上線下娛樂新橋梁

在互聯網技術的推動下&#xff0c;線上線下融合已經成為娛樂行業發展的必然趨勢。盲盒抽卡機&#xff0c;這一原本在線下備受歡迎的娛樂項目&#xff0c;通過小程序系統的開發&#xff0c;成功實現了線上線下的無縫對接&#xff0c;成為連接線上線下娛樂的新橋梁。盲盒抽卡機小…

【SSL證書校驗問題】通過 monkey-patch 關掉 SSL 證書校驗

標簽&#xff1a;Python、SSL、monkey-patch、httpx、aiohttp、requests、OpenAI 1 為什么會有這篇文章&#xff1f; 在本地調試 OpenAI 代理、數據抓取、私有服務、訪問外網 時&#xff0c;經常會碰到如下報錯&#xff1a; SSLCertVerificationError: [SSL: CERTIFICATE_VER…

VMWARE -ESXI-ntp時間同步無法啟動異常處理

從服務界面查看NTP服務是停止的&#xff08;手動啟動無效&#xff09;嘗試到系統-時間設置-添加服務-網絡時間協議&#xff0c;添加阿里云NTP服務器&#xff08;網絡可達&#xff09; ntp.aliyun.com 點擊確定報錯-無法更改主機配置出現上面的情況多半是DNS沒有設置ssh登錄到服…

yolo11分類一鍵訓練工具免安裝環境windows版使用教程

這個是windows上用于yolo11分類訓練工具&#xff0c;不需要寫代碼只需要按照要求擺放好分類圖片文件夾就可以訓練。軟件內置cuda和python模塊&#xff0c;因此不需要安裝python環境和cuda就可以使用。注意需要電腦配備有nvidia顯卡才能使用。要求顯存>4GB。首先我們打開軟件…

2025年-ClickHouse 高性能實時分析數據庫(大綱版)

告別等待&#xff0c;秒級響應&#xff01;這不只是教程&#xff0c;這是你駕馭PB級數據的超能力&#xff01;我的ClickHouse視頻課&#xff0c;凝練十年實戰精華&#xff0c;從入門到精通&#xff0c;從單機到集群。點開它&#xff0c;讓數據處理速度快到飛起&#xff0c;讓你…

深入理解 Scikit-learn:機器學習實戰的科學之道與避坑指南

掌握工具易&#xff0c;領悟其道難——本文帶你穿透API表面&#xff0c;直擊工業級機器學習實踐的核心邏輯。作為一名長期耕耘在機器學習研究與工業應用一線的從業者&#xff0c;我見過太多因誤用 sklearn 而導致的模型失效案例。從數據泄露到評估失真&#xff0c;從特征處理失…

Android 調試橋 (adb) 基礎知識點

Android 調試橋 (adb) 是一種功能多樣的命令行工具&#xff0c;可讓您與安卓手機進行通信。常用于輔助測試開發或定位問題。 一、adb的工作原理 &#x1f31f; 啟動服務器進程&#xff1a;檢查是否adb服務器進程正在運行&#xff0c;若沒有則啟動。 啟動或關閉adb服務&#xff…

AW2013 LED驅動芯片 工作方式介紹

根據您上傳的 AW2013 芯片手冊&#xff0c;我將為您分三個部分詳細解讀&#xff1a;一、芯片簡介&#xff08;AW2013 概述&#xff09; AW2013 是一款 3 通道的 IC 控制恒流 LED 驅動芯片&#xff0c;支持以下功能&#xff1a;單通道最大恒流輸出&#xff1a;15mA&#xff0c;支…