近期公司计划引入大语言模型(LLM)对内部合同文件和制度文档进行自动化审核,以减轻人工负担。为此,我着手研究如何利用Dify开发一套智能审核系统。虽然网上有不少相关工作流的教程,但实际落地时却发现诸多挑战。多数方案仅是简单的提示词+文件上传+结果输出模式,在实际应用中存在明显短板:
- 一次性让模型处理整篇文档易导致注意力分散(长文本场景下,LLM通常对首尾内容记忆更清晰),影响审核质量
- 文档长度超过模型上下文限制时,如何科学分割内容?
- 审核结果能否直接在原Word文档中生成批注?
针对这些问题,我想到可以基于标题对Word文档进行智能分割,而非简单截断。但如何在Dify中实现这一功能呢?代码执行节点安装第三方库较为繁琐,且无法完成复杂的文件读写操作。既然Dify插件市场没有合适的工具,那就自己开发一个!
成果展示
说明:原视频时长较长,此处为加速播放版本
下面为大家介绍该工作流的实现过程:
整体流程图

整个工作流分为三个核心模块:
- 合同文件的智能分块处理
- 分块内容的迭代审核
- 带批注的Word文档生成
以下将结合工作流文档的实现逻辑,对这三大模块进行详细技术解析:
模块详解
一、合同文件的智能分块处理

流程图

关键技术点(Word文档智能分块)
- 起始节点参数设计

自定义了三个核心参数,其中文件类型为必填项:
- file_type:用于区分审核类型(合同文件/制度文件),为后续针对性处理提供依据
- focus_point:用户可输入关注重点,便于LLM在审核时优先关注相关内容
- contracting_party:用户选择合同立场(甲方/乙方),使审核更具针对性
- 格式兼容性处理

- 原生支持.docx格式(直接使用开发的word-tool插件)
- 对.pdf格式先转为Word再处理(借助插件中的pdf2word工具)
- 自动拦截.doc格式(提示用户转换),当检测到.doc文件时,系统会明确提示不支持该格式

关于未开发doc转docx功能的说明:实现这一转换需要在Dify容器中额外安装libreoffice工具,考虑到多数用户操作不便,故未集成该功能,建议用户自行转换格式。
- 语义分块插件

这是我开发的核心插件之一,专门针对合同和制度类文件优化。其分块逻辑是通过Python-docx库先识别段落,再判断每个段落是否为标题,最后结合标题与普通段落进行分块,确保每个章节或小节作为独立单元,保持良好的语义完整性。感兴趣的读者可查看我的GitHub源码
该插件包含以下核心模块:
(1) 多维度标题识别
算法通过多重维度精准识别标题:
- 样式检测:识别Word内置标题样式(如Heading1-6)
- 格式特征:分析加粗、字体大小、居中对齐、黑体等格式特征
- 正则匹配:识别数字编号(1.、1.1)、中文序号、章节条目等结构模式
- 文档类型优化:针对合同和制度文件提供专属标题识别模式
- 文本分析:结合长度、关键词、结尾符号等特征辅助判断
(2) 智能语义分块
采用语义感知的分块策略:
- 连续标题处理:将多个连续标题合并为一个逻辑单元
- 长段落独立:超过1000字符的长段落单独成块
- 短段落合并:将短段落与相邻内容智能合并,避免碎片化
- 表格处理:确保表格与其最近的标题处于同一区块
(3) 数学分组算法
当分块数量超过限制时,采用精确的数学算法处理:
- 数量精确控制:通过商和余数计算确保最终块数不超过限制
- 余数优化分配:前余数组每组包含
商+1个段落,其余组包含商个段落 - 相邻合并策略:优先合并相邻段落,保持内容连贯性
由于Dify的迭代节点最多支持30个迭代对象,因此分块数量上限设为30个,同时支持用户自定义分块数量。
- 输出结构示例(JSON数组,对应Dify中的array[object]类型):
{"1": "第一条 合同主体...", "2": "第二条 付款方式..."}
- JSON数据提取
def main(chunks) -> dict:
# 提取第一个字典
data_dict = chunks[0]
# 按数值顺序排序键(1,2,3...30)
sorted_keys = sorted(data_dict.keys(), key=lambda x: int(x))
# 按排序后的键构建结果
content = [{key: data_dict[key]} for key in sorted_keys]
return {"result": content}
提取分块后的JSON数据,返回array[object]类型对象,便于后续迭代节点处理。
二、分段迭代审核

这一模块主要涉及提示词工程和RAG(检索增强生成)技术,针对合同文件和制度文件分别设计专用提示词,要求模型输出结构化的审查结果,以便后续用正则表达式提取关键信息。
流程图:

关键技术实现
- RAGFlow知识库构建
考虑到RAGFlow知识库对法律文件和制度文件有专业的分块策略,因此合同范本和法律文献均采用RAGFlow平台作为知识库。
合同审核依赖的知识库主要包括合同范本、审核规则和法律法规。由于单位尚未整理专用审核规则(若有则更佳),我将通用审核规则整合到提示词中,目前使用的知识库包括:
-
合同范本库:企业私有标准合同库(采用General策略分块)

-
法规库:最新法律法规库(采用LAW策略分块)

- 动态关键词检索与段落总结
在迭代节点中,每次处理一个分块内容。若直接将整个块作为关键词检索,容易超过知识检索节点的上限,且召回效果不佳。因此采用先对段落进行关键词提取的策略,以下是LLM的提示词:
【身份】
你是一个段落关键词提取器兼段落结构总结器,主要有两个任务:一是提取段落中的关键词,供后续节点进行知识库检索;二是对当前段落进行目录式总结,为后续全文总结和结构审核提供基础。
【背景】
你是文件审核系统的一个节点,由于文件过长,已被拆分为多个段落,你仅处理其中一个段落。通过对每个段落的总结,后续节点将拼接所有总结内容,形成全文总结并审核结构完整性,避免因文件过长导致超出读取上限。
【要求】
关键词要求:
1、全面提取整个段落的内容;
2、检索关键词不超过10个,数量适中。
段落总结要求:
1、尽量概括该段落的目录结构和主要内容;
2、每个段落总结不超过200字。
输出要求:
严格按照以下JSON格式输出:
{
"type": "object",
"properties": {
"keyword": {
"type": "string",
"description": "提取的关键词"
},
"paragraph_summary": {
"type": "string",
"description": "段落总结"
}
},
"required": [
"keyword",
"paragraph_summary"
],
"additionalProperties": false
}
【提示】
当前处理段落:{{#context#}}
通过将段落传入LLM节点,生成该段落的关键词,作为后续知识库检索的依据。同时让LLM生成段落总结,因为迭代切片方式下LLM无法看到全文,通过合并各段总结,可让迭代外的LLM进行整体结构审查与总结。
由于合同审核与制度审核的LLM提示词较长,此处未完全展示,可参考分享的DSL查看详情。
- 信息提取
import re
def main(text):
# 匹配所有问题块(从"合同文件中存在问题的原句摘要"到下一个同类标题前)
problem_blocks = re.findall(
r"合同文件中存在问题的原句摘要\b.*?(?=\n\s*(?:\*\*)?合同文件中存在问题的原句摘要\b|\Z)",
text,
re.DOTALL,
)
result_dict = {}
for block in problem_blocks:
# 提取原句摘要(从标题后到问题点前)
origin_match = re.search(
r"合同文件中存在问题的原句摘要\b[^\n]*(.*?)(?=\n\s*(?:\*\*)?问题点\b)",
block,
re.DOTALL,
)
# 提取问题点(从标题后到相关法律依据前)
problem_match = re.search(
r"问题点\b[^\n]*(.*?)(?=\n\s*(?:\*\*)?相关法律依据\b)", block, re.DOTALL
)
# 提取风险等级
risk_level = re.search(
r"风险等级\b[^\n]*(.*?)(?=\n\s*(?:\*\*)?修改建议\b)", block, re.DOTALL
)
# 提取修改建议(从标题后到是否有需要补充的条款前)
suggestion_match = re.search(
r"修改建议\b[^\n]*(.*?)(?=\n\s*(?:\*\*)?是否有需要补充的条款\b)",
block,
re.DOTALL,
)
if origin_match:
origin = origin_match.group(1).strip()
problem = (
problem_match.group(1).strip() if problem_match else "未找到问题点"
)
suggestion = (
suggestion_match.group(1).strip()
if suggestion_match
else "未找到修改建议"
)
risk = (
risk_level.group(1).strip()
if risk_level
else "未找到风险等级"
)
# 拼接问题点和修改建议作为value
result_dict[origin] = f"问题点:\n{problem}\n\n风险等级:\n{risk}\n\n修改建议:\n{suggestion}"
# 提取全局的补充条款
additional_match = re.search(
r"是否有需要补充的条款\b[^\n]*(.*?)(?=\n\*\*\*合同文件中存在问题的原句摘要\b|\Z)", text, re.DOTALL
)
return {
"problems": result_dict,
"additional_clauses": (
additional_match.group(1).strip() if additional_match else ""
),
}
通过正则表达式提取LLM的审核结果,前提是必须要求LLM按固定结构输出,否则难以用正则提取。输出格式要求如下:
【输出要求】
1、审核结果按以下格式输出:
**合同文件中存在问题的原句摘要**
[具体原句内容]
> 注意:`合同文件中存在问题的原句摘要`要以一个句子或一个小段落为单元,不允许一次性输出多个段落或长段落。若有多句话或多个小段落有问题,可重复该结构,但不得超过5个。原句不允许省略,务必保证完整性!
**问题点**
[具体问题描述]
**相关法律依据**
> [法律1]
> [法律2]
**风险等级**
> [风险等级]
**修改建议**
[具体修改建议,不超过五点]
**是否有需要补充的条款**
[是/否及补充内容]
(多个问题重复以上结构,每个结构不可缺少,每段问题不超过5条!)
这里说明一下为何不使用Dify中LLM节点的JSON结构化输出:因为我使用的是chatflow而非workflow,需要保证用户能看到过程输出。
三、批注生成与报告整合
这一模块主要实现迭代内容的整合及Word文档批注功能。

关键技术(Word文档批注)
- 批注数据构建
// 批注数据结构
{
"原文摘要": "第十条 违约金为总价20%",
"批注内容": "风险等级:中\\n建议:应明确约定违约金计算基数"
}

将正则表达式每次迭代输出的原文与批注键值对存储在会话变量中,通过代码节点进行JSON类型转换,将array[object]类型转为JSON类型,以便传入批注工具。
转换代码如下:
import json
def main(comment) -> dict:
result = json.dumps(comment)
return {
"result": result,
}
- 批注插件
这款插件的开发颇费功夫,能够在Word文档中查询LLM输出的原文,支持对一句话、一段话或连续多段话进行检索匹配并生成批注。

该插件包含以下核心模块:
(1) 多格式JSON数据处理
- 格式兼容性:同时支持数组格式
[{<原文>:<批注>},{}...]和对象格式{<原文>:<批注>}
(2) 多维度智能文本匹配算法
第一层:精确匹配
# 首先尝试精确匹配
if target_text in paragraph_text:
return True, target_text, 1.0
第二层:单段落语义匹配
- 标准化匹配:去除多余空格和标点后进行精确匹配
- 句子级匹配:使用
SequenceMatcher计算语义相似度 - 滑动窗口算法:动态调整窗口大小匹配长文本片段
- 关键词密度分析:基于关键词分布和顺序进行智能匹配
第三层:跨段落组合匹配
# 多段落匹配逻辑
for start_para_idx in range(start_index, len(all_paragraphs) - len(target_paragraphs) + 1):
# 尝试在连续段落中匹配所有目标段落
(3) 原生Word批注API集成
- 采用python-docx 1.2.0原生API:
doc.add_comment(runs, text, author, initials) - 精确Run分割:实现Run级别的精确文本定位
- 样式保持技术:分割Run时保留原有的加粗、斜体、下划线、字体等格式属性
(4) 自定义文件名处理
文件名处理逻辑:
- output_filename参数:支持用户自定义输出文件名,无需包含扩展名
通过插件的批注功能,最终生成带批注的Word文档(示例文档为网上下载的公开合同范本)。

总结与扩展
以上就是智能合同审核智能体的完整构建流程。作为首次分享技术内容,若有不足之处,欢迎大家指正。希望本文能为大家提供帮助,也请多多点赞转发,欢迎在评论区交流讨论。
这款插件已上架Dify插件市场,搜索"word文档操作工具"即可下载使用。建议安装前将Dify的.env文件中PIP_MIRROR_URL参数设置为国内源,避免因网络问题导致第三方库安装缓慢。目前为第一版,使用中若有问题,可在我的GitHub反馈或在文章下方留言。
此外,为进一步提升系统实用性,未来计划增加以下功能:
- 支持多人协作审核,实现批注合并与冲突解决
- 增加审核结果的统计分析功能,生成风险评估报告
- 优化分块算法,提高对复杂格式文档的处理能力
- 扩展支持更多文件格式,如Excel表格中的条款审核

如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】


为什么要学习大模型?
我国在A大模型领域面临人才短缺,数量与质量均落后于发达国家。2023年,人才缺口已超百万,凸显培养不足。随着AI技术飞速发展,预计到2025年,这一缺口将急剧扩大至400万,严重制约我国AI产业的创新步伐。加强人才培养,优化教育体系,国际合作并进是破解困局、推动AI发展的关键。


大模型入门到实战全套学习大礼包
1、大模型系统化学习路线
作为学习AI大模型技术的新手,方向至关重要。 正确的学习路线可以为你节省时间,少走弯路;方向不对,努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划,带你从零基础入门到精通!

2、大模型学习书籍&文档
学习AI大模型离不开书籍文档,我精选了一系列大模型技术的书籍和学习文档(电子版),它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。

3、AI大模型最新行业报告
2025最新行业报告,针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

4、大模型项目实战&配套源码
学以致用,在项目实战中检验和巩固你所学到的知识,同时为你找工作就业和职业发展打下坚实的基础。

5、大模型大厂面试真题
面试不仅是技术的较量,更需要充分的准备。在你已经掌握了大模型技术之后,就需要开始准备面试,我精心整理了一份大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

适用人群

第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。
这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

3033





