二、使用langchain搭建RAG:金融问答机器人--数据清洗和切片

ops/2024/12/22 16:23:35/

选择金融领域的专业文档作为源文件

这里选择 《博金大模型挑战赛-金融千问14b数据集》,这个数据集包含若干公司的年报,我们将利用这个年报搭建金融问答机器人
具体下载地址 这里

在这里插入图片描述

git clone https://www.modelscope.cn/datasets/BJQW14B/bs_challenge_financial_14b_dataset.git

具体目录如下:
在这里插入图片描述
这里直接使用已经识别的纯文本数据,即pdf_txt_file目录下的文件。

选择词向量模型

这里选用m3e-base。M3E是专注于中文文本处理,具有强大的文本处理能力和灵活的部署选项,适合资源受限或需要私有化的应用场景

这里

在这里插入图片描述

git clone https://www.modelscope.cn/Jerry0/m3e-base.git

读取与清洗数据

1, 读取文件列表

python">import osdir_path = "bs_challenge_financial_14b_dataset/pdf_txt_file"
all_files = os.listdir(dir_path)
print(all_files)

在这里插入图片描述
2,清洗数据
从结果我们可以观察到文件名都是乱码,我们需要把文件名改成公司名,可以一看就看出是哪个公司的年报,并且在后续处理的时候把公司名加入到每个chuck中,在后续检索的时候对应指定公司的query就能匹配这个公司相关的一系列信息。
(1),读取数据

python">import re
for file in all_files:with open(os.path.join(dir_path, file), "r",encoding = "utf-8") as f:lst = f.readlines()pattern = ".*发行人.*股份有限公司\n"name = ""         for line in lst[-20:]:            if re.match(pattern, line): name = linename = name.split(":")[-1]                breakif name == "" :pattern = ".*股份有限公司\n"for line in lst:            if re.match(pattern, line): name = lineif ":" in name:name = name.split(":")[-1]                break        name = name.strip() #找到公司名后:创建一个新文件夹存放if name != "" :           print(file,name)try:with open("financial_dataset/{}.txt".format(name), "w",encoding = "utf-8") as f:for line in lst:f.write(line)except Exception as e:print(e)continue

(2)经过研究,文本里会含有多个股份有限公司,所以想过滤一次“.*发行人.*股份有限公司”,再过滤“.*股份有限公司” 。然后把新文件放到独立的目录下

python">import osdir_path = "financial_dataset"
files = os.listdir(dir_path)
files

在这里插入图片描述
(3)然后对文件名做最后的筛选,公司名称一般不超过20个字符。

python">new_files = []
for item_file in files:if len(item_file) > 20:continueelse:if " " in item_file:continueif "、" in item_file:continuenew_files.append(item_file)
new_files

在这里插入图片描述
至此数据清洗完毕。如果还有其他需求可以自行再根据规则清洗。

读取无结构文本内并切片

1,使用UnstructuredFileLoader加载文件

python">def get_all_text(file_list):documents = []#遍历所有目标文件#使用tqdm可视化库,以时间轴的形式展示出来for one_file in tqdm(file_list):print(one_file)file_suffix = one_file.split(".")[-1]if file_suffix == "txt":loader = TextLoader(one_file,encoding = "utf-8")else:continuedocuments.extend(loader.load())return documentsfile_list = [os.path.join(dir_path, item) for item in new_files]
docs = get_all_text(file_list)

在这里插入图片描述
2,数据切片
由于1个文档的内容比较多,超过大模型的上下文窗口限制,所以需要把数据切片。
调用langchain里的text_splitter分割为chunk,每个chunk设置为350个大小,同时overlap为150,也就是前一个chunk的后150个字符跟后一个chunk的前150个字符是一样的。通过这样的方式避免在分chunk的时候遗漏相关信息

python">from langchain.text_splitter import RecursiveCharacterTextSplittertext_splitter = RecursiveCharacterTextSplitter(chunk_size=350, chunk_overlap=150)
split_docs = text_splitter.split_documents(docs)
print(split_docs[0])

在这里插入图片描述
可以看page_content里没公司名称,但我们在query的时候希望与公司相关,所有把公司名也放到page_content里

python">for one_chunk in split_docs:one_chunk.page_content = one_chunk.metadata["source"].split("/")[-1] +  one_chunk.page_content + one_chunk.metadata["source"].split("/")[-1]
print(split_docs[0])

在这里插入图片描述

数据向量化并保存到向量数据库中

使用词向量模型把前面切分的chunk转化成词向量,保存到向量数据库中。

python">from langchain_huggingface import HuggingFaceEmbeddings
embeddings = HuggingFaceEmbeddings(model_name="m3e-base") from langchain.vectorstores import Chroma
# 定义持久化路径
persist_directory = 'data_base/chroma'
# 加载数据库
vectordb = Chroma.from_documents(documents=split_docs[:20000],#由于自己电脑性能有限,如果很久没完成的时候,可以重新启动执行,改成取1000或者500。记得删除已经生成的向量数据库文件。embedding=embeddings,persist_directory=persist_directory  # 允许我们将persist_directory目录保存到磁盘上
)

会自动保存到磁盘上:
在这里插入图片描述

数据清洗和切片已完毕。

项目源代码:https://gitee.com/ailianshuo/finance-bot


http://www.ppmy.cn/ops/144068.html

相关文章

智慧商城:购物车模块基本静态结构 + 构建vuex cart模块,获取数据存储(异步actions)

基本静态结构 静态结构直接 cv笔记中的内容 ,粘贴到 layout架子上的 cart组件中 给详情页底部的 首页 和 购物车 添加点击跳转事件 cart.vue中应用到的 van-Checkbox组件,进行该组件的引入注册 将数字框替换为之前封装好(两个-按钮中间的1那个输入框)的组…

如果模块请求http改为了https,测试方案应该如何制定,修改

作者:逍遥Sean 简介:一个主修Java的Web网站\游戏服务器后端开发者 主页:https://blog.csdn.net/Ureliable 觉得博主文章不错的话,可以三连支持一下~ 如有疑问和建议,请私信或评论留言! 前言 将模块的请求协…

电脑频繁弹出“缺少d3dcompiler_47.dll”提示?“缺少d3dcompiler_47.dll”要怎么解决?

电脑频繁弹出“缺少d3dcompiler_47.dll”提示?一文带你了解原因与解决方案 在日常使用电脑的过程中,不少用户可能会遇到系统频繁弹出“缺少d3dcompiler_47.dll”的提示。这个看似陌生的文件名,实则对电脑游戏的运行至关重要。d3dcompiler_47…

【UBUNTU 20】环境变量

查看环境变量 # 查看所有环境变量 export env# 查看指定环境变量 echo $PATH修改环境变量 命令式修改 立即生效仅在当前终端窗口有效,窗口关闭后无效仅对当前用户有效 export PATH${HOME}:$PATH修改 ~/.bashrc 永久有效仅对当前用户有效 vim ~/.bashrc# 在最后…

TypeScript与JavaScript的区别

本文我们要聊一聊 TypeScript 和 JavaScript 之间的区别。可能我们已经注意到,TypeScript 是 JavaScript 的超集,那么它到底比 JavaScript 多了些什么?为什么我们要选择 TypeScript,而不仅仅是写普通的 JavaScript 呢?…

从监控异常发现网络安全

前言 最近在前端异常监控系统中,发现一些异常信息,从中做了一些分析,得到一些体会,因此作文。 发现异常 某天早上打开监控系统发现,当天凌晨1点过测试环境有2个前端上报的异常,报错的原因都是由于没有获取…

华为OD --- TLV解码

华为OD --- TLV解码 题目独立实现理解思路AC源码 题目 独立实现 理解 个人认为这题最大的难点就是理解题目 以测试用例举个🌰 31 32 01 00 AE 90 02 00 01 02 30 03 00 AB 32 31 31 02 00 32 33 33 01 00 CC题目需要找到tag 31对应的value值. 示例中第一个tag值为…

uniapp navigateTo、redirectTo、reLaunch等页面路由跳转方法的区别

uni.switchTab 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面 // app.json {"tabBar": {"list": [{"pagePath": "index","text": "首页"},{"pagePath": "other","text&…