17 · Dify 初识与核心概念:把 Agent 工程"可视化"

本章目标:认识 Dify 这条不写代码的路线——用可视化界面编排 RAG、Agent、工作流,把前 16 章学过的每一个概念在图形化工具里对号入座。它不是来替代你写代码的,而是给你多一个"更快出活"的选项。

本章你将学到

  1. Dify 是什么、它解决了什么问题(以及它不解决什么);
  2. "可视化编排"与"代码编排"(LangChain / LangGraph)的定位关系与选型标准;
  3. 把前 16 章的概念映射到 Dify 的五大核心组件:模型管理 / 知识库 / 工作流 / 工具与 Agent / 发布与可观测;
  4. 一张"何时用 Dify、何时写代码、怎么混用"的决策清单。

前置知识

  • 至少完成第 05 章(RAG 链路)与第 08 章(工具与 Agent)——否则你会"会用界面,但不知道界面在封装什么";
  • 第 14 章的全代码实现,是第 18 章在 Dify 里复刻的对照物(本章多处引用它)。

17.1 Dify 是什么

Dify 是一个开源(Community Edition 可在 GitHub 获取、可自托管)的 LLM 应用开发平台:把模型管理、知识库(RAG)、可视化工作流编排、工具调用、Agent、应用发布与日志这些"AI 应用的通用骨架"做成开箱即用的界面,让你不写胶水代码就搭出一个能上线的应用。

一句话定位:前 16 章里我们用 Python 一行行手搓的东西,Dify 把它们变成了界面上拖一拖、配一配。

它和你已经熟悉的两条路线的关系:

路线一:全代码       路线二:Java 生态      路线三:可视化平台
LangChain/LangGraph  LangChain4j/Spring AI   Dify(本章)
(Python,前 7-14 章)   (第 13 章)            (低代码,17-18 章)
     │                    │                       │
     └──────── 同一套心智模型:RAG / Agent / 工具 / 记忆 ────────┘

Dify 提供的核心能力(全部图形化,不用写代码):

能力对应你学过的章节Dify 里的形态
模型接入第 01-02 章控制台配模型供应商(OpenAI 兼容端点、DeepSeek/Qwen/GLM、Ollama 本地)
知识库 RAG第 04-06 章上传文档 → 自动分段 → 建索引 → 检索模式配置(Top-K / Score / Rerank)
工具调用第 08 章内置工具 + 自定义工具(用 OpenAPI 描述把你的 HTTP 接口暴露给模型)
工作流编排第 09-10 章可视化节点画布(LLM / 知识检索 / 条件分支 / 迭代……)
Agent第 08、10 章Agent 应用:ReAct 模式,模型自主决定调哪个工具
记忆第 09 章会话变量、消息窗口,按会话自动维护
发布与 API第 12、14 章一键发布 WebApp / 嵌入 / 三种 API + 应用日志

Dify 不替你做的事(要记牢,这是选型边界):

  • 不替你写业务逻辑:真正的下单、退票、查订单,还是得你在 Java / Python 侧实现,Dify 通过"自定义工具"去调它;
  • 不保证生产级工程化:复杂权限、大规模高并发、深度私有化改造,仍要自己兜(第 12 章的清单照样适用);
  • 不替代深度定制的控制流:高度自定义的图、多 Agent 复杂协作,代码方案(第 10 章)更灵活。

版本说明:Dify 迭代很快(云版与开源 Community Edition 节奏不同),且界面在持续改版。本章与第 18 章按 Dify 1.x 的核心概念写作,节点名称、API 路径等以你部署版本的官方文档 / 实际界面为准,概念与思路不变。

17.2 可视化编排 vs 代码编排:怎么选

这是本章最实用的一张表。多数团队不是二选一,而是混用。

维度Dify(可视化)代码:LangGraph / LangChain(前 7-14 章)
上手速度几小时搭出 MVP需要懂 Python + 框架
谁可以改产品、运营也能自助改 Prompt / 加知识只有工程师能改
知识库 / RAG内置,界面配自己写或接框架(第 5-6 章)
复杂控制流界面节点,适合 80% 常规流程图式编排,复杂分支 / 循环 / 人工介入更灵活
深度定制有限(代码节点可写 Python/JS 兜底)无限
性能与成本精细控制平台封装,可观测但定制有限完全可控
私有化深度集成自托管 Docker 可部署,业务靠自定义工具直接嵌进你的系统
一句话快速、可自助、够用深度、可控、可定制

选型口诀:

  1. 知识库问答类、运营要能自己改 → 先上 Dify,别写代码;
  2. 复杂编排 / 深度集成 / 要极致可控 → 写代码(或 Java 生态,第 13 章);
  3. 两条腿走路(最推荐)→ Dify 做应用层(对话、RAG、Agent),你的 Java 服务通过自定义工具被 Dify 调用;复杂模块再用代码单独实现。

类比:Dify ≈ 你们团队的低代码平台 / 表单引擎,代码 ≈ 核心业务系统。低代码平台解决 80% 的重复搭建,核心逻辑永远留给你自己。

17.3 概念映射:把前 16 章翻译成 Dify

读完下面这张表,Dify 对你就不再是黑盒——每个界面上出现的词,你都能指出它在原理上对应什么。

前 16 章的概念Dify 里的对应物关键点
Prompt(第 03 章)应用编排里的"系统提示词 / 用户提示词 / 变量"同一个"角色 + 任务 + 约束"结构,支持 {{变量}}
Embedding(第 04-05 章)控制台"模型供应商"里配置的 Embedding 模型入库与检索必须同一个模型(第 5 章强调过的坑,Dify 已替你管好)
分块 / overlap(第 05 章)知识库"分段设置"(chunk size / overlap)中文分段建议看实际效果调,默认 500 字符附近
向量检索 / BM25(第 06 章)知识库"检索模式":向量 / 全文 / 混合混合 = 向量 + 全文加权融合(RRF 思路,第 6.3 节)
Top-K / 相似度阈值(第 06 章)检索设置里的 Top-K 与 Score 阈值0.5 阈值那个练习(第 5 章练习 3),Dify 里是个输入框
Rerank 精排(第 06 章)检索设置里可选的 Rerank 模型需要单独配一个 rerank 供应商模型
工具 @tool(第 08 章)工具节点 + 自定义工具(OpenAPI 描述)模型只决定调用,执行仍在你后端
ReAct 循环(第 02 / 10 章)Agent 应用(自动调工具 + 知识库)那个 while 循环 Dify 帮你写了
图 / 节点 / 边(第 09 章)工作流 / 对话流画布节点 = 处理,连线 = 数据流(变量传递)
Checkpointer / 会话记忆(第 09 章)会话变量 + 消息窗口按 conversation_id 自动维护
意图识别(第 14 章)"问题分类器"节点(LLM 分类)替代你手写的 classify_node
人工接管 interrupt(第 10 / 14 章)工作流里转人工(调用你的工单接口 / 直接回复兜底)Dify 不做人工审批平台,交接靠你的工具
可观测 / 日志(第 12 章)应用日志(每次对话的输入/输出/token/延迟)原生带,不用自己埋点

17.4 应用类型与编排方式

Dify 里"应用"是部署和发布的基本单位。类型决定对话形态,编排方式决定复杂程度:

应用类型对话形态典型用途对应前文
聊天助手(Chatbot)多轮对话客服、问答机器人第 14 章客服
文本生成(Text Generator)单次生成一段文字写摘要、翻译、生成报告第 03 章结构化输出
Agent多轮对话 + 自动调工具查数据、多步任务第 02 / 08 / 10 章
工作流(Workflow)一次运行,输出结构化结果内容处理流水线、批处理第 09 章图
对话流(Chatflow)多轮对话 + 工作流编排客服、需要分步处理的对话第 14 章客服

两种编排方式:

  • 基础编排(简单聊天 / 文本生成):只配 Prompt + 模型,适合极简场景;
  • 高级编排(工作流 / 对话流):画布拖节点,处理复杂逻辑——这是 Dify 的核心玩法。

第 14 章那个"意图识别 → 分派 → 政策问答 / 航班查询 / 转人工"的客服系统,在 Dify 里就是一张对话流画布:开始 → 问题分类 → 条件分支 →(知识检索 + LLM)→ 直接回复。第 18 章会把它一步步搭出来。

17.5 核心组件一:模型管理

在"设置 → 模型供应商"里接入你的模型。Dify 支持几十家供应商,关键认知:

  • OpenAI 兼容格式是一条通用通道:DeepSeek / 通义千问 / 智谱 GLM 等都提供 OpenAI 兼容端点,填 base_url + API Key 即可(和第 02 章 .env 的思路完全一样);
  • 也可以接 Ollama 本地模型(离线、免费,但并发与效果看机器)。

系统模型分工(一个应用可能同时用到三种模型,Dify 让你分别指定):

模型角色干什么对应前文
推理模型(默认 LLM)对话、生成、分类第 01-02 章
Embedding 模型知识库入库与检索的向量化第 04-05 章
Rerank 模型混合检索后的精排(可选)第 06.4 节
  • Embedding 模型选定后不要随便换:换了必须重建知识库索引(第 6.8 节的坑,Dify 只是帮你强制了这个流程);
  • 控制台能看到每个应用的 token 用量与费用——这就是第 12.4 节"成本监控"的现成实现。

17.6 核心组件二:知识库(RAG 图形化)

知识库是 Dify 最常用的模块,把第 5-6 章的所有旋钮搬到了界面:

入库流程:上传文档(PDF / Word / Markdown / 网页)→ 分段 → 索引。

配置项说明对应前文
分段模式自动分段(通用)或自定义(Q&A、按分隔符)第 5.4 节切分器
分段长度 / 重叠chunk_size / overlap第 5.4 节
索引方式高质量(Embedding,检索准)/ 经济(关键词索引)第 5.5-5.6 节
清洗规则去多余换行、无意义字符第 05 章预处理

检索配置(决定"怎么召回"):

配置项说明对应前文
检索模式向量检索 / 全文检索 / 混合检索第 6.3 节(BM25 + 向量)
Top-K召回多少条第 5.8 节 k
Score 阈值低于该相似度一律不返回(默认 0.5 附近)第 5 章练习 3
Rerank 模型精排模型,混合检索强烈建议配第 6.4 节
  • 每个知识库可以单独测召回:输入一个问题,界面直接显示命中了哪些段、相似度多少——这就是第 6.1 节"先看检索"的诊断动作,Dify 内置了;
  • 多知识库 + 元数据过滤:可为知识库打标签,应用按标签决定用哪个库(对应第 6.8 节"按部门/租户过滤"的雏形,生产级权限仍建议放后端)。

17.7 核心组件三:可视化工作流(节点)

高级编排的画布上,节点是处理单元,连线是数据流:上游节点的输出成为下游节点的输入变量({{node.output}})。常用节点:

节点作用对应前文
开始 / 结束 / 直接回复定义输入变量 / 收尾 / 立即回答图的 START / END(第 09 章)
LLM一次模型调用,配 Prompt + 模型第 02 章
知识检索查知识库,输出命中的段落第 05-06 章
工具调用内置 / 自定义工具第 08 章
HTTP 请求直接调一个 REST 接口(比自定义工具更"裸")第 12.5 章 Java 调用
代码写一小段 Python / JS 处理变量兜底任何定制逻辑
问题分类器用 LLM 把输入分成几类 → 走不同分支第 14 章 classify_node
条件分支(IF/ELSE)按变量值走不同路径第 09 章条件边
参数提取用 LLM 从文本抽结构化字段(JSON)第 03 章结构化输出
迭代对数组逐项处理循环(第 10 章多轮)
变量赋值 / 变量聚合改 / 合并变量State 更新(第 09 章)

两种画布的区别:

  • 工作流(Workflow):一次输入跑一遍,面向"任务"(生成摘要、处理一批数据);
  • 对话流(Chatflow):带会话上下文的多轮对话,面向"对话"(客服、助手),可以引用历史消息。

对读到这里的人来说,Dify 画布就是 LangGraph 的图形化:节点 = 你的函数,连线 = State 的流转。唯一要适应的是"配置靠填表单、变量靠拖拽"而不是写代码。

17.8 核心组件四:工具与 Agent

工具是把"外部世界"接进 Dify 的入口:

  • 内置工具:网页搜索、代码解释器、网页抓取等;
  • 自定义工具:用 OpenAPI(Swagger)描述文件把你后端的 REST 接口导入——Dify 据此生成工具 Schema,模型就能调它。这是你 Java 服务与 Dify 协作的官方姿势(第 18 章实践):

    • 你的 Java 接口(如 GET /api/flight/status?flightNo=CA1501)写一份 OpenAPI 描述;
    • Dify 里"创建自定义工具 → 粘贴 OpenAPI 描述"→ 生成工具;
    • 模型在对话中自主决定调用它,真正执行仍在你的 Java 服务(权限、校验、审计都在你那端,安全边界和第 08、12 章一致)。

Agent 应用:把"手写 ReAct 循环"(第 02 章 while 循环、第 10 章 create_react_agent)变成开关——勾选工具 + 知识库,模型自己决定"要不要查、查什么、要不要调工具、调完再答"。Agent 里还能配 Agent 推理模型(单独指定比默认更聪明的模型跑决策),对应第 12.4.3 节"模型分级"。

17.9 发布与 API

应用编排完 → 发布。发布后的三种访问方式:

方式说明适合
WebAppDify 生成的对话界面,可分享链接快速给内部 / 小范围试用
嵌入iframe 嵌进现有系统快速嵌入门户
访问 API生成 app-xxx API Key,走 HTTP你的 Java / 前端正式调用

三种 API 对应三种应用类型:

API应用类型说明
POST /v1/chat-messages聊天助手 / 对话流 / Agent多轮对话,传 conversation_id 续会话
POST /v1/completion-messages文本生成单次生成
POST /v1/workflows/run工作流触发一次流程,拿结构化输出

请求都带 Authorization: Bearer app-xxx,响应可 blocking(一次性返回)或 streaming(SSE 流式,对应第 12.5 章 Java 侧 WebClient 透传流式)。

一次对话 API 调用(预览,第 18 章会完整实践):

curl -X POST "http://localhost/v1/chat-messages" \
  -H "Authorization: Bearer app-xxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
        "inputs": {},
        "query": "航班起飞前4小时内退票,手续费是多少?",
        "response_mode": "blocking",
        "conversation_id": "",
        "user": "u-20261009"
      }'

运行后输出(模拟,实际结果取决于模型与运行数据):

{
  "message_id": "a3fe1f52-2a1f-4e3f-9c0b-8f4e...",
  "conversation_id": "1c7d55fb-...",
  "mode": "chat",
  "answer": "航班起飞前 4 小时内退票,收取票面价 40% 的手续费(依据资料[1])。",
  "metadata": {
    "usage": {"prompt_tokens": 812, "completion_tokens": 96, "total_tokens": 908}
  }
}

第二次提问时把返回的 conversation_id 传回去,Dify 就"记得"上下文(第 09 章 Checkpointer 的云端形态)。

17.10 可观测与迭代

发布不是终点。Dify 自带的应用观测能覆盖第 12 章相当一部分:

需求Dify 里的对应
看每次对话发生了什么应用日志:输入 / 输出 / 命中的知识库段落 / token / 延迟
查 token 成本控制台 token 用量统计(按应用 / 按天)
低成本纠错标注(Annotation):人工把正确答案标给某个问题,命中时优先返回(冷启动神器,比改 Prompt 快)
定位"答得差"看日志里命中的段落 + score,归因检索还是生成(第 6.1 节口诀)

Dify 给了你应用层的可观测;系统层的(QPS、并发、基础设施、审计)仍要自己接(第 12 章清单不变)。

17.11 何时选 Dify:一张决策清单

把它贴到团队 Wiki,遇到新需求先过一遍:

  1. 是不是知识库问答 / 客服 / 运营要改内容? → Dify,别写代码;
  2. 是不是"一次调用 + 工具循环"就能覆盖的 MVP? → Dify,快速验证;
  3. 产品 / 运营需要自助调整? → Dify(他们改 Prompt 和知识,不用排队等工程师);
  4. 涉及深度定制控制流、复杂多 Agent、严格性能预算? → 写代码(第 10 / 12 / 14 章);
  5. 两者都要? → Dify 做应用层,Java / Python 服务做执行层,用自定义工具对接(第 18 章就是这条路)。

小结

  • Dify 是可视化编排路线:模型管理、知识库、工作流、工具、Agent、发布与日志全图形化,前 16 章的概念在界面上一一对应;
  • 它不替你写业务逻辑:真正的交易与权限在你自己后端,Dify 通过自定义工具(OpenAPI)去调;
  • 选型:知识库问答、快速 MVP、运营自助 → Dify;深度定制、复杂编排、极致可控 → 代码;生产团队通常是两条腿:Dify 做应用层 + 你的服务做执行层;
  • 可观测省心:应用日志、token 成本、标注纠错开箱即用;系统层工程化(第 12 章)仍需自己兜。

下一章,我们把第 14 章的客服系统在 Dify 里完整搭一遍:第 18 章。

练习

  1. 打开 Dify 控制台,把知识库检索设置里的"向量检索 / 全文检索 / 混合检索"各跑一遍召回测试,记录同一问题三种模式命中的段落差异——对应第 6.3 节的观察。
  2. 把"系统模型"里的 Embedding 模型换成另一个,重建索引,再问同一个问题,观察回答变化(体会第 6.8 节"换模型必须全量重建")。
  3. 用"问题分类器"节点做一个三分类(政策 / 航班 / 其他),对比它和你手写 classify_node(第 14 章)的准确率。
  4. 在应用日志里找出一次"答得差"的对话,判断是检索没召回还是生成了没依据的内容(第 6.1 节归因)。

参考答案

<details>
<summary>练习1(三种检索模式对比)</summary>

在知识库检索设置里切换模式,同一问题(如"航班延误能赔多少钱"):

  • 向量检索:语义命中 d5(延误赔偿),但对"赔"字这类精确词不敏感;
  • 全文检索:命中含"延误""赔偿"字眼的段落,可能带进不相关的(比如同时提到延误的行李条款);
  • 混合检索:两路融合,既保语义又保词法——通常召回最稳,配合 Rerank 效果最好(第 6.3-6.4 节结论在界面上复现)。

观察点:命中的段落 id 集合、相似度分数分布。若你的数据上三种几乎无差别,说明语料简单,纯向量够用。
</details>

<details>
<summary>练习2(换 Embedding 模型)</summary>

把 Embedding 模型从 A 换成 B 后,先重建知识库索引再问:

  • 索引未重建时:新旧向量混在一个集合里,相似度整体乱掉(回答可能明显变差或召回错误段落)——Dify 会在界面上提示你重建;
  • 重建后:一切恢复正常。

结论:Dify 帮你强制了"换模型 = 全量重建"这个纪律(第 6.8 节),但你必须理解为什么——向量空间不兼容。
</details>

<details>
<summary>练习3(问题分类器 vs 手写 classify)</summary>

在对话流里加"问题分类器"节点,类别设 policy / flight / other,用 20 条问题测准确率,和手写版(第 14 章 classify_node,同样的模型)对比:

  • 两者本质都是一次带约束的 LLM 调用(第 03 章结构化输出),准确率通常接近;
  • Dify 版优势:界面可调类别描述、可加 few-shot 示例,运营也能改;
  • 手写版优势:逻辑在你代码里,能接自定义后处理。

结论:准确率差异通常不大,选哪个取决于"谁需要改它"。
</details>

<details>
<summary>练习4(日志归因)</summary>

找一次回答差的对话,在应用日志里看两步:

  1. 命中了哪些段落、score 多少:若该命中的没命中 / 分数低 → 检索问题(调 Top-K、Score 阈值、检索模式、分块);
  2. 答案是否用了命中段落:命中了但答案没依据 / 编造 → 生成问题(改系统提示词"只依据资料回答"、加标注示例)。

这就是第 6.1 节"先看检索再怪模型"的日常版,Dify 把原始数据都记在日志里了。
</details>

延伸阅读