【AI大模型实战】合同审核Agent开发全攻略:使用Dify和AI技术实现智能合同审查,看到就是赚到!!

手把手实战:快速构建合同智能审查Agent 配置“模型供应商”,选择 “OpenAI-API-compatible”,输入申请到的 “API Key” 和 “URL” 后点击“保存”,如下图示例完成 “AlayaNew/DeepSeek-R1。至此,我们完成了合同智能审核Agent的构建,我们也可以在Dify中把这个智能体发布为API服务,这样企业其它应用如OA就可以通过API集成,在原合同流程中实现智能审核工作。该节点“输入变量”中,配置从“开始”节点中获取上传的文件,输出变量就是合同的内容,配置如下图。接下来我们开始创建智能体。 阅读详情

背景介绍

为什么需要合同审核agent?

合同是商业活动的基石,明确权责、管控风险、保障交易安全。但在传统人工审核模式下,合同管理面临三大核心挑战:

  • 审核盲区与风险漏判: 依赖法务人员个人经验,面对海量非标条款时,难以百分百识别所有隐蔽风险条款(如责任限制、保密范围、争议解决地),为后续履约埋下隐患;
  • 效率瓶颈与协作成本高: 高并发业务场景下,审核请求排队严重,流转耗时漫长,法务团队疲于应付简单重复问题,严重拖慢商务谈判与项目推进节奏;
  • 知识断层与标准不统一: 审核标准因人而异,新手律师易经验不足,而资深专家的风险偏好与判例知识难以快速沉淀和复用,导致组织级的合同风控水平波动大。

合同审核agent通过AI技术精准破局,将法务专家经验转化为实时、在线、可复用的智能服务,实现风险管控的自动化、标准化与前置化。

今天我就带着大家使用dify搭建合同审核Agent。利用它,用户只需轻松上传合同文件,即可获得一份带有详细风险批注的反馈文档,高效识别条款漏洞与潜在风险。

实现流程

整体的工作流分为三部分:合同文件处理、合同要点审核、生成批注文件。

下面就让我们逐个步骤来看一下是怎么实现的吧!

一、合同文件内容获取

图1 文件处理部分流程

首先是对用户上传合同文件的处理,这里处理的主要目的是提取出文件的内容。在【开始】节点我们自定义了“file”和“product_type”两个参数,分别是用户上传的合同文件以及合同中设计的采购产品类型。

图2 开始节点

我们的合同审核工作流目前支持用户上传三种类型的文件:docx、doc以及普通pdf。对于docx和pdf格式的文件来说,dify提供的【文件提取】节点可以直接读取文件内容,而使用该节点读取doc格式的文件会报错,所以我们自定义了一个【doc转docx】的插件,将文件转化为docx格式进行读取。插件使用python进行开发,具体实现见下方代码。具体dify中如何实现自定义插件请参考此链接中的内容:

https://legacy-docs.dify.ai/zh-hans/plugins/quick-start/develop-plugins/extension-plugin

图3 doc格式文件转化插件

from collections.abc import Generatorfrom typing import Anyfrom dify_plugin import Toolfrom dify_plugin.entities.tool import ToolInvokeMessagefrom docx import Documentimport tempfileimport ioimport osimport subprocessfrom typing import Optionalimport requestsclass Doc2docxTool(Tool):    def _invoke(self, tool_parameters: dict[str, Any]) -> Generator[ToolInvokeMessage]:        filename = tool_parameters.get('doc_file')        filename.url = "http://api:5001"+filename.url        result_bytes_io = self.convert_doc_to_docx(filename.url)        result_file_bytes = result_bytes_io.getvalue()        print(f"Converted DOCX file size: {len(result_file_bytes)} bytes")        yield self.create_blob_message(            blob=result_file_bytes,            meta=self.get_meta_data(                mime_type = "application/vnd.openxmlformats-officedocument.wordprocessingml.document",                output_filename=tool_parameters.get("output_filename"),           ),        )        return    def convert_doc_to_docx(self, url):        with tempfile.TemporaryDirectory() as tmpdir:            response = requests.get(url)            doc_path = os.path.join(tmpdir, "input.doc")            with open(doc_path, "wb") as f:                f.write(response.content)            # 执行转换
            subprocess.run([                "libreoffice", "--headless", "--convert-to", "docx", doc_path, "--outdir", tmpdir            ], check=True)            docx_path = os.path.join(tmpdir, "input.docx")            result_bytes_io = io.BytesIO()            document = Document(docx_path)            document.save(result_bytes_io)            print(f"Converted DOCX file size: {result_bytes_io.getbuffer().nbytes} bytes")        return result_bytes_io    def get_meta_data(self, mime_type, output_filename):        result_filename: Optional[str] = None        temp_filename = output_filename.strip() if output_filename else None        if temp_filename:            # ensure extension name            extension = MimeType.get_extension(mime_type)            if not temp_filename.lower().endswith(extension):                temp_filename = f"{temp_filename}{extension}"            result_filename = temp_filename        return {            "mime_type": mime_type,            "filename": result_filename,        }

从代码中可以看出,我们使用了libreoffice命令行实现了doc格式的转换。这里需要注意的一点是我们需要在plugin_daemon-1这个容器中安装libreoffice这个工具,执行下面的命令:

apt updateapt install libreoffice -y

通过文件提取这一步骤之后,我们使用【代码】节点将三个分支内容进行参数聚合,获取真正包含文件内容的分支的数据。代码节点的脚本如下:

图4 分支聚合代码


二、合同要点审查

第二部分是我们合同审核任务的关键(这一步非常重要哦),目标就是根据用户的需求在合同中进行逐条审核。下面是我们合同要点审查实现流程:

图5 审查部分流程

售后部分和其他节点有一些区别,因为不同的产品对应的售后条款不同,所以针对这一点,我们使用【代码】节点结合【开始】节点中的“product_type”进行判断,然后将需要遵守的售后规则传入【售后条款审核】节点。

从图中可以看到,我们在条款审核这一部分主要是依靠大模型的能力来实现的。所以这部分的调优除了大模型的选型,就是我们对prompt的调整。下面我们以【赔偿责任】节点为例进行讲解。 【赔偿责任】节点的prompt如下图6所示。

我们设置prompt的主要目的是让大模型明白三件事:

  1. 你是谁?(确定角色以及立场)

  2. 你要做什么?(审查的要点和遵守的规则)

  3. 你最终要输出什么?(输出内容和格式)

Ok,带着这三点要求我们来看一下prompt中具体是怎么实现的。

图6 赔偿责任审查要点

prompt解读:

  • 在prompt开始的部分我们给大模型进行了身份和立场的确认,因为我们所做的合同审核工具主要是为采购合同的乙方服务,所以我们希望大模型能够站在乙方的角度思考,“屏蔽”训练过程中数据、loss function或reward model教给它的“中立客观”的记忆。
  • 第二段我们告诉了大模型他的具体任务是什么。 接着我们给出了审核中要关注的要点和始终坚持的目标。审核要点很好理解,这就是用户针对“赔偿责任”所要重点关注的内容,模型需要关注合同中有关“赔偿责任”的条款,认真研判这些条款是否侵害了乙方的权益。
  • 最后就是对模型输出的格式和内容的要求了。为了方便后续文档批注的插入,我们需要模型以json的格式输出“问题原文”、“风险类型”和“修订建议”。

各位看到这里可能有疑问了:“你的合同审核关注要点和我的不同,怎么办啊?”

答:好办,将你的审查要点和我所提供给你的prompt输入到大模型中,告诉他“按照我提供给你的模板生成一份!”,这样就可以生成适合你的审查要点的prompt了。


在得到审核内容之后,我们使用一个大模型节点对审核内容进行二次判断,主要目标是为了将重复的“问题原文”进行合并,具体prompt如下图。

因为这个节点所实现的目标相比审查节点来说要简单的多,所以我们使用了qwen3-4B的模型来实现,从测试效果来看可以满足我们的需求。不过话说回来,如果我们在审查节点时使用235B的模型,是否可以省略二次审查的节点呢?

图7 审查结果去重节点

通过各个审查节点的处理我们最终得到了六个角度的审查结果,我们通过【代码】节点清洗内容,最终构成嵌套字符串。各部分的代码实现见下图。

图8 json清洗代码节点

图9 审查结果聚合代码节点


三、生成批注文件

通过前两步的处理我们对上传的合同文件进行了审查,得到了审查的结果,万事俱备只欠展示。

针对用户经常使用的合同审核方法,我们选择使用批注的形式输出最终的审查结果。

针对三种上传的文件格式,我们编写了对应的【批注插入】插件。插件的构建参考我们前面给出的链接,下面我们以docx文件插入批注为例给出tool部分代码。

图10 批注插入流程

from collections.abc import Generatorfrom typing import Anyfrom dify_plugin import Toolfrom dify_plugin.entities.tool import ToolInvokeMessageimport jsonimport iofrom docx import Documentfrom docx.oxml.ns import qnfrom docx.oxml import OxmlElementfrom docx.text.run import Runfrom docx.opc.constants import CONTENT_TYPE, RELATIONSHIP_TYPEfrom docx.opc.packuri import PackURIfrom docx.opc.part import Partfrom docx.opc.oxml import parse_xmlfrom datetime import datetimeimport xml.etree.ElementTree as ETfrom pydantic import Field, PositiveInt, PositiveFloat, BaseModelfrom typing import Annotated, Literal, Optionalimport requestsimport jiebafrom sklearn.feature_extraction.text import TfidfVectorizerfrom sklearn.metrics.pairwise import cosine_similarity_COMMENTS_PART_DEFAULT_XML_BYTES = b"""<w:comments xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" />"""class InsertCommentTool(Tool):    def _invoke(self, tool_parameters: dict[str, Any]) -> Generator[ToolInvokeMessage]:        # 提取参数        uploaded_file = tool_parameters.get('docx')        if not uploaded_file:            yield self.create_text_message("请上传文件")            return        file_url = "http://api:5001" + uploaded_file.url        print(f"Processing uploaded file: {file_url}")        response = requests.get(file_url)        print(f"the response info : {response.content}")        print(f"the response info type : {type(response.content)}")        if response.status_code != 200:            yield self.create_text_message(f"文件下载失败,状态码: {response.status_code}")            return        text_to_comment = tool_parameters.get('comment_list')
        try:            # 先把外层字符串列表转换成Python list            json_strs = json.loads(text_to_comment)        except json.JSONDecodeError as e:            print(f"外层列表JSON解析错误: {e}")            return        print(f"Parsed JSON strings: {json_strs}")
        # 转化为元组列表        final_text_comments = []        for json_str in json_strs:            processed = self.process_json_string(json_str)            final_text_comments.extend(processed)        print(f"Final text comments to insert: {final_text_comments}")        outfile_path, document = self.insert_multiple_comments_into_docx(response.content, uploaded_file.filename, final_text_comments, "AI审查助手")        result_bytes_io = io.BytesIO()        document.save(result_bytes_io)        result_file_bytes = result_bytes_io.getvalue()        yield self.create_blob_message(            blob=result_file_bytes,            meta=self.get_meta_data(                mime_type = "application/vnd.openxmlformats-officedocument.wordprocessingml.document",                output_filename=tool_parameters.get("output_filename"),           ),        )        return    def get_meta_data(self, mime_type, output_filename):        result_filename: Optional[str] = None        temp_filename = output_filename.strip() if output_filename else None        if temp_filename:            # ensure extension name            extension = MimeType.get_extension(mime_type)            if not temp_filename.lower().endswith(extension):                temp_filename = f"{temp_filename}{extension}"            result_filename = temp_filename        return {            "mime_type": mime_type,            "filename": result_filename,        }    def process_json_string(self, json_str):            try:                json_node = json.loads(json_str)  # 先把字符串转为字典            except json.JSONDecodeError as e:                print(f"JSON解析错误: {e}")                return []            result = []            question_list = json_node.get("问题条款", [])            for item in question_list:                original_text = item.get("问题原文", "")                suggestion = item.get("修订建议", "")                error_type = item.get("风险类型", "")                result.append((original_text, f"风险类型:{error_type}。修订建议:{suggestion}"))            return result    def similarity(self, text1, text2):        texts = [' '.join(jieba.lcut(text1)), ' '.join(jieba.lcut(text2))]        vectorizer = TfidfVectorizer()        tfidf = vectorizer.fit_transform(texts)        similarity = cosine_similarity(tfidf[0:1], tfidf[1:2])        return similarity[0][0]    def insert_multiple_comments_into_docx(self, io_content, file_path, comments_list, author="Author", initials="A"):        """        在DOCX文件中插入多个批注。        Args:            io_content (str): DOCX内容的二进制流。            comments_list (list): 包含 (text_to_comment, comment_text) 元组的列表。            author (str): 批注作者。            initials (str): 批注作者缩写。        """        doc_file = io.BytesIO(io_content)        document = Document(doc_file)        # 确保comments part存在        try:            comments_part = document.part.part_related_by(RELATIONSHIP_TYPE.COMMENTS)        except KeyError:            comments_part = Part(                partname=PackURI("/word/comments.xml"),                content_type=CONTENT_TYPE.WML_COMMENTS,                blob=_COMMENTS_PART_DEFAULT_XML_BYTES,                package=document.part.package,            )            document.part.relate_to(comments_part, RELATIONSHIP_TYPE.COMMENTS)        ET.register_namespace("w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main")        comments_xml = parse_xml(comments_part.blob)        # 获取下一个可用的批注ID        next_comment_id = 0        for comment in comments_xml.findall(qn("w:comment")):            current_id = int(comment.get(qn("w:id")))            if current_id >= next_comment_id:                next_comment_id = current_id + 1        for text_to_comment, comment_text in comments_list:            comment_id = next_comment_id            next_comment_id += 1            # 创建批注XML元素            comment_element = OxmlElement("w:comment")            comment_element.set(qn("w:date"), datetime.now().isoformat())            comment_element.set(qn("w:id"), str(comment_id))            comment_element.set(qn("w:author"), author)            comment_element.set(qn("w:initials"), initials)            comment_paragraph = OxmlElement("w:p")            comment_run = OxmlElement("w:r")            comment_text_element = OxmlElement("w:t")            comment_text_element.text = comment_text            comment_run.append(comment_text_element)            comment_paragraph.append(comment_run)            comment_element.append(comment_paragraph)            comments_xml.append(comment_element)            # 查找需要批注的文本并插入批注引用            found_in_document = False            for paragraph in document.paragraphs:                if text_to_comment in paragraph.text or self.similarity(text_to_comment, paragraph.text) > 0.8:                    # 找到文本在段落中的位置                    # 创建w:commentRangeStart和w:commentRangeEnd                    comment_range_start = OxmlElement("w:commentRangeStart")                    comment_range_start.set(qn("w:id"), str(comment_id))                    comment_range_end = OxmlElement("w:commentRangeEnd")                    comment_range_end.set(qn("w:id"), str(comment_id))                    # 将w:commentRangeStart插入到run之前                    paragraph.runs[0]._element.addprevious(comment_range_start)                    # 将w:commentRangeEnd插入到run之后                    paragraph.runs[-1]._element.addnext(comment_range_end)                    # 创建w:r元素,包含w:commentReference                    comment_reference_run = OxmlElement("w:r")                    comment_reference = OxmlElement("w:commentReference")                    comment_reference.set(qn("w:id"), str(comment_id))                    comment_reference_run.append(comment_reference)                    # 将w:commentReference插入到run中                    paragraph.runs[-1]._element.append(comment_reference_run)                    found_in_document = True                    break                if found_in_document:                    break            if not found_in_document:                print(f"Warning: Text \"{text_to_comment}\" not found in the document. Comment not added for this text.")        comments_part._blob = ET.tostring(comments_xml)        output_file_path = file_path.replace(".docx", "_with_multiple_comments.docx")        document.save(output_file_path)        print(f"批注已成功插入到 {output_file_path} 中。")        return output_file_path, document

最后

为什么要学AI大模型

当下,⼈⼯智能市场迎来了爆发期,并逐渐进⼊以⼈⼯通⽤智能(AGI)为主导的新时代。企业纷纷官宣“ AI+ ”战略,为新兴技术⼈才创造丰富的就业机会,⼈才缺⼝将达 400 万!

DeepSeek问世以来,生成式AI和大模型技术爆发式增长,让很多岗位重新成了炙手可热的新星,岗位薪资远超很多后端岗位,在程序员中稳居前列。

在这里插入图片描述

与此同时AI与各行各业深度融合,飞速发展,成为炙手可热的新风口,企业非常需要了解AI、懂AI、会用AI的员工,纷纷开出高薪招聘AI大模型相关岗位。
在这里插入图片描述
最近很多程序员朋友都已经学习或者准备学习 AI 大模型,后台也经常会有小伙伴咨询学习路线和学习资料,我特别拜托北京清华大学学士和美国加州理工学院博士学位的鲁为民老师给大家这里给大家准备了一份涵盖了AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频 全系列的学习资料,这些学习资料不仅深入浅出,而且非常实用,让大家系统而高效地掌握AI大模型的各个知识点。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

AI大模型系统学习路线

在面对AI大模型开发领域的复杂与深入,精准学习显得尤为重要。一份系统的技术路线图,不仅能够帮助开发者清晰地了解从入门到精通所需掌握的知识点,还能提供一条高效、有序的学习路径。

img

但知道是一回事,做又是另一回事,初学者最常遇到的问题主要是理论知识缺乏、资源和工具的限制、模型理解和调试的复杂性,在这基础上,找到高质量的学习资源,不浪费时间、不走弯路,又是重中之重。

AI大模型入门到实战的视频教程+项目包

看视频学习是一种高效、直观、灵活且富有吸引力的学习方式,可以更直观地展示过程,能有效提升学习兴趣和理解力,是现在获取知识的重要途径

在这里插入图片描述
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

海量AI大模型必读的经典书籍(PDF)

阅读AI大模型经典书籍可以帮助读者提高技术水平,开拓视野,掌握核心技术,提高解决问题的能力,同时也可以借鉴他人的经验。对于想要深入学习AI大模型开发的读者来说,阅读经典书籍是非常有必要的。
在这里插入图片描述

600+AI大模型报告(实时更新)

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
在这里插入图片描述

AI大模型面试真题+答案解析

我们学习AI大模型必然是想找到高薪的工作,下面这些面试题都是总结当前最新、最热、最高频的面试题,并且每道题都有详细的答案,面试前刷完这套面试题资料,小小offer,不在话下
在这里插入图片描述

在这里插入图片描述

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

基于 Dify +大模型(LLM)+ Qwen3模型,输出合同审查智能体(Agent) 在商业合作与法律事务中,合同审查与起草是高频且专业的需求,传统的人工处理方式效率低、成本高,且容易因疏忽导致法律风险。如今,借助大语言模型(LLM)和低代码AI开发平台,企业可以快速构建私有化、智能化的合同处理助手,实现合同条款解析、风险提示、自动修订等核心功能。本文将详细介绍如何基于平台和大模型,从零开发一个高效、安全的企业级合同智能体,涵盖模型微调、法律知识库构建、合规性校验等关键技术,助力企业法务与商务团队降本增效,同时确保数据隐私与法律合规。 阅读详情

相关推荐

用dify实现简单的Agent应用(AI信息检索)

这篇文章里,我们来聊聊如何使用字节最新的豆包大模型,在 Dify 上来快速完成一个具备理解需求、自主规划、自主选择工具使用的简单智能体(Agent)。

leaning_java的博客 4957

【喂饭教程】手把手教你使用dify搭建合同审核Agent,全程干货,小白也能轻松学会!!

为什么需要合同审核agent? 合同是商业活动的基石,明确权责、管控风险、保障交易安全。但在传统人工审核模式下,合同管理面临三大核心挑战:

datian1234的博客 1666

大模型落地全攻略:业务诊断、技术选型与工程化避坑

大模型(LLM)技术正加速渗透企业业务,但许多落地项目因需求错配或工程化不足而失败。理解LLM在语义理解、非结构化信息处理上的能力边界,是选择应用场景的前提。知识问答、内容生成与信息抽取是当前最具性价比的三大方向,其中RAG(检索增强生成)通过文档切分、向量召回与重排机制,成为构建企业知识库的核心技术路径。工程上,延迟与成本控制、结构化输出的Prompt设计、评测体系建立,决定了系统能否从Demo走向生产。针对模型幻觉与长文本处理,可采用检索过滤、输出约束与预压缩等策略。从真实业务需求出发,做好选型与工程迭

weixin_34252686的博客 460

Dify “Agent节点” 让工作流学会 “自主推理”,小白零基础收藏这一篇就够了!!

在以往常见的Dify工作流里面,工具的调用逻辑是预先编排好的,不够灵活,无法适应复杂场景。随着大型语言模型(LLM)推理能力的不断增强,Dify推出Agent节点,利用大模型自主调 用工具。通过集成不同的Agent推理策略,使LLM能在运行时动态选择并执行工具,增强工具调用灵活性。

datian1234的博客 5165

Dify.AI 用户直面会总结:Embedding 技术与 Dify 数据集设计/规划

这样不仅可以大大减少模型的计算量,提高响应速度,更重要的是降低成本,并丰富了模型的知识库。

Dify 3515

VINS-Mono 时延估计论文翻译

Online Temporal Calibration for Monocular Visual-Inertial Systems 摘要 精确的状态估计是机器人导航、自主驾驶、虚拟现实和增强现实等各种智能应用的基础模块。视觉惯性融合是近年来流行的六自由度状态估计技术。记录不同传感器测量值的时刻对系统的鲁棒性和准确性至关重要。在实践中,每个传感器的时间戳通常会受到触发和传输延迟的影响,从而导致不同传感器之间的时间偏差(时间偏移)。这种时间偏移严重影响传感器融合的性能。为此,我们提出了一种标定视觉和

weixin_39061796的博客 1255

AI开发必看:Agent与Workflow工作流全攻略,收藏这份Agentic系统搭建指南

智能体与工作流:大模型落地的核心载体 本文探讨了智能体(Agent)与工作流(Workflow)如何成为连接大模型、工具与业务场景的关键桥梁。文章首先区分了二者的本质差异:工作流是预编排的标准化流程,而智能体具备自主决策能力。然后详细介绍了7种工作流搭建方式,包括增强型LLM、提示词链接、路由、并行等,并分析了各自的适用场景。最后指出,构建高效的Agentic系统需要根据业务场景平衡标准化与自主性,保持系统简洁,同时介绍了Dify、N8N等开源框架的应用。核心观点是:工作流与智能体相互补充,应根据实际需求灵

优快云_430422的博客 1128

Java 开发 修改【冒险岛 079 私服】完整学习流程

第 1-2 天:环境搭建 + 运行原版 079 服务端,能正常登录游戏;第 3-4 天:纯配置文件修改,掌握倍率、属性、怪物、道具的修改,改出第一个「百倍经验私服」;第 5-10 天:Java 代码基础修改,掌握 Player/Skill/Monster 核心类的修改,实现技能无冷却、一刀秒怪、升级满属性;第 11-20 天:Java 代码进阶修改,掌握业务逻辑修改,实现死亡不掉经验、自动捡物、装备强化无失败;第 21-30 天。

萧曳丶 3895

Dify实践 | Agent详解:定义、工作原理、搭建搜索引擎、多Agent协作....

AI大模型作为人工智能领域的重要技术突破,正成为推动各行各业创新和转型的关键力量。抓住AI大模型的风口,掌握AI大模型的知识和技能将变得越来越重要。学习AI大模型是一个系统的过程,需要从基础开始,逐步深入到更高级的技术。这里给大家精心整理了一份全面的AI大模型学习资源,包括:AI大模型全套学习路线图(从入门到实战)、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等,资料免费分享!

star_nwe的博客 8151

【教程】ENVI主成分分析详解

主成分分析(PCA)是一种统计方法,简而言之就是用几种特性去描述事物。每个事物都可以用不同的特性去进行表达,但这些特性一般而言是存在相互的融合和冗余,而用主成分分析方法将这些特性进行转换成不相关的新特性。 在ENVI软件中共提供了三种主成分分析方式分别为:(1)Forward PCA Rotation Existing Statistics(2)Forward PCA Rotation New Statistics and Rotate(3)Inverse PCA Rotati...

YW_remote的博客 1万+

VSCode玩转STM32:手把手教你配置EIDE插件与OpenOCD调试(附野火DAP配置文件详解)

本文详细介绍了如何在VSCode中配置EIDE插件与OpenOCD进行STM32开发,特别针对野火DAP调试器提供了配置文件详解。从基础环境搭建到深度调试技巧,帮助开发者高效完成STM32项目开发,实现现代化嵌入式开发工作流。

weixin_26905487的博客 553

【Python大语言模型系列】一文教你使用dify云版本开发一个简单的Agent(完整教程)

一文教你使用dify云版本开发一个简单的Agent(完整教程)

数据杂坛 1728

ANSYS Maxwell:创建即用型 3D 轴向磁通电机模型

Magnet Length” 是磁体的径向长度。“Magnet Thickness” 是磁体的轴向长度。为了对 AFM 进行更详细的分析,用户需要在 ANSYS Maxwell 中运行 3D FEA 分析。对于 2D 模型,它们类似于 MotorCAD 中的模型,后者对等效的直线电机进行建模。单击“确定”后,将创建一个 3D Maxwell 模型。“长度”是转子铁的轴向长度。然后需要定义定子的“磁芯”尺寸和材料。“长度”是定子铁芯的轴向长度。“转子”# 的极数必须与“定子”中定义的磁极相同。

jkh920184196的博客 1930

Dify学习笔记-工具(七)

Dify学习笔记-工具

大数据知识梳理 1万+

数字后端:版图基础seal ring

seal ring结构是为了防止划片或封装对芯片造成破坏,从而在芯片与划片道(scribe line)之间添加的一圈保护环

m0_61544122的博客 1万+

电磁场仿真:电磁场基础理论_(13).微波技术基础

微波是指频率在300 MHz到300 GHz之间的电磁波。这一频率范围对应的波长为1米到1毫米。

2401_87715305的博客 1318

必收藏!合同审查Agent实战指南(附问题合同+审核报告)| 小白程序员也能上手

合同审查Agent的核心是“两库两规”的建设,只要搭建好风险条款库、标准模板库、行业法规库、公司政策库,再通过“主Agent调度+子Agent执行”的模式,就能实现合同的全面审查,小白程序员也能逐步上手开发。本文的架构设计、Agent分工及实战案例,可直接作为小白开发合同审查Agent的参考范本,尤其是问题合同与审核报告的对比,能清晰看到Agent的核心作用——识别风险、合规把关、给出可落地建议。后续可基于本文方案,拓展更多行业的合同模板、优化Agent的实时性和交互体验,逐步完善功能。

AI大模型的博客 1194

数据分析案例-基于红米和华为手机的用户评论分析

在智能手机市场日益繁荣的今天,红米与华为手机作为国产手机品牌的佼佼者,凭借其各自独特的品牌魅力和技术实力,赢得了广泛的用户群体和高度关注。随着技术的不断进步和消费者需求的日益多样化,用户对手机的期望已不仅限于基本的通讯功能,更涵盖了性能、拍照、续航、用户体验等多个方面。因此,深入探究红米与华为手机在用户长期使用过程中的实际表现,尤其是用户评论中所反映出的真实反馈,对于理解市场需求、优化产品设计及提升用户体验具有重要意义。本实验的背景正是基于这样的市场环境和技术发展趋势。我们旨在通过收集并分析红米与华为手机的

m0_64336780的博客 1万+

智合同丨大模型审合同是趋势还是跟风

大模型审合同是一个结合了技术发展、市场需求和法律监管的综合趋势,而不仅仅是一种跟风行为。随着技术的不断进步大模型审合同技术正逐步成为合同管理领域的一种有效工具,但同时也需要不断优化和完善,以应对技术和合规方面的挑战。

Shenhetong的博客 1083

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

真实案例:使用LLM大模型及BERT模型实现合同审查系统

在合同审查中的优势在于其强大的文本理解和生成能力。LLM经过在大量法律数据上的微调训练后,能够深入理解合同文本的深层含义,识别合同类型和结构,并显著提高合同风险审查的准确性。通过特定于法律领域的训练和调优,BERT模型可以进一步提高在法律文书分类、法律合同审查、法律案例分析等任务上的性能,并更好地理解和利用法律文书的含义、法律合同的有效性以及法律案例的背景。思通数科的合同审查管理系统通过LLM和BERT模型的应用,不仅提高了合同审查的效率和准确性,而且在用户体验度上具有明显优势。

Luli2024的博客 9092

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

详解智能体应用——合同审查Agent,非常详细建议收藏

【摘要】本文探讨了合同审查的重要性及AI辅助审查系统的构建。合同审查是企业法务核心工作,但中小企业往往缺乏专业法务支持。作者提出基于"两库两规"(风险条款库、标准模板库、行业法规、公司政策)的合同审查Agent架构,包含初审、要素审核、风险评估、合规检查、修改建议五大功能模块。通过农产品采购合同案例,展示了该系统的风险识别能力,包括主体信息不全、条款模糊等8类问题,并提出规范化修改建议。最后强调AI大模型在合同审查领域的应用前景,指出掌握AI工具将成为法律从业者的重要竞争力。(149字)

WANGJUNAIJIAO的博客 2123

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

如何用dify搭建agent工作流

Dify 从 v0.6+ 版本开始支持 “工作流”(Workflow)模式,可构建类似 AutoGen 或 LangGraph 的链式/分支式 Agent 流程。通过以上步骤,即可在 Dify 中搭建出具备多角色协作、工具调用、条件判断能力的 Agent 工作流,满足央国企常见的“智能公文”“合规质检”“数据问答”等需求。💡 提示:Workflow 模式支持可视化编排多个节点(Node),每个节点可视为一个“子 Agent”。创建新应用 → 选择 “Workflow” 类型(不是 “Chatbot”)

张杰的博客 1808

Dify学习笔记-入门学习(二)

Dify学习笔记-入门学习,包括基础介绍和安装

大数据知识梳理 2万+

Dify学习笔记-基础介绍(一)

Dify学习笔记-基础介绍

大数据知识梳理 3万+

一文搞懂AI大模型学习路线:核心知识点 + 实战路径全解析

一文搞懂AI大模型学习路线:核心知识点 + 实战路径全解析

Android_XG的博客 1626

【收藏级】详解智能体应用——合同审查Agent从架构到实战

合同审查Agent通过“两库两规”基础支撑与多Agent协同架构,实现了合同审查的标准化、高效化与合规化,尤其适合缺乏专业法务资源的中小企业。对于小白与程序员而言,学习此类智能体的开发与应用,不仅能掌握大模型Agent的核心设计逻辑(如任务拆分、多智能体协同、知识库搭建),还能快速落地实际业务场景,提升技术变现能力。后续可进一步探索的方向包括:引入向量数据库提升“两库”检索效率、优化Agent的自然语言理解能力以适配复杂合同文本、对接电子签章系统实现审核-签署全流程闭环等。

weixin_72959097的博客 1814
上一篇: 大模型RAG核心技术:信息检索如何打造AI“超级大脑“?看完这一篇你就知道了!!
下一篇: Agent实战教程:LangGraph图结构深度解析,构建大模型智能体的核心组件与实战,看到就是赚到!!
Agent学习路线
博客等级 码龄6年 1万+粉丝 1903原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值