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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;模型构建与预测方法项目意义与应用前景相关可视化展示总结每文一语有需要本项目的代码或文档以及…