假设你是一个决心开餐厅的门外汉。你不需要养猪种菜,不需要发明酱油,更不需要亲手打造一口铁锅——你只需要走进一家“中央厨房”:炉灶、冷库、切菜台、餐具一应俱全,你翻翻菜单样板,把食材和调料按顺序摆上流水线,一上午就能出品几十道像样的菜。过去要花上几个月的筹备,如今一杯茶的功夫就能试营业。 这就是Dify给你的感觉。在AI应用的世界里,人人都在谈大模型、智能体、知识库,但这些听起来高大上的词,本质上就是“食材”“厨师”和“冷库”。Dify做的恰如那座中央厨房:把底层模型接入、工作流编排、知识检索、部署上线这些重复工程全部备好,让你通过拖拖拽拽就能把天马行空的AI想法,变成真正能上线营业的应用。 这篇文章,我们就以“中央厨房”为线索,把Dify这座厨房的七个储藏间一一打开:从平台概览到可视化工作流,从Agent编排到知识库管理,从API发布到多租户支持,再到Prompt管理的心法。读完你会发现,“低代码”不是低水平,而是把重复劳动交给平台,把你解放出来专心做好那一道“招牌菜”。

岗位关联

掌握Dify低代码平台,意味着你不用再从零搭建模型接入、知识检索与部署链路——用一天时间交付一个产品团队打磨数周的LLM应用,是所有AI产品经理和开发者的效率杠杆。

目录
  1. 可视化演示
  2. 平台概览:AI应用的中央厨房
  3. 可视化工作流:打通后厨的流水线
  4. Agent编排:总厨调度帮厨
  5. 知识库管理:恒温食材冷库
  6. API发布:上架外卖平台
  7. 多租户支持:连锁分店各自经营
  8. Prompt管理:秘制调料配方
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示Dify低代码的核心机制,通过入门/进阶/实战/优化四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

Dify低代码:Dify Dify低代码平台总览与生产部 Agent编排与智能体构建机制 核心机制可视化 Dify低代码整体架构与关键组件

平台概览:AI应用的中央厨房

想象你是一位想开餐厅的创业者。你不需要自己养猪种菜、发明酱油配方,更不需要从零打造一座燃气灶——你只需要租用一间“中央厨房”,里面的炉灶、冷库、切菜台一应俱全,你只管把菜品设计好、把食材组合起来,就能端出成品菜。这就是“低代码”的核心哲学:不重复造轮子,把成熟的能力当作现成模块来拼接。

在AI应用开发的世界里,Dify就是这样一个“中央厨房”。传统的LLM应用开发,需要你从零搭建Prompt工程、设计知识检索流程、编写Agent推理逻辑、对接模型API、再写一套后端服务来管理用户请求——就像为了开一家面馆,先得建一座面粉加工厂。Dify把这些繁琐的“基建”全部封装为可视化模块,你只需在浏览器里拖拽、配置,就能把原本需要数周开发的AI应用压缩到几小时完成。

Dify的核心能力可以拆解为三个层面:一是模型接入层,内置了OpenAI、Anthropic、通义千问等数十种主流LLM的API接入,你只需填写一个密钥就能切换底层模型;二是应用编排层,提供工作流画布、Agent配置、知识库绑定等可视化工具;三是部署运营层,支持一键发布API、监控调用日志、管理团队成员。这是一套完整的LLM应用生命周期管理方案,覆盖了从Prompt到生产部署的全链路。

回到中央厨房的比喻:LLM是你的主厨,Prompt是指令,知识上下文是菜谱,工具调用是帮厨。Dify把主厨、菜谱、食材、帮厨全部备齐,你只需要巧妙组合它们——这正是低代码的魅力:你不需要会训练模型、构建向量数据库或写Agent搜索引擎,就能构建出专业的LLM应用。

LLM应用=LLM模型(Prompt指令⊕知识上下文⊕工具调用)\displaystyle \text{LLM应用} = \text{LLM模型}\left(\text{Prompt指令} \oplus \text{知识上下文} \oplus \text{工具调用}\right)
公式通俗说明:一个LLM应用的最终产出,等于大语言模型接收三路输入的组合:用户或系统的提示词、从知识库检索出的参考资料、以及Agent调用的工具结果。
  1. LLM模型底层大语言模型,相当于中央厨房里技术最过硬的主厨。
    LLM模型{\text{LLM模型}}
  2. Prompt指令我们给大厨的订单描述,告诉模型“做什么、按什么标准做”。
    Prompt指令{\text{Prompt指令}}
  3. 知识上下文从知识库检索出的参考资料,相当于厨师手边的菜谱。
    知识上下文{\text{知识上下文}}
  4. 工具调用模型通过Agent调用外部服务获取的动态数据,相当于帮厨递来的实时食材。
    工具调用{\text{工具调用}}
  5. \oplus 组合符号表示多路信息拼接为一个整体的输入上下文。
    ⊕{\oplus}

可视化工作流:打通后厨的流水线

走进一家现代化快餐连锁店的后厨,你会看到一条清晰的流水线:配菜台把食材切好码齐,递到烹饪区,出锅后滑入装盘区,最后送到出餐口。每一步都有专门的工位,食材沿着固定的轨道流动,任何一个工位出了问题,整条线的节奏都会一目了然。

Dify的可视化工作流,就是这条AI应用的流水线。在Dify的画布上,你看到的不是一行行代码,而是一个个可以自由拖拽的节点:开始节点、LLM节点、知识检索节点、条件分支节点、工具节点、结束节点。你像铺设流水线一样把它们连起来,就完成了一个应用的主干逻辑。比如一个客服机器人,可以是“开始 → 意图判断 → 知识检索 → LLM生成 → 结束”这样标准的一条线。

每个节点都是一个可配置的“工位”。LLM节点可以切换模型、调节温度参数、限制最大Token数;知识检索节点可以绑定某个知识库、设定返回条数;条件分支节点可以按关键词或结构化数据走不同的线路。节点的输出会成为下一个节点的变量输入,这种“数据流转”机制让复杂的多步推理被拆解成清晰的单元。比起硬编码逻辑,可视化工作流让整个应用的处理过程可读性极强,调试时只需查看每个节点的输入输出即可定位问题。

流水线的好处在于:改一道工序不需要重建整条线。在Dify中,你想在LLM前加一道“敏感词过滤”,只需拖一个节点插入即可,下游节点自动感知输入变化。这种可视化的流式编排,让AI应用的迭代像调整快餐店流水线一样灵活——今天换一盒调料,明天加一道配菜,后厨的节奏完全由你把控。

工作流输出=fn∘fn−1∘⋯∘f1(输入数据)\displaystyle \text{工作流输出} = f_n \circ f_{n-1} \circ \cdots \circ f_1(\text{输入数据})
公式通俗说明:一个工作流的最终输出,是一连串节点顺序执行的结果——前一个节点的输出自动成为下一个节点的输入。
  1. 输入数据工作流起始节点收到的用户请求或Webhook触发数据。
    输入数据{\text{输入数据}}
  2. f_1 \sim f_n流水线上依次排列的各个处理节点(LLM、检索、工具等)。
    f1∼fn{f_1 \sim f_n}
  3. \circ 复合运算符表示“先执行右边、再把结果交给左边”的顺序衔接。
    ∘{\circ}
  4. 工作流输出末端最后一个节点产出的最终结果,返回给调用方。
    工作流输出{\text{工作流输出}}

Agent编排:总厨调度帮厨

餐厅的总厨不会亲自切每一根葱、翻每一勺锅。他手里有一份“调度表”:切配师负责处理蔬菜,炒锅师傅负责烹制热菜,甜点师负责甜品。当一张新订单进来,总厨看一眼订单内容,决定哪些菜让哪位师傅做、什么顺序做、哪些菜需要几位师傅配合。在这个场景里,总厨就是Agent,各位师傅就是Agent可以调用的“工具”。

Dify的Agent编排,正是让LLM扮演这位“总厨”的总控角色。在Agent节点中,你可以挂载一组工具——可以是Dify内置的搜索、计算器,也可以是你自己接入的第三方API。当用户提出复杂需求时,Agent不会像普通聊天一样直接回答,而是先“思考”:这个任务需要调用哪个工具?需要查询什么数据?然后按计划逐个调用工具,把工具返回的结果聚合起来,最终给出一个综合性的答复。

这种“思考—行动—观察”的循环(业内称为ReAct模式)是Agent编排的核心机制。Dify通过“规划器”让LLM按结构化格式输出决策(比如JSON格式的“下一步动作”),系统解析该决策后执行对应的工具调用,将观察结果作为新的上下文反馈给LLM,循环往复直到任务完成。在多轮工具调用之间,Dify还支持“人机交互”节点:当Agent不确定时,可以把问题抛给人工确认,再带着人工的决策继续执行。

回到总厨的比喻:Agent让LLM不再是一个“只会聊天的厨子”,而是一个懂得调度资源的总厨。手下工具越多,能做的菜就越复杂。Dify将这种“总厨调度”的机制可视化、配置化,你不需要手写一套复杂的ReAct提示词,只需在界面上勾选Agent可用的工具,剩下的“排兵布阵”,交给你的总厨自己拿主意。

at=LLM决策(st, Tools)⇒st+1=st⊕Obs(at)\displaystyle a_t = \text{LLM}_{\text{决策}}\left(s_t,\ \text{Tools}\right) \quad\Rightarrow\quad s_{t+1} = s_t \oplus \text{Obs}(a_t)
公式通俗说明:第t步,LLM根据当前状态和可选工具列表决策出动作;执行后得到的观察结果追加到状态中,作为下一步决策的依据。
  1. s_t 状态截至第t步的上下文,包含用户原问题、历史调用记录、工具反馈。
    st{s_t}
  2. Tools 工具集所有可用工具的功能描述列表,Agent据此判断该用谁。
    Tools{\text{Tools}}
  3. a_t 动作Agent每一步的决策结果,可以是调用某个工具,也可以是直接回复。
    at{a_t}
  4. Obs(a_t) 观察执行该动作后得到的返回结果,比如工具返回的数据。
    Obs(at){\text{Obs}(a_t)}
  5. \oplus 拼接把新观察追加进状态,形成逐步累积的推理上下文。
    st⊕Obs(at){s_t \oplus \text{Obs}(a_t)}

知识库管理:恒温食材冷库

一家餐厅要保证出品稳定,靠的是后方那座井井有条的冷库。每周采购的新鲜食材入库前要整理、打包、贴上标签;出库时按需取用,今天要做哪道菜,就从冷库里精准拿出对应食材。如果冷库乱成一团,厨师找食材就要花半小时,高峰期根本来不及。对AI应用来说,知识库就是这座冷库——LLM默认只知道自己训练时学过的知识,你的业务专有知识,必须预先“存入冷库”,才能运行时随时取用。

Dify的知识库管理,覆盖了“采购入库 → 整理分装 → 按需取用”的全流程。首先是数据导入:支持上传PDF、Word、Markdown、网页链接等多种格式,也可以通过API批量写入。导入后系统会自动分段,把长文档拆成适合检索的短文本块(业内叫chunk),并做数据清洗,去掉页眉页脚、重复信息等噪音。然后系统把这些文本块做嵌入向量化——也就是把每一段文字转换成一串可以计算语义相似度的数字坐标——存进内置的向量数据库。

当用户提问时,Dify的检索节点会先将问题向量化,在向量数据库中做相似度搜索,返回最相关的Top-K个文本块,把它们拼接到Prompt的上下文里,让LLM基于检索到的资料进行回答——这就是RAG(检索增强生成)。通过RAG,LLM可以回答它训练时从未见过的最新内容,同时也能在答案中附上引用来源,方便验证可靠性。Dify还允许针对每个知识库调整检索策略,比如按语义相关度、按关键词权重,或者混合模式。

冷库管理得越好,出菜越快越稳定。知识库的导入质量和分段策略,直接决定RAG效果的上限——如果食材又脏又乱,再顶尖的主厨也做不出干净的菜。Dify最重要的价值之一,就是把“冷库”管理做得足够傻瓜:上传、分段、向量化、绑定到应用,四个步骤走完,你的LLM应用就拥有了“最新、最准”的业务知识。

答案=LLM(问题⊕TopKcos(q, di)i=1k)\displaystyle \text{答案} = \text{LLM}\left(\text{问题} \oplus \text{TopK}_{\mathrm{cos}}\left(\mathbf{q},\ \mathbf{d}_i\right)_{i=1}^{k}\right)
公式通俗说明:把问题向量分别和知识库各条文本块的向量算余弦相似度,取最高分的k条拼进提示词,再让LLM生成最终答案。
  1. \mathbf{q} 问题向量用户问题经嵌入模型转换得到的向量表示。
    q{\mathbf{q}}
  2. \mathbf{d}_i 文档向量知识库中第i条文本块对应的向量。
    di{\mathbf{d}_i}
  3. 余弦相似度衡量“问题与这段资料的语义接近程度”。
    cos⁡(q, di){\cos(\mathbf{q},\ \mathbf{d}_i)}
  4. TopK从全部文本块中挑出相似度排名前k的条目。
    TopK{\text{TopK}}
  5. 拼接生成选中文本块的原文拼入提示词,作为LLM回答的参考素材。
    LLM(⋅){\text{LLM}(\cdot)}

API发布:上架外卖平台

后厨忙活再久,菜要做出来给客人吃才算数。一家餐厅要营业,需要在美团、饿了么上架菜品,把菜单和价格公布出去;客人通过平台下单,餐厅接单后把成品菜送出去。与此同时,餐厅还会盯着后台的订单统计,看看今天卖了多少单、哪道菜最受欢迎,借此调整明天的备菜策略。

Dify的应用构建完成后,下一步就是“上架营业”。Dify提供了多种发布方式:一是WebApp模式,Dify直接帮你托管一个可分享的对话页面,无需任何前端开发,填入链接就能用;二是API发布模式,一键将应用封装为RESTful接口,你可以在自己的业务系统中调用;三是嵌入模式,通过一段iframe或脚本将对话组件嵌入到你的官网。三种方式涵盖了从“快速演示”到“生产集成”的各个阶段。

在API发布模式下,Dify做了很多“餐厅运营”的细节:访问控制层面支持API密钥鉴权,只有持有密钥的调用方才能访问你的应用,确保业务数据不外泄;运营监控层面提供调用次数、Token消耗、响应延迟、错误率等维度的统计面板,让你一眼看清应用的健康状况;此外还支持日志回溯,每一次用户与应用的对话都能回放,这对定位Prompt问题和优化产品体验至关重要。

在Dify上发布一个AI应用,本质上就是一次“低成本开门营业”:不需要自己买服务器搭网关,不需要自己写节流限流模块,只需要点一下“发布”,Dify的外卖平台就自动开张了。接下来你要做的,就是把API地址放到你的产品里,然后像餐厅老板一样,盯着监控面板看数据。这也解释了为什么Dify特别受AI产品团队欢迎——它把“做菜”和“开餐厅”两大难题一起解决了。

R可用性=N成功请求N总请求×100%\displaystyle R_{\text{可用性}} = \frac{N_{\text{成功请求}}}{N_{\text{总请求}}} \times 100\%
公式通俗说明:接口的可用性等于成功响应次数占总请求次数的比例,这是判断“餐厅是否正常营业”的核心指标。
  1. N_{\text{总请求}}统计周期内API收到的全部请求数。
    N总请求{N_{\text{总请求}}}
  2. N_{\text{成功请求}}返回正常响应的请求数。
    N成功请求{N_{\text{成功请求}}}
  3. \times 100\%将比例转化为百分比,方便直观观察。
    ×100%{\times 100\%}
  4. R_{\text{可用性}}可用率指标,数值越高说明“营业越稳定”。
    R可用性{R_{\text{可用性}}}

多租户支持:连锁分店各自经营

一家成功的连锁餐饮品牌,通常会有多家分店:北京店、上海店、深圳店……每家分店有自己的店长、员工和菜单,但所有分店共享同一个中央厨房的后勤体系。如果你要新开一家分店,不需要重建一座中央厨房,只需要租好店面、配置好人手、开放中央厨房的接入权限,当天就能开业。

Dify的多租户(多工作空间)机制,就是为这种“连锁经营”设计的。一个Dify实例可以创建多个工作空间(Workspace),每个空间相当于一家独立的分店:有自己的成员列表(通过邮箱邀请加入)、自己的应用集合、自己的知识库和标注数据。作为平台管理员,你可以创建空间并任命空间所有者;作为空间所有者,可以进一步管理本空间的成员角色和权限。

租户隔离是核心安全保障。不同工作空间之间的数据是隔离的——A空间的Prompt、知识库、API密钥、日志,B空间的成员和AI应用完全不可见。这让你可以用一个Dify部署支撑公司内部多个团队(如客服部、运营部、产品部各自一个空间),互不干扰。在权限管理上,Dify区分了“所有者、编辑、只读”等角色,配合资源级权限(谁能改这个应用、谁能看这个知识库),实现“小事不出分店,大事平台审批”的治理格局。

对于AI企业服务来说,多租户能力往往是从“做了个Demo”到“卖给企业客户”的门槛之一。Dify把多租户做成开箱即用的能力,让团队不必为每个客户单独部署一套系统,也不必自己从零写一套权限模型。这就像连锁品牌扩张时,不必为每家店买一个新中央厨房——总部统一运营、分店灵活配置,规模化的路自然就通了。

Tenanti∩Tenantj=∅(i≠j)\displaystyle \text{Tenant}_i \cap \text{Tenant}_j = \varnothing \quad (i \neq j)
公式通俗说明:任意两个租户(工作空间)的数据集合交集为空,意味着A空间的数据在B空间里完全不存在——这就是“隔离”的数学表达。
  1. \text{Tenant}_i第i个租户(工作空间)内全部数据资源的集合。
    Tenanti{\text{Tenant}_i}
  2. \cap 交集表示两个集合共有的部分。
    ∩{\cap}
  3. \varnothing 空集没有任何重叠元素。
    ∅{\varnothing}
  4. i \neq j 条件限定比较的是两个不同的租户。
    i≠j{i \neq j}

Prompt管理:秘制调料配方

去一家餐厅,让你印象深刻的不只是食材新鲜,还有那道独特的“秘制酱料”——同样的食材,配比不同、火候不同,出来的味道天差地别。每家大厨都有自己的配方本:盐3克、糖2克、生抽一勺、醋半勺……这个配方就是AI应用里的Prompt。同一个LLM,不同的Prompt设计,效果可能判若云泥。

Dify的Prompt管理,就是一套“配方工程”工具箱。在应用编辑页,你可以分别配置“系统提示词”(设定模型角色的全局指令)和“用户提示词模板”。模板里支持插入变量——比如用户输入的question、知识库检索出的context、Agent工具返回的result,所有这些运行时数据都能像调料一样自动填充进Prompt模板。

Dify还内置了上下文管理能力:在多轮对话场景中,它会自动维护对话历史(把前几轮的问答带进新请求),同时让你设置携带的轮数上限,避免超出模型窗口。模型调试方面,Dify编辑器右侧提供“模型参数”面板,可实时调整temperature(回复的随机性)、topP、max tokens等;左下角有“调试对话”窗口,让你改完Prompt立刻测试效果,不必等到发布后才发现问题。这套“配方—试吃—调整”的闭环,让Prompt优化变得非常高效。

好的调料配方需要反复试错,Dify的目的就是让“试错”的成本降到最低。每一位Prompt工程师本质上都是在为LLM写“菜谱”,而Dify提供了从配比(变量填充)、试吃(实时调试)到量产(发布上线)的完整工具链。正如大厨的秘方不是一次写成的,你的最佳Prompt也需要在同一条可视化流水线里不断迭代——Dify让这件事变得像做实验一样顺滑。

输出=LLM(S⏟系统提示⊕Ht⏟对话历史⊕Ut⏟当前输入)\displaystyle \text{输出} = \text{LLM}\left(\underbrace{S}_{\text{系统提示}} \oplus \underbrace{H_t}_{\text{对话历史}} \oplus \underbrace{U_t}_{\text{当前输入}}\right)
公式通俗说明:每次调用模型时,实际的输入由三个部分拼接而成:系统层的角色设定、过去几轮对话记录、以及用户刚刚发来的消息。
  1. S 系统提示定义模型的身份和行为准则,比如“你是客服助手”。
    S{S}
  2. H_t 对话历史保存前若干轮的用户消息与助手回复。
    Ht{H_t}
  3. U_t 当前输入本轮需要模型处理的实时请求。
    Ut{U_t}
  4. 拼接 \oplus三个部分按固定分隔符组装成完整上下文。
    ⊕{\oplus}
  5. LLM(\cdot) 生成大语言模型基于这个完整上下文输出回复。
    LLM(⋅){\text{LLM}(\cdot)}

AI 应用场景

企业内部知识库问答机器人

阶段:应用构建与部署

解决的问题:传统方式需要IT团队从零搭建,涉及模型接入、知识切片、检索服务、前端页面、鉴权系统,动辄数周工期;Dify通过知识库管理加可视化工作流,让业务人员也能一天内搭起客服机器人。

具体案例:某金融机构把制度文档上传到Dify知识库,拖拽“开始→知识检索→LLM→输出”四个节点,一键发布API接入企业微信机器人,回答员工关于报销制度的提问。上线后人工工单量下降六成,新制度发布后只需更新知识库文档,机器人立即“学会”新内容。

销售赋能Agent编排

阶段:Agent编排与工具调用

解决的问题:销售团队需要一个能查库存、算折扣、写方案的智能助手,传统方式需要开发多个系统的集成和复杂的状态机,维护成本高。

具体案例:某电商公司用Dify的Agent节点挂载了订单查询API、库存API和计算器工具。销售提问“200台iPhone 15有货吗?总价多少?”,Agent自动规划:先调库存API确认数量,再调计算器算出总价,最后综合两路结果返回结构化答复。整个编排在Dify界面完成,无需编写一行工具调度代码。

面向企业客户的多租户SaaS交付

阶段:平台运营与多租户管理

解决的问题:AI SaaS公司要给数十家企业客户提供独立的AI应用环境,但每个客户一套独立部署会导致成本失控、版本碎片化。

具体案例:某SaaS服务商在一个Dify实例中为每个客户创建独立工作空间,绑定各自的文档知识库、API密钥、用量配额。月底按空间统计Token消耗生成账单;客户之间的Prompt和数据完全隔离,通过等保测评。平台侧只需升级一次,所有客户空间同步获得新能力。

Python 演示

python139 行
"""Dify风格LLM应用工作流模拟:可视化工作流 -> Agent编排 -> 知识库检索 -> 生成回答不依赖外部API, 纯逻辑模拟"""import refrom dataclasses import dataclassfrom typing import List, Dict, Tuple  @dataclassclass WorkflowNode:    """工作流节点基类"""    name: str     def run(self, data: dict) -> dict:        return data  class PromptNode(WorkflowNode):    """提示词节点: 组装模板"""    def __init__(self, name: str, template: str):        super().__init__(name)        self.template = template     def run(self, data: dict) -> dict:        question = data.get("question", "")        data["prompt"] = self.template.replace("{question}", question)        return data  class KnowledgeBase:    """知识库: 文档向量检索 (模拟)"""     def __init__(self, docs: List[Dict[str, str]]):        self.docs = docs     def search(self, query: str, top_k: int = 2) -> List[Tuple[str, float]]:        """基于关键词重合的简易检索"""        q_tokens = set(re.findall(r"[\w\u4e00-\u9fa5]+", query.lower()))        scored = []        for doc in self.docs:            content = doc["content"]            d_tokens = set(re.findall(r"[\w\u4e00-\u9fa5]+", content.lower()))            inter = len(q_tokens & d_tokens)            union = len(q_tokens | d_tokens) or 1            score = inter / union            scored.append((content, score))        scored.sort(key=lambda x: x[1], reverse=True)        return scored[:top_k]  class RetrievalNode(WorkflowNode):    """知识检索节点: 注入检索结果到上下文"""     def __init__(self, name: str, kb: KnowledgeBase, top_k: int = 2):        super().__init__(name)        self.kb = kb        self.top_k = top_k        self.hit_count = 0     def run(self, data: dict) -> dict:        question = data.get("question", "")        results = self.kb.search(question, self.top_k)        self.hit_count += len(results)        data["references"] = results        return data  class AgentLLMNode(WorkflowNode):    """Agent节点: 选择是否调用工具 (模拟推理)"""     def __init__(self, name: str, tools: List[Dict[str, str]]):        super().__init__(name)        self.tools = tools        self.tool_calls = 0     def run(self, data: dict) -> dict:        prompt = data.get("prompt", "")        refs = data.get("references", [])        context = "\n".join(f"- {doc}" for doc, _ in refs)         # 模拟Agent决策: 检测到计算/数字/总数则调用计算工具        if re.search(r"计算|数字|总数", prompt):            self.tool_calls += 1            nums = [int(n) for n in re.findall(r"\d+", prompt)]            data["answer"] = f"工具计算结果: {sum(nums)}"        else:            data["answer"] = f"基于检索回答: {context[:60]}"        return data  class OutputNode(WorkflowNode):    """输出节点: 格式化最终回答"""     def run(self, data: dict) -> dict:        data["final"] = f"[{self.name}] {data.get('answer', '')}"        return data  class Workflow:    """工作流引擎: 按节点顺序执行"""     def __init__(self, nodes: List[WorkflowNode]):        self.nodes = nodes     def run(self, question: str) -> dict:        data = {"question": question}        for node in self.nodes:            data = node.run(data)        return data  def main():    # 1. 搭建知识库    kb = KnowledgeBase([        {"content": "Dify是开源的低代码LLM应用开发平台"},        {"content": "Dify支持可视化工作流和Agent编排"},        {"content": "知识库通过RAG增强LLM回答"},        {"content": "Dify支持多租户隔离和API发布"},    ])     # 2. 构建可视化工作流    workflow = Workflow([        PromptNode("提示词节点", "请基于上下文回答问题: {question}"),        RetrievalNode("知识检索节点", kb, top_k=2),        AgentLLMNode("Agent推理节点", tools=[{"name": "计算器"}]),        OutputNode("结果输出节点"),    ])     # 3. 运行应用    for q in ["Dify是什么?", "请计算 10+20+30"]:        result = workflow.run(q)        print(f"Q: {q}")        print(f"A: {result['final']}\n")  if __name__ == "__main__":    main()
目的:用纯Python模拟一个Dify风格的工作流——知识库检索节点注入资料、Agent节点决策是否调用工具、多个节点串联执行。运行后会看到两个问题分别走“检索回答”和“工具计算”两条路径。
  1. data["prompt"] = self.template.replace("{question}", question)模板变量注入,相当于Dify Prompt模板里{question}的运行时填充
  2. q_tokens = set(re.findall(r"[\w\u4e00-\u9fa5]+", query.lower()))把文本切分成词集合,模拟向量化的“语义标记”
  3. scored.sort(key=lambda x: x[1], reverse=True)按相似度分数降序排列,模拟向量检索的排序逻辑
  4. self.hit_count += len(results)每次检索命中计数,对应Dify监控面板的知识库命中率
  5. if re.search(r"计算|数字|总数", prompt):Agent的“决策”:判断当前任务是否需要调用工具
  6. data = node.run(data)工作流引擎把上一个节点的输出传给下一个节点,对应Dify画布上的数据流转
  7. workflow = Workflow([...])用列表按顺序组装节点,对应在Dify画布上拖拽连线

常见误区

误区我是专业开发者,手写Python调API才是硬功夫。Dify这种拖拽工具是给不懂代码的业务人员玩的,用了会显得我不专业。

正解Dify解决的是LLM应用开发中“重复基建”的难题:模型接入、知识库pipeline、Prompt变量注入、API鉴权、日志监控。正如中央厨房不替代大厨,而是让大厨不必自己养猪种菜。专业开发者用Dify把基建从数天压缩到数小时,把时间花在定义业务逻辑和优化Prompt这些真正有壁垒的地方。

为何常见:“低代码”这个词天然让人联想到“低端”,加上Dify界面确实很傻瓜化,容易让人误以为它只能做玩具Demo。

误区Prompt不就是在文本框里写几句话告诉模型该干嘛吗?我照着网上的模板抄一段不就行了?

正解Dify的Prompt编排中有系统提示与用户模板的分层、变量注入(如{question}、{context})、多轮历史窗口管理、温度等模型参数的联动。每个变量从哪来、何时注入、历史截断多少轮,都会实质影响输出质量。这就像秘制酱料——不是把酱油倒进去就行,配比、时机、火候缺一不可。

为何常见:LLM的聊天界面让人误以为提示词和日常对话一样随意,而Dify的文本框形式进一步强化了这种错觉,让人忽略了上下文管理的内在复杂度。

误区我把公司的产品手册传进Dify知识库,LLM从此就掌握了这些知识,和训练过一样,丢了原始文档也不怕。

正解Dify知识库是RAG机制——文档先分段、向量化入库;每次问答时,系统检索最相关的文本块拼进Prompt作为参考。模型本身没有吸收这些知识,只是“临时看到”你喂给它的片段。检索不到、切片不合理或向量化质量差,模型依然可能答非所问。原始文档是“食材”,不是“厨师”,食材变质了菜就会难吃。

为何常见:UI操作太顺滑(上传→绑定→问答有效),用户几乎感受不到背后的检索过程,自然以为模型“上载”了知识。

误区工作流画完、API发布成功,这个AI应用就算交付了。以后只需要处理新需求,不用管它。

正解生产环境里的LLM应用需要持续运营:Token消耗和延迟监控、错误率告警、对话日志复盘、Prompt迭代、知识库内容更新。Dify提供了监控面板和日志回放,但这些工具的价值取决于你是否持续使用。AI应用不是一次装好就不管的燃气灶,而是需要像餐厅菜品一样根据顾客反馈不断调整配方。

为何常见:传统软件“发布即交付”的心智模型让人忽略了LLM应用的运行时不确定性——模型升级、提问漂移、知识库过期,都会让一个“曾经工作正常”的应用悄悄变差。

面试题

Q1. Dify低代码平台的核心设计理念是什么?

单选题 · easy

  • A.用可视化编排替代重复基建← 正确答案
  • B.用Python替代前端开发
  • C.用数据库替代模型训练
  • D.用微调替代提示词工程

答案:A。Dify把LLM应用开发中的重复基建(模型接入、知识库、部署)封装成可视化模块,让开发者专注业务逻辑。这就像中央厨房不替代厨师,而是把食材加工和厨房设备备好。B、C、D都歪曲了“低代码”的含义,Dify不替代Python、数据库或训练。

Q2. Dify可视化工作流中,以下哪些是常见节点类型?

多选题 · mid

  • A.LLM生成节点← 正确答案
  • B.知识检索节点← 正确答案
  • C.条件分支节点← 正确答案
  • D.模型训练节点

答案:ABC。Dify工作流节点包括LLM、知识检索、条件分支、工具调用等,用于编排应用逻辑。模型训练不属于Dify的工作流节点——Dify面向应用编排而非模型训练,就像中央厨房负责做菜,不负责种地。

Q3. 在Dify中,Agent编排主要让LLM扮演什么角色?

单选题 · easy

  • A.协调多种工具完成复杂任务← 正确答案
  • B.管理数据库的读写和索引
  • C.设计前端页面和交互效果
  • D.配置服务器网络和安全策略

答案:A。Agent编排的核心是让LLM做“决策者”,根据任务需要动态调用工具,就像总厨调度帮厨。B、C、D分别是DBA、前端工程师、运维工程师的职责,与Agent的角色定位不符。

Q4. 关于RAG知识库,下列说法正确的是?

多选题 · hard

  • A.文档分段后向量化存储← 正确答案
  • B.检索计算问题与文本相似度← 正确答案
  • C.和微调一样会修改模型权重
  • D.检索结果拼接入提示上下文← 正确答案

答案:ABD。RAG的流程是分段→向量化→相似度检索→拼接Prompt→LLM生成,全程不修改模型权重。C选项混淆了RAG与微调——微调是让模型“重新学”,RAG是让模型“临时查阅资料”。

Q5. Dify的API发布模式中,用什么来保护接口安全?

单选题 · easy

  • A.调用方API密钥← 正确答案
  • B.服务器防火墙
  • C.HTTPS传输加密
  • D.数据库字段加密

答案:A。Dify通过API密钥鉴权控制访问,调用方必须携带有效密钥才能调用。类比外卖平台需要账号才能下单,密钥就是准入凭证。防火墙是网络层防护,HTTPS是传输加密,数据库加密针对存储,都不是接口访问控制。

Q6. Dify多租户机制可以解决哪些问题?

多选题 · mid

  • A.不同团队间的数据隔离← 正确答案
  • B.平台内的权限分级管理← 正确答案
  • C.模型分布式训练加速
  • D.各租户知识库相互隔离← 正确答案

答案:ABD。多租户解决团队隔离和权限管理:每个工作空间数据互不可见、成员角色可控。它不涉及模型训练。类比连锁店分店共享中央厨房但各自独立核算——选项C是无中生有的能力。

Q7. 在Dify中,知识库的“分段(chunk)”质量直接影响什么?

单选题 · hard

  • A.RAG检索的准确性← 正确答案
  • B.LLM模型的参数量
  • C.API接口的响应速度
  • D.模型的最大并发上限

答案:A。分段决定文本的“语义粒度”:分段过大导致检索命中太宽泛,分得过小导致语义不完整,都会降低检索质量,最终影响RAG生成效果。类比冷库分装——食材包装大小必须匹配菜品用量。其余选项与分段无关。

Q8. 在Dify的Prompt模板中,插入{question}变量表示什么?

单选题 · mid

  • A.用户在运行时输入的内容← 正确答案
  • B.固定的系统级提示指令
  • C.模型生成时的温度参数
  • D.知识库向量化的中间结果

答案:A。{variable}语法用于在模板中动态填充运行时数据,{question}代表用户本次输入的内容。就像菜单上的“主菜:____”需要填上客人点的菜名。系统指令是另一层配置,温度参数在模型设置面板,向量化结果由检索节点管理。

Q9. 关于Dify的RAG检索增强流程,以下描述正确的是?

多选题 · hard

  • A.执行检索前先向量化问题← 正确答案
  • B.文本块向量化后存入库中← 正确答案
  • C.检索结果直接作为最终答案
  • D.检索文本拼入提示上下文← 正确答案

答案:ABD。RAG流程是:文档分段→向量化入库→问题向量化→相似度检索→文本块拼接Prompt→LLM生成。C的错误在于检索结果只是“参考素材”,需要LLM加工生成最终答案,就像把食材递给厨师还需要烹饪,不能直接端给客人。

Q10. 某团队在Dify中构建应用时,需要Agent在不确定时暂停并询问人工,应当使用什么能力?

单选题 · extreme

  • A.人机交互节点← 正确答案
  • B.条件分支节点
  • C.知识检索节点
  • D.模型参数调优

答案:A。Dify的Agent编排支持人机交互节点:Agent遇到不确定性时,将问题抛给人工确认,再带着人工决策继续执行,这属于“人在回路”机制。类比总厨遇到不明确的订单先询问值班经理。条件分支只是按规则分流,知识检索是查资料,调参是改模型行为,都无法实现“暂停问人”。