花半天对两份合同差异后,我找到了更省力的方案
上个礼拜法务同事丢给我一个需求:两份几十页的采购合同,逐字比对差异,圈出所有修改点。
听起来不难对吧?但真正做起来,第一遍人工读完就花了大半天,翻了二十多次才发现对方在违约金条款里偷偷加了两句话。第二天甲方突然又发来“微调版”,附言只有四个字“稍微优化了下表述”,法务同事脸都绿了——这意味着从头再来,之前圈的所有变更又要重新核实。
我当时的想法比较朴素:写一个脚本,用类似 Git diff 的方式比对合同文本。但试了试才发现这条路子深不见底。PDF 解析得先过一遍,合同里有水印(比如“Confidential”“仅供内部使用”之类的不相关内容),直接比对会把水印的变动也算成差异,极其误导,必须在差异分析前把这些噪声过滤掉。还有格式差异问题:同样一段话,对方只是改了一下换行或者空格数量,在传统 diff 看来就是一次修改,但实际上内容一模一样,这种假差异太多会严重干扰判断。
折腾了一整天,还在和水印过滤死磕,法务同事已经来催第三遍了。
后来在 GitHub 上翻 RAG 相关项目的时候注意到一个热度挺高的开源平台,社区讨论很活跃,看了一下它的模板市场,意外发现有个“合同对比助手”的工作流模板。模板的核心逻辑是:PDF 上传 → 文本提取(内置水印关键词过滤) → 文本对齐(基于 LCS 或 Myers diff 算法) → 识别新增、删除、修改三种差异类型并记录位置信息 → 生成 HTML 可视化报告。
最打动我的是水印过滤的细节设计。模板内置了“Confidential”“Draft”“内部使用”等关键词过滤机制,提交两份文件后,那些烦人的水印压根不会出现在对比结果中,这正好击中了之前让我头疼半天的痛点。
真正跑起来之后测试了一组样本。旧版合同和对方发来的“微调版”扫描件一起丢进去,几秒钟生成了一份 HTML 报告。头部区域清楚显示统计卡片:新增 3 处、删除 5 处、修改 12 处;左右两栏布局展示原文和修改后的文本,删除是红色波浪线标出,新增用浅绿背景高亮。我随便抽了五处报告标记的差异回去查原 PDF,有四处完全匹配(包括数字、标点符号的细粒度修改),还有一处是空格数量变化导致的格式差异,也被合理标记为修改而不是丢失信息。水印过滤也验证通过,报告里完全没有出现原文中的 Confidential 和仅供内部使用字样。
用下来也碰到了一些短板。当前版本只支持 PDF,Word 文件要先手动转一道,不够顺手。表格内容目前按纯文本流处理,结构化的表格对比还是容易出问题,如果合同里表格比较多,建议先人工复核一遍。另外 HTML 报告虽然能直接在浏览器看,但导出 Excel 的功能还没有,做批量对比归档的时候有点不方便。
最让我意外的是,法务同事第一次看到这个工作流时,拖拽了几个节点就懂了大概逻辑。后来提需求的时候直接指着画布说“这里我想再加一个字段去对比签署日期”,懂业务的非开发同事能参与进来讨论实现方案,沟通效率确实提高不少。而且数据全部跑在自己服务器上,合同文档不外传,安全合规方面也彻底放心了。
当然,可视化工作流不是要取代你手写代码。手写解析和比对的灵活性无可替代,尤其是当需求定制化程度特别高的时候。但这个方案在我这个场景里确实解决了最基本的问题:把 30 分钟一轮的人工比对压缩到几秒钟,并且准确率比人工高得多。
目前还有几个没解决的问题想和社区的朋友交流一下:模板里内置的水印关键词是固定的,如果合同里出现其他自定义水印,需要手动修改正则表达式——有没有办法做成动态配置的?还有表格对比这块,你们有没有什么好的方案可以感知表格结构而不是当纯文本处理?欢迎评论区交流!
