零代码实战|基于 Skill 搭建合同文档智能 Agent:PDF 合同要素提取 + 风险条款识别

面向读者:法务、行政、合同管理岗,以及想快速验证 AI 落地的业务同学
前置要求:不需要写代码,会写清楚配置和提示词即可
阅读时长:约 12 分钟,含可直接复制的模板


写在前面:本文和网上同类文章有什么不一样

同类文章它们的重点本文的区别
《用多模态大模型做合同信息抽取》自己写 OCR + 模型 pipeline,偏工程实现本文零代码,不写一行代码
《10 分钟搭建合同审查助理》平台操作演示,演示即止本文给出可交付的验收标准:页码溯源、风险规则库、考核指标
《大模型合同审核全流程解析》讲原理与架构本文讲怎么验收、怎么不出错

三个本文独有、同类文章基本没写的设计:

  1. 页码溯源硬要求——每个抽取字段必须能定位到原文第几页;
  2. 数值二次校验——金额、日期不只信模型的一次输出;
  3. 风险判断必须引用知识库规则——不允许模型"凭感觉"判风险。

一、为什么合同场景特别适合用 Agent

先说一个大家都有的痛点:

一批合同(几十份 PDF)进来,法务要做的第一件事是——把里面的关键信息抄到 Excel 里。

金额、签订日期、履约期限、甲方乙方、付款方式、违约金比例……一份合同 5 分钟,50 份就是一整天,而且人累了就会抄错。

传统方案有三个问题:

方案问题
纯人工慢、易错、无法批量
正则/模板匹配合同格式千变万化,模板一改就废
直接丢给大模型长文档超上下文、金额日期容易编、没有依据可追溯

而 Agent + Skill 的组合刚好补上这三点:Skill 负责解析文档(PDF/OCR),模型负责理解语义,知识库负责提供判断依据(法务规则、范本条款)。


二、先定义清楚目标(这一步比搭 Skill 更重要)

别急着配 Skill,先把"要什么"写清楚。我们的目标是输出一张结构化表格:

字段说明示例
合同名称标题采购框架协议
甲方 / 乙方双方名称A 公司 / B 公司
合同金额含税金额¥1,280,000.00
签订日期YYYY-MM-DD2026-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 min15~30 s
50 份总耗时约 5 小时约 20 分钟(含人工复核)
金额抄录错误偶发需人工复核兜底

注意措辞:是"辅助"而不是"替代"。正确用法是 AI 出初稿 + 人工复核,这才能既提效又不担责。


六、常见问题与解法

问题原因解法
金额读不出来扫描件无文字层开 OCR + 提高 DPI
金额差一位/单位错模型自行换算提示词禁止换算,只取原文 raw
跨页表格错乱未开表格模式table_mode: markdown
违约条款漏识别条款被分片切断增大 overlap,按条款切分
印章遮挡文字图像质量问题提高分辨率 + 人工复核兜底
输出不是 JSON提示词约束不足只用结构化输出,禁止自由文本
风险判断前后不一缺判断依据强制引用知识库制度条款

七、合规与安全提醒(政企场景必读)

合同是高敏感数据,上线前确认以下几点:

  1. 数据不出内网:模型、Embedding、OCR 全部本地化,禁止走公网 API;
  2. 权限最小化:能看 A 部门合同的人,不能检索到 B 部门合同;
  3. 操作留痕:谁在什么时间审了哪份合同,必须有日志;
  4. 保留人工环节:AI 结论不直接作为法律意见,保留法务签核;
  5. 上传前脱敏(如为演示/测试):隐去真实主体名称与金额。

八、小结

环节关键动作
目标先定义字段和风险清单,而不是先配 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 出初稿 + 法务复核",责任边界必须清晰。这也是本文反复强调人工复核环节的原因。


如果你正在做合同/招投标/公文类的文档智能,欢迎评论区交流。下一篇会展开讲"批量合同 + 风险台账自动生成"的完整自动化链路。

Logo

一站式 AI 云服务平台

更多推荐