rag學習-以項目為基礎快速啟動掌握rag

rag從0到放棄

  • 黃帝內經rag問答系統
  • RAG 項目版本迭代總覽
    • 各版本技術細節
    • 如何使用

黃帝內經rag問答系統

本項目使用爬蟲獲取了皇帝內經全文以此為數據構建檢索增強系統
本項目以一個系統的多層迭代不斷更新優化技術,由淺入深逐漸理解rag原理及優化技術

話不多說github地址:https://github.com/good-lwb/rag_learn
(所有代碼均可使用,但是需要自己下載一下模型,或者申請一個阿里云的api用在線的模型也可以)
各位看官大爺覺得有用麻煩github給個star,非常感謝(祝大家的code之路一路無bug)

在本次項目中將rag分為三步:

  1. indexing索引階段
  2. retrive檢索階段
  3. generation生成階段

本項目主要對這三個階段分別展開優化

RAG 項目版本迭代總覽

版本核心目標索引優化檢索優化評估/其他框架/工具鏈
v1.0快速體驗基礎RAG流程- 按500token分塊
- BGE-small-zh Embedding
- FAISS向量庫
- 單路向量檢索
- 無召回優化
- 大量日志打印輔助理解LangChain
v2.0基礎優化技術實踐- LangChain分塊(512+128重疊)
- 同v1.0 Embedding/FAISS
- 雙路召回(BM25+向量)
- 10+10→rerank Top5
- 支持API/本地模型加載LangChain
v3.0企業級快速測試(平衡質量與效率)- 同v2.0- Qwen-Rag框架內置優化
- 支持多輪對話
- 本地vLLM加速推理Qwen-Rag + vLLM
v4.0解決長文本信息碎片化問題- 父文檔檢索器
- 子塊匹配→返回父塊
- Chroma向量庫+JSON持久化
- 子塊Top3→父塊返回
- 支持API/本地Embedding
- 引入Logging
- 檢索過程存JSON
LangChain + Chroma + vLLM
v5.0量化評估RAG效果- 同v4.0- 同v4.0- RAGAS評估
(忠實度、相關性等5指標)
Ragas + 自定義模型
v6.0探索LlamaIndex生態- LlamaIndex基礎分塊/索引- 基礎檢索流程- 對比LangChain/Qwen-RagLlamaIndex

效果圖1
效果圖2

各版本技術細節

v1.0?
1.0版本旨在快速啟動rag體驗rag流程并且在代碼中使用了大量打印注釋方便理解rag流程
索引:使用最簡單的按500token分塊,未作overlap,bge-samll-zh-v1.5作為embeding模型,使用faiss構架本地向量數據庫
檢索:使用最基礎的huggingface加載器加載模型推理,未做多路召回,未做rerank,無增強檢索技術

v2.0??
2.0版本旨在使用基本的優化技術(非企業級)
提供了api版本(main_api.py)和本地加載模型的版本(main.py)
索引:使用langchain.text_spliter對文檔進行分塊chunk=512、overlap=128,embeding=‘bge-samll-zh-v1.5’,向量數據庫=faiss
檢索:最簡單的雙路召回(關鍵詞檢索(BM25)、向量匹配),召回10+10,rerank取前5

v3.0???
3.0版本使用Qwen-Rag框架進行開發(可以作為企業的快速啟動測試,能在保證質量的前提下體驗Rag帶來的效果提升)
這里還是提供兩個版本的測試腳本,api版本(main_api.py)和本地加載模型的版本(main.py)
對于本地加載模型,在此版本中我們直接使用vllm來加載本地模型給Qwen-Rag使用(直接在終端使用bash start_vllm.sh即可加載模型);
同時在這次測試中考慮到v2版本無記憶對話不支持多輪對話,也在Qwen-rag框架下進行了多輪對話的加入

v4.0????
4.0版本中引入了父文檔檢索器,同時合并api加載模型和本地vllm加載的代碼,并添加logging打印功能

在這里介紹以下父文檔檢索器,父文檔檢索器主要解決,某些任務當chunk設置的比較小的時候檢索到的chunk和question相似度較高,但是由于chunk較小可能導致內容信息不全,就會使模型輸出不準確。而大的chunk雖然會保存較豐富的信息,但是chunk較長可能與question匹配相似度不夠高。
為了解決上述問題所以引入父文檔檢索器,先對文本塊先分割成parent文本塊(chunk較長),在分割較短的child塊(chunk較短);使用child進行相似度匹配,然后塞給模型對應的parent塊,這樣就能使得模型在保證相似度較高的前提下拿到更多的上下文信息。
langchain的父文檔檢索器主要提供了兩種方式:檢索完整文檔 和 檢索較大的文檔塊,我個人更推薦第二種,這里不做科普感興趣的朋友可以自己去看一下父文檔檢索器的原理和詳細的介紹,我這里主要是說明一下方便使用。

索引:使用langchain.retrievers提供的父文檔檢索器(ParentDocumentRetriever)構建Chroma本地向量數據庫。
在這部分在由于ParentDocumentRetriever不支持持久化保存父文檔信息我們單獨構建json將父文檔chunk保存,再通過json在rag檢索時進行加載,使得檢索精度得到極大的提升。
同時,支持兩中加載embedding模型的方式(api/本地),通過參數控制方便使用。
除此之外提供test_chroma_db.py文件支持對本地chroma向量數據庫進行測試。

檢索:父文檔檢索器(檢索top_k=3個相似度最高的子文檔,并根據重構的json返回對應的父文檔片段)
4.0版本中將llm的本地化加載合并為同一main.py中并通過指定remote/local參數進行配置使用阿里云api加載或本地部署的vllm。
日志:在4.0中引入了logging功能,并將檢索信息通過json文件進行保存,方便后續對rag檢索能進行評估。
在這部分我并沒做多路召回+重排序,因為本任務文檔級別較小,如果有需要大量文檔召回的朋友可以去結合v2.0的多路召回策略和rerank自行修改一下代碼。

v5.0?????
5.0版本使用ragas對rag系統進行評估以此驗證在4.0版本rag的提升(其他版本測試代碼這里不給出了,我已經將ragas評估函數封裝,直接傳參進去測試其他版本不難)。
衡量一個rag系統的主要參數有如下五類:
忠實度(faithfulness):衡量了生成的答案(answer)與給定上下文(context)的事實一致性。它是根據answer和檢索到的context計算得出的。并將計算結果縮放到 (0,1) 范圍且越高越好。
答案相關性(Answer relevancy):重點評估生成的答案(answer)與用戶問題(question)之間相關程度。不完整或包含冗余信息的答案將獲得較低分數。該指標是通過計算question和answer獲得的,它的取值范圍在 0 到 1 之間,其中分數越高表示相關性越好。
上下文精度(Context precision):評估所有在上下文(contexts)中呈現的與基本事實(ground-truth)相關的條目是否排名較高。理想情況下,所有相關文檔塊(chunks)必須出現在頂層。該指標使用question和計算contexts,值范圍在 0 到 1 之間,其中分數越高表示精度越高。
上下文召回率(Context recall):衡量檢索到的上下文(Context)與人類提供的真實答案(ground truth)的一致程度。它是根據ground truth和檢索到的Context計算出來的,取值范圍在 0 到 1 之間,值越高表示性能越好。
上下文相關性(Context relevancy):該指標衡量檢索到的上下文(Context)的相關性,根據用戶問題(question)和上下文(Context)計算得到,并且取值范圍在 (0, 1)之間,值越高表示相關性越好。理想情況下,檢索到的Context應只包含解答question的信息。
最終測試結果如下所示(因為ragas默認需要使用opanai的ai,我這里我沒有就硬傳的自己的模型,雖然有結果但是不知道為什么有幾個指標都是零,這個我后續在研究補充):
在這里插入圖片描述

v6.0??????
6.0版本使用llama_index完成了黃帝內經系統的開發,但只是使用了最基礎的開發框架,沒有進行優化。
llama_index相較于langchain生態更加完善,集成的編碼、檢索優化等手段更加方便,基本都是開箱即用(內部包支持),不像langchain手寫的多。
這里沒給出基于llama_index的優化,llama_index生態文檔很完善可以看文檔,基本優化都很簡單官方集成了很多的優化而且都是換個參數改個函數就能實現。

心得
在這個項目中,我一共使用了三個框架對黃帝內經rag進行開發(langchain、llama_index、Qwen-rag)
說一下我個人感覺:
Qwen-rag的話優化做得很好,而且上手很簡單,官方抽象的很好基本就是把自己的doc扔進去就可以使用而且有不錯的效果,適合想要快速體驗rag給llm帶來的提升效果的同學,或者項目著急出個實體給客戶看一眼也可以使用。
llama_index對于數據庫構建、索引,包括生成其實都有很強的抽象程度,而且用起來真的很方便,感覺很多人都在吹langchain(包括我自己),但實際用下來rag感覺還是llama_index更好一些。
langchain怎么說呢又愛又恨,真的很多都要自己手寫,比如數據庫檢索之類的,但是你說他不行它prompt模板有很好用,而且他還有自己的一套生態比如LCEL(管道符執行,非常有意思),而且她對模型調用、agent、工作流的支持也都不是llama_index能做到的。

綜上沒有說什么好什么不好,干這行你就都得會,都得學,而且其實現在你看langchain和llama_index的文檔可以很明顯的感覺到,他倆越來越像了,就比如文檔加載器都要一摸一樣了,后面他們各自優化其實也會更相似。

如何使用

首先你需要下載bge-small-zh-v1.5;bge-reranker-base;Qwen3-4B三個模型,并保存在項目路徑下.
langchain版本>0.3即可,其余不做版本要求.
!pip install langchain
!pip install langchain-openai
!pip install langchain-community
!pip install faiss-cpu
!pip install openai
!pip install vllm # 可能會下載失敗,可以單獨create一個conda環境只下載vllm,專門用來bash start_vllm.sh使用
!pip install chromadb
!pip install ragas
!pip install -U "qwen-agent[rag,code_interpreter,gui,mcp] #v3版本使用的
!pip install llama-index # 安裝llama_index必須新create虛擬環境,和langchain不兼容
!pip install llama-index-embeddings-huggingface
!pip install llama-index-llms-huggingface

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

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

相關文章

linux 啟動流程?

linux 啟動流程 CPU 上電后最先執行的啟動代碼,通常確實是放在 arch 目錄下對應架構的啟動文件里。這是因為啟動代碼強相關于 CPU 架構和硬件細節,不同架構差異非常大。具體說明 1. 為什么啟動代碼放在 arch 目錄? 啟動代碼要設置 CPU 狀態&a…

《Kubernetes部署篇:基于Kylin V10+ARM64架構CPU使用containerd部署K8S 1.33.3集群(多主多從)》

總結:整理不易,如果對你有幫助,可否點贊關注一下? 更多詳細內容請參考:企業級K8s集群運維實戰 一、架構圖 如下圖所示: 二、環境信息 基于x86_64+aarch64架構使用containerd部署K8S 1.33.3集群資源合集(三主多從) 2、部署規劃 云平臺 主機名 K8S版本 系統版本 CPU架構…

Docker 鏡像打包為 ZIP 文件便于分享和轉發

網上找到的記錄一下方便下次看步驟詳解1. 將鏡像導出為 TAR 文件Docker 提供了 docker save 命令,可以將鏡像導出為 .tar 文件。使用以下命令:docker save -o dify.tar dify說明:docker save:導出鏡像為文件。-o dify.tar&#xf…

一對一交友小程序 / APP 系統架構分析

一對一交友小程序 / APP 系統架構分析一、引言在數字化社交的大背景下,一對一交友小程序和 APP 為人們拓展社交圈提供了便捷途徑。合理且高效的系統架構是保障此類應用穩定運行、提升用戶體驗的基石。本文將深入剖析一對一交友小程序 / APP 的系統架構,涵…

Anthropic最新研究Persona vector人格向量

今天本來就想更一期強化學習,但是突然看了Anthropic的persona vector,所以又來寫這一篇,因為我覺得這個很有價值以往我們玩LLM比較怕的事就事他亂說話作為概率模型,它能說對,它也能亂編,亂編輕癥就是所謂的…

Spring AI集成Elasticsearch向量檢索時filter過濾失效問題排查與解決方案

使用vectorStore.similaritySearch遇到問題 最近需要做一個功能,用到了es做向量數據庫。在使用vectorStore.similaritySearch查詢的時候,發現filterExpression中加的條件并沒有完全生效,導致查詢出來的數據不準確,出現了不符合me…

安燈系統(Andon System)

安燈系統是源自豐田生產系統(TPS)的一種可視化生產管理工具,其名稱"Andon"來自日語的"提燈",原指用于報警的燈籠,現已成為制造業現場管理的核心工具之一。一、安燈系統的定義安燈系統是一種實時監控生產異常的可視化管理…

MyBatis與MySQL

要理解 MyBatis 語法及其與 MySQL 的區別,首先需要明確兩者的本質定位:MyBatis 是 Java 的持久層框架(負責 Java 對象與數據庫數據的映射),而MySQL 是關系型數據庫管理系統(負責數據的存儲和 SQL 執行&…

Vulnhub Noob靶機復現(附提權)

一、安裝靶機 下載地址:https://download.vulnhub.com/noob/Noob.ova 下載好后使用VM打開配置如下。 二、主機發現 使用nmap掃描確認靶機ip(192.168.29.138) nmap -sn 192.168.29.1/24 三、端口掃描 使用nmap工具掃描全部端口以防遺漏。 nmap -A -p- 192.168.…

文心4.5開源測評:國產大模型的輕量化革命與全棧突破

> 當算力成本成為AI落地的最大攔路虎,一款僅需2.1GB顯存、支持32K上下文的輕量級大模型如何撬動產業智能化的大門? ^ - ^ 2025年6月30日,百度正式開源文心大模型4.5系列,以**10款全維度模型矩陣**(0.3B至424B參數)刷新國產開源模型的技術邊界。這不僅是參數規模的躍進…

【自存用】mumu模擬器+mitmproxy配置

一、 安裝證書 下載mitmproxy進行安裝。cmd 輸入 mitmdump產生證書在C:\Users\賬號名.mitmproxy找到mitmproxy-ca.p12,雙擊進入證書導入向導,一直點下一頁,直到選擇證書存儲的地方選擇【受信任的根證書頒發機構】,后面的繼續點【是】或【完成…

Java中的字符串 - String 類

在C語言中若要表示字符串只能使用字符數組或者字符指針,Java語言則專門提供了 String 類,在面向對象編程中具有重要地位。在開發和校招筆試中,字符串也是常客。 目錄 一、字符串的構造 二、常用方法 2.1 字符串的拼接 2.2 字符串之間的比…

[網安工具] Web 漏洞掃描工具 —— AWVS · 使用手冊

🌟想了解其它網安工具?看看這個:[網安工具] 網絡安全工具管理 —— 工具倉庫 管理手冊 Acunetix | Web Application Security ScannerAcunetix is an end-to-end web security scanner that offers a 360 view of an organization’s securi…

丑數-優先隊列/三指針/動態規劃

丑數 Solution 核心思路&#xff1a; 注意的幾個點&#xff1a; 1.優先隊列改變排序&#xff1a; priority_queue<int,vector<int>,greater<int>> q;2.用來判斷是否訪問過&#xff0c;可以用unordered_set 注意set的插入用的是insert而不是push unorder…

FPGA(或者數字電路)中組合邏輯和時序邏輯是怎么劃分的

1.組合邏輯 在FPGA中&#xff0c;組合邏輯是哪些沒有觸發器作為存儲單元的電路 LUT查找表就是組合邏輯電路&#xff0c;無時鐘信號參與。 加法器&#xff0c;邏輯門&#xff0c;多路選擇器&#xff0c;譯碼器2.時序邏輯電路 輸出依賴于當前輸入&#xff0c;還依賴于過去 觸發器…

【音視頻】WebRTC 中的RTP、RTCP、SDP、Candidate

一、RTP 1.1 RTP協議介紹 在 WebRTC 中&#xff0c;RTP&#xff08;Real-time Transport Protocol&#xff0c;實時傳輸協議&#xff09;是音視頻媒體數據傳輸的核心協議&#xff0c;負責實時數據的封裝、傳輸與解封裝&#xff0c;為實時交互提供時序、同步、分片重組等關鍵能…

accept函數及示例

這次我們介紹 accept 函數&#xff0c;它是 TCP 服務器用來接受客戶端連接請求的核心系統調用。1. 函數介紹 accept 是一個 Linux 系統調用&#xff0c;專門用于TCP 服務器&#xff08;使用 SOCK_STREAM 套接字&#xff09;。它的主要功能是從監聽套接字&#xff08;通過 liste…

【Java】在一個前臺界面中動態展示多個數據表的字段及數據

企業的生產環境中&#xff0c;如果不允許直接操作數據表中的數據&#xff0c;則需要開發一個前臺界面&#xff0c;在必要時實現對多個數據表中數據的增刪改查&#xff0c; 此時就需要后端將Oracle表字段及數據查詢返回前端動態展示…… 一、Oracle特定元數據查詢 使用JDBC獲取O…

MySQL(174)如何理解MySQL的多版本并發控制(MVCC)?

MySQL的多版本并發控制&#xff08;MVCC, Multi-Version Concurrency Control&#xff09;是一種用于實現高并發性的機制&#xff0c;它允許多個事務同時讀取和寫入數據&#xff0c;而不會相互阻塞。MVCC主要在InnoDB存儲引擎中實現&#xff0c;通過維護數據的多個版本來實現一…

Docker--將非root用戶添加docker用戶組,解決頻繁sudo執行輸入密碼的問題

一、為什么要有docker用戶組&#xff1f; 根本原因&#xff1a; Linux的設備訪問權限控制機制 Docker守護進程&#xff08;dockerd&#xff09;運行時會創建一個特殊的Unix套接字文件&#xff0c;如&#xff1a;/var/run/docker.sock。 這個文件就像一個“門”&#xff0c;所有…