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

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

这里选择 《博金大模型挑战赛-金融千问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, 读取文件列表

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

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

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

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

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

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加载文件

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的时候遗漏相关信息

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里

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转化成词向量,保存到向量数据库中。

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.mzph.cn/diannao/64463.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【FFmpeg 教程 一】截图

本章使用 ffmpeg 实现观影中经常会用到的功能,截图。 以下给出两种方式。 课程需具备的基础能力:Python 1. 使用 subprocess 调用 FFmpeg 命令 import subprocess def extract_frame(video_path, output_image_path, timestamp"00:00:05")&qu…

Ionic 侧栏菜单

Ionic 侧栏菜单 Ionic 是一个强大的开源框架,用于构建高性能、高质量的移动端和网页应用程序。它基于流行的前端技术栈,如 HTML、CSS 和 JavaScript,并且紧密集成了 Angular、React 或 Vue.js 等前端框架。Ionic 的一个显著特点是其丰富的组件库,其中包括了侧栏菜单(Side…

maven使用Dependency-Check来扫描安全漏洞

在现代软件开发中,使用开源库和第三方依赖项已成为常态。然而,这些依赖项可能包含已知的安全漏洞,给应用程序带来潜在的风险。为了解决这个问题,OWASP Dependency-Check 应运而生。本文将介绍 OWASP Dependency-Check 的功能、安装…

meta-llama/Llama-3.2-1B 微调记录

踩坑: 1.刚开始部署在自己的windows电脑上,semgrep不支持windows ,然后就换了linux服务器 2.服务器没有梯子,huggingface无法访问,模型数据集无法下载 解决方法: 使用huggingface镜像网站下载模型&#xf…

双指针---有效三角形的个数

这里写自定义目录标题 题目链接 [有效三角形的个数](https://leetcode.cn/problems/valid-triangle-number/description/)问题分析代码解决执行用时 题目链接 有效三角形的个数 给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。 示例…

《通信电子电路》入门手册

因为大学这门课好多同学理解不了这门课 于是考完试后花了两天时间整理了这份笔记,在这分享给完全没有学懂这门课的同学,也帮助“理解概念才能学得进去”的同学入门 笔记:通信电子电路 入门手册 —— flowus笔记 对应:《通信电子…

对AI现状和未来发展的浅见

我认为人工智能(AI)的发展正在逐步向更高层次的通用智能(AGI)迈进,但目前的技术仍然有很大差距。以下是我对AI的认识以及对其未来发展的看法。 1. 机器思维与人类思维的对比 机器思维:一功能对一功能 想象你…

基于单片机的智能水表的设计

1总体设计 本次设计智能IC卡水表,在系统架构上设计如图2.1所示,由STM32F103单片机,YF-S401霍尔型传感器,RFID模块,OLED12864液晶,按键,继电器等构成,在功能上可以实现水流量的检测,…

LA2016逻辑分析仪使用笔记1:测量引脚、解析串口数据

今日尝试学习使用LA2016逻辑分析仪:测量引脚 解析串口数据: 目录 逻辑分析仪: 实验接线: 基础操作: 选择使用到的通道: 设置采样时间、采样频率: 设置电平标准: 解析串口数据、测量串…

[论文阅读]Universal and transferable adversarial attacks on aligned language models

Universal and transferable adversarial attacks on aligned language models http://arxiv.org/abs/2307.15043 图 1:Aligned LLMs 不是对抗性 Aligned。我们的攻击构建了一个单一的对抗性提示,该提示始终绕过最先进的商业模式(包括 ChatG…

鸿蒙-应用内悬浮窗

//悬浮窗工具类 import { window } from kit.ArkUI; import { BusinessError } from kit.BasicServicesKit; import { Logger } from mbbase/common-ui; import * as FloatedWindowPage from ./FloatedWindowPage; // 导入命名路由页面 const TAG [FloatedWindowUtils]; ex…

【C++】小乐乐求和题目分析n变量类型讨论

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述💯解题分析💯为什么 n 需要是 long long问题重点:中间计算水平上的数据类型不足的例子:正确解决:将 n 设…

计算机基础知识——数据结构与算法(一)(山东省大数据职称考试)

大数据分析应用-初级 第一部分 基础知识 一、大数据法律法规、政策文件、相关标准 二、计算机基础知识 三、信息化基础知识 四、密码学 五、大数据安全 六、数据库系统 七、数据仓库. 第二部分 专业知识 一、大数据技术与应用 二、大数据分析模型 三、数据科学 数据结构与算法…

WebView通过@JavascriptInterface 调用原生方法

1. 创建 WebView 和设置 WebView 设置 在 XML 布局中添加 WebView 在activity_main.xml里创建一个WebView控件 <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schem…

python:用 sklearn.metrics 评价 K-Means 聚类模型

sklearn 的 metrics 模块提供的聚类模型评价指标如下&#xff1a; ARI 评价法&#xff08;兰德系数&#xff09;: adjusted_rand_score AMI 评价法&#xff08;相互信息&#xff09;: adjusted_mutual_info_score V-measure 评分 : completeness_score FMI 评价法 : fowlkes_m…

基于AI对话生成剧情AVG游戏

游戏开发这个领域&#xff0c;一直有较高的学习门槛。作为一个非专业的游戏爱好者&#xff0c;如果想要开发游戏&#xff0c;往往受制于游戏引擎的专业程度&#xff0c;难以完成复杂的游戏项目。 AI IDE的诞生&#xff0c;提供了另外的一种思路&#xff0c;即通过AI 生成项目及…

mac电脑可以使用的模拟器

BlueStacks Air 推荐-》亲测可用 BlueStacks Air https://www.bluestacks.com 支持macOS/Windows&#xff0c;刚新增了对Apple Silicon系列M芯片的支持 GameLoop https://www.gameloop.com/ 支持 macOS/Windows Genymotion https://www.genymotion.com/ 支持Android/macO…

qt 类中的run线程

在Qt中&#xff0c;QThread类的run()方法是线程的执行入口&#xff0c;它是由QThread内部自动调用的&#xff0c;而不是用户直接调用。 详细解释&#xff1a; QThread类&#xff1a; QThread是Qt的线程类&#xff0c;提供了用于多线程操作的接口。我们可以创建QThread对象并将…

ElasticSearch 数据聚合与运算

1、数据聚合 聚合&#xff08;aggregations&#xff09;可以让我们极其方便的实现数据的统计、分析和运算。实现这些统计功能的比数据库的 SQL 要方便的多&#xff0c;而且查询速度非常快&#xff0c;可以实现近实时搜索效果。 注意&#xff1a; 参加聚合的字段必须是 keywor…

人工智能浪潮来袭:2024年技术革命与产业变革深度解析@附64页PDF文件下载

随着2024年的到来&#xff0c;人工智能&#xff08;AI&#xff09;技术正以前所未有的速度、广度和深度改变着我们的生产和生活方式。在这篇深度解析中&#xff0c;我们将带您一探AI技术的最新发展、产业应用的现状以及未来的安全治理趋势。 技术革命&#xff1a;AI技术的新范…