1. 项目背景:当大模型遇上合同盲区
合同审核这个活儿,干过法务或财务的朋友都懂——每份合同动辄几十页,关键条款藏在字里行间,稍不留神就可能掉坑。传统人工审核像在玩"大家来找茬",而普通大模型聊天式交互又停留在表面问答。我们团队去年处理某供应链合同时,就曾因漏看一个"最惠国条款"多付了15%采购成本。
现在有个更聪明的解法:用RAG(检索增强生成)结合结构化信息抽取,把大模型变成合同审查专家。实测下来,这套方案能在3分钟内完成百页合同的关键条款提取与风险提示,准确率比人工检查高出20%。举个例子,当合同中出现"单方解除权需提前30天书面通知"时,系统会自动标红并提示:"建议修改为双向对等条款"。
2. 技术架构设计
2.1 整体方案流程图
合同PDF → 文本解析 → 向量化存储 → 用户提问 → 语义检索 → 结构化抽取 → 风险报告2.2 核心组件选型
- 文本解析层:PyPDF2 + Unstructured(处理扫描件用PaddleOCR)
- 向量数据库:ChromaDB(轻量级)或Weaviate(生产级)
- 大模型:Llama3-70B(本地部署)或GPT-4-turbo(API调用)
- 结构化抽取:采用LangChain的Pydantic输出解析器
关键选择:为什么不用纯文本搜索?因为合同条款常存在同义表述(如"终止"/"解除"),向量检索能捕捉语义关联
3. 实现步骤详解
3.1 合同知识库构建
from langchain.text_splitter import RecursiveCharacterTextSplitter # 按章节智能分块(保留上下文) splitter = RecursiveCharacterTextSplitter( chunk_size=1000, chunk_overlap=200, separators=["\n\n第", "\n\nARTICLE"] ) chunks = splitter.split_documents(pages)3.2 关键条款抽取模板
定义Pydantic模型捕获合同要素:
from pydantic import BaseModel, Field class TerminationClause(BaseModel): notice_period: int = Field(description="提前通知天数") party: str = Field(description="有权终止方", enum=["甲方","乙方","双方"]) compensation: bool = Field(description="是否需赔偿")3.3 混合检索策略
# 先语义检索再精确匹配 retriever = db.as_retriever( search_type="mmr", # 最大边际相关性 search_kwargs={"k": 5, "filter": {"doc_type": "contract"}} )4. 实战效果对比
测试某技术许可协议时:
| 检查项 | 人工审核 | 传统NLP | 本方案 |
|---|---|---|---|
| 保密条款遗漏 | 15% | 35% | 3% |
| 条款冲突发现 | 2处 | 0处 | 5处 |
| 耗时 | 120分钟 | 5分钟 | 3分钟 |
5. 避坑指南
扫描件处理:遇到图片合同时,先用Tesseract做OCR,但要注意:
- 分辨率需≥300dpi
- 中文合同添加
--psm 6参数
条款冲突检测:建立条款关系图谱
graph LR A[保密期限] --> B[协议有效期] B --> C[终止后义务]- 版本控制:用git管理合同修订过程,配合Diff Match Patch工具比对版本差异
6. 扩展应用场景
- 投资协议:自动提取对赌条款、回购条件
- 租房合同:检查押金退还规则、维修责任
- 采购订单:识别付款账期与违约金计算方式
最近我们给某跨境电商客户部署的系统中,就发现了其物流合同里藏着一条:"旺季运费可上浮不超过300%",这条款差点让他们双11多付200万运费。现在他们的法务总监见人就说:"这AI比三个律师加起来都好使"