ChatPDF · 文档解读助手
ChatPDF 是一个命令行辅助脚本,专门用于解读和分析 PDF 文档。它能够将文档转换为更易于输入大模型的Markdown格式,并通过内容分片避免上下文窗口限制。支持本地文件与公开可得的在线文档,支持批量处理,可实现信息快速提取与深度解读,并生成结构化的分析/问答报告。
项目目标:为研究人员和文档分析者提供一个高效的文档信息提取/快速解读工具,通过 AI 技术实现对长文档的智能化解读和分析,输出清晰的结构化见解。
项目概览
ChatPDF 采用简洁的脚本式架构,通过 MinerU 实现 PDF 解析与格式转换,通过文档切分和DeepSeek的强大能力,实现对 PDF 文档中信息的快速提取与深度理解。 支持单一文件/批量文件,支持本地文件/url链接。用户可以根据文档内容自定义问题,对批量PDF中特定信息实现快速提取与格式化输出;也可以持续发问,前序问答将作为后续问答的上下文,实现深度解读。
Why
- 现有LLM限制直接解读批量PDF文档
- 长文档/批量解读受上下文窗口限制
- 快速提取信息并结构化输出的需求
- 提高批量文档深度解读效率
What
- 利用MinerU转换PDF
- 智能文档分片处理
- 自动去重与答案整合
- 详细的日志与费用统计
系统架构
- 文档加载器:支持批量处理模式,可通过 services/mineru.py 批量上传本地 PDF 文档 / 批量接收 PDF 链接,实现多文件自动化加载。
- 内容分片器:使用 utils/text.py/split_into_chunks() 将长文本按默认 100000 字符大小切分,,适配大文件和多文件批量处理,确保所有片段均符合下游 API 限制。
- 智能解读器:由 core/interpreter.py 的 deepseek_interpretation() 驱动,自动对每个分片进行智能分析。批量模式下,支持对多个文档、多个片段并行处理,并在多片段/多文档场景下自动整合答案。
- 上下文管理:utils/files.py/load_existing_answers() 为后续问题提供上下文,同时避免重复处理相同的问题。
- 日志系统:集成双层日志,终端实时输出 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)
代码设计注重可靠性和效率,通过合理的分片策略和重试机制确保了大文档处理的稳定性。所有关键操作都有详细的日志记录,便于问题诊断。
演示与截图
展示项目的实际运行效果,可以包括界面截图、操作视频或在线演示链接。
开发计划
- ✅ 基础文档解读功能
- ✅ 自定义问题模板
- ✅ 智能分片与答案整合
- ✅ 详细日志与费用统计
- ✅ 支持批量文件处理
- ⏳ 支持本地知识库构建、问答与综述
- ⏳ 开发Web UI并上线个人网页开放内测
- ⏳ 发布命令行版本为标准PyPi包