Langchain-Chatchat之pdf转markdown格式

news2024/12/26 10:58:47

文章目录

    • 背景
    • 开发环境
    • 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

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

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

相关文章

【Linux】Linux下centos更换国内yum源

🌱博客主页:青竹雾色间 🌱系列专栏:Linux 😘博客制作不易欢迎各位👍点赞⭐收藏➕关注 目录 1. 备份旧的 YUM 源文件2. 下载国内的 YUM 源文件阿里云:网易: 3. 清理 YUM 缓存4. 更新…

【c++leetcode】69. Sqrt(x)

问题入口 二分搜索 最困难的是能否意识到用二分搜索法解题。 算术平方根的区间在[1, x] 。代码如下&#xff1a; class Solution { public:int mySqrt(int x) {if (x 1 || x 0){return x;}int64_t start 1;int64_t end x;while (start < x){int64_t mid start (en…

开箱元宇宙| 探索家乐福如何在The Sandbox 中重新定义零售和可持续发展

有没有想过 The Sandbox 如何与世界上最具代表性的品牌和名人的战略保持一致&#xff1f;在本期的 "开箱元宇宙 "系列中&#xff0c;我们与家乐福团队进行了对话&#xff0c;这家法国巨头率先采用web3技术重新定义零售和可持续发展。 家乐福的用户平均游玩时间为 57 …

06_知识点总结(JS高级)

一、进程与线程 1. 进程(process)&#xff1a;程序的一次执行, 它占有一片独有的内存空间 2. 线程(thread)&#xff1a; 是进程内的一个独立执行单元&#xff0c;CPU的基本调度单元, 是程序执行的一个完整流程 3. 进程与线程 * 应用程序必须运行在某个进程的某个线程上 * 一个…

tinyrenderer-渲染器着色

整理了代码&#xff0c;创建了一个相机类&#xff0c;控制镜头 class Camera { public:Camera(Vec3f cameraPos, Vec3f target, Vec3f up):cameraPos_(cameraPos), target_(target), up_(up) {}Matrix getView();Matrix getProjection(); private:Vec3f cameraPos_;Vec3f targ…

来自学术界的知识库 RAG 调优方案实践(一)

背景介绍 在之前的文章详细梳理过工业界的 RAG 方案 QAnything 和 RagFlow&#xff0c;这次主要整理下来自学术界的一系列 RAG 优化方案。 主要关注优化方案对应的设计思想以及相关的实现&#xff0c;希望可以对大家的 RAG 服务效果提升有所帮助。 基础介绍 在综述论文 Ret…

【ARM+Codesys案例】T3/RK3568/树莓派+Codesys锂电池测试设备控制解决方案

锂电池诞生于上世纪60年代&#xff0c;90年代开始由日本索尼公司实现商业化。锂离子电池凭借快速充放电、长循环寿命、无记忆效应等众多优点&#xff0c;成为当今数码产品及电动汽车大规模应用的第一选择。与镍氢电池、铅酸电池相比&#xff0c;锂电池可以存储更多电能。现在&a…

Word如何绘制三线表及设置磅值

插入表格&#xff0c; 开始 边框 边框和低温 设置磅值 先全部设置为无边框 上边 1.5 0.5 以上内容未完善&#xff0c;请等待作者更新

春秋云境CVE-2018-20604

简介 雷风影视CMS是一款采用PHP基于THINKPHP3.2.3框架开发&#xff0c;适合各类视频、影视网站的影视内容管理程序&#xff0c;该CMS存在缺陷&#xff0c;可以通过 admin.php?s/Template/edit/path/*web*..*..*..*..*1.txt 的方式读取任意文件。 正文 1.进入靶场 2./admin…

机器学习(五) -- 监督学习(4) -- 集成学习方法-随机森林

系列文章目录及链接 上篇&#xff1a;机器学习&#xff08;五&#xff09; -- 监督学习&#xff08;3&#xff09; -- 决策树 下篇&#xff1a;机器学习&#xff08;五&#xff09; -- 监督学习&#xff08;5&#xff09; -- 线性回归1 前言 tips&#xff1a;标题前有“***”…

pip安装软件包提示“没有那个文件或目录”问题的处理

文章目录 一、Python.h&#xff1a;没有那个文件或目录二、lber.h&#xff1a;没有那个文件或目录 一、Python.h&#xff1a;没有那个文件或目录 pip install -I python-ldap3.0.0b1 #异常提示In file included from Modules/LDAPObject.c:3:0:Modules/common.h:9:20: 致命错…

zabbix配置自动发现规则模版-snmp

配置-->模版-->创建模版 找到刚才创建的模版进行编辑 创建一个自动发现规则&#xff08;SNMP OID 一般配置表中较有代表性的字段的OID&#xff09; 修改监控项原型 创建一台主机并链接模版 测试&#xff0c;获得预计自动发现的监控项的值 上述测试不为空&#xff0c…

OWASP十大API漏洞解析:如何抵御Bot攻击?

新型数字经济中&#xff0c;API是物联网设备、Web和移动应用以及业务合作伙伴流程的入口点。然而&#xff0c;API也是犯罪分子的前门&#xff0c;许多人依靠Bot来发动攻击。对于安全团队来说&#xff0c;保护API并缓解Bot攻击至关重要。那么Bot在API攻击中处于怎样的地位&#…

动手学操作系统(三、通过IO接口直接控制显卡)

动手学操作系统&#xff08;三、通过IO接口直接控制显卡&#xff09; 在之前的学习内容中&#xff0c;我们成功编写了MBR主引导记录&#xff0c;在终端上进行了打印显示&#xff0c;在这一节我们使用MBR通过IO接口来直接控制显卡输出字符。 文章目录 动手学操作系统&#xff0…

物联网在IT/OT融合中的作用有哪些?——青创智通

工业物联网解决方案-工业IOT-青创智通 制造业等重工业正处于大规模数字化转型之中。这种转变的一部分是一种称为IT/OT融合的做法&#xff0c;这种做法带来了一些独特的安全风险。企业需要物联网来解决这些问题。 什么是IT/OT融合&#xff1f; IT/OT融合是信息技术&#xff08…

ue引擎游戏开发笔记(47)——设置状态机解决跳跃问题

1.问题分析&#xff1a; 目前当角色起跳时&#xff0c;只是简单的上下移动&#xff0c;空中仍然保持行走动作&#xff0c;并没有设置跳跃动作&#xff0c;因此&#xff0c;给角色设置新的跳跃动作&#xff0c;并优化新的动作动画。 2.操作实现&#xff1a; 1.实现跳跃不复杂&…

vr数字成果展在线展示突破用户传统认知

想要轻松搭建一个充满互动与创意的3D数字展厅吗?vr互动数字展厅搭建编辑器将是您的不二之选!华锐视点3D云展平台提供的vr互动数字展厅搭建编辑器将空间重建与互动制作完美结合&#xff0c;让您轻松实现3D空间的搭建与互动营销制作。 在vr互动数字展厅搭建编辑器的帮助下&#…

设计软件有哪些?建模和造型工具篇(3),渲染100邀请码1a12

这次我们接着介绍建模工具。 1、FloorGenerator FloorGenerator是由CG-Source开发的3ds Max插件&#xff0c;用于快速创建各种类型的地板和瓷砖。该插件提供了丰富的地板样式和布局选项&#xff0c;用户可以根据需要轻松创建木质地板、石板地板、砖瓦地板等不同风格的地面。F…

CSS弹窗

CSS 曲线弹窗和气泡弹窗小笔记&#xff0c;高德地图 let content [<div class"overview-bus-info-window">,<div class"line1"></div><div class"line2"></div>,<div class"title">${data.plat…

visio生成pdf文件有黑边(边框),插入latex输出有边框

解决办法&#xff1a; 1 文件-导出pdf-点击“选项” 2 选择取消勾选