Python MinerU DeepSeek PDF/Markdown 最后更新:

ChatPDF · 文档解读助手

ChatPDF 是一个命令行辅助脚本,专门用于解读和分析 PDF 文档。它能够将文档转换为更易于输入大模型的Markdown格式,并通过内容分片避免上下文窗口限制。支持本地文件与公开可得的在线文档,支持批量处理,可实现信息快速提取与深度解读,并生成结构化的分析/问答报告。

项目目标:为研究人员和文档分析者提供一个高效的文档信息提取/快速解读工具,通过 AI 技术实现对长文档的智能化解读和分析,输出清晰的结构化见解。

项目概览

ChatPDF 采用简洁的脚本式架构,通过 MinerU 实现 PDF 解析与格式转换,通过文档切分和DeepSeek的强大能力,实现对 PDF 文档中信息的快速提取与深度理解。 支持单一文件/批量文件,支持本地文件/url链接。用户可以根据文档内容自定义问题,对批量PDF中特定信息实现快速提取与格式化输出;也可以持续发问,前序问答将作为后续问答的上下文,实现深度解读。

Why

  • 现有LLM限制直接解读批量PDF文档
  • 长文档/批量解读受上下文窗口限制
  • 快速提取信息并结构化输出的需求
  • 提高批量文档深度解读效率

What

  • 利用MinerU转换PDF
  • 智能文档分片处理
  • 自动去重与答案整合
  • 详细的日志与费用统计

系统架构

  1. 文档加载器:支持批量处理模式,可通过 services/mineru.py 批量上传本地 PDF 文档 / 批量接收 PDF 链接,实现多文件自动化加载。
  2. 内容分片器:使用 utils/text.py/split_into_chunks() 将长文本按默认 100000 字符大小切分,,适配大文件和多文件批量处理,确保所有片段均符合下游 API 限制。
  3. 智能解读器:由 core/interpreter.py 的 deepseek_interpretation() 驱动,自动对每个分片进行智能分析。批量模式下,支持对多个文档、多个片段并行处理,并在多片段/多文档场景下自动整合答案。
  4. 上下文管理:utils/files.py/load_existing_answers() 为后续问题提供上下文,同时避免重复处理相同的问题。
  5. 日志系统:集成双层日志,终端实时输出 INFO 级别进度,详细 DEBUG 日志写入文件,便于批量任务的追踪与问题定位。
系统采用高效的批量线性处理流程,所有模块均针对批量文档智能解读场景优化,支持大规模文档自动化处理,极大提升处理效率与结果一致性。

技术栈与工具

核心技术

  • Python 3.12+
  • MinerU2.5/VLM
  • DeepSeek-V3.2-Exp/deepseek-chat
  • requests

开发工具

  • uv 包管理器
  • VS Code
  • Git
  • Codex/Roo code Chinese/Github Copilot

关键代码示例

以下伪代码展示了 ChatPDF 的核心功能实现,包括批量文档加载与处理、文本内容分片以及智能解读与整合。

批量文档加载文档


def process_local_files_via_mineru(file_paths, ...):
  # 1. 构造每个本地文件的上传信息
  files_data = [{"name": 文件名, "data_id": 文件stem} for 文件 in file_paths]
  # 2. 请求批量上传URL
  response = POST /file-urls/batch (带上 files_data)
  batch_id, file_urls = response["batch_id"], response["file_urls"]
  # 3. 依次上传本地文件到指定URL
  for file_path, upload_url in zip(file_paths, file_urls):
      PUT 上传 file_path 到 upload_url
  # 4. 轮询批量任务状态,直到全部完成
  while not all_done:
      batch_data = get_batch_results(batch_id)
      检查每个任务状态
  # 5. 下载并解压每个文件的结果包,返回 markdown 路径列表
  return [下载并解压每个结果包]
def process_urls_via_mineru(urls, ...):
  # 1. 构造每个URL的任务信息
  files_data = [{"url": url, "data_id": url对应stem} for url in urls]
  # 2. 提交批量URL任务
  response = POST /extract/task/batch (带上 files_data)
  batch_id = response["batch_id"]
  # 3. 轮询批量任务状态,直到全部完成
  while not all_done:
      batch_data = get_batch_results(batch_id)
      检查每个任务状态
  # 4. 下载并解压每个URL的结果包,返回 markdown 路径列表
  return [下载并解压每个结果包]
        

文档内容切片


def split_into_chunks(text, chunk_size=100000):
  return [text[i:i+chunk_size] for i in range(0, len(text), chunk_size)]
      

智能解读与答案整合


def chatgpt_interpretation(chunks, ...):
  results = []
  for chunk in chunks:
      result = call_gpt4(chunk)
      results.append(result)
  # 多片段整合
  return merge_results(results)
      

代码设计注重可靠性和效率,通过合理的分片策略和重试机制确保了大文档处理的稳定性。所有关键操作都有详细的日志记录,便于问题诊断。

演示与截图

展示项目的实际运行效果,可以包括界面截图、操作视频或在线演示链接。

ChatPDF 运行示意图1
上传本地PDF至MinerU,转换,下载,解读
ChatPDF 运行示意图2
指定写入了在线PDF链接的txt文件路径,转换,下载,解读
ChatPDF 运行示意图3
查看log文件与解读结果

开发计划

参考资源