从手写RAG到AI Agent:我搭了一个合同差异对比的工具

0 阅读3分钟

在搞 AI Agent 之前,我一直在和 RAG 系统较劲。

公司内部的知识库问答一直不理想——产品手册散落在各个部门,员工想查个参数得翻好几个文档。后来转向用 AI Agent 的思路去做应用开发,上手了一段时间发现 RAG 之外的另一种玩法:与其让用户问 AI 答,不如让 AI 直接帮你把两样东西“比”出来。

手头遇到一个具体需求:客户返回来的一版采购合同和上一版之间存在哪些差异?传统人工比对的方式太痛苦了,几十页 PDF 两稿交替着看,看串行是常有的事,尤其是时间紧的时候,漏掉关键修改的风险很高。

我尝试过自己写 diff 脚本来处理 PDF,但 PDF 的水印问题直接把我卡住了。原本尝试用 Python 的 pdfplumber 库解析,再把文本放进去跑 difflib,看起来逻辑简单,结果跑出来满屏都是水印词的变动,真实的条款差异淹没在几百条 Wasser 噪声里。为了过滤水印专门加了一个 keyword filtering 层,但水印格式不固定的现实又让写死的过滤规则失效了。

后来在社区的分享中看到有同学在 FastGPT 的工作流市场上传了一个“合同对比助手”模板。这个模板的核心处理逻辑是先用文档解析节点提取 PDF 内容,内置可配置的水印关键词过滤列表(“Confidential”“Draft”“仅供内部使用”等),再通过文本对齐算法识别新增、删除、修改三类差异,最后将差异数据渲染成 HTML 报告。

实测效果不错。我找了一份旧版合同和一份新版的扫描版 PDF,直接在模板里跑了一遍,几秒后生成了 diff 报告。HTML 报告长得有点像 GitHub 那边的 PR diff review 页面,左边是旧版文本,右边是新版,删除用红色波浪线,新增用浅绿背景标出。报告头部有差异数量统计卡片:新增 3 处、删除 5 处、修改 12 处。我随机挑了几处 mark 标记回去核对原合同,四处完全匹配,唯一的偏差是空格数量变动导致的格式差异判断 —— 已经算非常有参考价值。水印过滤也生效了,报告正文完全没有出现“仅供内部使用”和“Confidential”相关的内容。

不过当前的模板有几点还不够完善。一是只支持 PDF 格式,如果收到的是 Word 文件还得先跑一次格式转换。二是表格对比被当作纯文本处理,对表格依赖比较重的合同报告呈现效果不理想。三是 HTML 报告没有导出 CSV 或 Excel 的选项,批量归档不是特别方便。

这当中有点小感悟:AI Agent 的应用场景比我们想的要广很多,不只是一问一答的客服机器人,还可以把它变成帮你做事的“工具人”。模板化的工作流让非开发的同事也获得了提需求的能力。当法务同事看着画布说“这里能不能再加一个字段去对比签署日期”时,这意味着业务和技术的沟通成本已经降了一个维度。

最后想和大家讨论一下:在做文档差异对比的时候,你们是怎么处理格式化噪声的?比如换行符、空格和特殊字符,有没有一套比较稳健的清洗方案?另外,对于表格维度的 diff,我还没有找到一个很适合做结构化对比的方法,欢迎指点。