签合同前让 AI 帮你过一遍:我开源了个合同审查 Agent,30 秒找出霸王条款

0 阅读10分钟

之前在北京租房的时候,管家甩过来一份电子合同,催我赶紧签。十几页密密麻麻的小字,我大概扫了一眼,觉得”大公司应该不会太离谱”,就签了。

搬进去半年后因为计划变动想退租,才发现合同第十条藏着一句:”承租人提前解约的,应向甲方支付相当于两个月租金的违约金,且已付押金不予退还。” 两个月租金加一个月押金。在北京,三个月房租是多少钱我就不说了。

后来跟一个做律师的朋友吃饭,他听完说这种条款其实是可以谈的,很多城市对违约金比例有上限规定,但你签了就认了。他又补了一句:”你们做技术的,怎么不写个工具帮自己看合同?”

这句话我记住了。我断断续续地写了一个完善的 Agent,开源出来了。GitHub:

github.com/he-yufeng/C…


做了什么

ContractGuard,开源的 AI 合同审查 Agent。给它一份合同(PDF、Word、TXT 都行),30 秒出一份结构化报告:

  • 红旗条款:可能让你亏钱、丧失权利的严重问题,附修改建议
  • 警告条款:不至于致命但值得谈的风险点
  • 保护条款:合同中对你有利的部分(别删了)
  • 缺失保护:行业惯例里应该有但这份合同没有的条款
  • 公平评分:A+ 到 F 打分,一眼看出合同偏向谁

开源免费,MIT 协议。


实际效果长什么样

拿一份典型的租房合同跑一下:

contractguard scan lease.pdf
⬤ RED FLAGS (5 found)
==================================================

  1. 押金不可退还
     条款: 第三条
     "The security deposit is non-refundable and shall
      be retained by Landlord upon termination"
     大多数司法管辖区要求押金在无损坏时全额退还。
     建议: 删除"不可退还"表述,明确退还条件和时限。

  2. 出租方可随时无通知进入
     条款: 第五条
     "Landlord shall have the right to enter the Property
      at any time, with or without notice"
     法律通常要求提前 24-48 小时书面通知。
     建议: 增加"需提前 24 小时书面通知,紧急情况除外"。

  3. 承租方承担结构维修费用
     条款: 第四条
     水管、电路、承重结构的维修通常是出租方责任。
     建议: 将承租方责任限定为日常小修。

  4. 单方面终止条款
     条款: 第十条
     出租方可无理由 30 天通知终止,承租方无对等权利。
     建议: 增加双方对等终止权或要求有正当理由。

  5. 单方面律师费条款
     条款: 第十二条
     无论诉讼结果如何,承租方承担出租方律师费。
     建议: 改为败诉方承担。

⚠ WARNINGS (3 found)
==================================================
  1. 续约租金涨幅上限 15%(建议谈到与 CPI 挂钩)
  2. 90 天不续约通知期(常规是 30-60 天)
  3. 转租需出租方同意且可无理由拒绝

✔ PROTECTIONS (2 found)
==================================================
  ✔ 终止需书面通知
  ✔ 合同修改需双方书面同意

❓ MISSING PROTECTIONS (4)
  ✗ 无居住适宜性保证
  ✗ 违约无宽限期
  ✗ 滞纳金无上限
  ✗ 退房后押金退还无时限约定

FAIRNESS SCORE: D (28/100)
  5 红旗  3 警告  2 保护  4 缺失

我当年签的那份自如合同,如果当时跑一下 ContractGuard,那个”两个月违约金 + 押金不退”会被直接标红。省下来的钱够买好几年 API 了。


它查到过哪些真实的坑

我拿身边朋友的真实合同(脱敏后)测了几种场景:

租房合同(北京某长租公寓):

  • “如遇政府征收或拆迁,本合同自动终止,乙方不得要求任何补偿” —— 标红。你的损失凭什么不补偿?
  • “甲方有权在认为必要时进入房屋检查” —— 标红。没有通知条款。
  • 缺失:没有任何关于房屋设备维修责任的约定 —— 到时候空调坏了算谁的?

劳动合同(某互联网公司):

  • 竞业限制覆盖”互联网及相关行业”,期限两年 —— 标红。范围太宽,离职后两年不能去任何互联网公司?
  • “员工在职期间及离职后产生的一切知识产权归公司所有” —— 标红。你周末写的开源项目也算?
  • 竞业补偿金只有”月工资的 30%“—— 警告。法律规定不得低于 30%,但这刚好卡线,你可以谈更高。

自由职业合同(翻译外包):

  • 付款条件”验收合格后 90 个工作日内支付” —— 标红。90 个工作日差不多四个半月,你干完活要等小半年才拿钱。
  • 没有 kill fee 条款 —— 缺失。如果甲方中途取消项目,你已经做的工作白干。

这些不是虚构的例子。都是身边真人碰到的真事,只是平时没人细看合同。


成本

请律师审一份合同,北京行情大概 500-2000 块。有些合同值得请律师看,但很多合同你只是想知道”有没有明显的坑”。

ContractGuard 一次分析消耗大约 3000-5000 token,用 Kimi 不到 0.1 元,用 Claude 大概 0.3 元,用 Ollama 本地跑是 0 元。

花一毛钱或者免费,30 秒知道这份合同有几个坑。然后你再决定值不值得花几千块请律师。


跟直接丢给 ChatGPT 有什么不同

你当然可以把合同粘到 ChatGPT 里问”帮我看看有没有问题”。我也试过。

问题一:输出是一大段散文。 没有分类没有优先级,红旗条款和”这条写得还行”混在一起,你还得自己筛。严重问题藏在第三段第二句,你可能直接跳过了。

问题二:格式不稳定。 同一份合同问两次,输出结构可能完全不同。你没法把它接到其他工具里用,也没法做 before/after 对比。

问题三:容易漏东西。 ChatGPT 没有被引导去检查”缺失保护”。它只看合同里有的条款,不会主动想”这份合同缺了什么”。

ContractGuard 用 Pydantic 模型强制约束 LLM 输出的结构。每次跑出来都是同样的格式:红旗、警告、保护、缺失、评分。LLM 被明确要求从四个维度审查,不会遗漏。

导出 JSON 接到你的系统里也行:

contractguard scan contract.pdf --json | jq '.red_flags | length'
# 输出: 5

技术实现(给开发者看的)

整个系统其实不复杂,核心就三步:

  1. 文档解析:PDF 用 pdfplumber(处理复杂排版比 PyPDF2 靠谱),Word 用 python-docx。提取纯文本。
  2. 结构化分析:把合同文本 + 精心设计的 system prompt 发给 LLM。prompt 里明确要求从红旗/警告/保护/缺失四个维度审查,并且要求输出严格符合 Pydantic 定义的 JSON Schema。这样 LLM 不会漏维度,输出格式也固定。
  3. 报告生成:拿到结构化数据后,用 Rich 渲染终端报告(带颜色、图标),或者导出 Markdown/JSON。

Python API 也很简单:

from contractguard.analyzer import analyze_contract
from contractguard.parser import extract_text

text = extract_text("lease.pdf")
result = analyze_contract(text)

# result 是 Pydantic model,类型安全
for flag in result.red_flags:
    print(f"{flag.title}: {flag.suggestion}")

print(f"Score: {result.fairness_grade} ({result.fairness_score}/100)")

想集成到你自己的系统里,几行代码就够了。


支持什么模型

任何 OpenAI 兼容 API 都行。推荐 Claude 做审查,效果最好。Kimi 也不错,便宜很多。

# Kimi K2.5
export OPENAI_API_KEY=sk-... OPENAI_BASE_URL=https://api.moonshot.ai/v1
contractguard scan contract.pdf --model kimi-k2.5

# 通过 OpenRouter 用 Claude(推荐)
export OPENROUTER_API_KEY=sk-or-...
contractguard scan contract.pdf --model anthropic/claude-sonnet-4

# 完全本地,合同数据不出机器
export OPENAI_BASE_URL=http://localhost:11434/v1 OPENAI_API_KEY=ollama
contractguard scan contract.pdf --model llama3.1

支持的合同类型

类型重点检查
租房合同押金退还、租金涨幅、进入权、提前终止、维修责任、居住保证
劳动合同竞业范围和时限、知识产权归属、解雇条件、遣散费、试用期
保密协议“机密信息”定义宽度、期限、竞业伪装、独立开发例外
自由职业付款周期、kill fee、IP 归属、范围蔓延、违约责任
SaaS 条款数据归属、自动续费、SLA、单方面修改权、数据迁移
贷款协议利率类型、提前还款罚金、违约触发、担保范围
购销合同质保条款、退换政策、责任限额、争议解决、不可抗力

也支持中文合同。模型用 Claude 或 GPT 时,中文审查效果跟英文差不多。


谁用得上

在北上广深租房的你。 中介催你”今天不签就没了”的时候,先花 30 秒跑一下。我那份自如合同,三个月房租的教训你不需要再交一次。

刚拿到 offer 准备入职的你。 竞业覆盖”互联网及相关行业”意味着你离职后两年只能去卖煎饼。知识产权条款”在职期间及离职后的一切”意味着你周末写的开源项目是公司的。这些条款都是可以谈的,但你得先发现它们。

接外包项目的你。 “验收合格后 90 个工作日支付”你可能没细想,但那意味着你干完活等四个半月才拿钱。如果甲方一直说”还有几个小问题需要调整”,你可能永远拿不到。

签任何合同之前,30 秒的事。


常见问题

中文合同能用吗? 能。用 Claude 或 GPT 时,中文审查效果跟英文基本一样。我测试的那几份北京长租公寓合同和互联网公司劳动合同全是中文的,都正确识别了问题。Kimi 对中文也不错,而且更便宜。

结果准吗? 大模型对合同条款的理解能力已经很强了,常见的坑(押金不退、竞业过宽、单方面终止)基本不会漏。但它不了解你所在城市的具体法规细节(比如上海和深圳对押金退还的时限要求不同),也可能对多条款交叉影响的复杂情况判断不够准。把它当第一道筛子用,发现红旗了再找律师确认。

扫描过的合同会被存下来吗? ContractGuard 本身不存储任何数据。合同文本会发送到你配置的 LLM 提供商(OpenRouter、OpenAI 等)做分析,跟你直接用 ChatGPT 问是一样的数据流向。如果你完全不想让合同内容离开你的电脑,用 Ollama 本地模型就行。

能分析扫描件 PDF 吗? 目前只支持文本型 PDF(可以复制文字的那种)。扫描件 PDF(图片)需要先做 OCR,这个功能在 roadmap 上了但还没做。你可以先用其他 OCR 工具转成文本再喂进来。


这不是法律意见

必须说清楚:ContractGuard 是辅助工具,不能替代律师。

它的定位是合同审查的第一道筛子:花 30 秒跑一下,快速知道这份合同有几个坑、严重程度如何、哪些地方需要跟对方谈。然后你再决定要不要请律师细看。

请律师一次几百到几千块,但如果你连”这份合同有没有问题”都不知道,连律师都不知道该不该请。

先让 AI 过一遍。发现红旗再请律师。这个工作流比闭着眼签,或者花几千块让律师看一份其实没问题的合同,都合理得多。


GitHub:

github.com/he-yufeng/C…

写这个工具的初衷就是不想让更多人踩我踩过的坑。合同里的每一个字都是在保护某个人的利益,问题是保护的是你还是对方。

用了觉得有用请 Star 一下。更重要的是,转发给你身边正在签合同的朋友。他们可能正准备闭着眼签字。

我的其他项目:

  • CoreCoder:Claude Code 51 万行源码的 1300 行 Python 核心重写,附 7 篇架构导读。GitHub:

github.com/he-yufeng/C…