二、基于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目录保存到磁盘上
)

会自动保存到磁盘上:

数据清洗和切片已完毕。

相关推荐
小九九的爸爸16 分钟前
前端想要入门Agent开发,要具备哪些Python基础?
python·agent·ai编程
AlbertZein17 分钟前
别只盯着最强模型了,Agent 场景更该看这类 Flash 档模型
aigc·openai·ai编程
ZzT30 分钟前
公司用 AI 筛简历,他写了个 AI 帮你挑公司
面试·aigc·ai编程
阿耶同学1 小时前
手把手教你用 LangGraph 搭建三层嵌套 Agent 架构
python·程序员
leeyi3 小时前
中间件系统:在 Agent 执行流中插入自定义逻辑
aigc·agent·ai编程
刘棕霆7 小时前
25—AI Skill 测评结果能否跨次比较:SkillSentry 从一次性测评到质量基础设施
aigc·ai编程·测试
怕浪猫8 小时前
第7章 检索增强生成:打造知识库驱动型Agent
aigc·openai·ai编程
小和尚同志17 小时前
AI 自动化测试探索(二):Chrome-devtools MCP
人工智能·e2e·aigc
花酒锄作田17 小时前
Pydantic校验配置文件
python