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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;所有…