合同太长不想看?AI 3分钟标出所有风险条款,附Python实现和Prompt模板
TL;DR签合同前最怕漏掉隐藏风险条款。写了一个 Python 脚本把合同扔给 AI自动识别高风险条款、问题表述和模糊地带3 分钟审完一份 20 页的合同。1. 痛点合同太长20-50 页没时间逐字看完法律术语看不懂只能硬着头皮签出了问题才发现合同里早就写了只能认栽每次都要花钱请律师审成本太高核心问题普通人看不懂合同里的风险法律咨询又太贵。2. 效果实测审阅一份 28 页的合作协议人工阅读2 小时AI 审查3 分钟识别风险条款18 处高风险5 处需重点关注中风险8 处建议修改低风险5 处可接受3. 环境准备bashpip install openai pymupdf python-dotenv4. 合同读取PDF / TXTPython - contract_parser.pyimport fitz # PyMuPDF from pathlib import Path def read_contract(filepath: str) - str: 读取 PDF 或 TXT 格式的合同 path Path(filepath) text if path.suffix.lower() .pdf: doc fitz.open(filepath) for page in doc: page_text page.get_text() text page_text \n\n doc.close() elif path.suffix.lower() .txt: text path.read_text(encodingutf-8) else: raise ValueError(仅支持 PDF 或 TXT 格式) text \n.join(line.strip() for line in text.splitlines() if line.strip()) print(f 已读取合同共 {len(text)} 字) return text5. 风险审查 Prompt 模板Python - 审查 PromptREVIEW_PROMPT 你是一位专业的合同审查律师。请仔细阅读以下合同内容识别潜在风险条款。 合同正文 --- {contract_text} --- 审查要求 1. 识别所有风险条款按严重程度分类 2. 对每个风险条款说明 - 条款原文 - 风险类型高/中/低 - 风险说明为什么有风险 - 建议如何修改或应对 风险等级定义 - 高风险可能导致重大损失、被起诉、或明显不公平的条款 - 中风险存在隐患签约前应要求修改 - 低风险无重大问题但值得注意的条款 输出格式严格按此格式 ## 审查摘要 整体风险评估不超过3句话 ## 高风险条款 {index}. **条款位置**[第X条/第X段] **原文**[原文内容] **风险说明**[为什么有风险] **建议**[如何应对] ## 中风险条款 同上格式 ## 低风险条款 同上格式 ## 需要特别关注的表述 合同中模糊、歧义、或有多种解释的表述 ## 总结建议 签约前必须做的3件事6. 完整审查脚本Python - contract_review.py完整版#!/usr/bin/env python3 # contract_review.py - AI 合同风险审查工具 import os import sys from pathlib import Path import fitz from openai import OpenAI import argparse client OpenAI() # Prompt import textwrap REVIEW_PROMPT textwrap.dedent(\ 你是一位有10年经验的公司法务律师。请审查以下合同识别所有风险条款。 ## 风险等级 - 高风险可能导致重大损失、被起诉、明显不公平 - 中风险存在隐患建议修改 - 低风险值得注意但无重大问题 ## 必须检查的12类风险 1. **违约金过高**超过实际损失的30%可能无效 2. **无限连带**无上限的赔偿义务 3. **单方解除权**对方可随时终止合同 4. **知识产权归属**你的创意/代码归对方所有 5. **竞业限制**离职后不能从事相关行业 6. **数据使用**你的数据/信息被无偿使用 7. **争议管辖**约定在你城市的法院管辖 8. **税负转移**税费由你承担但不含税 9. **沉默即同意**XX天内不回复视为同意 10. **自动续约**无主动终止权自动续约 11. **单方变更**对方可单方修改合同条款 12. **沉默合同**未明确服务期限无限期约束 ## 合同正文 --- {contract_text} --- ## 输出格式 ### 审查摘要 整体风险评估3句话以内 ### 高风险条款⚠️⚠️⚠️ 重点看 {n}. **[风险类别]** 第X条 原文「...」 问题... 建议... ### 中风险条款⚠️ 注意 ... ### 低风险条款ℹ️ 参考 ... ### 签约前必做清单 [ ] 1. [ ] 2. [ ] 3. ) # 读取合同 def read_contract(filepath: str) - str: path Path(filepath) if path.suffix.lower() .pdf: doc fitz.open(filepath) pages [] for page in doc: text page.get_text().strip() if text: pages.append(text) doc.close() text \n\n.join(pages) else: text path.read_text(encodingutf-8) text .join(text.split()) print(f 已读取 {path.name}共 {len(text)} 字) return text # AI 审查 def review_contract(contract_text: str, model: str gpt-4o) - str: print( AI 正在审查合同请稍候...) # 分段处理超过 10000 字分段 if len(contract_text) 10000: print(f 合同较长{len(contract_text)}字分段审查...) chunks split_text(contract_text, chunk_size8000) results [] for i, chunk in enumerate(chunks, 1): prompt REVIEW_PROMPT.format(contract_textchunk) resp client.chat.completions.create( modelmodel, messages[{role: user, content: prompt}], max_tokens4000 ) results.append(resp.choices[0].message.content) if i len(chunks): import time; time.sleep(2) return \n\n---\n\n.join(results) else: prompt REVIEW_PROMPT.format(contract_textcontract_text) resp client.chat.completions.create( modelmodel, messages[{role: user, content: prompt}], max_tokens4000 ) return resp.choices[0].message.content def split_text(text: str, chunk_size: int 8000) - list: paragraphs text.split(。) chunks [] current for p in paragraphs: if len(current) len(p) chunk_size: current p 。 else: chunks.append(current) current p 。 if current: chunks.append(current) return chunks # 主程序 def main(): parser argparse.ArgumentParser(descriptionAI 合同风险审查工具) parser.add_argument(file, help合同文件路径PDF 或 TXT) parser.add_argument(--output, -o, help结果输出文件) parser.add_argument(--model, -m, defaultgpt-4o, help使用的模型gpt-4o / gpt-4o-mini) args parser.parse_args() import time start time.time() contract read_contract(args.file) result review_contract(contract, args.model) elapsed time.time() - start print(\n *60) print( 审查结果) print(*60) print(result) print(*60) print(f⏱️ 审查耗时{elapsed:.1f} 秒) if args.output: Path(args.output).write_text(result, encodingutf-8) print(f 结果已保存到 {args.output}) if __name__ __main__: main()7. 使用方式bash# 基本用法 python contract_review.py contract.pdf # 保存结果 python contract_review.py contract.pdf -o review_result.txt # 用 mini 模型更快便宜 python contract_review.py contract.pdf -m gpt-4o-mini8. 输出示例审查结果示例部分## 审查摘要 合同整体偏向甲方利益存在5处高风险条款和8处中风险条款 签约前必须与对方协商修改否则可能面临重大风险。 ## 高风险条款⚠️⚠️⚠️ 重点看 1. **[违约金过高]** 第七条 原文「如乙方违约应向甲方支付合同总额200%的违约金」 问题违约金为合同金额的2倍远超实际损失 法院可能认定为无效条款但维权成本高 建议争取降低到30%-50%或改为赔偿实际损失 2. **[单方变更权]** 第十二条 原文「甲方有权根据业务需要单方调整服务内容和价格」 问题对方可随时调整合同内容你必须接受 建议增加调整需双方协商一致或设置调价上限 3. **[知识产权归属]** 第十五条 原文「乙方基于本合同产生的所有知识产权归甲方所有」 问题你为项目付出的创意、代码版权归对方 建议明确工作成果的范围保留个人作品集权利 ## 签约前必做清单 [ ] 1. 将违约金降低到50%以内 [ ] 2. 删除或修改单方变更条款 [ ] 3. 保留个人作品的著作权9. 局限性⚠️ AI 审查不能替代律师AI 能帮你快速发现风险但有以下局限AI 不懂最新法规和司法解释AI 不了解你们具体业务背景AI 对模糊条款的判断可能不准高风险合同 10万金额务必请律师AI 审查的正确用法初筛 快速了解风险 → 找律师重点讨论高风险条款10. 总结这个脚本解决三个问题快速定位3 分钟扫完 20 页合同找到所有风险点通俗翻译把法律术语翻译成普通人能看懂的话给出建议每条风险都有具体修改建议最佳实践先 AI 审查一遍快速了解合同有哪些坑再带着问题去找律师省 80% 的沟通时间。如果对你有帮助欢迎在评论区分享你的合同审查经验。