AI端侧应用、氛围编程 DocJev开源PDF分类拆分教程,本地LiteParse零成本OCR实战指南 #字符串转换与处理 #AI人工智能指南 #GitHub工具库推荐 #Jev分类模型 2026-09-21 6K banq
Jerry Liu 开源的 DocJev 用 138 毫秒就分完了一份 15 页的政府公文包,比 GPT-5.6 Luna 快了整整 6 倍!

免费本地 OCR 加专用决策引擎,PDF 分类拆分又快又准的秘密全在这里!

DocJev 把 PDF 文档分类和 PDF 拆分拆成两步,本地 LiteParse 免费提取文字,TypeSafe Jev 引擎 138 毫秒完成决策,40 份真实公文分类全对,成本不到 Luna 的四分之一。


一份公文包撕开了大模型的遮羞布

你手里有一叠混在一起的 PDF 文件,里面有美国国税局的税表、财政部的拍卖结果、经济分析局的新闻稿、证券交易委员会的法律公告,总共 15 页,全部粘成了一个 PDF 文件,你的任务是把这个 PDF 文件拆回原来的四份独立公文,并且给每一份贴上正确的分类标签!

常识告诉你,干这种活必须把整个 PDF 文件扔给一个超大参数的云端大语言模型,让大语言模型从头到尾读一遍,顺便做 OCR 识别扫描件里的文字,然后一口气输出分类结果和拆分边界,LlamaIndex 的 Classify 和 Split API 就是这么干的,OpenAI 的 GPT-5.6 Luna 也是同样的端到端路子,听起来很省心!

但是 Jerry Liu 在 2026 年 9 月 19 日开源的 DocJev 偏偏把一条龙砍成了两截,DocJev 的第一步用本地免费的 LiteParse 把 PDF 文件的每一页文字提取出来存进缓存,第二步才把提取好的纯文本发给 TypeSafe 的 Jev 1.13.0 决策引擎做分类和拆分判断,OCR 阶段零 API 费用,决策阶段按 token 计费,整个 15 页公文包的拆分决策只花了 209 毫秒,而 GPT-5.6 Luna 做同样的事花了 1590 毫秒,速度快了 5.4 倍,成本低了将近 4 倍!


本地免费 OCR 干掉了云端付费识别

OCR 的全称是光学字符识别,说白了就是把图片或扫描件里的文字变成电脑能编辑的纯文本,你用,,背后跑的就是 OCR 技术!

DocJev 默认使用的 OCR 引擎叫 LiteParse,LiteParse 是一个纯本地运行的 Python 解析器,LiteParse 不需要联网,不需要 API 密钥,不需要按页付费,LiteParse 第一次运行时会自动下载英文 OCR 语言数据包,之后所有 PDF 文件的文字提取都在你自己的电脑上完成,DocJev 的开发者在 README 里明确写了一句话:LiteParse 没有 OCR API 费用!

但是 DocJev 也留了一个付费后门,如果你手里的 PDF 文件是那种模糊的扫描件、歪斜的传真件、或者密密麻麻的统计表格,LiteParse 提取出来的文字可能有错漏,这时候你可以切换到 LlamaParse,LlamaParse 是 LlamaIndex 提供的云端 OCR 服务,LlamaParse 有三个付费档位:cost-effective 档走 LlamaParse Parse v2 的基础识别;agentic 档加了智能纠错;agentic-plus 档是最高精度,切换方式很简单,在命令行加 --ocr llamaparse --tier agentic-plus 就行,但是 LlamaParse 会把 PDF 文件的原始字节上传到 LlamaIndex 的云端服务器,而 LiteParse 全程不上传任何数据!

这就怪了,既然 LiteParse 免费又安全,为什么还要留 LlamaParse 的接口?因为 DocJev 的 40 份真实公文基准测试里,所有文档都用 LiteParse 提取文字,40 份分类全部正确,8 个公文包拆分对了 7 个,唯一的错误是 Jev 1.13.0 在一份美联储声明的附件边界上多切了一刀,把本来属于同一份出版物的实施附件当成了独立文档,而 GPT-5.6 Luna 在同样的 LiteParse 文字上 8 个公文包全部拆对,说明瓶颈不在 OCR 精度,而在决策引擎对规则的理解!


YAML 规则文件取代了千行硬编码

传统的文档分类系统需要你写一大堆 if-else 代码,比如"如果第一页包含 invoice 这个词就归类为发票,如果包含 purchase order 就归类为采购单",每增加一个类别就要改代码、重新测试、重新部署,维护成本高得吓人!

DocJev 彻底抛弃了硬编码,DocJev 用一个 YAML 格式的配置文件来定义分类规则,YAML 是一种人类可读的纯文本配置格式,长得像缩进版的清单,你在 YAML 文件里写清楚每个类别的 ID 和自然语言描述,DocJev 就会把 YAML 文件里的描述连同提取出来的页面文字一起发给 Jev 1.13.0 引擎,让 Jev 1.13.0 自己判断每一页属于哪个类别,比如你在 YAML 里写 id: invoice,description: A seller's request for payment for goods or services already supplied,Jev 1.13.0 就能理解"这是一份卖方要求买方付款的单据",然后把符合这个描述的页面归到 invoice 类别!

更狠的是拆分规则,DocJev 的 YAML 文件里有一个 splitting_instructions 字段,你在这个字段里用自然语言告诉 Jev 1.13.0 怎么判断文档边界,比如"不同的发票编号代表不同的文档,即使相邻两页属于同一个类别也要切开",Jev 1.13.0 就会在 15 页的公文包里精准找到四个拆分点,输出四个独立的文档段落,每段带类别标签和页码范围,DocJev 甚至能识别出两份相邻的财政部拍卖结果虽然类别相同但属于不同文档,然后把两份拍卖结果切成两个独立段落!


138 毫秒对 794 毫秒的决策赛跑

DocJev 的基准测试里有一组让人瞪大眼睛的数字:40 份真实 PDF 文件的分类任务,Jev 1.13.0 的中位决策延迟是 138.6 毫秒,GPT-5.6 Luna 的中位决策延迟是 794.3 毫秒,Luna 比 Jev 慢了 5.73 倍!

这个速度差距不是靠偷工减料换来的,DocJev 的基准测试严格控制了变量:两个引擎收到的是完全相同的 LiteParse 提取文字,OCR 时间被单独剥离不计入决策延迟,并发数设为 1,重试机制关闭,所有 40 份分类任务和 8 个拆分任务都在同一次运行中完成,Jev 1.13.0 和 GPT-5.6 Luna 的输入条件完全一致!

但是速度快的代价是什么?Jev 1.13.0 在 8 个公文包拆分任务里错了 1 个,Jev 1.13.0 在一份美联储声明前面多切了一刀,把联邦储备系统声明的实施附件当成了独立文档,而 DocJev 的冻结规则明确把实施附件视为原出版物的一部分,GPT-5.6 Luna 在同样的 8 个公文包上全部拆对,8/8 精确匹配,不过 Luna 的拆分中位延迟高达 1352.3 毫秒,是 Jev 1.13.0 的 209.6 毫秒的 6.45 倍,你愿意为了多对那一个边界多等 6 倍时间吗?

成本差距更夸张,DocJev 的基准测试记录了完整的 API 账单:40 份分类加 8 个拆分的决策调用,Jev 1.13.0 总共花了 0.011663 美元,GPT-5.6 Luna 总共花了 0.046894 美元,Luna 的成本是 Jev 的四倍,整个基准测试包括预热调用在内只花了 0.068050 美元,连一毛钱都不到,但是 Luna 的缓存状态没有被控制,Luna 的重复输入命中了近完整的提供商缓存,所以 Luna 的实际推理成本只有 0.002109 美元,比 Jev 的 0.005351 美元还低,缓存命中的时候 Luna 反而更便宜,缓存没命中的时候 Luna 贵四倍,这种波动让成本对比变得非常不可靠!


40 份真实公文揭开了准确率真相

DocJev 的准确率基准测试用了一个精心策划的数据集:40 份真实的英文公共部门 PDF 文件,涵盖 8 个类别,每个类别 5 份文档,总共 116 个独立页面,来源包括美国国税局的税表、财政部的拍卖报告、经济分析局的新闻稿、证券交易委员会的联邦公报通知,全部是原始出版物下载,没有经过任何人工修改!

这 40 份 PDF 文件被重新组装成了 8 个公文包,每个公文包含 5 份文档,公文包里故意设置了陷阱:有两份相邻的财政部拍卖结果属于同一个类别,传统拆分逻辑很容易把两份同类文档合并成一份,但是 DocJev 的 YAML 规则明确告诉 Jev 1.13.0"不同的拍卖日期代表不同的文档",Jev 1.13.0 和 GPT-5.6 Luna 都成功识别出了全部 32 个真实公文包边界,包括全部 4 个相邻同类别边界!

但是 DocJev 的开发者在基准测试报告里非常诚实地写了一段免责声明:这 40 份文档是一个小型便利样本,来源和模板家族高度重叠,提供商缓存状态没有控制,8 个公文包不足以建立通用的拆分准确率,DocJev 没有给出任何统计置信区间或重复稳定性声明,换句话说,40/40 分类全对和 7/8 拆分正确只是这一次运行的结果,换一批文档、换一个时间段、换一种网络条件,数字可能会变!


拆分边界比分类更难也更值钱

分类是判断一份文档"是什么",拆分是判断一叠文档"在哪里断开",拆分比分类难得多,因为拆分必须在每一页的交界处做一个二元决定:这一页和上一页属于同一份文档,还是属于新的一份文档?

DocJev 的拆分逻辑是页面级别的连续切分,DocJev 不允许跳页合并,比如第 1 页和第 3 页属于同一份文档但第 2 页属于另一份文档,DocJev 不支持这种非连续拆分,DocJev 的每一页必须恰好属于一个文档段落,不能遗漏也不能重复,这种设计保证了输出的干净,但也意味着如果原始 PDF 文件的页面顺序本身就有问题,DocJev 无法自动纠正!

DocJev 的拆分输出是一个 JSON 结构,每个段落包含一个唯一 ID、一个类别标签、一个页码数组,比如第一段是 tax_form 类别的第 1 到 3 页,第二段是 financial_report 类别的第 4 页,第三段是 financial_report 类别的第 5 页,第四段是 press_release 类别的第 6 到 15 页,注意第二段和第三段类别相同但被切成了两个独立段落,因为 DocJev 的 YAML 规则告诉 Jev 1.13.0 这两页分别来自两份不同的财政部拍卖报告,Jev 1.13.0 忠实地执行了规则!

DocJev 还提供了一个 --export-dir 参数,DocJev 会根据拆分结果把原始 PDF 文件切成多个独立的 PDF 文件,每个文件对应一个文档段落,DocJev 在导出时会验证原始 PDF 文件的哈希值,确保导出的页面和原始页面完全一致,不会多一页也不会少一页!


你拿到 DocJev 之后第一步该干什么

DocJev 要求 Python 3.11 以上版本和一个 TypeSafe API 密钥,你在 TypeSafe 控制台注册后拿到 API 密钥,然后把密钥设置为环境变量 TYPESAFE_API_KEY,DocJev 的命令行不会自动读取 .env 文件,你必须手动 export!

安装 DocJev 只需要三行命令:git clone 克隆仓库,cd docjev 进入目录,uv sync 安装依赖,然后跑 uv run docjev doctor --smoke 做一次冒烟测试,冒烟测试会检查 LiteParse 能不能正确解析一份纯光栅化的 PDF 文件,如果冒烟测试通过,说明 DocJev 的本地 OCR 环境已经就绪!

DocJev 的本地可视化应用是一个隐藏的彩蛋,你跑 uv sync --extra demo --extra baseline 安装演示依赖,然后 uv run docjev demo 启动本地服务器,打开 localhost:8765 就能看到 DocJev 的交互界面,DocJev 的演示界面默认加载真实的公共文档数据集,你可以编辑分类规则、预览原始 PDF 页面、实时运行分类和拆分、下载拆分后的 PDF 文件,DocJev 甚至提供了一个 /race 页面,DocJev 的 /race 页面会同时调用 Jev 1.13.0 和 GPT-5.6 Luna,让你在浏览器里亲眼看到两个引擎的决策速度差异,但是 /race 页面需要同时配置 TYPESAFE_API_KEY 和 OPENAI_API_KEY 两个密钥!

DocJev 的基准测试脚本也值得你跑一遍,你先用 --prepare-only 参数跑一次预检,DocJev 会只做本地 OCR 和文本提取,不调用任何付费 API,预检完成后你再用 --prepared 参数指向预检输出文件,DocJev 才会真正调用 Jev 1.13.0 和 GPT-5.6 Luna 做决策,DocJev 的基准测试内置了一个 2 美元的本地估算护栏,DocJev 会在估算费用超过 2 美元时自动停止派发任务,但是这个护栏不是提供商的计费上限,DocJev 的开发者明确警告:预检收据不能重复用于另一次付费运行!

Jev 1.13.0 在 40 份分类任务上 138.6 毫秒全对,在 8 个拆分任务上 209.6 毫秒错了 1 个边界,GPT-5.6 Luna 在同样的 LiteParse 文字上分类同样全对但慢了 5.73 倍,拆分全对但慢了 6.45 倍,可是 Luna 命中缓存后推理成本反而比 Jev 低了 60%,缓存没命中时又贵了四倍,这种缓存依赖的成本波动到底会让真实生产环境的账单走向哪个方向,DocJev 的 40 份文档基准测试还没有给出答案!