这一份是谁写的、数据是什么性质:由 HEYI 撰写,介绍我们交付的一个客户项目,客户未获具名授权前按其要求匿名。本文数据全部取自系统代码与测试实测(截至 2026 年 9 月 8 日)——第一期已完成,真实合同的人工验收进行中,客户侧的量化收益要等验收之后才有,本文一条都不写。
这一份里有什么
- 法务每次要回答的,是同一个问题
- 五件挡在前面的事,第一件是「标错比漏标更糟」
- 六条方案,支点是「位置由算法算」
- 第一期已完成:验收指标与 144 条断言
- 现在还做不到什么(这一节写全了)
- 数据的性质、口径与出处
01 场景
法务要回答的问题始终是同一个:这一版跟我们发出去的那版,差在哪,哪些差异不能接受。
企业发出自己的合同范本,对手方改一版回传。这件事在采购、销售、技术服务、软件与 SaaS、租赁、建设工程、委托代理、保密、知识产权许可等常见商事合同上每天都在发生,而法务每次都要从头逐条比对。
交付是一套 Web 应用,六个页面。日常使用五个:合同预审、预审历史、预审详情(逐条接受或拒绝对手方改动)、规则库、规则建议;实施时配一次的首次配置问卷不放进导航栏——日常使用的人不该改审查标准。
- 上传两份 .docx:我方稿 + 对手方回传稿。
- 逐字比对:纯算法,模型不参与。每处改动带段落号与字符区间。
- 按我方立场筛规则:同时判合同类型。立场由人选,系统不推断。
- 模型判风险:定实质性、定风险等级、给处理口径。
- 按编号贴回位置:坐标来自第二步,不是模型给的。
- 出两份交付物:风险清单 Word / 在对手方原稿上注入批注的 docx。
六步自上而下读。要看的是第二步和第五步之间隔着模型——位置在模型介入之前就算好了,之后只按编号贴回去。这条分工是整套设计的支点。
02 挑战
让模型「找出改动并复述原文」,交付出来的是一份不可信的批注。
01 位置标错,比漏标更糟
模型会改写原文、会漏、会把批注挂到相似的另一条上。合同批注只要错一处位置,法务就得回头重新比对全文——这份交付物的价值直接归零,还不如不给。
02 审查标准只存在于法务脑子里
没有规则的审查引擎是空壳。而「我们能接受多长账期」「违约金下限多少」「能不能接受无理由解除」这类问题,答案只在法务那里,既没有写下来,也无法从历史合同里可靠地挖出来。规则库不解决冷启动,系统上线第一天就是空跑。
03 同一处改动,甲乙双方的结论完全相反
账期供应方希望短、采购方能接受长;违约金供应方要高、采购方要低;责任上限一方要有、另一方不要。把供应方的规则用在采购方的合同上,系统会输出方向完全相反的建议——而这种错误不抛异常、不崩溃、日志一切正常,界面上看起来一切如常。
04 法务的工作方式不能动
法务改合同的载体就是 Word 的修订与批注,这是几十年的习惯。而对手方回传的稿子上,往往已经带着他们自己的批注和未接受的修订痕迹。系统若整体重写文档,对方批注全丢、残留的批注锚点指向不存在的编号,Word 打开直接提示文件损坏。批注必须注入回那份原稿,且原有内容一个字节都不能动。
05 漏判是无声的
模型把一处实质改动判成「不用看」,这处改动就从清单里消失了:不报错、不告警,状态显示「预审完成」。同理,「有改动但一条都没归类」如果被当成正常结果落库,用户看到的是「预审完成,未发现差异」。这种静默错误比直接报错危险得多。
03 方案
位置是算出来的,模型全程碰不到它。
01 坐标与判断彻底分开
比对两稿走纯算法:扫文档 XML 抽出段落序列(含表格单元格坐标)→ 精确最长公共子序列锚点加加权序列对齐配对段落 → 字符级差异 → 按句子聚合。每处改动带着段落号加字符区间产出。送给模型的清单里,每条改动只有一个编号;模型只能回引编号,位置与原文由算法在事后按编号贴回去——模型输出里的位置和原文字段即使被改写也一概不采纳。
关键决定:只支持 .docx,不给退路。曾有一条「模型读全文对比」的兜底路径支持 .doc 与 PDF,靠事后文本反查定位,会漏会错位,还有 6000 字截断——已整条删除,上传即拒绝非 .docx。宁可明确不支持,不要给出一份不可信的批注。同一原则贯彻到底:段落枚举器全系统只有一个,比对端算坐标、导出端用坐标必须调同一个函数;文本来源也只有一个。任一端另起一套,全体批注锚点会整体偏移。
02 三级粒度分工:定位要最细,判断要最粗
把字符碎片直接丢给模型判断是错的:「应→应当」和「三十日→九十日」在字符层面长得一模一样,只有放回整句才分得开。配套边界同样明确:机械过滤只做可证明不改变含义的——空白、标点、全角半角;不做「百分之十 ↔ 10%」这类数字规范化,写错一次就会把「三十」和「三百」混为一谈。送模型前先脱敏身份证、手机号、银行卡、邮箱四类,脱敏只作用于交给模型的文本,不影响坐标。改动多时按段落号排序后自动分批,同一段落尽量不切开。
03 立场是硬约束,不是标签
规则库按立场分三包——供应方 40 条、采购方 15 条、法规类 12 条,发起预审时由用户选择我方立场,系统不做自动推断。筛选两级的兜底语义刻意做成完全不同:立场是硬筛,绝不兜底,筛完为空也只返回空——给不出建议远好于给出方向相反的建议;合同类型可兜底,但退回的是「立场筛后的集合」,不是全量,退回全量等于把立场硬筛整个绕过去。未指定立场时只用法规类规则,不许默认成某一方。这条约束有专门的回归测试守着。
04 规则库冷启动:三条来源,且刻意不做向量检索
内置三包共 67 条开箱可用,覆盖付款条件、违约责任、责任限额、解除权、验收标准、知识产权、保密、数据安全、争议解决等 26 个条款维度。12 题配置问卷(约 20 分钟)解决只有法务知道的问题——账期上限、预付款下限、违约金下限、责任上限口径、是否接受无理由解除等;答案只填进模板占位符,不参与自由文本拼接,答 skip 或留空的题不生成规则,宁可少几条也不要生成没依据的规则。既做甲方又做乙方的公司两个立场各答一遍,互不影响。另有表格批量导入与在线编辑,保存即生效。
刻意不做向量检索:适用规则按立场筛后全量注入——供应方 52 条约 6900 字、采购方 27 条约 3500 字,模型上下文完全装得下。全量注入的召回率高于任何检索式筛选,不会漏。数据库里没有向量表、没有向量字段、没有嵌入依赖。省掉的是嵌入,不是模型——差异识别与风险评估离不开对话模型。
05 批注注入原稿:不改动任何原有字节
优先用比对坐标定位,按段落号加字符区间直接算,不做任何文本匹配;锚点收紧到文本片段边界而非整段,几百字的条款只改一句时批注只框那一句。没有模糊匹配,也没有「退回整段」的兜底——定不到就明确列入未覆盖清单。只在顶层子元素之间插入标记、不切分文本片段,所以带修订痕迹、超链接、域代码、文本框的段落都不会被改坏。对手方自带的批注必须保留:往原批注文件末尾追加、保留原有命名空间声明,新批注编号扫描全文已有编号后顺延。覆盖率如实回传,未全覆盖时前端主动提示。
06 漏判与决策全部留痕
有改动但一条都没归类,一律当失败抛错,绝不落成「已完成但清单为空」。被判「非实质」的改动存明细,不只存计数——这是漏判红线条款的唯一出口,也是换模型时唯一的判据来源;只留计数会同时废掉三件事:漏判率无法测量、漏判无法事后追责、没法用生产数据攒评测集。模型没表态的改动也存明细并提示人工复核。法务的每一次接受或拒绝按「旧值 → 新值」增减,不只做加一——法务可能先点接受、后改成拒绝。
这份数据汇总成三类信号:高价值规则(拒绝率高,说明规则命中得准)、可能是噪音(采纳率高,报了风险但实际影响不大)、规则库缺口(反复出现却从未被评估的改动)。口径上要说清:这两个计数记的是法务对「对手方改动」的态度,不是对系统建议的评价——「规则表述好不好用」无法从这份数据判断。
| 粒度 | 只用来做什么 |
|---|---|
| 字符级 | 只用来定位——批注必须精确框到被改的那几个字上 |
| 句子级 | 只用来判断——模型看「改前整句 vs 改后整句」定实质性与风险 |
| 语义分组 | 只用来呈现——把零散改动归并成一条审查条目 |
三种粒度各管一件事,不交叉。定位要最细、判断要最粗——这是「位置由算法算、风险由模型判」这条分工在实现层的样子。
04 第一期已完成:验收指标与 144 条断言
回归断言不依赖数据库与测试框架,实测全绿;它证明的是「没改坏文件」和「在构造夹具上位置正确」。
| 回归套件 | 守的是什么 | 断言数 |
|---|---|---|
| 逐字比对 | 改动区间精确、未改动段落零噪音、加权对齐不交叉、表格坐标约束生效 | 36 |
| 批注注入 | 注入后 XML 合法、可见文本逐字不变、段落数不变、编号不冲突、对手方原有批注保留 | 36 |
| 分批 | 分批不丢改动、同一条款不被切散 | 22 |
| 立场筛选 | 立场硬筛不兜底、未指定时只用法规类、分类兜底不绕过立场 | 21 |
| 端到端定位 | 批注真的落在正确位置,且模型改写原文时位置不受影响 | 17 |
| 修订痕迹 | 带未接受修订时,参与比对的是「接受全部修订后」的文本 | 12 |
六套共 144 条。断言证明的是「在构造夹具上位置正确」,不能替代真实合同的人工验收——那一步正在进行中。
| 第一期验收指标 | 目标值 | 现在的状态 |
|---|---|---|
| 单份合同预审耗时 | ≤ 5 分钟 | 测试环境实测 1–3 分钟,留了余量 |
| 批注位置准确率 | ≥ 99% | 构造夹具上 17 条端到端断言全绿;真实合同待验收 |
| 注入后文档完整性 | 100% | 原文可见文本逐字不变、对手方原有批注保留,36 条断言守着 |
| 差异识别覆盖 | 100% | 有改动却一条未归类一律抛错,不落成「未发现差异」 |
| 漏判可追溯率 | 100% | 被判非实质、模型未表态的改动全部存明细,详情页可逐条核对 |
| 规则召回 | 无检索损失 | 按立场筛后全量注入(供应方 52 条 / 采购方 27 条),不做向量检索 |
这是第一期的验收指标,不是已实现的客户侧收益。数值按保守原则设定—— 「≤ 5 分钟」比实测的 1–3 分钟留了余量,「≥ 99%」低于算法定位理论上应达到的水平。 真实合同的人工验收完成后,这张表会用实测值替换目标值。
01 效率
全流程三步:上传两份 .docx → 看风险清单 → 导出带批注的 Word。单次预审通常 1 到 3 分钟;接口立即返回预审编号,后台异步跑,前端轮询进度,不占用等待。长合同不再被静默截断——改动多时自动分批评估,仅合同分类一处取前 2000 字。
02 风险
坐标由算法产出、模型碰不到;两条定位路径都定不到就明确列入未覆盖,不做模糊回退。立场筛错有测试拦。静默失败被堵住:有改动却一条未归类一律抛错,绝不落成「预审完成,未发现差异」。漏判可追溯:被判非实质、模型未表态的改动均存明细并在详情页可核对。外发文本先脱敏。
03 体验
法务的工作方式不用变——批注落在对手方那份原稿上,直接在 Word 里看、在 Word 里改。对手方原有批注与修订痕迹完整保留,文档不会被改坏。覆盖率如实告知,未全覆盖时主动提示。产品页头长期挂着「AI 辅助审查,不替代人工终审」——定位是预审,降低漏看概率,不承诺零漏。
04 稳定性与交付规模
预审状态与结果存数据库,进程重启不丢结果。模型调用有 2 次重试、递增退避、超时控制与兜底解析,双通道可切换。部署侧网关读超时设为 600 秒(单次分析可能跑 3 分钟,默认 60 秒会中断)。交付体量供参考:约 7100 行前后端代码另加约 1000 行测试断言、25 个业务接口、5 张业务数据表、6 个页面,规则库内置 67 条覆盖 26 个条款维度,支持 12 类合同的分类识别。
05 现在还做不到什么
这一节写全,因为定位准确不等于判断准确——漏判一条红线条款,位置再精确也没有意义。
01 格式与范围的硬边界
仅支持 .docx,其它格式上传即拒绝。页眉、页脚、脚注不在扫描范围内。表格只做了防错、没做结构比对——段落对齐已按单元格坐标约束,但「加了一行」「改了一列」这类结构变化表达不出来。
02 语义等价的改写会被报出来
对手方把「乙方应于 30 日内支付」重写成「付款期限为自验收之日起三十个自然日」,机械比对会报成改动,再由模型判为非实质。这类误报消不掉——这是换取位置可靠的代价,我们选择了这一边。
03 定位准确不等于判断准确
系统定位是预审,不是终审。漏判一条红线条款,位置再精确也没有意义——所以被判非实质的改动全部存了明细,让漏判至少是可测量、可追责的。
04 还差的两件工程事
决策数据尚无出口:接受与拒绝已在采集并汇总成规则建议,但风险清单与批注版还没用到它——这是下一步「半自动回稿」的入口。当前无登录鉴权:现为内网与演示形态,对外交付前需补认证。
位置由算法算,模型全程碰不到它。
因为合同批注标错一处位置,法务就得回头重新比对全文——这份东西的价值会直接归零。
口径与说明
- 客户身份:客户为一家 B2B SaaS 企业。未获书面授权前不具名。
- 本文数据的性质:144 条回归断言、67 条内置规则、26 个条款维度、12 类合同、约 7100 行代码等,全部取自系统代码与测试实测(截至 2026 年 9 月 8 日)。客户侧的量化收益要等真实合同的人工验收完成之后才有——本文一条都不写。
- 「1 到 3 分钟」是测试环境下单次预审的实测区间,会随合同长度与改动数量变化。
- 回归断言证明了什么、没证明什么:它证明「没改坏文件」和「在构造夹具上位置正确」,不能替代真实合同的人工验收。那一步正在进行中。
- 「第一期验收指标」那张表是目标值,不是成果:它是这一期验收要核定的指标,数值按保守原则设定(「≤ 5 分钟」比实测的 1–3 分钟留了余量)。我们没有把行业参考值当作客户实测收益来写——验收完成后以实测值替换。
- 我们不承诺零漏:产品定位是预审、不是终审,页头长期挂着「AI 辅助审查,不替代人工终审」。语义等价的改写会被报成改动,这类误报消不掉。
- 当前形态:无登录鉴权,为内网与演示形态;对外交付前需补认证。仅支持 .docx,页眉页脚脚注不扫。
- 关于界面截图:系统里是客户的真实合同文本,本文未使用截图。需要看界面时,我们用演示合同现场演示。
关于这个案例的常见问题
这个系统支持哪些文档格式?
仅支持.docx格式,其他格式上传即拒绝。这是为确保批注位置准确性的硬边界,因为系统依赖文档XML结构进行精确比对。页眉、页脚、脚注不在扫描范围内。
系统处理一份合同需要多长时间?准确率如何?
单次预审通常1到3分钟,测试环境实测值。批注位置准确率在构造夹具上达到目标值≥99%,有17条端到端断言全绿。真实合同的人工验收正在进行中,实际准确率待验证。
系统如何确保批注准确落在修改位置?
位置由算法算,模型全程碰不到它。系统使用纯算法进行文档比对,精确计算段落号和字符区间,确保批注精确框到被改的那几个字上。即使模型改写原文,位置也不受影响。
系统内置了多少条规则?如何更新?
内置三包共67条规则,覆盖26个条款维度。用户可通过12题配置问卷补充个性化规则,也可通过表格批量导入与在线编辑更新规则。规则按立场(供应方、采购方、法规类)筛选,系统不做自动推断。
这个系统现在还做不到什么?
语义等价的改写会被报出来;仅支持.docx,页眉页脚脚注不扫;定位准确不等于判断准确;当前无登录鉴权,为内网与演示形态;决策数据尚无出口,无法实现半自动回稿功能。