dify可通过workflow构建合同要素比对分析器,实现条款级差异结构化定位:支持多格式合同上传、保留段落结构的文档提取、基于中文条款标记的语义分块、两两配对并行比对、要素级(主体/时间/金额等)差异识别,并输出标准化markdown差异报告。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

你需要让Dify自动比对两份或多份法律合同,精准定位条款级差异,比如“甲方义务”部分在A版中写明“7个工作日内付款”,B版却写成“收到发票后30日付款”,这种关键表述偏移必须被结构化标出,不能只靠大模型泛泛而谈“内容不同”。
准备多合同输入与基础解析
进入Dify工作区→点击“创建工作流”→选择“Workflow”类型→命名“合同要素比对分析器”。【必须选Workflow,Chatflow不支持并行文档提取和列表操作节点】
在“开始节点”配置中,点击“+添加字段”→选择“文件列表”类型→字段名设为contracts→勾选支持格式:.pdf、.docx、.txt→设置最大上传数量为5。这一步漏掉“.docx”会导致Word合同无法上传,流程直接卡死。
拖入“文档提取器”节点→连接至开始节点→双击配置:输入来源选contracts→输出变量名设为raw_texts→勾选“保留原始段落结构”。该选项决定后续能否准确定位“第3条第2款”这类位置信息,不勾选则所有文本压成一整段,比对失去意义。
构建条款级语义分块矩阵
拖入“代码”节点→连接至文档提取器→输入变量设为raw_texts。粘贴以下Python代码:
```python
import re
def split_by_clause(text):
# 匹配“第X条”“第X款”“(X)”等中文条款标记
pattern = r'(?:第[零一二三四五六七八九十百千\d]+[条|款]|(\d+)|\[\d+\])'
parts = re.split(pattern, text)
markers = re.findall(pattern, text)
blocks = []
for i, (marker, content) in enumerate(zip(markers, parts[1:])):
if len(content.strip()) > 20: # 过短内容忽略,避免噪声
blocks.append({"clause_marker": marker.strip(), "content": content.strip()})
return blocks
result = []
for doc in raw_texts:
blocks = split_by_clause(doc["text"])
result.append({"name": doc["name"], "blocks": blocks})
return result
```
这段代码会把每份合同按中文条款标记切分成独立语义块,比如把“第5条 保密义务”及其下全部正文作为一个块。它不依赖标题样式,专为法律文书设计,能识别手写编号、括号编号、方括号编号等多种变体。
注意:若某份合同未检测到任何“第X条”类标记,该文档将被跳过——说明它根本不是标准法律合同,可能是附件或说明文档,无需参与主比对。
执行两两条款块精准比对
拖入“迭代”节点→输入变量选上一步的输出(变量名假设为chunked_docs)→启用“并行执行”。
在迭代框内依次添加:
① “列表操作”节点→选择“组合”功能→源列表选chunked_docs→组合方式选“两两配对”→输出字段映射为paired_chunks;
② “大模型”节点→输入绑定为paired_chunks→关闭“流式响应”→系统提示词开头加一句:“你是一名法律文本比对专家,仅对比两个条款块的实质含义是否一致,忽略标点、空格、序号格式差异,重点识别权利义务主体、时间、金额、条件等关键要素的实质性偏移。”
这一步的关键是让模型聚焦“要素级”而非“字面级”比对。例如,“乙方应在交货后15日内开具发票”和“乙方须于货物交付完毕后十五(15)日内提供合规发票”,模型必须判断为一致;但若一处写“15日”,另一处写“30日”,就必须标出差异。
大模型节点输出变量设为comparison_results,格式为JSON数组,每个元素含file_a、file_b、clause_marker、diff_type(一致/主体偏移/时间偏移/金额偏移/缺失)、original_a、original_b。
生成可交付的差异定位报告
拖入“大模型”节点→输入绑定为comparison_results→系统提示词强制要求:“严格按以下Markdown模板输出,不得增删字段,不得解释原因:\n\n## 合同差异总览\n- 共比对__份合同,生成__组条款对,发现__处实质性差异\n\n## 差异明细\n| 文件A | 文件B | 条款位置 | 差异类型 | A原文 | B原文 |\n|---|---|---|---|---|---|\n{逐行填充}”
最后拖入“结束”节点→连接上一步→在输出配置中勾选“返回结构化数据”和“启用前端展示”。此时用户上传两份采购合同,就能立刻看到表格里清晰列出哪一条款谁写了什么、差异在哪、属于哪种风险类型。











