长三角一家汽车零部件制造商,年产值约 6 亿,供应商 400+。三年前合同全靠纸质 + 微信传输,3 名法务 + 1 名合同管理员,全年处理约 1500 份合同。本文不讲故事,复盘它旧架构 → 新架构的演进路径、关键模块与踩坑,重点回答"审批效率提升 80%"是怎么在工程上堆出来的。
一、旧架构:人肉状态机
旧模式没有任何系统,合同状态靠人脑维护:
[纸质起草] → [微信传阅] → [线下签字] → [抽屉归档] │ │ │ └─ 卡在谁手里? 无人知道 ────┘问题量化:平均流转 9.5 天,法务 60% 时间花在催签、找版本、对齐条款;一年因"忘了质保金回收节点"损失约 80 万。状态不可见、版本不唯一、节点不预警——典型的"无状态机"系统。
二、新架构:分层 + OCR 入库 + 审批流引擎
旧架构 新架构 ──────────────── ──────────────────────────────── 纸质/微信 对象存储(MinIO) + 事务库(Postgres) 人工状态 Activiti/Flowable 状态机 人工催办 BullMQ 延时任务(超时提醒) 人工记忆Excel obligations 表 + 定时扫描预警 无审查 Ollama 自托管 (Review/Redline Agent)阶段一:模板标准化(第 1 月)
把 12 类高频采购合同做成模板库,变量自动填充。关键是用模板引擎而非自由文本:
# 采购合同模板变量定义(TipTap + 模板引擎)template:purchase_ordervariables:-supplier_name:string-amount_cents:int-payment_term_days:int# 账期-warranty_rate:float# 质保金比例-delivery_date:date起草时长从 3 小时降到 25 分钟——本质是"填空"替代"从零写"。
阶段二:审批流上线(第 2 月)
可视化流程配置多级审批 + 超时提醒,串行并行混合。用状态机描述:
// 审批状态机(串行+并行混合)constapprovalFlow={nodes:['LEGAL','FINANCE','VP'],parallel:[['LEGAL','FINANCE']],// 法务与财务并行then:'VP',// 汇合后副总批timeoutHours:48,};// 超时由 BullMQ 延时任务推送催办纸质 9.5 天 → 线上平均 4 天。
阶段三:AI 审查接入(第 3 月)
引入 Redline + Review 代理(参考 draft-legal 思路,自托管 Ollama),人工只复核高风险项。之所以选自托管而非公有云 API,是出于图纸与报价的私密性——合同技术附件含核心工艺参数,不能出服务器。aakd 的自托管方案契合这点,对制造业是底线而非加分项。
三、OCR 入库流水线
纸质合同先过 OCR 入库。普通解析把表格行列揉成一团,金额日期错行,义务提取准确率仅 71%。换成带版面分析的解析器(保留坐标 + 表格结构)后升到 94%。
PDF/扫描件 │ OCR(版面分析, 保留坐标+表格) ▼ 版面 JSON(blocks + bbox) │ 条款分块(按"第X条"切) ▼ clauses 表(embedding + meta_json) │ 义务提取 Agent ▼ obligations 表 → BullMQ 预警四、80% 是怎么算出来的
口径定义:从合同提交到最终签署完成的时间。
| 阶段 | 平均耗时 | 说明 |
|---|---|---|
| 改造前 | 9.5天 | 纸质跑签+人工催办 |
| 模板+审批流后 | 4.0天 | 流转在线化 |
| 接入AI审查后 | 1.9天 | 人工只复核高风险 |
(9.5 − 1.9) / 9.5 ≈ 80%。不是魔法,是流程 + AI 把无效等待挤掉。法务月审合同量从 120 份升到 540 份,没加人头。
五、落地结果与踩坑
- 质保金回收遗漏归零,首年追回约 75 万;
- 供应商资质在起草时自动校验,拦下 2 家异常名录企业;
- 合同数据第一次成"资产"——管理层随时看供应商风险分布。
踩坑:① Ollama 首次加载 32B 模型冷启动慢(首份 ~30s),用常驻进程 + 预热请求解决;② 模板变量类型没校验,早期有人填payment_term_days: "三十"导致流程异常,加 JSON Schema 校验拦下;③ 审批流并行节点汇合后状态丢失,Flowable 需显式配置"会签完成"事件。
开放性问题
如果给你们合同流程算一笔账,卡在"流转等待"上的时间占了百分之几?你们的系统里,审批状态是用工作流引擎管,还是用几张表 + 代码硬写的?