↓
第一步:OCR(光学字符识别)把图片上的文字"认"出来,输出纯文本
↓
第二步:把纯文本喂给大模型,让它分析理解
↓
到底为什么OCR不行?
步骤 | 做什么 | 法律场景中的实际含义 |
① 图片化 | 如果是 PDF,先把每一页渲染成一张图片 | 一份 Word 导出的 PDF 合同,系统先把它“拍”成图片 |
② 区域检测 | 在图片中识别“哪里是文字区域” | 找出正文、页眉、表格、签名栏各自的位置 |
③ 字符识别 | 逐个比对像素形状,猜“这是什么字” | 看到某个像素形状,判断是“末”还是“未”——这两个字在法律语境下差别巨大 |
④ 拼成文本 | 把识别出的字符按行拼接,输出纯文字 | 文本的顺序、换行、缩进完全取决于 OCR 的判断 |
API拿到的是什么?
以一份标准的股权转让协议为例,OCR 处理完,喂给大模型的内容大致是这样的(真实情况可能更混乱):
股权转让协议
甲方(转让方):张三
乙方(受让方):李四
第3页/共12页
第一条标的股权
1.1甲方同意将其持有的目标公司30%股权转让给乙方
1.2转让价款及支付方式如下表所示
项目金额(万元)支付时间
首期款500工商变更完成后5个工作日内
第二期款300标的股权交割日后30日内
尾款2002025年12月31日前
甲方(盖章)乙方(盖章)
看起来似乎还行,但仔细看看:
“第3页/共12页”是页脚,但和正文拼在了一起
签名栏没有位置信息——“张三”签在哪个栏?是甲方还是乙方?OCR 输出里,这行字下面紧接着是“乙方(盖章)”,但原文中它们分别在页面的左右两端
如果页面上有任何手写批注、印章、高亮标记——它们要么变成乱码,要么直接消失
第一层损失:PDF 变成纯文字的过程中,丢了什么?
这一层的问题发生在 OCR 环节——也就是“把图片上的字认出来”这一步。它产生的错误和信息丢失,是在大模型还没介入之前就已经发生了的。
问题一文书结构逻辑混乱:
(1)表格:法律文书中最常见的重灾区
合同中的付款计划表、股权结构表、资产清单、对价计算表——这些是 OCR 出错率最高的区域。原因在于,OCR 是“从左到右、从上到下”逐行扫描的,它不理解“列”的概念。
举个例子,原文是一张简单的付款计划表:
付款节点 | 金额(万元) | 支付条件 | 最迟支付日 |
首期款 | 500 | 工商变更完成 | 2025-06-30 |
第二期 | 300 | 审计报告出具 | 2025-09-30 |
尾款 | 200 | 交割完成 | 2025-12-31 |
OCR 从左到右扫过去,可能输出成:
付款节点金额(万元)支付条件最迟支付日
首期款 500 工商变更完成 2025-06-30
第二期 300 审计报告出具 2025-09-30
尾款 200 交割完成 2025-12-31
前期付款 500 工商变更完成 2025-06-30
第二期 300 审计报告出具 2025-09-30
更隐蔽的情况是:表格里的数字被错位。比如资产清单中,“资产编号”列的数字被 OCR 认到了“账面价值”列,乍看之下数字本身都是合理的,但律师核查时才会发现编号和金额对不上号。
(2)条款层级体系消失
一份规范的合同,条款编号层级往往是这样的:
原文通过字体加粗、字号大小、缩进距离,让读者一眼看出“第一条 > 1.1 > 1.1.1”的层级关系。但 OCR 输出后,所有文字字号相同、无加粗、无缩进:
(3)页眉页脚和页码混入正文
OCR 不知道什么是页眉页脚。对它来说,页面上所有的字都是平等的。所以一份合同的每页底部印的“第 X 页 / 共 Y 页”“机密文件”“XX 律师事务所”,会像正文一样被拼进段落中间。
“第4页 / 共12页”这个字符串隔在了第四条和第五条之间。虽然大模型通常能跳过这个干扰,但如果页码恰好落在了某个条款的关键句子中间(比如分隔了主句和但书),它就可能把一句话拆成两段来理解。
(4)签名页和正文之间的分隔丢失
这是法律场景中一个特别重要的问题。合同的最后一页通常是签名页,正文在签名页之前结束。但 OCR 输出会把签名页的内容直接接在正文末尾,中间没有任何分界标记。更麻烦的是,如果签名页上方还有一个“(本页以下无正文,为签署页)”的声明,这个声明在 OCR 输出中会变成正文段落的最后一句,大模型可能把它理解为某个条款的一部分。
问题二:手写内容几乎无法识别
法律文件中的手写内容常见于:当事人手写签注的合同条款、仲裁庭庭审笔录、对方律师在文件上的手写批注、证据材料上的手写说明。这些场景下,手写文字的识别质量直接决定了后续分析的正确性。
问题三:跨页和跨文件的上下文断裂
(1)跨页表格
这是 OCR 最经典的失败模式。同一张表格跨了两页,第二页通常会重复表头。OCR 不知道这张表在延续,它看到第二页的表头,以为是新的一张表从头开始。
以一份资产收购协议的附件——资产清单为例,这个表格有 40 行,跨了 3 页。OCR 处理后,大模型会认为这是 3 张不同的表。当律师问“请列出所有资产的账面价值和评估价值”,大模型可能只根据第一张表回答,后两页的数据“在它眼里不属于同一张表”。
(2)合同与附件的引用断裂
一份股权转让协议的典型结构是:
主协议(20页)
├── 附件一:标的公司股权结构表
├── 附件二:资产清单
├── 附件三:重大合同清单
└── 附件四:对价计算表
(3)多份文件之间的实体关联
一个 M&A 项目可能涉及:股转协议 + 章程修正案 + 股东会决议 + 债权债务公告 + 多份补充协议。这些文件中的当事人名称、金额、日期、条款编号需要对照审查——甲方在股转协议中承诺的转让价款,是否和股东会决议中记载的一致?补充协议是否实质性修改了原协议的付款节奏?再举个诉讼的例子,当事人提交了一份证据为签署版书面租赁合同,期限仅一年,证明目的是租赁关系存在。租赁关系没有其他书面合同支持,故超过期限转为不定期租赁,主给付义务如租金支付条款一般不变,但仍需交付惯例证明。交付惯例可以通过转账记录来证明,但一份超过期限的合同,几张没有说明转账目的的转账记录,大模型能够跨文件联动思考吗?
第二层损失:即使文字100%识别正确,大模型也看不到什么?
其一、签名与印章的空间位置
这是法律工作中最核心的视觉判断之一。
一份合同签名页上,左右两栏分别写着“甲方(盖章):”和“乙方(盖章):”。张三的签名签在哪一栏,决定了他在合同中的身份。OCR 输出是这样的:
甲方(盖章):乙方(盖章):
张三李四
这看起来还清楚——“张三”在“甲方”下面,“李四”在“乙方”下面。但如果签名栏的布局稍微复杂一点:
实际签名位置在页面偏左,恰好和“乙方”在垂直方向上更接近
签名使用了艺术字体或图案化签章,OCR 在排版判断时可能把两人的身份对调
其二、修改痕迹与修订标记
对方发来一份修改后的合同,使用了 Word 的“修订模式”或者 PDF 的标注功能——删除的内容用删除线标记,新增的内容用下划线标记,部分条款旁边有批注气泡。
举个例子,原条款是:
更严重的是——如果修改痕迹本身具有法律意义。比如在争议中,一方主张合同某条款已被对方在修订中删除,因此不构成合意。但 OCR 输出让删除痕迹消失了,大模型根本不知道这个条款曾经经历过修改。
其三、高亮、颜色标记与视觉强调
合同审查中,律师经常用颜色做区分标记:
如前所述但又有所不同:证据材料中的照片和截图
诉讼或仲裁中,证据材料经常包含:
微信/钉钉聊天记录截图
现场照片(损害状况、施工进度、货物状态)
邮件截图
财务系统中的数据界面截图
最后:错误如何被放大
首先 OCR 错误会被大模型“合理化”
OCR 把合同中的“违约金为每日万分之五”识别成了“违约金为每日万分乏五”。“乏五”显然不通,但大模型有一个特性——看到不通的句子,它会调用自己的语言知识去“修”。它可能把“乏五”理解成“之五”的错别字,然后基于“每日万分之五”去分析。
这次它猜对了。但如果 OCR 把“股权转让价款为 1,000 万元”识别成“股权转让价款为 10,000 万元”——多了一个零——数字本身是通顺的,大模型不会觉得有任何异常。于是它基于一个翻了 10 倍的金额,认真分析了整个交易结构。
如果模型温度不等于零,systemprompt也没关注事实性质,大模型对自己看不到的内容还会“自信地编”
非视觉模型的正常做法应该是回答:“抱歉,我无法查看原始文件,无法确认。”但实际上,有的模型很可能回答:“根据文件名和内容判断,这是一份标准的股权转让协议,通常情况下甲方一栏应该有盖章。”
这就是大模型的“幻觉”——它不知道自己不知道。在它看来,这个问题和“请解释什么是违约责任”是一回事——都是根据已有知识回答。它意识不到自己的知识来源只是 OCR 输出的一串文字,而非原始文件。(当然,幻觉并非只产生于这一个原因,上下文超过百分之40、噪音过多、lost in the middle 都是致幻的典型原因)
解决路径:法律场景下的四步实操方案,从流程上处理全过程的解决
处理前:判断文件类型,预选路径
处理中:根据场景进行实际工具组合
场景 A:需要关注结构、格式的合同审查(抽屉协议、开口协议、附件)
这类场景的特点是:条款结构的层级关系有其意义,表格数据需要精确,页码和签名信息不可丢失。
1. 将合同的每一页导出为高清图片(PNG 或 JPG,分辨率不低于 150 DPI)
2. 将图片直接送入具备视觉能力的大模型(GPT-4o、Claude 3.5/4 系列、Gemini 2.5 Pro 等)(更建议使用ccswitch切换模型工作)
3. 视觉模型能够同时看到图片中的文字内容和空间布局,理解签名位置、表格结构、印章覆盖范围
4. 让模型输出结构化的审查结果
实操注意:
如果合同页数较多,单次处理可能超出模型的上下文限制(一般而言api为了节省token单次工具调用不超过50k字符,消息合集也有限制,超过的虽然会自动写磁盘但是也有直接返回异常状态的)。建议分割pdf,或者分批处理(为了保证逻辑连贯或者减少噪音可以使用subagent返回摘要文件给主agent),每批依据图片内容大小不同应当动态调整页数。
关键页面(签名页、对价计算页、违约责任页)单独处理,不给模型“跳过去”的机会
提示词(Prompt)中明确要求模型:“请逐页检查以下内容:① 所有表格的行列对应是否正确;② 签名和印章的位置;③ 是否有任何文字覆盖或重叠的情况”可以写在项目文件夹下。(最好项目开始时就给出该约束,或从现有工作流调用,复用过程不能简单提示,而要准确说明,适用于本项目并重新写入本项目记忆)
场景 B:大量证据材料的初步梳理
这类场景的特点是:文件数量多、格式杂、每份文件的重要性参差不齐。主要目的是快速梳理出关键信息。
3. 将 Markdown 文本送入大模型进行分析
实操步骤(以 Docling 为例):
[bash]
安装 Docling(需要 Python 环境)
pip install docling
将 PDF 转换为 Markdown
docling 证据材料.pdf --output 证据材料.md
输出后得到一个保留了结构的 Markdown 文件,再把这个文件的内容复制给大模型进行分析。
场景 C:手写内容处理
如果文件中有大量手写批注、手写签字或手写条款,普通 OCR 和大部分文档转换工具的表现都会很差。
推荐路径:
3. 如果必须降低成本,可以先让普通 OCR 处理印刷部分,手写部分人工录入
场景 D:跨文件关联审查
多份关联文件(主协议+多个附件+补充协议)需要对照审查时:
1. 先用 Docling 或视觉模型,把每份文件转换为结构化的 Markdown
文件A:股权转让协议(主协议).md
文件B:附件一-标的公司股权结构表.md
文件C:附件二-资产清单.md
文件D:补充协议(2025年3月).md
3. 将所有 Markdown 文本拼接,在每个文件的开头插入明确的文件标识:
=== 文件A:股权转让协议(主协议)===
[正文内容...]
=== 文件B:附件一-标的公司股权结构表 ===
[正文内容...]
处理后:校验机制
无论使用哪种工具路径,都应建立校验环节。这应当是一个工作习惯。(本人常常因为老板push跳过校验而导致输出不尽人意,需知质量质量,质大于量)
针对 OCR 输出 / Docling 输出:
之后手动抽查关键数据:从输出文件中取出 3-5 处金额、日期、当事人名称,对照原文核实。如果这几处都正确,对整体质量有一个基本判断;如果有多处错误,说明这条路径不适合这批文件,需要更换方案。
针对视觉模型直读:
最后的焚决:人在回路
1. AI 第一轮处理,输出分析报告 + 可疑点清单
2. 律师复核可疑点 + 抽查关键数据
3. 确认无误后,AI 辅助生成最终文书
4. 律师核定后发出
夜雨聆风