合同审查入门:用大模型做一份可复核的初审札记
一份三十页的采购合同摆在面前,法务要回答的问题其实很朴素:钱怎么付、活怎么干、出了事谁兜底、不想干了怎么退。AI 在这里的价值不是替你做判断,而是把散落在各条款里的事实先捞出来、对齐成表,让你把精力放在那几处真正需要经验判断的地方。
这篇教程带你把这件事跑通:把一份 PDF 或 Word 合同变成一份结构化的初审札记,包含条款抽取表、风险提示清单、以及需要人工确认的问题列表。全程用通用工具,命令可直接照抄。
这篇能做出什么
完成后的产出是一份 Markdown 文件,大致长这样:
```markdown
一、基础信息
- 合同类型:设备采购合同
- 甲方:某某科技有限公司(买方)
- 乙方:某某设备制造有限公司(卖方)
- 合同金额:人民币 XXX 万元(含税)
- 履行期限:自合同生效之日起 90 日内交付
二、关键条款抽取
| 事项 | 条款位置 | 原文要点 |
|---|---|---|
| 付款节奏 | 第 4.2 条 | 签订后付 30%,验收合格后付 60%,质保期满付 10% |
| 验收标准 | 第 6.1 条 | 按附件二技术参数逐项验收,异议期 15 日 |
| 违约责任 | 第 9.3 条 | 逾期交付按日万分之三计违约金,上限合同总额 5% |
三、风险提示
1. 第 9.3 条违约金上限仅 5%,低于同类合同常见水平,需评估对乙方的约束力。
2. 第 6.1 条验收异议期 15 日,若设备需长时间试运行,该期限可能不足。
3. 全文未约定争议解决方式,建议补充仲裁或管辖法院条款。
四、需人工确认的问题
- 附件二技术参数是否已随合同一并提供?
- 第 4.2 条"验收合格"是否以甲方单方确认为准?
```
注意第三、四部分的措辞:AI 可以指出"这里可能有问题",但"这个问题在这个交易里能否接受"必须由人来定。整篇教程的设计都围绕这一点。
前置条件清单
开始之前,确认手上有这些东西:
- 一份可以合法处理的合同文本。涉及商业秘密的,先确认所在单位对使用外部大模型服务的政策;拿不准就改用本地部署的模型,或先做脱敏。
- 合同的电子版文件(PDF、Word 或纯文本)。扫描件需要先做 OCR,识别质量直接决定后续效果。
- 一个能处理长文本的大模型入口。可以是网页版对话,也可以是 API;合同动辄几十页,AI 词典:上下文窗口">上下文窗口太小的模型会截断,选型以模型官方文档标注的上下文长度为准。
- 基础的命令行环境(Windows 可用 PowerShell 或 WSL)。可选,但在做文本提取时比手工复制粘贴可靠。
- 一份自己整理的"审查要点清单"。这是整套流程里最值钱的东西,后面会详细讲。
步骤一:把合同变成干净的纯文本
这一步最容易被跳过,也最容易毁掉后面所有环节。PDF 直接复制出来的文本常常夹杂页眉页脚、断行错乱、表格串行。先做提取,再肉眼扫一遍。
用 Python 提取 PDF 文本:
```python
依赖:pip install pdfplumber
import pdfplumber
with pdfplumber.open("contract.pdf") as pdf:
pages = []
for i, page in enumerate(pdf.pages, start=1):
text = page.extract_text() or ""
pages.append(f"\n--- 第 {i} 页 ---\n{text}")
with open("contract.txt", "w", encoding="utf-8") as f:
f.write("\n".join(pages))
print("已输出 contract.txt,共", len(pages), "页")
```
Word 文件用另一条路:
```python
依赖:pip install python-docx
from docx import Document
doc = Document("contract.docx")
lines = [p.text for p in doc.paragraphs if p.text.strip()]
with open("contract.txt", "w", encoding="utf-8") as f:
f.write("\n".join(lines))
print("已输出 contract.txt,共", len(lines), "段")
```
提取完打开 contract.txt,做三件事:
1. 删掉重复的页眉页脚和页码标记,只保留 --- 第 N 页 --- 这类定位锚点。
2. 检查金额、百分比、日期有没有变成乱码或错位。数字错了后面全错。
3. 确认条款编号还在(如"第 9.3 条")。这些编号是你复核时的坐标,不能丢。
步骤二:写一份自己的审查要点清单
不要一上来就问模型"这份合同有什么风险"。开放式提问得到的往往是正确但没用的套话。先把你所在业务领域的关注点列成清单,再让模型按清单逐项回填。
一份通用的合同初审清单,可以从这几个维度起步:
- 主体:双方名称是否与营业执照一致,有没有签约主体不是履约主体的情况
- 标的:数量、规格、技术参数是否明确,附件是否齐全
- 价款:总价、税费承担、付款节点、付款前提条件
- 履行:交付时间、地点、方式,验收标准与异议期
- 违约:违约责任是否对等,违约金计算方式与上限
- 变动:变更有无书面要求,价格是否锁定
- 终止:解除条件、通知期、退出后的结算与交接
- 争议:适用法律、仲裁或管辖约定
- 其他:保密、知识产权归属、不可抗力、通知送达地址
把这份清单存成 checklist.md,后续每次审查都用同一份。它是可迭代的资产:每遇到一个清单没覆盖到的坑,就补一条进去。
步骤三:让模型按结构抽取,而不是自由发挥
关键在于提示词的结构。要求模型逐项回答,并且每一项都必须给出条款位置和原文要点,没有找到就明确写"未找到"。
可以直接用下面这段作为提示词模板:
```text
你是合同初审助手。下面是一份合同全文。请严格按以下要求输出,不要做法律意见,只做事实抽取和疑点标注。
【输出格式】
一、基础信息:合同类型、双方名称、金额、期限
二、关键条款抽取:用 Markdown 表格,列为基础信息 | 条款编号 | 原文要点
覆盖以下事项:付款节奏、交付、验收、违约责任、解除条件、争议解决、保密、知识产权
三、风险提示:逐条列出,格式为"第 X 条 —— 疑点描述 —— 为什么值得关注"
四、需人工确认的问题:以问句形式列出,只列问题不给结论
【硬性要求】
1. 每一项都必须标注条款编号;找不到对应条款的写"未找到"。
2. 原文要点尽量引用原文措辞,不要改写数字和期限。
3. 不确定的地方标注"存疑",不要猜测。
4. 不要输出任何"建议贵司如何如何"的结论性表述。
【合同全文】
<把 contract.txt 的内容粘贴到这里>
```
把合同全文粘进去之后提交。如果合同很长超过上下文限制,就按页拆成几段分别处理,最后再合并——合并时特别留意跨段的条款,比如付款条款从第 8 页开始、第 9 页结束。
步骤四:交叉复核,别信第一遍
模型输出的第一版一定会有漏项和错位。复核动作有三条:
回原文核对数字。 模型偶尔会把"万分之三"写成"千分之三",把"90 日"写成"90 个工作日"。凡是金额、比例、期限,逐个在原文里搜一遍。
检查"未找到"。 模型说"未找到争议解决条款",可能只是没识别出来,也可能是原文用了"纠纷处理"这种不同措辞。用关键词在原文里搜一遍再下结论。
换一种问法再问一次。 把第二次提问改为"这份合同里对甲方不利的条款有哪几条",或者"如果乙方逾期交付,甲方能主张什么"。两次结果比对,不一致的地方就是需要重点看的。
这个交叉验证的思路,和人工复核时让两个人分别看一遍是同一个道理。
步骤五:整理成可交付的初审札记
把核对后的内容汇编成一份文档,格式参照开头的示例。要注意几点:
- 风险提示里区分"事实"和"判断"。事实是"第 9.3 条违约金上限为合同总额 5%",判断是"该比例偏低"。判断部分留给具备权限的人确认。
- 每一条风险后面标注依据的条款编号,方便对方直接翻到原文。
- 单独列一节"本次审查未覆盖的内容",比如没拿到附件、没看到对方主体资质文件。把边界写清楚,比假装审查完整要负责。
常见坑与排错
坑一:扫描件直接喂给模型。 图像型 PDF 提取出来是空白或乱码。先跑 OCR,识别完务必人工核对金额和日期,OCR 对数字最容易出错。
坑二:页眉页脚污染上下文。 每页重复的公司名和页码会挤占上下文,还可能让模型误以为那是条款内容。提取阶段就清掉。
坑三:忘了脱敏。 涉及真实交易对手、报价、个人信息时,先确认使用政策。需要脱敏的场景,可以把主体名称替换成"甲方""乙方",金额等比例缩放后处理,最后再映射回去——但这一步很容易出错,映射表要留好。
坑四:把模型的"建议"当成结论发给业务方。 模型会写出看起来很专业的建议,但它不了解交易背景、谈判地位和行业惯例。发出去之前,所有结论性表述都应该被替换或删除。
坑五:只审正文,不看附件。 大量关键约定在附件里(技术参数、报价明细、服务水平指标)。附件没拿到就在札记里明确写出来。
坑六:每次都用不同的提示词。 结果无法比较,也无法积累。固定一份模板,每次只替换合同全文。
下一步建议
跑通一遍之后,可以从这三个方向继续:
建自己的条款库。 把每次审出的问题条款按类型归档,形成"常见坑清单"。下次审查时把这份清单一起放进提示词,让模型优先检查这些位置,效果通常比泛泛地问要好。
做批量初审。 如果手上是几十份格式相近的合同(比如同一模板下的多份订单),可以写脚本循环调用模型 API,输出统一的表格,人工只看被标红的行。脚本里的模型名称和调用参数以官方文档当前版本为准。
区分场景调整清单。 采购合同看交付和验收,服务合同看服务标准和知识产权,劳动相关协议看期限和解除条件。清单不同,抽取项就不同,不要用一份清单打天下。
明确 AI 的边界。 这套流程适合做初审:把事实捞出来、把明显的缺失标出来、把需要追问的问题列出来。它不适合做终审判断,也不适合在没人工复核的情况下直接对外出具意见。把这条边界写进团队的操作规范里,比任何提示词技巧都重要。
