
基于Agent的金融问答系统:RAG检索模块初建成 原创
前言
我们在上一章《【项目实战】基于Agent的金融问答系统之项目简介》中简单介绍了项目背景以及数据集情况,本章将介绍RAG模块的实现。
功能列表
参考之前所学内容《大模型之初识RAG》,我们需要实现如下功能:
- 向量库的基础功能
向量库
数据入库
- 文件导入
PDF文件的读取
PDF文件的切分
调用向量库接口入库
- 文件检索
连接向量库
检索器检索文件
开发过程
1、规划工程文件
项目开始之后,我们如果能够抑制住直接撸代码的冲动,改为提前做好规划,这会是一个好的习惯。 为此,我提前做了如下规划:
代码管理
- 代码使用Git进行管理,这样后期多人协作时方便代码更新、代码Merge、冲突解决等。
- 由于国内访问Github优势会ban,所以我们将代码仓库放在Gitee上。
- 为代码仓库起了一个响亮的名称后,仓库地址定为https://gitee.com/deadwalk/smart-finance-bot
项目目录
考虑这个项目会涉及到前端、后端、数据集、模型等,所以项目目录规划如下:
上述目录中,dataset
是直接使用git的submodul命令,直接将天池大赛提供的数据集引入到本项目中,方便后续使用。
引入方法:
命名规范
项目如果能够约束统一的命名规范,这对于后续代码的可读性、可维护性会提供需要便利,在此我沿用了约定俗成的代码命名规范:
- 类名:使用大驼峰命名法,例如:
MyClass
- 函数名:使用小驼峰命名法,例如:
my_function
- 变量名:使用小驼峰命名法,例如:
my_variable
- 文件夹:使用小驼峰命名法。
整体命名时,要尽量见文知意。
2、实现基本的连接大模型的util库
代码文件及目录:app/utils/util.py
在app/conf/.qwen中,添加对应的API KEY,例如:
3、实现向量库基础功能
向量库文件考虑使用Chroma实现,所以我们先实现一个向量库的类,用于完成基本的向量库连接、数据入库操作。
代码文件及目录:app/rag/chroma_conn.py
在实际项目实践过程中,我们发现导入Chroma数据时使用本地化连接方式更快一些,所以对连接方式做了两个参数的扩展,local 代表本地连接,http 代表远程连接。
4、实现入库功能
本着先跑通流程,再优化交互过程的思路,对于PDF文件入向量库的过程,我们先通过一段脚本实现(暂不做前端UI的交互)。
代码文件及目录:app/rag/pdf_processor.py
5、测试导入功能
因为Python的导入库的原因(一般都是从工作目录查找),所以我们在项目根目录下创建test_framework.py,方便后续统一测试工作。
代码文件: app/test_framework.py
1.通过命令行启动ChromaDB服务端:
2.运行test_framework.py
运行效果:
备注:一般测试框架会使用Pytest并且编写相应的单元测试函数,本次项目中由于项目较小且函数返回结果不固定,所以就没有写UnitTest。如果想了解Pytest的使用示例,可以参考我的其他代码仓库,例如:UnitTest的使用
6、实现检索功能
代码文件: app/rag/rag.py
以上是实现了一个使用基本检索器的RAG,其中:
- 代码中通过chroma_conn.py模块连接到ChromaDB数据库,并使用ChromaDB的as_retriever方法创建一个检索器。
7、测试检索效果
在test_framework.py中添加RAG的测试调用函数。
代码文件:app/test_framework.py
注释掉批量导入函数,开启test_rag()函数,运行效果:
至此,我们完成了RAG模块的基本功能,它包括PDF文件的批量导入以及检索功能。
内容小结
- 首先,我们创建了一个ChromaDB的类,封装了基础的Chroma连接、插入、检索。
- 其次,我们实现了PDFProcessor类,该类中会调用ChromaDB类的插入函数,将批量读取的PDF文件进行切分后保存至向量库。
- 然后,我们实现了RagManager类,该类中封装了RAG的检索链,并定义了检索的参数。
- 最后,我们实现了一个测试函数,用于测试RAG的检索功能。
- 除此之外,有两个注意事项:
在项目初期,进行合理的项目文件目录规划,可以有效减少项目维护的难度。
在项目行进中,通过搭建测试框架,可以方便函数验证以及后续重构的回归测试。
本文转载自公众号一起AI技术 作者:Dongming
原文链接:https://mp.weixin.qq.com/s/ZMwZSsmms03U-GRRwnxMNg
