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

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

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

具体下载地址 这里

powershell 复制代码
git clone https://www.modelscope.cn/datasets/BJQW14B/bs_challenge_financial_14b_dataset.git

具体目录如下:

这里直接使用已经识别的纯文本数据,即pdf_txt_file目录下的文件。

选择词向量模型

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

这里

powershell 复制代码
git clone https://www.modelscope.cn/Jerry0/m3e-base.git

读取与清洗数据

1, 读取文件列表

python 复制代码
import os

dir_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 = line
                name = name.split(":")[-1]                
                break
        if name == "" :
            pattern = ".*股份有限公司\n"
            for line in lst:            
                if re.match(pattern, line): 
                    name = line
                    if ":" 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 os

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

(3)然后对文件名做最后的筛选,公司名称一般不超过20个字符。

python 复制代码
new_files = []
for item_file in files:
    if len(item_file) > 20:
        continue
    else:
        if " " in item_file:
            continue
        if "、" in item_file:
            continue
        new_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:
            continue
        documents.extend(loader.load())
    return documents

file_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 RecursiveCharacterTextSplitter

text_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目录保存到磁盘上
)

会自动保存到磁盘上:

数据清洗和切片已完毕。

相关推荐
西柚小萌新几秒前
python--在服务器上面创建conda环境
服务器·python·conda
WW、forever1 分钟前
【服务器】服务器进程运行不受本地终端影响的方法总结
服务器·python
blues_C25 分钟前
Pytest-Bdd vs Behave:选择最适合的 Python BDD 框架
自动化测试·python·pytest·测试框架·bdd
测试杂货铺26 分钟前
Appium怎样连接多台设备?
自动化测试·软件测试·python·测试工具·职场和发展·appium·测试用例
我是Superman丶38 分钟前
【自动化】Python SeleniumUtil 工具 开启开发者模式 自动安装油猴用户脚本等
运维·python·自动化
往日情怀酿做酒 V17639296381 小时前
Django基础之中间件
python·中间件·django
清弦墨客1 小时前
【蓝桥杯】46195.水仙花数
python·蓝桥杯
小oo呆1 小时前
【自然语言处理与大模型】Ollama拉取huggingface社区或modelscope社区的GGUF模型并部署
人工智能·python·自然语言处理
戴着眼镜看不清1 小时前
从腾讯云的恶意文件查杀学习下PHP的eval函数
android·python·gpt·学习·网络安全·木马·中转api
东方不败之鸭梨的测试笔记2 小时前
多进程、多线程、分布式测试支持-pytest-xdis插件
python