一、引言在AI应用开发过程中我们常面临“重复造轮子”、“流程碎片化”、“技术门槛高”三大绊脚难题不同场景需重新编写数据处理、工具调用逻辑非专业人员难以参与复杂流程维护成本高。而基于ModelEngine 的核心思想正是通过角色化智能体分工、插件化工具集成、双模式开发适配打通 AI 应用从设计到落地的全链路让开发效率倍增。这种思想并非依赖ModelEngine官方框架而是一套可复现的设计范式将复杂任务拆分为“专业智能体”通过标准化插件对接外部工具同时支持低代码拖拽和代码扩展兼顾易用性与灵活性。今天我们深入了解ModelEngine的核心思想并通过“智能合同审查助手” 实践示例细化分解此思想的核心体现。二、ModelEngine思想拆解1. 角色化智能体让任务专职专责、专人专岗打破传统单体代码逻辑将应用拆分为多个有明确角色的智能体每个智能体只负责单一核心任务通过数据传递实现协作。优势解耦复杂逻辑便于单独调试、迭代和复用如“数据清洗智能体”可跨数据分析、办公自动化场景复用核心原则一个智能体对应一个业务能力输入输出格式标准化。2. 插件化工具集成对接资源无需重复开发定义标准化插件接口将 Excel、PDF、大模型、邮件等外部工具封装为插件智能体通过调用插件完成具体操作无需关注工具底层实现。优势插件可跨智能体、跨项目复用新增工具仅需开发新插件不改动核心逻辑核心原则插件只负责工具调用业务逻辑沉淀在智能体中。3. 双模式开发适配不同技术能力兼顾非技术人员和开发者需求支持两种开发模式低代码模式通过可视化画布拖拽智能体、插件配置参数即可搭建流程适合运营、产品等非技术人员代码模式通过编写代码定义智能体和插件适配复杂业务逻辑适合开发者。三、智能体智能合同审查助手基于ModelEngine思想我们构建一款“智能合同审查助手”实现上传 PDF/Word 合同→自动解析文本→审查合规风险如违约责任、争议解决条款→生成审查报告。示例PyPDF2、python-docx插件库同时已经本地大模型进行审查和分析。风险范围释义违约责任条款审查赔偿范围、违约金合理性争议解决条款审查管辖法院、仲裁机构、法律适用其他合规风险点知识产权、保密条款、不可抗力等1. 需求拆解与架构设计1.1 核心需求1. 支持 PDF/Word 合同上传自动提取文本内容2. 审查 3 类核心风险是否缺失违约责任条款、争议解决方式是否明确、付款期限是否清晰3. 生成结构化审查报告风险点、修改建议、无风险项支持 Word 导出。1.2 架构设计智能体 插件组件类型具体组件核心功能依赖插件智能体文档解析智能体读取 PDF/Word 文本去除格式干扰PDF 插件、Word 插件智能体合规审查智能体识别风险点生成修改建议大模型插件智能体报告生成智能体整合审查结果生成标准化 Word 报告Word 插件插件PDFPlugin解析 PDF 文件文本PyPDF2 库插件WordPlugin读取 / 生成 Word 文件python-docx 库插件LLMPlugin调用大模型完成合规审查本地Qwen大模型2. 整体执行流程步骤说明1. 合同文件上传用户上传PDF/Word合同文件系统接收并验证文件格式与完整性支持批量上传和加密传输。2. 文档解析智能体自动提取文本内容识别合同结构分割条款段落处理扫描件OCR识别生成结构化数据。3. 合规审查智能体分析条款合规性检查违约责任、争议解决等风险点比对法律数据库评估风险等级并提供修改建议。4. 报告生成智能体整合审查结果生成结构化报告包含风险摘要、条款分析、修改建议并自动生成Word格式文档。5. 输出结果最终提供可下载的Word审查报告和Excel风险清单支持后续编辑和归档确保审查过程可追溯。6. 异常处理如文件解析失败则提示格式异常无风险则标记合同合规系统自动处理各种边缘情况。3. 项目整体实践3.1 结构预览contract_review/├─ core/ ModelEngine核心模块│ ├─ __init__.py│ ├─ agent.py 智能体基类│ └─ plugin.py 插件基类具体插件├─ agents/ 自定义智能体│ ├─ __init__.py│ ├─ parse_agent.py 文档解析智能体│ ├─ review_agent.py 合规审查智能体│ └─ report_agent.py 报告生成智能体└─ main.py 主流程入口3.2 实现核心模块core/三个核心智能体和多个插件模块的交互流程系统接收PDF或DOCX格式的合同文件通过文档解析智能体提取文本内容合规审查智能体利用本地Qwen 1.8B模型进行风险分析报告生成智能体最终输出结构化审查报告。插件系统提供了可扩展的文件处理和报告生成能力。3.2.1 core/agent.py智能体基类定义标准接口class BaseAgent: 智能体基类模拟ModelEngine的BaseAgent agent_name default_agent agent_desc 默认智能体需子类重写业务逻辑 def __init__(self, pluginsNone): self.plugins plugins or {} # 关联插件字典格式管理 def execute(self, input_data): 核心执行方法必须由子类重写 raise NotImplementedError(请在子类中实现execute方法)3.2.2 core/plugin.py插件基类 具体插件实现实现了基于插件架构的本地合同合规审查系统的核心包括从PDF/Word 文件中提取合同文本并利用本地部署的大语言模型Qwen1.5-1.8B-Chat进行合规分析最后生成结构化 Word 审查报告的完整过程。import os from abc import abstractmethod from PyPDF2 import PdfReader from docx import Document class BasePlugin: 插件基类模拟ModelEngine的BasePlugin plugin_name default_plugin plugin_version 1.0.0 abstractmethod def run(self, *args, **kwargs): 插件核心执行方法子类重写 pass # ---------------------- 插件实现基于本地模型包含PDF/Word/本地大模型 ---------------------- class PDFPlugin(BasePlugin): PDF解析插件提取PDF文本内容 plugin_name pdf_plugin def run(self, file_path): if not os.path.exists(file_path): raise FileNotFoundError(fPDF文件不存在{file_path}) if not file_path.endswith(.pdf): raise ValueError(仅支持后缀为.pdf的文件) # 读取PDF文本 reader PdfReader(file_path) text_content for page in reader.pages: page_text page.extract_text() or text_content page_text \n return text_content.strip() class WordPlugin(BasePlugin): Word插件读取docx文本 生成审查报告Word plugin_name word_plugin def run(self, action, file_path, contentNone): if not os.path.exists(os.path.dirname(file_path)) and os.path.dirname(file_path): os.makedirs(os.path.dirname(file_path), exist_okTrue) # 动作1读取docx文件文本 if action read: if not file_path.endswith(.docx): raise ValueError(仅支持后缀为.docx的文件) doc Document(file_path) text_content \n.join([para.text for para in doc.paragraphs]) return text_content.strip() # 动作2生成合规审查报告Word elif action generate: if not content: raise ValueError(生成Word报告需要传入content字典参数) doc Document() # 填充报告内容企业标准格式 doc.add_heading(合同合规审查报告, 0) doc.add_paragraph(f审查合同{os.path.basename(content[file_path])}) doc.add_paragraph(f审查时间{content[review_time]}) doc.add_paragraph(f审查模型Qwen1.5-1.8B-Chat本地运行) # 风险点汇总 doc.add_heading(一、核心风险点汇总, level1) if content[risks]: for i, risk in enumerate(content[risks], 1): doc.add_paragraph(f{i}. {risk[item]}, styleList Number) doc.add_paragraph(f 整改建议{risk[suggestion]}, styleList Bullet) else: doc.add_paragraph(✅ 无核心风险点合同条款符合企业合规要求。) # 审查结论 doc.add_heading(二、审查最终结论, level1) doc.add_paragraph(content[conclusion]) # 保存Word文件 doc.save(file_path) return file_path class LocalLLMPlugin(BasePlugin): 本地大模型插件基于Qwen1.5-1.8B-Chat执行合同合规审查 plugin_name local_llm_plugin def __init__(self, model_nameqwen/Qwen1.5-1.8B-Chat, cache_dirD:\\modelscope\\hub): super().__init__() self.model_name model_name self.cache_dir cache_dir self.tokenizer None self.model None self._load_local_model() # 初始化时自动下载/加载本地模型 def _load_local_model(self): 下载首次并加载本地Qwen1.5-1.8B-Chat模型 print(*50) print(f正在下载/校验模型{self.model_name}) print(f模型缓存目录{self.cache_dir}) print(提示首次下载需要约4GB磁盘空间后续运行直接加载缓存无需重复下载) print(*50) # 步骤1通过modelscope下载模型到本地缓存 try: local_model_path snapshot_download( self.model_name, cache_dirself.cache_dir ) except Exception as e: raise Exception(f模型下载失败{e}) # 步骤2通过transformers加载tokenizer和模型 try: self.tokenizer AutoTokenizer.from_pretrained( local_model_path, trust_remote_codeTrue, padding_sideright # 优化生成效果 ) self.model AutoModelForCausalLM.from_pretrained( local_model_path, trust_remote_codeTrue, device_mapcpu # 自动适配CPU/GPU有GPU则自动加载无GPU则用CPU ) # 模型推理优化CPU/GPU通用 self.model.eval() except Exception as e: raise Exception(f模型加载失败{e}) print(*50) print(模型下载/加载完成可开始合同审查) print(*50)重点说明模块化设计通过 BasePlugin 抽象基类定义统一接口支持扩展不同功能插件PDF 解析、Word 处理、大模型推理。多格式文档支持PDFPlugin读取 .pdf 文件并提取纯文本。WordPlugin既可读取 .docx 文本也可生成标准化的合规审查报告含风险点、建议、结论。本地大模型集成LocalLLMPlugin 封装了 Qwen1.5-1.8B-Chat 模型的下载、加载与推理流程确保数据不出内网满足安全要求。自动化审查流程用户只需提供合同文件路径系统即可自动完成文件解析 → 模型分析 → 报告生成无需人工干预。3.3 实现自定义智能体agents/3.3.1 agents/parse_agent.py文档解析智能体定义文档解析智能体核心作用是根据输入的文件路径自动识别合同文件格式PDF 或 Word并调用对应的插件提取其中的纯文本内容。from core.agent import BaseAgent class ParseAgent(BaseAgent): 文档解析智能体解析PDF/Word合同文本 agent_name parse_agent agent_desc 解析PDF/Word格式合同提取纯文本内容 def execute(self, input_data): file_path input_data[file_path] if not os.path.exists(file_path): raise FileNotFoundError(f合同文件不存在{file_path}) # 根据文件后缀选择对应插件 if file_path.endswith(.pdf): pdf_plugin self.plugins.get(pdf_plugin) return pdf_plugin.run(file_path) elif file_path.endswith(.docx): word_plugin self.plugins.get(word_plugin) return word_plugin.run(actionread, file_pathfile_path, contentNone) else: raise ValueError(不支持的文件格式仅支持.pdf和.docx)重要说明统一入口解析多格式文档对外提供一致的 execute() 接口内部根据文件扩展名分发到 PDF 或 Word 解析插件。插件化架构通过 self.plugins.get(...) 动态调用已注册的 pdf_plugin 或 word_plugin实现解耦和可扩展性。输入校验检查文件是否存在、格式是否支持避免无效操作。3.3.2 agents/review_agent.py合规审查智能体定义合规审查智能体核心作用是作为合同合规审查任务的协调者接收合同文本调用已注册的本地大模型插件local_llm_plugin进行风险分析并返回审查结果。from core.agent import BaseAgent class ReviewAgent(BaseAgent): 合规审查智能体调用本地模型审查合同风险 agent_name review_agent agent_desc 基于本地大模型审查合同合规风险并生成修改建议 def execute(self, input_data): contract_text input_data if not contract_text: raise ValueError(合同文本为空无法进行审查) # 调用本地大模型插件执行审查 llm_plugin self.plugins.get(local_llm_plugin) return llm_plugin.run(contract_text)重点说明插件化调用不直接依赖模型实现而是通过 self.plugins.get(local_llm_plugin) 动态获取已注册的插件实现逻辑与执行分离便于替换或升级底层模型。输入校验对传入的合同文本进行非空检查防止无效请求导致后续错误。统一接口通过 execute(input_data) 方法提供标准化入口便于上层调度系统如工作流引擎、API 服务调用。3.3.3 agents/report_agent.py报告生成智能体定义报告生成智能体核心作用是将合同审查结果风险点、结论等与原始文件信息整合调用 Word 插件生成符合企业标准格式的 Word 审查报告并保存到指定目录。from core.agent import BaseAgent import datetime class ReportAgent(BaseAgent): 报告生成智能体生成标准化Word审查报告 agent_name report_agent agent_desc 整合审查结果生成企业标准格式Word审查报告 def execute(self, input_data): review_result input_data[review_result] file_path input_data[file_path] # 构造报告内容 report_content { file_path: file_path, review_time: datetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S), risks: review_result[risks], conclusion: review_result[conclusion] } # 调用Word插件生成报告 word_plugin self.plugins.get(word_plugin) output_file_name f合同审查报告_{os.path.basename(file_path).replace(., _)}.docx output_file_path os.path.join(contract_reports, output_file_name) return word_plugin.run( actiongenerate, file_pathoutput_file_path, contentreport_content )重要说明结构化报告生成将来自ReviewAgent的审查结果封装为标准化字典供报告模板使用。自动化命名与存储根据原始合同文件名自动生成带时间语义的报告文件名并统一存入 contract_reports/ 目录。插件驱动输出通过 word_plugin 的 generate 动作实现报告渲染保持逻辑与格式解耦。3.4 主流程入口main.pyimport os from core.plugin import PDFPlugin, WordPlugin, LLMPlugin from agents.parse_agent import ParseAgent from agents.review_agent import ReviewAgent from agents.report_agent import ReportAgent def main(contract_file_path): 主流程合同文件 → 解析 → 审查 → 生成报告 :param contract_file_path: 合同文件路径.pdf或.docx # 步骤1初始化插件包含本地大模型插件 plugins { pdf_plugin: PDFPlugin(), word_plugin: WordPlugin(), local_llm_plugin: LocalLLMPlugin( model_nameqwen/Qwen1.5-1.8B-Chat, cache_dirD:\\modelscope\\hub ) } # 步骤2初始化智能体并关联插件 parse_agent ParseAgent(pluginsplugins) review_agent ReviewAgent(pluginsplugins) report_agent ReportAgent(pluginsplugins) # 步骤3执行全流程 try: print(\n【步骤1/3】正在解析合同文件...) contract_text parse_agent.execute({file_path: contract_file_path}) print(\n【步骤2/3】正在进行合规审查本地模型推理中稍等...) review_result review_agent.execute(contract_text) print(freview_result:{review_result}) print(\n【步骤3/3】正在生成Word审查报告...) report_file_path report_agent.execute({ review_result: review_result, file_path: contract_file_path }) # 步骤4输出结果 print(\n *60) print(合同审查全流程完成) print(f审查报告保存路径{os.path.abspath(report_file_path)}) print(f风险点数量{len(review_result[risks])}) for i, risk in enumerate(review_result[risks], 1): print(f {i}. 风险点{risk[item]}) print(f 建议{risk[suggestion]}) print(*60) except Exception as e: print(f\n流程执行失败{e}) # ---------------------- 运行入口直接执行此文件即可 ---------------------- if __name__ __main__: # 替换为你的合同文件路径支持.pdf或.docx TEST_CONTRACT_PATH 测试合同.pdf # 可修改为测试合同.docx # 运行主流程 main(TEST_CONTRACT_PATH)输出结果正在下载/校验模型qwen/Qwen1.5-1.8B-Chat模型缓存目录D:\modelscope\hub提示首次下载需要约4GB磁盘空间后续运行直接加载缓存无需重复下载Downloading Model from modelscope to directory: D:\modelscope\hub\qwen\Qwen1.5-1.8B-Chat2026-02-04 14:13:42,563 - modelscope - INFO - Creating symbolic link [D:\modelscope\hub\qwen\Qwen1.5-1.8B-Chat].2026-02-04 14:13:42,572 - modelscope - WARNING - Failed to create symbolic link D:\modelscope\hub\qwen\Qwen1.5-1.8B-Chat for D:\modelscope\hub\qwen\Qwen1___5-1___8B-Chat.Loading weights: 100%|███████████████████████| 291/291 [00:0000:00, 956.43it/s, Materializing parammodel.norm.weight]模型下载/加载完成可开始合同审查【步骤1/3】正在解析合同文件...【步骤2/3】正在进行合规审查本地模型推理中稍等...模型原始返回内容{risks: [{item: 违约责任条款,suggestion: 在系统开发过程中如果乙方未能按照约定的时间节点完成任务甲方有权要求乙方支付违约金具体金额根据逾期天数和总费用的比例计算。同时如果乙方未能按照约定的方式和时间提交系统甲方有权解除合同并要求乙方退还已收款项并赔偿相应的经济损失。对于乙方违反保密义务的行为甲方有权要求乙方赔偿实际经济损失。},{item: 风险点,suggestion: 在第 1 条中关于乙方的培训时间限制可能需要调整为 2-3 次每次时长不少于 3 小时以满足甲方的需求。此外可以增加一个风险点即乙方在试运行期间应对可能出现的技术问题进行快速响应如系统崩溃、数据丢失等以保障系统的稳定运行。}],conclusion: 本合同中甲方有以下违约责任条款在系统开发过程中如乙方未能按照约定的时间节点完成任务甲方有权要求乙方支付违约金具体金额根据逾期天数和总费用的比例计算。同时如果乙方未能按照约定的方式和时间提交系统甲方有权解除合同并要求乙方退还已收款项并赔偿相应的经济损失。对于乙方违反保密义务的行为甲方有权要求乙方赔偿实际经济损失。同时培训时间限制可能需要调整为 2-3 次每次时长不少于 3 小时以满足甲方的需求。此外可以增加一个风险点即乙方在试运行期间应对可能出现的技术问题进行快速响应如系统崩溃、数据丢失等以保障系统的稳定运行。}【步骤3/3】正在生成Word审查报告...合同审查全流程完成审查报告保存路径D:\AIWorld\test\contract_reports\合同审查报告_测试合同_pdf.docx风险点数量21. 风险点违约责任条款建议在系统开发过程中如果乙方未能按照约定的时间节点完成任务甲方有权要求乙方支付违约金具体金额根据逾期天数和总费用的比例计算。同时如果乙方未能按照约定的方式和时间提交系统甲方有权解除合同并要求乙方退还已收款项并赔偿相应的经济损失。对于乙方违反保密义务的行为甲方有权要求乙方赔偿实际经济损失。2. 风险点风险点建议在第 1 条中关于乙方的培训时间限制可能需要调整为 2-3 次每次时长不少于 3 小时以满足甲方的需求。此外可以增加一个风险点即乙方在试运行期间应对可能出现的技术问题进行快速响应如系统崩溃、数据丢失等以保障系统的稳定运行。四、总结ModelEngine的核心价值并非某一个框架或工具而是“模块化拆分、标准化集成、全场景适配”的设计思想。打破了传统 AI 应用开发都是从头到尾手写代码的固化模式把复杂系统拆解成一个个可独立运作、可自由组合的智能体和插件。通过智能体的角色化分工将复杂逻辑解耦每个智能体只专注一件事既方便单独调试优化又能跨项目复用通过插件化集成外部工具不管是 Excel、PDF 处理还是本地大模型、云端 API都能按统一标准接入不用反复适配底层逻辑再加上全场景适配的特性都能基于这套思想快速搭建专属AI应用。