合同审查助手¶
项目背景与目标¶
合同是企业经营的基石,但合同审查专业性强、耗时长、风险点多。法务人员审一份复杂合同可能耗时数小时,而业务端又急需推进。漏审风险条款可能导致巨额损失。智能合同审查助手通过 AI 自动识别合同条款、标注风险点、给出修改建议,大幅提升审查效率与覆盖度,让法务聚焦于复杂判断。
本项目目标是构建一个合同审查 Agent,支持常见合同类型(买卖、租赁、劳动、服务、借款),输出条款识别、风险标注、修改建议、审查报告。
需求分析¶
核心能力: 1. 合同结构解析:识别标题、条款、附件、签署信息 2. 条款分类:将条款归类(标的、价格、违约、争议解决等) 3. 风险识别:标注对己方不利的条款(违约金过高、管辖不利、隐含义务) 4. 缺失检查:检查必备条款是否缺失(如违约责任、保密条款) 5. 修改建议:给出修改措辞建议 6. 审查报告:生成结构化审查意见
审查视角:支持买方/卖方/中立多视角审查,不同视角风险判断不同。
技术选型说明¶
| 模块 | 技术方案 | 选型理由 |
|---|---|---|
| 文档解析 | python-docx + PDF 解析 | 多格式合同处理 |
| Agent 框架 | LangGraph | 多步骤审查流程 |
| 条款识别 | LLM + 规则 | 灵活适配各种合同 |
| 风险库 | 结构化风险规则 | 标准化风险判断 |
| LLM | Qwen-Max | 修改建议生成 |
| 知识库 | 标准合同模板 RAG | 条款对比 |
| 后端 | FastAPI | 异步审查 |
| 数据库 | PostgreSQL + MinIO | 审查记录 + 合同文件 |
架构设计¶
flowchart TD
DOC[合同文档] --> PARSE[文档解析]
PARSE --> SEG[条款分割]
SEG --> CLS[条款分类]
CLS --> AGENT[审查 Agent]
AGENT --> RISK[风险识别]
RISK --> RULE[(风险规则库)]
AGENT --> MISS[缺失检查]
MISS --> TPL[(标准模板库)]
AGENT --> COMP[条款对比]
COMP --> VEC[(条款向量库)]
AGENT --> SUG[修改建议]
SUG --> LLM[LLM 生成]
AGENT --> REP[审查报告]
REP --> VIEW{审查视角}
VIEW --> BUY[买方视角]
VIEW --> SELL[卖方视角]
关键模块实现思路¶
模块1:合同解析与条款分割¶
合同格式多样(Word/PDF/扫描件)。Word 用 python-docx 按段落与样式识别结构;PDF 用版面分析;扫描件需 OCR。条款分割按编号(第一条、1.1、(1))与标题识别,处理嵌套条款。
def split_clauses(document):
clauses = []
for para in document.paragraphs:
if is_clause_heading(para.text): # 匹配编号模式
clauses.append({"id": extract_id(para.text), "text": para.text,
"level": detect_level(para.text)})
elif clauses:
clauses[-1]["text"] += para.text # 续接条款内容
return clauses
模块2:条款分类与风险识别¶
条款分类将每个条款映射到标准类别(标的、数量、质量、价款、履行期限、违约责任、争议解决、保密、知识产权等)。分类用 LLM + 关键词规则双轨。
风险识别基于风险规则库,每条规则定义:适用条款类型、风险模式、风险等级、修改建议。例如:
RISK_RULES = [
{"type": "违约金", "pattern": "违约金.*超过.*30%", "level": "high",
"advice": "违约金过高,建议调整为不超过实际损失的30%"},
{"type": "管辖", "pattern": "由.*对方所在地.*法院管辖", "level": "medium",
"advice": "管辖不利于己方,建议改为被告所在地或合同履行地"},
{"type": "付款", "pattern": "预付款.*100%", "level": "high",
"advice": "全款预付风险大,建议分期付款"},
]
LLM 补充识别规则未覆盖的隐含风险(如模糊表述、单方解释权)。
模块3:缺失条款检查¶
对照标准合同模板检查必备条款是否缺失。不同合同类型必备条款不同:买卖合同须有标的、数量、质量、价款、交付、验收、违约;劳动合同须有期限、工作内容、报酬、社保、解除条件。
REQUIRED_CLAUSES = {
"买卖合同": ["标的", "数量", "质量", "价款", "交付", "验收", "违约责任", "争议解决"],
"劳动合同": ["期限", "工作内容", "工作地点", "报酬", "社保", "解除条件"]
}
def check_missing(contract_type, found_clauses):
required = REQUIRED_CLAUSES[contract_type]
return [c for c in required if c not in found_clauses]
缺失条款在报告中重点提示,建议补充。
模块4:修改建议生成¶
LLM 基于风险识别结果生成具体修改建议:原条款 → 风险点 → 建议修改措辞。修改建议须具体可操作,给出替换文本而非抽象建议。
SUGGEST_PROMPT = """合同审查修改建议:
原条款:{original_clause}
风险点:{risk}
审查视角:{perspective}
要求:
1. 指出具体风险
2. 给出修改后的条款文本
3. 说明修改理由"""
模块5:审查视角适配¶
同一条款对不同方风险不同。如"由甲方所在地法院管辖",对甲方有利、对乙方不利。系统支持切换审查视角,风险标注与建议相应调整。
核心流程详解¶
合同审查流程: 1. 上传合同 → 文档解析 → 条款分割 2. 条款分类 → 识别条款类型 3. 风险识别:规则库匹配 + LLM 补充 4. 缺失检查:对照标准模板 5. 修改建议生成:LLM 输出具体修改 6. 汇总审查报告:风险清单 + 修改建议 + 缺失提示 7. 法务复核:采纳/修改建议,反馈优化模型
审查报告输出: - 风险等级汇总(高/中/低各几项) - 逐条款审查意见(原文 + 风险 + 建议) - 缺失条款清单 - 整体评价与签约建议
部署与优化建议¶
- 模板管理:常用合同类型预设审查模板,提升一致性
- 规则迭代:法务反馈的新风险模式持续加入规则库
- 视角切换:支持买卖双方视角,灵活服务不同客户
- 版本对比:合同修改后对比版本,识别新增风险
- 保密性:合同涉密,私有化部署或加密传输
常见问题与解决方案¶
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 条款分割错 | 格式不规范 | 多模式匹配 + LLM 兜底 |
| 风险漏报 | 规则覆盖不全 | 规则库持续扩充 + LLM 补充 |
| 修改建议不专业 | LLM 法律功底不足 | 模板约束 + 法务审核样本微调 |
| 误报多 | 规则过敏感 | 风险等级分级 + 法务调参 |
扩展方向¶
- 合同起草:基于要素生成合同初稿
- 履约监控:关键节点提醒(付款、交付、到期)
- 合同台账:企业合同集中管理与检索
- 智能比对:与己方标准模板差异高亮