RAG項目實戰:LangChain 0.3集成 Milvus 2.5向量數據庫,構建大模型智能應用

項目背景

? ? ? ?最近,有時間,想著動手實戰一下,從0到1搭建一個 RAG 系統,也是想通過實戰的方式來更進一步學習 RAG。因此,就定下了以項目實戰為主,書籍為輔的執行方式。(書籍是黃佳老師著的《RAG 實戰課》)

? ? ? ?在我的認知中,技術一直是作為一個工具,它就是為解決問題而生的,而對于企業來說,問題就是企業的業務。本項目選擇的業務領域是金融,為何選擇金融呢?有兩個原因吧。一個是和工作背景有關,以前從事的業務領域一直是和金融相關的;另一個原因是個人興趣,對金融相對感興趣,想借此多了解與學習。

項目目標

  1. 從0到1做一個 RAG 系統;
  2. 學習構建 RAG 系統的技術應用;
  3. 學習評估和優化 RAG 系統。

項目計劃

大的里程碑主要分為兩個:

  1. 首先是構建一個基于國家金融監督管理總局(National Financial Regulatory Administration,簡稱 NFRA 后文統一使用它替代)政策法規的智能問答 RAG 系統;
  2. 其次是基于該智能問答 RAG 系統進行評估與優化。迭代優化整體思路會參考如下圖:

項目簡介

項目名稱

????????NFRA 智能問答系統。

項目代碼

? ? ? ? 項目代碼,已開源發布到 Gitee 平臺。有需要,可點擊

技術棧

? ? ? ? 這里主要介紹項目中使用到的核心技術,LangChain 和 Milvus,以及在項目中應用到的核心技術點。

LangChain

????????LangChain 是一個框架,它使得開發者能夠更加容易地構建基于大型語言模型(LLMs)的應用程序。通過提供一系列工具組件,LangChain 可以幫助開發者快速搭建如聊天機器人、智能問答系統等應用。

LangChain?需要掌握的關鍵概念:

1. Models (模型)

????????LangChain 支持多種 LLM 接口,包括 OpenAI、Hugging Face 等,提供了標準化接口,允許輕松切換不同模型。

  • LLMs:處理純文本輸入并返回純文本輸出的模型。
  • Chat Models:支持格式化的聊天消息作為輸入和輸出,更適合對話應用。

2. Prompts (提示管理)

Prompts 模塊幫助開發者設計與模型交互的提示詞,并對輸出進行解析。

  • PromptTemplate:模板化提示,可以動態插入變量。
  • Output Parsers:將模型輸出結構化為易于理解的格式。

3. Chains (任務鏈)

Chains 將多個模型調用或工具調用組合成工作流,實現復雜流程的編排。

  • 預定義鏈:如 LLMChain、SequentialChain 等。
  • 自定義鏈:可以根據需求創建自己的鏈。

4. Indexes (索引與檢索)

Indexes 模塊集成外部數據源,使得模型能夠訪問這些數據進行增強生成。

  • Document Loaders:從各種來源加載文檔,如 PDF、網頁等。
  • Text Splitters:處理長文本分塊以便于處理。
  • Vector Stores:使用向量數據庫存儲嵌入式表示的數據,便于相似性搜索。
  • Retrievers:結合 LLM 實現 RAG(檢索增強生成)。

5. Callbacks (回調)

Callbacks 提供了一種機制來監控模型調用、記錄日志以及實現其他高級功能,比如異步支持。

6. Embeddings

Embeddings 模塊涉及文本向量化表示,這對于基于內容相似性的搜索至關重要。

  • Vector Similarity Calculation:計算向量之間的相似度。
  • Vector Storage and Retrieval:管理和檢索向量數據。

Milvus

????????Milvus 是一個開源的、高性能的向量數據庫,它支持存儲、索引和查詢大量的向量數據。這些向量通常由機器學習模型生成,用來表示文本、圖像、音頻等復雜的數據類型。通過使用 Milvus,可以快速地找到與給定向量最相似的數據項,這對于構建智能問答系統、推薦系統、搜索引擎等非常有用。

Milvus 需要掌握的關鍵概念:

  1. Collection(集合):相當于關系型數據庫中的表,包含一組 entity?
  2. Entity(實體):相當于表中的一行,包含一組 field?
  3. Field(字段):可以是結構化數據(數字、字符串)或向量?
  4. Partition(分區):集合的物理分區,用于減少數據讀取范圍?
  5. 向量索引:提高查詢速度,支持多種索引類型如 IVF_FLAT、IVF_PQ、HNSW 等

RAG 系統評估

? ? ? ? RAG 系統評估的重要性,上文已談及,不再贅述。不同 RAG 系統的評估數據集,格式可能會有所不同,有的時候存在精確的唯一數據來源,而有的時候答案可能來源于多個頁面或者文檔。NFRA 智能問答系統評估,針對的是答案來源單一文檔的。

? ? ? ? 目前,對 RAG 進行整體評估的,有一個叫 TRIAD 框架,它提供了一個無參照的評估體系。這種無參照的評估體系省去了構建評估數據集的麻煩,但同時也意味著評估指標本身具有一定的非確定性。因此,我們在實際項目中,還是要具體問題具體分析的,而且目前也尚未形成一種通用且可行的 RAG 評估標準。

? ? ? ? RAG 系統評估主要分為檢索評估和響應評估。NFRA 智能問答系統評估,重點是放在檢索評估。之所以這樣做,主要是因為在開發驗證過程中,發現了只要能檢索到問題關聯的政策法規條文作為上下文給到 LLM,大語言模型(項目中默認使用的模型是:deepseek-chat)生成的回復效果是相當不錯的,這對于使用基于忠實度(扎實性)指標評估來說,是可以達到良好及以上的。還有,通過調整提示詞,也會得到不一樣的回復風格。(大家可以搭建起項目來嘗試與驗證)

? ? ? ? 檢索評估指標,選擇的是——召回率。召回率衡量系統檢索到的相關文本塊的全面性,即檢索到的相關文本塊數量占數據庫中所有相關文本塊數量的比例。

?評估數據集

? ? ? ? 數據集文件路徑:/evaluation/data

????????一共三個表單,WX(文心),40條問答對; TY(通義),54條問答對; TXYB(騰訊元寶),50條問答對。總共問答對:144條

RAG 相關處理說明

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

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

檢索評估結果

數據表單

有效

問題個數

TOP1 個數

TOP1 平均相似度

TOP1

召回率

TOP2

個數

TOP1 平均相似度

TOP2

召回率

TOP N策略個數

TOP N策略召回率

通義

29

18

0.6855

62.07%

5

0.6716

17.24%

23

79.31%

元寶

33

17

0.6881

51.52%

7

0.6953

21.21%

24

72.73%

文心

21

17

0.6509

80.95%

2

0.6504

9.52%

19

90.48%

總計

83

52

0.6748

62.65%

14

0.6724

16.87%

66

79.52%

詳細評估數據集檢索處理結果,可見文件:/evaluation/eval_out

表格說明:

  • 有效問題個數:是在 LLM 生成的問答對前提下,刪除了無效的問題,比如不在知識庫中的問題,過于開放性的問題等;
  • TOP1、TOP2 個數:是指檢索回來的文本塊(被最終用于回復問題的文本塊在檢索返回時相似度的排名)的數量。越是位于 TOP1,說明檢索效率越高;
  • TOP N 策略:就是在問題檢索時,需要返回最相似向量個數。(本次評估,N=2)

檢索評估結論:

???????從表格中可以看到,在有效的 83個問題評估中,總共有 66個問題相關文本塊被召回,召回率是:79.52%。算是中規中矩吧,后續有待優化,至少得達到 90%以上。

檢索召回率不高分析

? ? ? ? 在核對檢索評估結果數據的過程中,基本上都是未能檢索到相關的條文,因而召回率不夠高。召回率不高可能存在的原因有多方面:

  1. 有些問題相關的條文內容少,在文本塊中占比就會小,文本塊經過嵌入處理后損失一定的語義性,在檢索時相似度得分就不會高,就很可能無法達到 TOP N 返回;(探究能否把政策法規逐條分塊)
  2. 條文因分塊大小而剛好被截斷,致使出現類似上述第一點的問題;
  3. 查詢問題與其他文件的分塊存在更高的相似性,致使實際相關的文本塊未能出現在 TOP N 中;(探究檢索前處理技術——查詢重寫;檢索后處理技術——重排)
  4. ……

其他

  • 項目過程遇到的問題,考慮到文章結構和篇幅問題,會單獨再寫一篇。

總結

從0到1做 RAG系統

從0到1做?NFRA 智能問答 RAG系統的過程,有幾點感受比較深的:

  1. 首要弄清楚你這個智能問答系統,主要面臨的用戶問題都有什么,要在項目開始前調研清楚。若是在公司里,我們要拉著相關業務部門把這個梳理清楚,整理出問答表。這個表會作為?RAG 系統評估數據集的重要來源。
  2. 其次,確定?RAG系統的評估指標。在梳理、整理問答對的這個過程中,我們也會得出評估 RAG 系統所要的指標,檢索評估指標是看精確率,還是召回率,亦或者是它們的平衡—— F1 分數等等;響應評估指標,是基于?n-gram 匹配程度,還是基于語義相似性,亦或者是基于忠實度(扎實性)等。
  3. 接著,是對用于構建知識庫的資料進行處理,主要包括:讀取、獲取、切分。同樣地步驟一進行的梳理、整理問答對過程,會讓我們在處理資料時有一個總體認知,能相對好地處理諸如此類問題——需要在資料中獲取什么樣的知識,是否需要獲取元數據,是否要做元數據的過濾,怎么切分這些知識內容等。這一步,與最終檢索的效果密切相關。
  4. 緊接著,要考慮選擇什么嵌入模型來進行分塊的嵌入,選擇什么樣的向量數據庫進行嵌入的存儲。這一步,看似是技術為主,但它又與業務息息相關。
  5. 往下,到了檢索、構建 prompt、生成回復,一般來說,按項目迭代的過程來看,這里面先考慮的是生成模型的選擇。
  6. 再往后,就是對 RAG 進行評估。具體上述RAG 系統評估章節,已談。

實戰感受

  • 通過項目實戰方式來學習技術是一個挺好的方式,不過短期內需要投入的時間會相對多,因為在實戰的過程中,會犯一些看似簡單但又讓你一時難以解決的問題,所以要有一定的耐心。

這里舉一個項目中遇到的問題:在做向量檢索過程中,從 Milvus 向量數據庫中查詢并返回結果,沒有注意到 Collection.search() 和 MilvusClient.search() 的區別,這兩個方法的傳參挺像的,而且方法名又是一樣的,導致在處理查詢結果上一直獲取不到想要的內容。當搞清楚Collection.search() 返回的是 Hits對象的集合,而 MilvusClient.search() 返回的是字典類型的集合,問題自然就解決了。

  • 以往做系統,我們主要關注的是準確性,不管是面向關系型還是非關系型數據庫,都是如此;而如今,我們主要關注的是相似性,面向的是向量數據庫。不管如何,都是試圖通過一種技術手段把現實世界進行建模、數據化,根據用戶的輸入,從數據化的“現實世界”中找到滿足用戶的輸出。


項目代碼地址:https://gitee.com/qiuyf180712/rag_nfra

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

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

相關文章

docker build 和compose 學習筆記

目錄 docker build 筆記 1. 路徑解析 2. 關鍵注意事項 2. docker compose up -d 核心區別對比 常見工作流 補充說明 1. 功能區別 2. 協作關系 場景 1:Compose 自動調用 Build 場景 2:先 Build 后 Compose 3. 關鍵區別 4. 為什么需要協作&…

Java學習第六十六部分——分布式系統架構

目錄 一、前言提要 二、核心目標 三、核心組件與技術 1. 服務拆分與通信 2. 服務注冊與發現 3. 配置中心 4. 負載均衡 5. 熔斷、降級與限流 6. API 網關 7. 分布式數據管理 8. 分布式追蹤與監控 9. 容器化與編排 四、典型Java分布式技術棧組合 五、關鍵…

Pycharm的Terminal打開后默認是python環境

Pycharm的Terminal打開后默認是python環境解決方案Pycharm的Terminal打開后默認是python環境,無法執行pip等命令,也沒辦法退出 解決方案 點擊Settings -> Tools -> Terminal 可以看到當前默認打開的是torch19py38環境中的python.exe(…

LVS——nat模式

一、搭建nat模式下LVS的實驗環境1.創建四臺虛擬機client——客戶端:192.168.134.111/24(nat模式)LVS——調度器【雙網卡】:192.168.134.112/24(nat模式)、172.25.254.111/24(僅主機模式&#xf…

ElasticSearch是什么

ElasticSearch是什么 ElasticSearch 是一個基于 Apache Lucene 的開源分布式搜索引擎,用于全文搜索、日志分析、實時數據分析等場景。它以高性能、分布式架構和易用性著稱,支持 JSON 格式的數據存儲和查詢,廣泛應用于日志監控、搜索服務、企業…

linxu CentOS 配置nginx

1、準備要發布的文件夾sudo mkdir -p /var/www/myfiles # 創建文件夾(如果不存在) sudo chmod -R 755 /var/www/myfiles # 設置權限(確保 Nginx 可以讀取) sudo chown -R nginx:nginx /var/www/myfiles # 修改所有者&#xff0…

內網穿透利器:基于HTTPHTTPS隧道的代理工具深度解析

內網穿透利器:基于HTTP/HTTPS隧道的代理工具深度解析 一、引言 在滲透測試和內網滲透中,HTTP/HTTPS隧道技術是突破網絡邊界的關鍵手段。它通過將TCP流量封裝在HTTP協議中,穿透防火墻/NACL策略,實現內網橫向移動。本文以reGeorg為…

容器編排K8S

k8s概述 容器部署優勢:部署方便,不依賴底層環境,升級鏡像 本質是一個容器編排工具,golang語言開發 master master管理節點:kube-api-server請求接口,kube-scheduler調度器,kube-controller-manager控制器/管理器,etcd分布式存儲數據庫 work node服務節點:kubelet代理保…

C語言:深入理解指針(1)

1. 內存和地址在了解指針前,我們需要知道內存和地址是什么。1.1 內存首先來看內存。舉個例子:當你在酒店找房間時,你并不是一層一層一間一間找,而是通過酒店為每間房子設置的門牌號直接找到你的房間,這樣的效率就會快很…

完整的 SquareStudio 注冊登錄功能實現方案:已經燒錄到開發板正常使用

根據你的需求,我將提供完整的實現方案,解決按鈕同時執行多個動作的問題,并確保注冊登錄功能正常工作。所需文件結構需要創建和修改的文件如下:ui_events.h - 事件處理函數聲明events.c - 實際的事件處理邏輯ui.c - UI 初始化和事件…

OkHttp 與 Chuck 結合使用:優雅的 Android 網絡請求調試方案

前言在 Android 應用開發過程中,網絡請求調試是日常工作中不可或缺的一部分。Chuck 是一個輕量級的 OkHttp 攔截器,能夠在應用內直接顯示網絡請求和響應的詳細信息,無需連接電腦或使用額外工具。本文將詳細介紹如何將 OkHttp 與 Chuck 結合使…

AI學習--本地部署ollama

AI小白,記錄下本地部署ollama1.下載安裝ollama下載地址ollama官方地址https://ollama.com/download根據系統下載即可下面是我下載的地址 https://release-assets.githubusercontent.com/github-production-release-asset/658928958/e8384a9d-8b1e-4742-9400-7a0ce2a…

docker 設置鏡像倉庫代理

1. 創建 Docker 服務的代理配置文件sudo mkdir -p /etc/systemd/system/docker.service.d2.創建文件 /etc/systemd/system/docker.service.d/http-proxy.conf,內容如下:[Service] Environment"HTTP_PROXYhttp://192.168.0.111:7890" Environme…

ffmpeg rtsp 丟包處理

直接用 demux 在有些網絡中,丟包畫屏; 再ffmpeg和ffplay中,可以指定 tcp 方式,所以代碼直接設置陶瓷坯方式; // 設置RTSP選項優化接收數據流防止數據包丟失 av_dict_set(&options, "rtsp_transport", …

aosp15實現SurfaceFlinger的dump輸出帶上Layer詳細信息踩坑筆記

背景: 針對上一篇文章 aosp15上SurfaceFlinger的dump部分新特性-無Layer信息輸出如何解決? 給大家布置了一個小作業,那就是需要實現dumpsys SurfaceFlinger相關輸出中可以攜帶上所有的Layer的詳細信息需求,今天來帶大家詳細實現一…

Linux 網絡調優指南:廢棄的 tcp_tw_recycle 與安全替代方案

一、問題起源:消失的內核參數 當你在 Debian 10 系統執行 sysctl 命令時,若看到報錯: sysctl: cannot stat /proc/sys/net/ipv4/tcp_tw_recycle: 沒有那個文件或目錄 這并非配置錯誤,而是Linux 內核演進的結果。自 4.12 版本起,內核正式移除了 tcp_tw_recycle 參數——…

刪除有序數組中的重復項

class Solution {public int removeElement(int[] nums, int val) {// 暴力法int n nums.length;for (int i 0; i < n; i) {if (nums[i] val) {for (int j i 1; j < n; j) {nums[j - 1] nums[j];}i--;n--;}}return n;} }代碼邏輯解析首先獲取數組長度n&#xff0c;…

【Pytest】從配置到固件的使用指南

掌握高效測試的關鍵技巧&#xff0c;打造專業級自動化測試框架一、Pytest框架的核心優勢 Pytest作為Python最強大的測試框架之一&#xff0c;以其簡潔靈活的語法和豐富的擴展能力深受開發者喜愛。相比unittest&#xff0c;Pytest提供了更直觀的測試編寫方式和更強大的功能集&am…

[matlab]matlab上安裝xgboost安裝教程簡單版

【前言】 網上基于MATLAB的xgboost安裝教程太少了&#xff0c;以至于幾乎搜不到&#xff0c;為此做了一個簡單安裝教程【安裝前提】 有matlab軟件&#xff0c;版本越高越好&#xff0c;我用的是2023a。理論支持matlab2018a及其以上&#xff0c;因此需要自己提前安裝好matlab【安…

基于多種機器學習的成都市二手房房價分析與價格預測【城市可換、算法模型多種對比】

文章目錄有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試可以私信博主項目背景數據來源與采集方式數據預處理與清洗流程探索性數據分析&#xff08;EDA&#xff09;模型構建與預測方法項目意義與應用前景相關可視化展示總結每文一語有需要本項目的代碼或文檔以及…