Langchain-Chatchat之pdf转markdown格式

文章目录

    • 背景
    • 开发环境
    • loader文本解析步骤
    • markdown格式的文本
      • 为什么选择markdown格式
      • 测试markdown格式提取表格
        • 原pdf表格
        • markdown格式的表格
    • 测试markdown格式的知识库
      • 运行项目
      • 修改文件加载器loader
    • 其他问题
      • 运行项目报错
        • 查看系统当前的max_user_watches
        • 修改sysctl.conf配置
      • 图片提取问题
        • 怎么提取图片内容
      • 使用Milvus向量库报错

背景

在使用Langchain-Chatchat做RAG的时候,发现导入的pdf文件中的表格关系无法保存,导致LLM的回答不符合预期。例如我想问的内容在表格中,但LLM的回答并不是对表格的总结。
那么想要解决这个问题,就需要找到一种合适的文本格式来保留表格间的关系,然后修改Langchain-Chatchat的文本加载源码,使pdf文本转换成目标的文本格式,也就是本篇的markdown格式。

开发环境

  • RAG框架: Langchain-Chatchat
  • 大模型: Qwen1.5-14B-Chat
  • 资源要求: GPU显存
    • 14B双精度约等于14*2,加上embeding模型,大约30G的显存
    • CPU>8核即可
  • Prompt: 使用Langchain-Chatchat为知识库配置的默认Prompt。

loader文本解析步骤

Langchain-Chatchat默认对pdf文件使用的loader是mypdfloader.py,解析文档的流程如下:

  1. 调用server/api.py中的/knowledge_base/upload_docs 上传文档
  2. 通过KnowledgeFile这个类来实现文档解析,文档分词等功能
  3. 调用mypdfloader.py加载pdf文件,使用pyMuPDF包的fitz解析pdf文档
  4. 获取pdf中的text内容
  5. 针对图片使用ocr模块进行解析,获取图片中的文本
  6. text和图片文本连接到一起,作为文档的内容
  7. 调用unstructured.partition.text import partition_text 进行文本段落划分
  8. 使用默认的ChineseRecursiveTextSplitter进行分词,存储到向量库

出问题的地方就在于加载pdf文件的部分,把表格作为普通的文本加载,自然就保存不了表格的关系了。

markdown格式的文本

Blog - Artifex
RAG分块策略的五个级别

为什么选择markdown格式

  1. markdown可以支持"基于文档的分块"
  2. 提取出markdown格式,支持保留表格的行,列关系
  3. 结构化的内容更有利于LLM大模型理解和上下文保存

在 LLM 和 RAG 环境中使用 Markdown 文本格式可确保更准确和相关的结果,因为它为 LLM 提供了更丰富的数据结构和更相关的数据块加载。

测试markdown格式提取表格

相比于text格式的分词来说,markdown格式的分词可以保留表格的数据和关系
,例如下面的表格。

原pdf表格

image.png

markdown格式的表格

image.png
可以看到表格关系都保留下来了。

测试markdown格式的知识库

运行项目

参考官方的开发环境搭建 即可。因为使用的是大模型是Qwen1.5-14B-Chat,因此需要更改模型配置文件的路径,读取Qwen1.5-14B-Chat。

# model_config.py
MODEL_ROOT_PATH = "你的本地模型地址path"
LLM_MODELS = ["Qwen1.5-14B-Chat"]
MODEL_PATH = {
  "llm_model":{
    "Qwen1.5-14B-Chat": "modelPath/Qwen1.5-14B-Chat",
  }
}

# server_config.py
FSCHAT_MODEL_WORKERS = {
  # 给Qwen-14b不同的启动端口,不然会默认使用default
    "Qwen1.5-14B-Chat": {
        "host": DEFAULT_BIND_HOST,
        "port": 21012,
        "device": LLM_DEVICE,
        "infer_turbo": False,
        # model_worker多卡加载需要配置的参数
        "gpus": "0,1,2,3", # 使用的GPU,以str的格式指定,如"0,1",如失效请使用CUDA_VISIBLE_DEVICES="0,1"等形式指定
        "num_gpus": 4, # 使用GPU的数量
    },
}

修改文件加载器loader

  1. 使用pdf4llm读取文件: https://pymupdf.readthedocs.io/en/latest/rag.html
    1. 安装 https://github.com/pymupdf/RAG/
  2. 修改document_loaders/mypdfloader.py
import pdf4llm
def pdf2markdown_text(filepath):
    doc = pdf4llm.to_markdown(filepath, pages=None)
    return doc

# pdf转markdown
from unstructured.partition.md import partition_md
text = pdf2markdown_text(self.file_path)
# 这里使用partition_md的分段
return partition_md(text=text, **self.unstructured_kwargs)
  1. 使用默认的ChineseRecursiveTextSplitter分词器
  2. web端页面新建知识库,导入pdf文件即可
  3. 测试表格问答效果
    1. 脚手架的搭设高度以及对应的安全等级
    2. pdf文档image.png
    3. 大模型回答image.png
    4. 可以看到保留了表格的关系,大模型做的总结是正确的。

其他问题

运行项目报错

raise OSError(errno.ENOSPC, "inotify watch limit reached")
OSError: [Errno 28] inotify watch limit reached

streamlit可能需要开启大量的inotify实例来监视文件系统的改动,因此可以手动增加max_user_watches的值来解决。
一般程序监视某个或某些目录的文件是否被创建、修改、删除等等就需要启动inotify实例,但是每一个inotify实例都需要消耗一定量的内存。

查看系统当前的max_user_watches
# 查看当前系统中的max_user_instances数量
cat /proc/sys/fs/inotify/max_user_instances
max_user_instances 控制着一个单一用户(或者用户ID,UID)可以创建的 inotify 实例的最大数量。

# 查看当前系统中的max_user_watches数量
cat /proc/sys/fs/inotify/max_user_watches
max_user_watches 控制着一个用户可以添加到所有 inotify 实例中的监视项(watches)的总数。

# 增大max_user_instances的值 (修改成10240还是启动不了,得修改成102400)
sudo sysctl -w fs.inotify.max_user_watches=102400

修改sysctl.conf配置
# 目前把这一行配置给加到/etc/sysctl.conf中去了,设置成102400
fs.inotify.max_user_watches=102400
# 执行一次sysctl.conf配置
sudo sysctl -p /etc/sysctl.conf
# 这样的好处是不需要重新启动系统即可应用更改,并且在每次系统启动时会自动将此值设置为 102400。

图片提取问题

经过测试,有的图片内容能提取出来,有的提取不出来 – 建议还是加一个图片提取函数

  1. 图片中的逻辑关系会丢失,例如:image.png
  2. 因为ppt排版中有文字和图片,会丢失一些逻辑关系,例如:文字1 图片1 ,在解析的时候会分别加载,失去了文字1 和图片1的逻辑关系
怎么提取图片内容
  1. 目前pdf4llm不支持图片的读取
  2. 可以看到在langchain中的使用,是文字提取+图片提取
    1. 参考:https://github.com/langchain-ai/langchain/blob/master/libs/community/langchain_community/document_loaders/parsers/pdf.py#L218
    2. _extract_images_from_page 函数
      1. 也是使用的OCR模块
    3. 不同的地方在于,langchain的pdfloader是text+img的方式。不是我们想要的markdown的方式,可以再添加一个提取图片的函数来完善markdown文件。

使用Milvus向量库报错

AssertionError: A list of valid ids are required when auto_id is False.
或
milvus error: KeyError: 'pk'

参考:https://github.com/langchain-ai/langchain/issues/17172
原因是Langchain-Chatchat中milvus的默认配置是auto_id=False,也就是说需要自己提供主键。但是在代码中没有发现有添加主键的部分,因此导入到milvus会报错。
修复方法也比较简单,直接在初始化Milvus的时候设置auto_id=True即可,如下:

    def _load_milvus(self):
        self.milvus = Milvus(embedding_function=EmbeddingsFunAdapter(self.embed_model),
         collection_name=self.kb_name,
         connection_args=kbs_config.get("milvus"),
         auto_id=True,
         index_params=kbs_config.get("milvus_kwargs")["index_params"],
         search_params=kbs_config.get("milvus_kwargs")["search_params"]
         )

end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/655632.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】直接选择排序详解!

文章目录 1.直接选择排序 1.直接选择排序 🐧 begin 有可能就是 maxi ,所以交换的时候,要及时更新 maxi 🍎 直接选择排序是不稳定的,例如: 9 [9] 5 [5],排序后,因为直接选择排序是会…

【Python编程实战】基于Python语言实现学生信息管理系统

🎩 欢迎来到技术探索的奇幻世界👨‍💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…

世界改变了我?还是我在改变着这个世界?-教育的魅力

目录 一、背景二、过程1.拥抱不确定性的心态2.应对变数的积极3.螺旋向上的能力4.突破自我的意志 三、总结 一、背景 现在这个时代唯一确定的就是不确定,社会发展太快了,尤其是中国的发展速度;大国生态人口生态。 有时候隐约中我自己也觉得和…

Linux源码编译安装MySQL + Qt连接MySQL

一、准备工作 1. 编译环境: 银河麒麟V10 飞腾D2000 CPU 2. 下载MySQL源码 这里编译的是5.7.44版本,带Boost库,这是官网的下载地址:MySQL :: Download MySQL Community Server (Archived Versions) 3. 解压压缩包 tar -zxvf mys…

springcloud-服务拆分与远程调用

一 微服务 1.1简单了解 SpringCloud SpringCloud是目前国内使用最广泛的微服务框架。官网地址:Spring Cloud。 SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验&#xff1a…

ChatGPT自然科学应用,R语言lavaan结构方程模型、copula函数

R语言lavaan结构方程模型(SEM) 结构方程模型(Sructural Equation Modeling,SEM)是分析系统内变量间的相互关系的利器,可通过图形化方式清晰展示系统中多变量因果关系网,具有强大的数据分析功能和…

大模型部署_书生浦语大模型 _作业2

本节课可以让同学们实践 4 个主要内容,分别是: 1、部署 InternLM2-Chat-1.8B 模型进行智能对话 1.1安装依赖库: pip install huggingface-hub0.17.3 pip install transformers4.34 pip install psutil5.9.8 pip install accelerate0.24.1…

微软为团队推出了 Copilot

微软希望使其生成式人工智能品牌对团队更有用,特别是跨公司和大型企业组织的团队。 在年度 Build 开发者大会上,微软宣布推出 Team Copilot,这是其 Copilot 系列生成式 AI 技术的最新扩展。 与微软之前的 Copilot 品牌产品不同,…

炸裂!AI五分钟模仿爆款IP故事,涨粉速度太绝了!

‍ ‍大家好,我是向阳。 今天我要分享一个利用AI技术模仿爆款账号的小技巧,帮助大家迅速增加粉丝。这个方法简单实用,尤其适用于副业和本地生活领域。接下来,我将为大家详细讲解操作步骤。让我们开始吧。 副业赚钱:模…

本地开发正常 线上CI/CD构建项目过程报错文件未能正确引用

问题快照 原因分析: 一般遇到这样的错误就是 文件路径或者文件名称未能正确匹配 或者文件不存在 会报这样的错误 以为很好解决 但这次 都排查 了 就是 没发现原因 不管怎么说还是要感谢 GPT的能力(分析问题的能力) 先上图 当我看到 第四步的时候 我立马 去仓库里查…

Go Redis 实现邮件群发

一、安装 go get github.com/go-redis/redis/v8二、邮箱服务配置,以QQ邮箱为例 三、示例代码 package mainimport ("context""fmt"redis "github.com/go-redis/redis/v8""gopkg.in/gomail.v2""gopkg.in/ini.v1"&quo…

怎样查看JavaScript中没有输出结果的数组值?

在JavaScript中,可以方便地定义和使用数组,对于已经定义的数组,怎样查看其值呢? 看下面的示例,并运行它。 上面的示例中,标签不完整,请补充完整再试运行。你知道少了什么标签么? 注…

SEC批准以太坊ETF了吗?

原创 | 刘教链 隔夜BTC击穿了5日均线,回落至67k一线。凌晨传来美SEC批准以太坊ETF的消息,但是ETH上下插针,杵在3.8k,微微下跌。定睛仔细一看,SEC批准了,但又没完全批准,这特么是薛定谔的批准哈&…

本地部署 MiniCPM-Llama3-V 2.5

本地部署 MiniCPM-Llama3-V 2.5 0. 引言1. 性能评估2. 典型示例3. 本地部署4. 运行 WebUI Demo5. vLLM 部署 0. 引言 MiniCPM-Llama3-V 2.5 是 MiniCPM-V 系列的最新版本模型,基于 SigLip-400M 和 Llama3-8B-Instruct 构建,共 8B 参数量,相较…

AWS迁移与传输之AMS/MGN

AWS Application Migration Service(AWS Application Migration Service简称为AWS MGN,MGN是migration的缩写。)是一项全面的迁移服务,旨在帮助企业将其本地服务器和虚拟机迁移到云端,包括AWS和VMware Cloud on AWS。 …

【pyspark速成专家】11_Spark性能调优方法2

目录 ​编辑 二,Spark任务UI监控 三,Spark调优案例 二,Spark任务UI监控 Spark任务启动后,可以在浏览器中输入 http://localhost:4040/ 进入到spark web UI 监控界面。 该界面中可以从多个维度以直观的方式非常细粒度地查看Spa…

防止浏览器缓存了静态的配置等文件(例如外部的config.js 等文件)

防止浏览器缓存了静态的配置文件 前言1、在script引入的时候添加随机数1.1、引入js文件1.2、引入css文件2、通过html文件的<meta>设置防止缓存3、使用HTTP响应头:前言 在实际开发中浏览器的缓存问题一直是一个很让人头疼的问题,尤其是我们打包时候防止的静态配置文件c…

Linux线程:管理与控制

一、引言 随着计算机硬件技术的飞速发展&#xff0c;尤其是多核CPU的普及&#xff0c;多线程编程已成为充分利用系统资源、提高程序并发性和响应速度的关键技术。 多线程编程允许一个程序中同时运行多个线程&#xff0c;每个线程可以独立地执行不同的任务。这种并行处理的方式…

计算机操作系统体系结构

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天给大家讲讲操作系统。 当今的操作系统趋向于越来越复杂&#xff0c;因为它们提供许多服务&#xff0c;并支持各种硬件和软件资源&#xff08;请参见“操作系统思想&#xff1a;尽量保持简单”&#xff0…

Dynadot API调整一览

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…