零代码实战|基于 Skill 搭建合同文档智能 Agent:PDF 合同要素提取 + 风险条款识别
零代码实战|基于 Skill 搭建合同文档智能 Agent:PDF 合同要素提取 + 风险条款识别
面向读者:法务、行政、合同管理岗,以及想快速验证 AI 落地的业务同学
前置要求:不需要写代码,会写清楚配置和提示词即可
阅读时长:约 12 分钟,含可直接复制的模板
写在前面:本文和网上同类文章有什么不一样
| 同类文章 | 它们的重点 | 本文的区别 |
|---|---|---|
| 《用多模态大模型做合同信息抽取》 | 自己写 OCR + 模型 pipeline,偏工程实现 | 本文零代码,不写一行代码 |
| 《10 分钟搭建合同审查助理》 | 平台操作演示,演示即止 | 本文给出可交付的验收标准:页码溯源、风险规则库、考核指标 |
| 《大模型合同审核全流程解析》 | 讲原理与架构 | 本文讲怎么验收、怎么不出错 |
三个本文独有、同类文章基本没写的设计:
- 页码溯源硬要求——每个抽取字段必须能定位到原文第几页;
- 数值二次校验——金额、日期不只信模型的一次输出;
- 风险判断必须引用知识库规则——不允许模型"凭感觉"判风险。
一、为什么合同场景特别适合用 Agent
先说一个大家都有的痛点:
一批合同(几十份 PDF)进来,法务要做的第一件事是——把里面的关键信息抄到 Excel 里。
金额、签订日期、履约期限、甲方乙方、付款方式、违约金比例……一份合同 5 分钟,50 份就是一整天,而且人累了就会抄错。
传统方案有三个问题:
| 方案 | 问题 |
|---|---|
| 纯人工 | 慢、易错、无法批量 |
| 正则/模板匹配 | 合同格式千变万化,模板一改就废 |
| 直接丢给大模型 | 长文档超上下文、金额日期容易编、没有依据可追溯 |
而 Agent + Skill 的组合刚好补上这三点:Skill 负责解析文档(PDF/OCR),模型负责理解语义,知识库负责提供判断依据(法务规则、范本条款)。
二、先定义清楚目标(这一步比搭 Skill 更重要)
别急着配 Skill,先把"要什么"写清楚。我们的目标是输出一张结构化表格:
| 字段 | 说明 | 示例 |
|---|---|---|
| 合同名称 | 标题 | 采购框架协议 |
| 甲方 / 乙方 | 双方名称 | A 公司 / B 公司 |
| 合同金额 | 含税金额 | ¥1,280,000.00 |
| 签订日期 | YYYY-MM-DD | 2026-03-15 |
| 履约期限 | 起止或时长 | 2026-03-15 ~ 2027-03-14 |
| 付款方式 | 分期/一次性 | 3:6:1 三期 |
| 违约金比例 | 单方违约 | 日 0.05% |
| 风险等级 | 高/中/低 | 中 |
| 风险条款原文 | 必须带原文出处 | “……乙方逾期交付的,每逾期一日按合同总额 0.5% 支付违约金……” |
关键设计:所有抽取结果必须能定位到原文。
这是合同场景的底线——法务不会相信一个没有出处的数字。所以输出里必须带page和原文片段。
三、整体方案
┌─────────────┐ ┌──────────────┐ ┌──────────────┐
│ 上传 PDF │ → │ PDF 解析 Skill│ → │ 文本 + 页码 │
└─────────────┘ └──────────────┘ └──────┬───────┘
↓
┌──────────────────────────────────┐
│ 抽取 Agent │
│ 要素抽取 + 风险条款识别 │
└───────┬──────────────────┬───────┘
↓ ↓
┌───────────────┐ ┌──────────────────┐
│ 法务知识库 │ │ 风险规则 + 输出模板 │
│(范本/制度/清单) │ │ (JSON Schema) │
└───────────────┘ └──────────────────┘
↓
┌───────────────────────┐
│ 结构化结果 + 风险报告 │
└───────────────────────┘
四个组成部分:一个解析 Skill、一个知识库、一套抽取规则、一个输出模板。
四、零代码搭建:五步走
第 1 步:创建法务知识库
把下面这些资料丢进知识库(内网环境用纯本地模式即可):
- 《合同管理办法》《审批权限表》
- 标准合同范本(采购/销售/劳务/保密各一套)
- 风险条款清单(什么算高风险)
- 历史合同(可选,用于比对)
知识库结构建议:
kb-legal/
├── 制度/ # 管理办法、审批权限
├── 范本/ # 各类标准合同模板
├── 风险清单/ # 高风险条款定义与阈值
└── 历史合同/ # 可选,用于同类条款比对
小技巧:把"高风险条款定义"单独整理成一页表,它的检索命中率最高,也直接决定风险识别的准确度。
第 2 步:启用/创建 PDF 解析 Skill
重点配置三项:
skill: pdf_parser
params:
extract_text: true
keep_page_number: true # 关键:保留页码,用于溯源
ocr_when_no_text: true # 扫描件自动 OCR
table_mode: markdown # 表格转 markdown,金额表更准
split_by_section: true # 按条款切分,利于定位违约条款
踩坑提醒:很多"AI 读不出金额"的问题,根源是 PDF 是扫描件没有文字层。必须先开 OCR,否则模型看到的是空白。
第 3 步:写抽取提示词(可直接抄)
你是资深法务合同审查助手。请从下面这份合同中抽取信息。
【任务】
1. 抽取固定要素:合同名称、甲方、乙方、合同金额(含税)、签订日期、
履约期限、付款方式、违约金比例。
2. 识别风险条款,重点关注:
- 违约金过高(单方日违约金 > 0.1%)或过低(无法覆盖损失)
- 付款比例失衡(预付款 > 30%,或验收前已付 > 70%)
- 缺少争议解决条款 / 管辖地约定不利
- 单方解除权不对等、保密与知识产权归属缺失
- 自动续约、无限连带责任
3. 每条风险必须给出:
- risk_level: 高 / 中 / 低
- clause: 条款原文(不要改写)
- page: 所在页码
- reason: 判定理由(引用知识库中的制度或清单)
【硬性规则】
- 找不到的字段填 null,禁止推测或编造。
- 金额、日期必须与原文完全一致,不要做单位换算。
- 只输出 JSON,不要输出任何解释性文字。
【合同内容】
{{pdf_text_with_pages}}
三条"硬性规则"是准确率的关键:禁止编造、保持原样、只输出 JSON。少了这几句,模型就会开始"帮你想"。
第 4 步:定义输出格式(JSON Schema)
零代码平台一般支持"结构化输出 / 字段定义",照着填:
{
"contract_name": "string",
"party_a": "string",
"party_b": "string",
"amount": { "value": "number|null", "raw": "string|null", "page": "number|null" },
"sign_date": "string|null",
"perform_period": "string|null",
"payment_terms": "string|null",
"penalty_rate": "string|null",
"risks": [
{
"risk_level": "高|中|低",
"title": "string",
"clause": "string",
"page": "number|null",
"reason": "string",
"suggestion": "string"
}
],
"overall_risk": "高|中|低",
"summary": "string"
}
第 5 步:做一个"报告模板"(给非技术同事看)
JSON 是给系统看的,法务要看的是报告。用输出模板渲染:
## 合同审查报告
**合同名称**:{{contract_name}}
**双方**:{{party_a}} × {{party_b}}
**金额**:{{amount.raw}}(第 {{amount.page}} 页)
**签订日期**:{{sign_date}} **履约期限**:{{perform_period}}
**整体风险等级**:🔴 {{overall_risk}}
### 风险条款(共 {{risks.length}} 条)
{{#each risks}}
**{{@index+1}}. [{{risk_level}}] {{title}}**(第 {{page}} 页)
> 原文:{{clause}}
- 判定理由:{{reason}}
- 修改建议:{{suggestion}}
{{/each}}
### 结论
{{summary}}
五、效果验证(别跳过这步)
抽 20 份不同类型的合同做验证,重点看三个指标:
| 指标 | 含义 | 目标 |
|---|---|---|
| 要素准确率 | 金额/日期等是否与原文一致 | ≥ 95% |
| 召回率(风险) | 该发现的风险有没有漏 | ≥ 85% |
| 溯源正确率 | page 是否真的对得上 | 必须 100% |
为什么溯源要 100%?
因为业务同事第一次使用时会随机抽查 2~3 条去核对页码。只要对不上一次,他就会不再信任整个系统。信任比准确率更重要。
一个真实数据参考(50 份合同)
| 项目 | 人工 | Agent |
|---|---|---|
| 单份耗时 | 5~8 min | 15~30 s |
| 50 份总耗时 | 约 5 小时 | 约 20 分钟(含人工复核) |
| 金额抄录错误 | 偶发 | 需人工复核兜底 |
注意措辞:是"辅助"而不是"替代"。正确用法是 AI 出初稿 + 人工复核,这才能既提效又不担责。
六、常见问题与解法
| 问题 | 原因 | 解法 |
|---|---|---|
| 金额读不出来 | 扫描件无文字层 | 开 OCR + 提高 DPI |
| 金额差一位/单位错 | 模型自行换算 | 提示词禁止换算,只取原文 raw |
| 跨页表格错乱 | 未开表格模式 | table_mode: markdown |
| 违约条款漏识别 | 条款被分片切断 | 增大 overlap,按条款切分 |
| 印章遮挡文字 | 图像质量问题 | 提高分辨率 + 人工复核兜底 |
| 输出不是 JSON | 提示词约束不足 | 只用结构化输出,禁止自由文本 |
| 风险判断前后不一 | 缺判断依据 | 强制引用知识库制度条款 |
七、合规与安全提醒(政企场景必读)
合同是高敏感数据,上线前确认以下几点:
- 数据不出内网:模型、Embedding、OCR 全部本地化,禁止走公网 API;
- 权限最小化:能看 A 部门合同的人,不能检索到 B 部门合同;
- 操作留痕:谁在什么时间审了哪份合同,必须有日志;
- 保留人工环节:AI 结论不直接作为法律意见,保留法务签核;
- 上传前脱敏(如为演示/测试):隐去真实主体名称与金额。
八、小结
| 环节 | 关键动作 |
|---|---|
| 目标 | 先定义字段和风险清单,而不是先配 Skill |
| 解析 | PDF Skill 必开 keep_page_number + OCR |
| 抽取 | 提示词写"三条硬性规则":禁编造、不改写、只出 JSON |
| 依据 | 风险判断必须引用知识库制度,避免"凭感觉" |
| 输出 | JSON 给系统,报告给人看,必须带页码溯源 |
| 落地 | AI 出初稿 + 人工复核,责任边界清晰 |
一句话总结:合同智能 Agent 的价值不在于"全自动",而在于把 5 小时的机械抄录压缩到 20 分钟,同时把风险条款从"靠经验"变成"有清单、有出处"。
附:高频问题(FAQ)
Q1:模型会不会把金额改一位?
会。所以必须做数值二次校验:raw 必须能在原文精确匹配,value 必须与 raw 一致;不一致就标记人工复核,而不是静默通过。
Q2:为什么非要页码?没有页码不行吗?
不行。业务同事第一次使用时会随机抽查 2~3 条去核对页码。只要对不上一次,他就不会再信任整个系统。溯源正确率必须 100%。
Q3:扫描件(图片型 PDF)能处理吗?
能,但要开 OCR。注意 OCR 是最贵的一步,批量场景下务必缓存结果,避免重复识别。
Q4:风险判断怎么保证前后一致?
规则写进知识库并锁定版本,提示词强制"必须引用规则条款作为判定理由",不允许模型自由发挥。
Q5:能直接用 AI 结论对外出合同吗?
不能。定位是"AI 出初稿 + 法务复核",责任边界必须清晰。这也是本文反复强调人工复核环节的原因。
如果你正在做合同/招投标/公文类的文档智能,欢迎评论区交流。下一篇会展开讲"批量合同 + 风险台账自动生成"的完整自动化链路。
更多推荐




所有评论(0)