目录

  • 引言
  • 一、Dify是什么
  • 二、为什么使用Dify
  • 三、使用Dify要怎么做
    • 1、聊天助手
    • 2、Agent
      • 2.1 Function calling(函数调用)和 ReAct 两种推理模式的区别
        • 2.1.1 技术本质与工作流程对比
        • 2.1.2 优缺点对比
        • 2.1.3 适用场景与选择依据
      • 2.2 LangChain 的 Agent 实现原理‌同时融合了 Function Calling 和 ReAct 两种模式‌
        • 2.2.1 核心机制:ReAct 框架‌
        • 2.2.2 ‌Function Calling 的作用‌
        • 2.2.3 LangChain 的灵活实现
        • 2.2.4 技术流程对比
    • 3、应用工具箱
    • 4、工作流
    • 5、工具 - MCP Server工具
      • 5.1 集成 MCP 工具
      • 5.2 在应用中使用 MCP 工具

引言

在《OpenAI Agent调用MCP Server案例分析》一文,小马介绍了支持MCP的框架,其中Dify目前备受青睐。对于企业来说,早期一般会沉淀一系列的AI应用,然后如何把这些应用的能力能串联到一起这是一个很值得探讨的话题。而Dify正是这样的一个框架,它兼容MCP,这样已经落地的应用都可以封装成一个MCP Server以工具的形式提供给AI LLM决策调用。就像积木一样,把原本需要分别各自独立实现一个成果的零件分别拆开工具化,这些工具作为基础颗粒模块就可以再自由拼装出N种不同的成果。

本文小马就对Dify进行初探,整理总结,聚焦剖析,以一个初学者的视角进入Dify的世界,帮助大家对Dify有初步的理解。尤其对于正在打算了解Dify框架或者正在进行Agent工程框架选型的同学具有参考意义。

阅读本文之前默认读者已经对基本的AI技术栈概念知识有所了解。

在这里插入图片描述

一、Dify是什么

首先我们来到Dify官方文档。

Dify 是一款开源的大语言模型(LLM)应用开发平台。它融合了后端即服务(Backend as Service)和 LLMOps 的理念,使开发者可以快速搭建生产级的生成式 AI 应用。即使你是非技术人员,也能参与到 AI 应用的定义和数据运营过程中。

这里面最后一句的概念很重要,“即使你是非技术人员,也能参与到 AI 应用的定义和数据运营过程中。

想要git仓库源码的同学可以移步这里传送门。但源码不是今天本文的重点。

二、为什么使用Dify

为什么使用 Dify?

你或许可以把 LangChain 这类的开发库(Library)想象为有着锤子、钉子的工具箱。与之相比,Dify 提供了更接近生产需要的完整方案,Dify 好比是一套脚手架,并且经过了精良的工程设计和软件测试。
重要的是,Dify 是开源的,它由一个专业的全职团队和社区共同打造。你可以基于任何模型自部署类似 Assistants API 和 GPTs 的能力,在灵活和安全的基础上,同时保持对数据的完全控制。

这一点也正是呼应了上一段的“即使你是非技术人员,也能参与到 AI 应用的定义和数据运营过程中。”,它已经工程化了,直接可以傻瓜式操作。

三、使用Dify要怎么做

这才是一个庞大的重点话题。
我们先站在非研发人员的角度来讨论这个话题,我们可以如何使用它。先来看几组概念。

在 Dify 中,一个“应用”是指基于 GPT 等大语言模型构建的实际场景应用。通过创建应用,你可以将智能 AI技术应用于特定的需求。它既包含了开发 AI 应用的工程范式,也包含了具体的交付物。 简而言之,一个应用为开发者交付了:

**封装友好的API,可由后端或前端应用直接调用,通过 Token 鉴权; **
开箱即用、美观且托管的WebApp,你可以 WebApp 的模板进行二次开发;
一套包含提示词工程、上下文管理、日志分析和标注的易用界面;

你可以任选其中之一或全部,来支撑你的 AI 应用开发。

小马特别喜欢其中的第一条,是不是意味着这个框架不仅提供了工程应用的搭建和Agent编排,同时还能提供API的调用服务。这对于企业来说既解决了工程应用的问题同时也具备了提供API服务的增值能力。

在这里插入图片描述

你可以通过 3 种方式在 Dify 的工作室内创建应用

基于应用模板创建(新手推荐)
创建一个空白应用
通过 DSL 文件(本地/在线)创建应用

Dify 中提供了五种应用类型

聊天助手:基于 LLM 构建对话式交互的助手
文本生成应用:面向文本生成类任务的助手,例如撰写故事、文本分类、翻译等
Agent:能够分解任务、推理思考、调用工具的对话式智能助手
对话流:适用于定义等复杂流程的多轮对话场景,具有记忆功能的应用编排方式
工作流:适用于自动化、批处理等单轮生成类任务的场景的应用编排方式

上面这几种类型看起来似乎没啥区别,我们自己来详细整理下这几个应用类型的不同。

应用类型对比区别
聊天助手聊天式;多轮对话;上下文保存-持续;AI 开场白-支持;情景举例-聊天;对话型应用的编排支持:对话前提示词,变量,上下文,开场白和下一步问题建议;
文本生成应用表单+结果式;一问一答;上下文保存-当次;AI 开场白-不支持;情景举例-翻译、判断、索引;
Agent智能助手(Agent Assistant),利用大语言模型的推理能力,能够自主对复杂的人类任务进行目标规划、任务拆解、工具调用、过程迭代,并在没有人类干预的情况下完成任务;Agent应用的编排提示词->你可以在“提示词”中编写智能助手的指令,为了能够达到更优的预期效果,你可以在指令中明确它的任务目标、工作流程、资源和限制等。添加工具->在“上下文”中,你可以添加智能助手可以用于查询的知识库工具,这将帮助它获取外部背景知识。在“工具”中,你可以添加需要使用的工具。工具可以扩展 LLM 的能力,比如联网搜索、科学计算或绘制图片,赋予并增强了 LLM 连接外部世界的能力。配置Agent->在 Dify 上为智能助手提供了 Function calling(函数调用)和 ReAct 两种推理模式。已支持 Function Call 的模型系列如 gpt-3.5/gpt-4 拥有效果更佳、更稳定的表现,尚未支持 Function calling 的模型系列,我们支持了 ReAct 推理框架实现类似的效果;
对话流
工作流工作流通过将复杂的任务分解成较小的步骤(节点)降低系统复杂度,减少了对提示词技术和模型推理能力的依赖,提高了 LLM 应用面向复杂任务的性能,提升了系统的可解释性、稳定性和容错性。Dify 工作流分为两种类型:Chatflow面向对话类情景和Workflow面向自动化和批处理情景 ;

接下来小马就重点挑几个和小马业务有关的应用类型来进一步展开剖析。

1、聊天助手

对话型应用采用一问一答模式与用户持续对话。对话型应用的编排支持:对话前提示词,变量,上下文,开场白和下一步问题建议

这倒是蛮适合客户服务和智能问答场景的,如下还可以自己添加附属功能。
在这里插入图片描述
有一个不足如下:
聊天助手类型应用不支持添加第三方工具,你可以在 Agent 类型应用内添加第三方工具。
怎么理解这句话呢?就是聊天应用类型只支持上下文这里的知识库(数据集或文件上传),你如果要自己添加一些第三方工具,如Google搜索引擎则不支持,需要自己使用Agent类型去实现。
(因此这里的聊天助手类型应用小马认为可拓展性还是有待斟酌的,选择的时候应慎重考虑自己的业务场景是否能匹配满足,长远考虑如果不行应直接选择可拓展性强的Agent类型)
在这里插入图片描述

2、Agent

这是小马重点关注的重中之重。
在上面的对比区别表格中,我们可以看到大致分为了几个步骤。

Agent应用的编排:选择模型->编辑提示词->添加工具->配置Agent

选择智能助手的推理模型智能助手的任务完成能力取决于模型推理能力,我们建议在使用智能助手时选择推理能力更强的模型系列如 gpt-4 以获得更稳定的任务完成效果。

在这里插入图片描述
你可以在“提示词”中编写智能助手的指令,为了能够达到更优的预期效果,你可以在指令中明确它的任务目标、工作流程、资源和限制等
在这里插入图片描述
在“上下文”中,你可以添加智能助手可以用于查询的知识库工具,这将帮助它获取外部背景知识。
在“工具”中,你可以添加需要使用的工具。工具可以扩展 LLM 的能力,比如联网搜索、科学计算或绘制图片,赋予并增强了 LLM 连接外部世界的能力(这里就是上面聊天助手应用类型所提到的它不能支持在上下文中添加第三方工具的部分)。Dify 提供了两种工具类型:第一方工具和自定义工具。

(小马插播一下:根据经验,从这一点来看,几乎可以判定 聊天助手应用类型 的技术实现使用的是类似langchain的RAG架构,而 Agent应用类型 的技术实现使用的是类似langchain的Agent核心组件模块。是Agent与非Agent思想架构的区别。《LangChain与Agent实现》)

你可以直接使用 Dify 生态提供的第一方内置工具,或者轻松导入自定义的 API 工具(目前支持 OpenAPI / Swagger 和 OpenAI Plugin 规范)。

“工具”功能允许用户借助外部能力,在 Dify 上创建出更加强大的 AI 应用。例如你可以为智能助理型应用(Agent)编排合适的工具,它可以通过任务推理、步骤拆解、调用工具完成复杂任务。
另外工具也可以方便将你的应用与其他系统或服务连接,与外部环境交互。例如代码执行、对专属信息源的访问等。你只需要在对话框中谈及需要调用的某个工具的名字,即可自动调用该工具。

在这里插入图片描述

在这里插入图片描述

下一步我们配置Agent。官方是这么说的。

在 Dify 上为智能助手提供了 Function calling(函数调用)和 ReAct 两种推理模式已支持 Function Call 的模型系列如 gpt-3.5/gpt-4 拥有效果更佳、更稳定的表现,尚未支持 Function calling 的模型系列,我们支持了 ReAct 推理框架实现类似的效果。
在 Agent 配置中,你可以修改助手的迭代次数限制。

小马认为这段话似乎理解起来有点歧义,Function calling和ReAct并不是两个平行的概念吧?要实现一个完整的推理循环的Agent,必须是需要ReAct 的吧。而模型是否支持Function calling应该只是会影响其中Action环节的稳定性。这两种模型的选择并不是解决模型是否兼容Function calling的问题,而应该是解决是否需要ReAct推理的选择。 于是小马也进行了进一步的探索验证。

2.1 Function calling(函数调用)和 ReAct 两种推理模式的区别

这里提到了两种推理模式,我们从以下两张官方的案例图多少可以看出两种推理模式的不同(放大看嗷)。
在这里插入图片描述
在这里插入图片描述

Function calling(函数调用)和 ReAct(Reasoning + Acting)是构建AI智能体的两种核心推理模式,它们在机制、适用场景和设计哲学上存在显著差异。核心区别在于:Function calling 针对结构化工具调用,强调高效执行;而 ReAct 通过迭代推理和行动循环处理复杂问题,注重适应性和可解释性。

2.1.1 技术本质与工作流程对比

Function calling‌
技术本质‌:一种结构化输出协议,模型将用户意图映射到预定义函数或工具(如API调用),直接输出标准化格式(如JSON),实现机器间通信。
工作流程‌:单次请求完成决策:模型识别意图 → 选择工具 → 提取参数 → 执行并返回结果,无需多步迭代。

ReAct‌
技术本质‌:一种认知行为框架,模拟人类推理-行动循环,模型通过自然语言描述思考过程,结合外部工具交互逐步推进任务。
工作流程‌:迭代循环:思考推理(Reason)→ 行动调用工具(Act)→ 观察结果(Observe)→ 调整策略直至解决问题。

2.1.2 优缺点对比

Function calling‌
优点‌:
执行效率高:适用于简单任务,响应速度快、。
结构化输出:便于下游处理(如数据检索或API集成)。
缺点‌:
灵活性低:处理模糊意图或多步任务时易出错(如参数提取失败)。
可解释性弱:决策过程在模型内部(黑盒),用户难跟踪。

ReAct‌
优点‌:
灵活性强:适应开放世界问题,能动态调整策略(如根据工具输出修改计算逻辑)。
可解释性高:推理步骤显式呈现(白盒),便于调试和信任。
缺点‌:
执行成本高:多步循环增加时间和资源消耗。
依赖模型能力:部分基础模型不支持自然语言指令解析。

2.1.3 适用场景与选择依据

Function calling‌
适合意图明确、结构化任务,例如:
实时数据查询(如股票价格或天气检索)。
自动化工具调用(如数学计算或API交互)。

ReAct‌
适合复杂、多步骤问题,例如:
动态调整方案(如折扣计算中根据观测值修改公式)。
开放环境决策(如目标导向的任务规划)。

实践中,两者常结合使用(如混合架构),以平衡效率与适应性。选择时优先考虑任务复杂度:Function calling 用于高效执行,ReAct 用于复杂推理。

2.2 LangChain 的 Agent 实现原理‌同时融合了 Function Calling 和 ReAct 两种模式‌

这是本文的一则题外话,但是既然气氛都到这里了还是一起整理了。

LangChain 的 Agent 实现原理‌同时融合了 Function Calling 和 ReAct 两种模式‌,具体取决于底层使用的 LLM 和 Agent 类型。

2.2.1 核心机制:ReAct 框架‌

ReAct(Reasoning + Acting)‌ 是 Agent 的‌基础推理逻辑‌

Thought‌:LLM 分析问题并制定计划。
Action‌:选择要调用的工具(如搜索、计算器)。
Action Input‌:提供工具所需的参数。
Observation‌:获取工具执行结果。
循环直到得出最终答案(Final Answer)。

ReAct 是通用模式‌:无论是否显式使用 Function CallingLangChain Agent 的交互流程都遵循此循环。

2.2.2 ‌Function Calling 的作用‌

优化 Action 步骤‌:

传统 ReAct 依赖 LLM 输出结构化文本(如 Action: 工具名),易出错。
Function Calling 允许 【LLM ‌直接输出】结构化 JSON‌(工具名 + 参数),提高可靠性。

例如:OpenAI 的 gpt-3.5-turbo 支持 tools 参数,可返回:

{"tool_calls": [{"name": "search","arguments": {"query": "LangChain 工作原理"}}]
}

非必需但高度兼容‌:
若 LLM 支持 Function Calling(如 OpenAI、Anthropic),LangChain 优先使用它以提升稳定性。
若不支持(如开源模型),Agent 仍可通过文本解析实现 ReAct。

2.2.3 LangChain 的灵活实现

不同 Agent 类型适配不同模式‌:

Agent 类型使用场景典型模式
ZERO_SHOT_REACT_DESCRIPTION通用任务(默认)ReAct(文本解析)
OPENAI_FUNCTIONS适配 OpenAI Function Calling‌Function Calling‌
STRUCTURED_CHAT_ZERO_SHOT复杂多工具场景‌ReAct + 结构化输出

底层统一性‌:
所有 Agent 均遵循 ReAct 的循环决策流程。
Function Calling 仅替代了其中的 ‌Action 生成步骤‌(从文本 → JSON)。

2.2.4 技术流程对比

传统 ReAct(无 Function Calling)‌

LLM 输出: Thought: 我需要搜索天气信息。Action: searchAction Input: {"query": "北京今日天气"}
→ LangChain 解析文本,调用工具

Function Calling 优化版‌

LLM 输出(JSON): {"tool_calls": [{"name": "search","arguments": {"query": "北京今日天气"}}]}
→ LangChain 直接执行工具

结论
ReAct 是核心框架‌:定义 Agent 的推理循环(Thought → Action → Observation)。
Function Calling 是优化手段‌:在支持的 LLM 上替代文本解析,提升 Action 生成的准确性和效率。
LangChain 同时支持两者‌:根据 LLM 能力和 Agent 配置动态选择模式。本质上是通过 Function Calling 增强的 ReAct 实现。‌

3、应用工具箱

在 工作室 — 应用编排 内点击 添加功能,打开应用工具箱
应用工具箱为 Dify 的应用提供了不同的附加功能:
在这里插入图片描述
Dify这里的应用工具箱似乎是一个功能附属插件的概念,而不是MCP中的工具的概念。

4、工作流

小马认为AI的工作流和传统普通工作流的区别主要在于,有LLM参与的工作流可以让决策更加智能同时AI的能力也将被串联在工作流中。如下的几个LLM节点的任务能力。(这似乎和Agent还是有概念区别的,虽有相关,但一个侧重流程一个侧重智能决策。同时我们也可以看到节点中已包含着工具、Agent、LLM等,从结构上也有子集关系。

在这里插入图片描述

在这里插入图片描述

LLM 节点是 Chatflow/Workflow 的核心节点。该节点能够利用大语言模型的对话/生成/分类/处理等能力,根据给定的提示词处理广泛的任务类型,并能够在工作流的不同环节使用。

  • 意图识别,在客服对话情景中,对用户问题进行意图识别和分类,导向下游不同的流程。
  • 文本生成,在文章生成情景中,作为内容生成的节点,根据主题、关键词生成符合的文本内容。
  • 内容分类,在邮件批处理情景中,对邮件的类型进行自动化分类,如咨询/投诉/垃圾邮件。
  • 文本转换,在文本翻译情景中,将用户提供的文本内容翻译成指定语言。
  • 代码生成,在辅助编程情景中,根据用户的要求生成指定的业务代码,编写测试用例。
  • RAG,在知识库问答情景中,将检索到的相关知识和用户问题重新组织回复问题。
  • 图片理解,使用 vision 能力的多模态模型,能对图像内的信息进行理解和问答。

选择合适的模型,编写提示词,你可以在 Chatflow/Workflow 中构建出强大、可靠的解决方案。

5、工具 - MCP Server工具

这是一个很重要的点,也是小马最关心的点之一。特别在MCP火爆的今天,不支持就会落伍。《模型上下文协议(Model Context Protocol,MCP)初见概念篇》

添加MCP Server 到Dify。还不知道如何实现一个MCP Server的也可以参考这里《编写第一个MCP Server之Hello world》。
在这里插入图片描述

5.1 集成 MCP 工具

你可以在 Dify 的 Agent 和 Workflow 应用中,直接集成来自外部 MCP 服务器的工具。除了使用 Dify 内置插件外,还可以接入 MCP 生态系统中的第三方服务,持续扩展你的应用功能。

5.2 在应用中使用 MCP 工具

当服务器配置完成后,其下的工具会出现在应用构建时的工具选择区:

Agent 应用
在 Agent 配置界面,与内置工具并列显示 MCP 工具。
工具按服务器分组,例如:“Notion MCP » 创建页面”、“Linear MCP » 创建任务”等。
可一键”添加全部”,快速启用该服务器下的所有工具。

Workflow 应用
构建 Workflow 时,MCP 工具以可选节点类型出现。
每个工具节点都会指明归属服务器,便于定位和排查问题。
参数较为复杂的工具会自动生成 JSON 格式的结构化输入界面。

Workflows 中的 Agent 节点
在 Workflow 的 Agent 节点中,也可灵活选择 MCP 工具进行配置,使用方式与独立 Agent 一致。

至此,MCP的Agent 工程框架 Dify初探 就告一段落了,欢迎交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/91654.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/91654.shtml
英文地址,请注明出处:http://en.pswp.cn/web/91654.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无人机光伏巡检漏检率↓78%!陌讯多模态融合算法实战解析

原创声明本文为原创技术解析,核心技术参数与架构设计引用自《陌讯技术白皮书》,转载请注明来源。一、行业痛点:无人机光伏巡检的 "识别困境"光伏电站的大规模铺设推动了无人机巡检的普及,但实际作业中仍面临三大技术瓶颈…

机动车占道识别准确率提升 29%:陌讯动态轮廓感知算法实战解析

原创声明本文为原创技术解析,核心技术参数与架构设计引用自《陌讯技术白皮书》,禁止未经授权的转载与改编。一、行业痛点:机动车占道治理的技术瓶颈城市交通监控中,机动车占用应急车道、公交车道等违规行为已成为影响通行效率与交…

UNet改进(29):记忆增强注意力机制在UNet中的创新应用-原理、实现与性能提升

记忆增强注意力机制概述 记忆增强注意力是一种结合了外部记忆模块的注意力机制,它使神经网络能够存储和检索长期知识,而不仅仅是依赖当前的输入特征。这种机制特别适合需要保持长期依赖关系的任务,如医学图像分割,其中模型需要记住不同样本中出现的常见模式。 核心组件 记…

使用Python开发Ditto剪贴板数据导出工具

前言在日常工作中,我们经常需要处理大量的剪贴板数据。Ditto作为一款优秀的剪贴板管理软件,帮助我们保存了丰富的历史记录。但有时我们需要将这些数据导出进行进一步分析或备份,而Ditto本身并没有提供直观的批量导出功能。C:\pythoncode\new\…

【人工智能】提示词设计原则:简洁性、明确性、具体性如何平衡?

提示词设计原则:简洁性、明确性、具体性如何平衡?1. 提示词设计三大原则的核心内涵1.1 简洁性1.1.1 定义用最少的文字传递核心信息,避免冗余和不必要的描述。比如 “写 3 个春天的成语” 比 “我想让你写出来 3 个和春天有关系的成语词语” 更…

JS的作用域

文章目录一、为什么需要作用域?二、什么是 JS 作用域?2.1 什么是词法作用域和动态作用域?1. 词法作用域(Lexical Scpoe)2. 动态作用域2.2 JS 的作用域2.3 JS 作用域的分类1. 全局作用域2. 模块作用域3. 函数作用域4. 块…

OLTP,OLAP,HTAP是什么,数据库该怎么选

目录 OLTP(Online Transaction Processing)联机事务处理 OLAP(Online Analytical Processing)联机分析处理 非实时OLAP 实时OLAP HTAP(Hybrid Transactional/Analytical Processing) OLAP 和 OLTP 数…

【前端】CSS Flexbox布局示例介绍

CSS Flexbox(弹性盒子)简介 Flexbox 是一种一维布局模型,用于高效处理元素在容器内的空间分配、对齐和排序。它通过父容器(flex container)和子元素(flex items)的配合实现灵活响应式布局。核心…

Vue3核心语法基础

一、为什么要学 Composition API?在以前我们写代码用Vue2写:export default {data() {return { count: 0, msg: hello }},methods: {add() { this.count }},computed: {double() { return this.count * 2 }} }很明显 一个功能被拆成三块:data…

FSMC的配置和应用

一、FSMC 简介与工作原理FSMC(Flexible Static Memory Controller)是 STM32 微控制器中用于与外部静态存储器(如 SRAM、PSRAM、NOR Flash、LCD 等)进行通信的一个外设模块。1、支持的设备类型:SRAM / PSRAMNOR FlashNA…

Linux I/O 系统调用完整对比分析

Linux I/O 系统调用完整对比分析 1. 概述 Linux 提供了丰富的 I/O 系统调用&#xff0c;每种都有其特定的用途和优势。本文将详细分析这些系统调用的特点、使用场景和性能特征。 2. 系统调用详细对比 2.1 基本读写函数 pread/pwrite #include <unistd.h>// 位置指定…

TiDB集群部署

架构&#xff1a; tidb–3台&#xff0c;pd–3台&#xff0c;tikv–3台 8c16g200g 1x2.2x.2x7.124 1x2.2x.2x7.148 1x2.2x.2x7.87 1x2.2x.2x7.93 1x2.2x.2x7.127 1x2.2x.2x7.104 pd-3台 4c8g100g 1x2.2x.2x7.143 1x2.2x.2x7.132 1x2.2x.2x7.91 1、下载安装包 #注&#xff1a;我…

C#中对于List的多种排序方式

在 C# 中给 List<AI> 排序&#xff0c;只要 明确排序规则&#xff08;比如按某个字段、某几个字段、或外部规则&#xff09;&#xff0c;就能用下面几种常见写法。下面全部基于这个示例类&#xff1a;public class AI {public int country; // 国家编号public int pr…

Spring框架中Bean的生命周期:源码解析与最佳实践

第1章&#xff1a;Spring Bean生命周期概述1.1 什么是Spring Bean生命周期&#xff1f;定义&#xff1a;Spring Bean生命周期是指从Bean的创建、初始化、使用到销毁的完整过程&#xff0c;由Spring容器严格管理 。核心思想是Spring容器通过IoC&#xff08;控制反转&#xff09;…

【51单片机6位数码管密码锁】2022-10-15

缘由六位密码器设计连接LED-嵌入式-CSDN问答 矩阵51单片机密码锁,回复:https://bbs.csdn.net/topics/392713242_智者知已应修善业的博客-CSDN博客 #include "REG52.h" unsigned char code smgduan[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x…

‌我的第一个开源项目:跃动的心

还是一个编程初学者时&#xff0c;我怀着激动的心情完成了人生第一个开源项目——一个用HTML5 Canvas制作的动态跳动爱心效果。这个项目虽然简单&#xff0c;却让我深刻体会到了开源分享的快乐和技术创造的魅力。 壹、项目灵感 这个项目的灵感来源于浏览网页时&#xff0c;被各…

技术演进中的开发沉思-53 DELPHI VCL系列:windows的消息(下):TApplication窗体

今天我们梳理下关于TApplication的窗体消息下半部分的内容。前面也说过&#xff0c;在 Delphi 的世界里&#xff0c;TApplication 就像一位经验丰富的总工程师&#xff0c;而主窗体则是它倾注心血打造的核心建筑。如果你第一次在实验室里敲出 Delphi 代码时&#xff0c;屏幕上弹…

cesium FBO(四)自定义相机渲染到Canvas(离屏渲染)

前面几节的例子是将Cesium默认的相机渲染到纹理&#xff08;RTT&#xff09;或Canvas&#xff0c;这片文章讲解如何将自定义的一个camera的画面渲染到Canvas上&#xff0c;有了前面几篇的基础了&#xff0c;也能将自定义的画面渲染纹理、也可以灰度处理&#xff0c;原理是一样的…

双机并联无功环流抑制虚拟阻抗VSG控制【simulink仿真模型实现】

双机并联虚拟同步发电机&#xff08;VSG&#xff09;系统中&#xff0c;因线路阻抗不匹配及参数差异&#xff0c;易引发无功环流。本方案在传统VSG控制基础上&#xff0c;引入自适应虚拟阻抗环节。其核心在于&#xff1a;实时检测两机间无功环流分量&#xff0c;据此动态调节各…

python测试总结

测试题的基础知识点总结 1.循环求和 for循环步长&#xff08;range(2,101,2)&#xff09; while循环条件判断&#xff08;i%20&#xff09; 生成器表达式&#xff08;sum(i for i in range )&#xff09; 所以&#xff1a;sum(range(1,101,2))&#xff08;奇数和&#xff09;和…