Langchain-Chatchat之pdf转markdown格式

优化Langchain-Chatchat的PDF处理:Markdown格式与表格关系保留,


背景

在使用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

<think>好的,用户之前问过有没有类似FastGPT的一键部署工具,我推荐了包括LangChain-Chatchat在内的几个选项。现在用户具体询问如何部署LangChain-Chatchat,我需要详细说明步骤。首先,我需要回忆之前提供的部署命令是否准确,可能用户已经尝试过但遇到了问题,或者需要更详细的指导。 用户可能是开发者或者有一定技术背景的人,想要自己搭建一个中文知识库问答系统。他们可能更关心具体的步骤、依赖项、配置以及常见问题的解决方法。我需要分步骤讲解,确保每个环节都清晰,比如环境准备、克隆仓库、安装依赖、配置模型、启动应用等。 同时,用户可能对本地模型和在线模型的选择有疑问,需要说明两者区别和配置方法。另外,常见问题如端口冲突、依赖安装失败、模型加载问题,这些都需要预先给出解决方案,帮助用户避免踩坑。 还要注意用户可能是在不同的操作系统上部署,比如Linux或Windows,但根据项目文档,可能主要支持Linux,需要明确指出。此外,硬件要求如RAM和GPU是否必要,也需要提及,特别是如果用户资源有限,可能需要调整模型选择。 最后,提供官方文档链接和社区支持,方便用户进一步查阅。确保回答结构清晰,步骤详细,同时语言简洁易懂,避免过于技术化的术语,但又要足够准确。</think>以下是 **LangChain-Chatchat 的详细部署指南**,涵盖本地与云端部署流程,建议根据硬件条件选择方案: --- ### **一、基础环境准备** 1. **硬件要求** - **最低配置**:CPU 4核 / 内存 16GB(运行小模型如 ChatGLM3-6B) - **推荐配置**:GPU 显存 ≥ 16GB(运行 Qwen-72B 等大模型) 2. **软件依赖** - Python 3.8+ - CUDA 11.7+(如需 GPU 加速) - Git、Docker(可选) --- ### **二、本地部署步骤** #### **1. 克隆代码库** ```bash git clone https://github.com/chatchat-space/Langchain-Chatchat.git cd Langchain-Chatchat ``` #### **2. 安装依赖** ```bash # 使用官方安装脚本(自动处理Python包) python install.py # 或手动安装 pip install -r requirements.txt --upgrade ``` #### **3. 配置模型路径** 修改 `configs/model_config.py`: ```python # 示例:使用智谱AI的在线API(快速体验) MODEL_ROOT_PATH = "zhipuai" API_KEY = "your_api_key_here" # 若使用本地模型(需提前下载模型文件) # MODEL_ROOT_PATH = "/path/to/your/models" # 例如使用 ChatGLM3-6B: # MODEL_PATH = {"chatglm3-6b": "THUDM/chatglm3-6b"} ``` #### **4. 初始化知识库** ```bash # 生成默认向量数据库(需要约5分钟) python init_database.py --recreate-vs ``` #### **5. 启动应用** ```bash # 启动API服务(默认端口: 7861) python startup.py -a # 启动Web界面(默认端口: 8501) python startup.py --all-webui ``` --- ### **三、云端部署(Docker方案)** #### **1. 构建镜像** ```bash docker build -t langchain-chatchat:latest . ``` #### **2. 运行容器** ```bash # 映射端口并挂载模型目录 docker run -d --name chatchat \ -p 7861:7861 -p 8501:8501 \ -v /path/to/models:/app/models \ langchain-chatchat:latest ``` --- ### **四、关键配置说明** 1. **模型选择** - **本地模型**:需提前从 HuggingFace 或 ModelScope 下载模型文件 - **在线API**:支持智谱AI、百度文心、OpenAI等(需申请API Key) 2. **知识库管理** - 支持格式PDF/TXT/Markdown/Word - 添加文件:将文档放入 `knowledge_base` 目录后,通过Web界面上传 3. **性能优化** ```python # 修改 configs/server_config.py HTTPX_DEFAULT_TIMEOUT = 300 # 超时时间 VECTOR_SEARCH_TOP_K = 5 # 检索结果数量 ``` --- ### **五、常见问题排查** | **问题现象** | **解决方案** | |---------------------------|---------------------------------------| | 启动时报错 `CUDA out of memory` | 换用小模型 / 减少 `MAX_GPU_MEMORY` 参数 | | 知识库检索结果不准确 | 检查文档分块长度(建议 500-800字) | | API请求超时 | 调整 `HTTPX_DEFAULT_TIMEOUT` 至 600 | | 端口冲突 | 修改 `configs/server_config.py` 中的端口号 | --- ### **六、官方资源** - GitHub仓库:https://github.com/chatchat-space/Langchain-Chatchat - 在线Demo:https://chatchat.arcsoft.com.cn - 中文文档:https://langchain-chatchat.readthedocs.io --- **提示**:首次部署建议优先使用 **在线API模式**(如智谱AI),避免本地模型下载和硬件兼容性问题。若需定制功能,可修改 `server_config.py` 中的路由逻辑。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铁柱同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值