feat(docs): integrate version2 curriculum and stage-3 updates

概要
- 将 version2 分支的课程结构重构、第三阶段章节新增、示例资源迁移、高级 RAG 文档与 Vercel 部署配置等整合为 main 上的一次汇总提交

内容导航与 README 调整
- 更新 README 的总体介绍文案,引入“第零阶段 + 第一到第三阶段”的完整学习路径描述
- 将原先的“三阶段实战路径”说明替换为新版分阶段描述,突出从小游戏到跨平台复杂应用的学习节奏
- 删除已过时的“第二次更新将在分支 version2 合并到主分支”的提示,改为直接以 main 为主线
- 统一 README 顶部标题和排版风格,保证中英文导航、徽章展示等视觉结构一致

课程结构与章节导航更新
- 调整 docs 目录下的学习阶段导航结构,使 README 中的导航表与各 stage 实际目录对齐
- 补全并创建 stage-3 相关章节入口文件,用于承载高级阶段的课程内容
- 新增或更新以下章节入口:
  - 高级核心技能:
    - docs/stage-3/core-skills/3.1-mcp-claudecode-skills/index.md
    - docs/stage-3/core-skills/3.2-long-running-tasks/index.md
  - 多平台开发:
    - docs/stage-3/cross-platform/3.3-wechat-miniprogram/index.md
    - docs/stage-3/cross-platform/3.4-wechat-miniprogram-backend/index.md
    - docs/stage-3/cross-platform/3.5-android-app/index.md
    - docs/stage-3/cross-platform/3.6-ios-app/index.md
  - 个人品牌:
    - docs/stage-3/personal-brand/3.7-personal-website-blog/index.md
- 保持 stage-0、stage-1、stage-2 既有章节结构不变的前提下,对导航表格进行排版和链接校正,使整体课程地图清晰、可点击

示例与图片资源重组
- 将原先位于 docs/examples/example1/images/ 下的微信小程序示例图片,整体迁移到 stage-3 的正式课程路径中:
  - 目标路径:docs/stage-3/3.3-how-to-build-a-wechat-miniprogram/example1/images/
- 通过 rename 方式保留 git 历史关系,避免图片资源被视为完全新增,从而方便后续追踪
- 为微信小程序示例新增 index 页面:
  - docs/stage-3/3.3-how-to-build-a-wechat-miniprogram/example1/index.md
- 使该示例在“高级三:多平台开发:如何构建微信小程序”章节中有清晰的入口,对应实际实战内容

高级 RAG 与 AI 进阶文档
- 新增一篇系统介绍 RAG 的高级文档:
  - docs/stage-3/ai-advanced/3.a1-rag-introduction/extra5-what-is-rag-and-how-does-it-work-and-future.md
- 覆盖内容包括:RAG 的基本概念、典型架构、工作流程以及未来演进方向,为第三阶段的复杂应用提供知识检索基础
- 配套引入多张插图,帮助读者从架构图和流程视角理解 RAG:
  - docs/stage-3/ai-advanced/3.a1-rag-introduction/images/image1.png ~ image15.png

部署与工程配置
- 新增 vercel.json 配置文件,为项目在 Vercel 上的部署提供基础配置
  - 明确文档构建产物的输出路径和静态站点托管方式
  - 为之后的一键部署和自动化预览打下基础

依赖与锁文件更新
- 调整 package.json 中与新版文档结构和部署相关的配置,保持脚本和依赖与当前课程形态同步
- 更新 package-lock.json,以反映最新的依赖树和版本锁定状态
- 保证在执行 npm install / npm run build 时,依赖环境与 version2 中的实际使用情况一致

兼容性与行为说明
- 该提交通过 npm run build 验证,确保在整合 version2 内容后,VitePress 构建过程正常完成
- main 分支上的历史被压缩为一条有语义的“第二次大更新”提交,详细的开发过程仍保留在 version2 分支,用于后续需要时回溯
This commit is contained in:
sanbuphy
2026-01-12 12:21:35 +08:00
parent 307a37cdb9
commit a4b583b13f
632 changed files with 18082 additions and 8092 deletions
@@ -27,9 +27,9 @@
4. RAG 的实现方法与价值,为什么需要检索增强生成?
5. 如何从 0 到 1 学会使用 Dify 和 AI IDE Trae (`Extra Knowledge 4 - What is AI IDE and Trae`),包括搭建 智能体、工作流,并基于 Dify API 制作前端对话机器人网页程序。
* Dify 的基本使用原理与智能体、工作流制作方法,API 调用方法。
* AI IDE 的使用方法,如何使用 AI IDE 编程。
* 一个可进行对话的前端网页智能体程序。
- Dify 的基本使用原理与智能体、工作流制作方法,API 调用方法。
- AI IDE 的使用方法,如何使用 AI IDE 编程。
- 一个可进行对话的前端网页智能体程序。
# 1. 从对话到智能体
@@ -77,10 +77,10 @@ RAG 的基本思路是:在用户提问时,系统首先从企业知识库中
完成搭建后,你可以尝试提出各类问题来检验它的能力,例如:
* “我们产品A的最新版本有哪些主要功能升级?”
* “请根据员工手册,说明今年的年假制度是如何规定的?”
* “在XX项目中,我们遇到的技术挑战‘XXX’是如何解决的?”
* “这篇论文中提到的核心研究方法是什么?”
- “我们产品A的最新版本有哪些主要功能升级?”
- “请根据员工手册,说明今年的年假制度是如何规定的?”
- “在XX项目中,我们遇到的技术挑战‘XXX’是如何解决的?”
- “这篇论文中提到的核心研究方法是什么?”
你将亲身感受 RAG 技术如何将静态分散的文档资料,转化为一个精准的智能知识库,为各种场景提供高精度问答支持。
@@ -220,7 +220,7 @@ Dify 是一个用于开发 LLM 应用的开源平台。它提供了直观的界
## 2.2 创建第一个 Dify Chatbot 应用
访问 Dify 首页 [https://cloud.dify.ai/apps](https://cloud.dify.ai/apps) 并注册和登录后,选择 Studio,你会看到如下界面:
访问 Dify 首页 [https://cloud.dify.ai/apps](https://cloud.dify.ai/apps) 并注册和登录后,选择 Studio,你会看到如下界面:
![](images/image14.png)
@@ -276,13 +276,14 @@ Dify 能够灵活接入来自 OpenAI、Azure、Anthropic 等主流服务商的
3. 安装结束后,我们能够配置支持新的模型供应商,在设置里的模型提供商部分,我们可以看到目前支持的所有模型商:
![](images/image24.png)
4. 在开始使用前,需要先完成模型的配置。对于 OpenAI-API-compatible 插件,你可以点击 “Add Model” 来添加并配置任意模型。你可以在 “Model Type” 中选择该模型是LLM还是 Embedding,你需要确保模型的类型被正确配置。
你需要写入具体的模型名字、模型 endpoint URL 以及 API Key 才能确保模型启用,如果你初步觉得配置该参数麻烦,你可以直接跳到后者的 SiliconFLow 平台的 Key 配置,或者安装 OpenRouter 等第三方服务商插件进行简单的模型支持配置。(确保服务商内有剩余可使用额度)
你需要写入具体的模型名字、模型 endpoint URL 以及 API Key 才能确保模型启用,如果你初步觉得配置该参数麻烦,你可以直接跳到后者的 SiliconFLow 平台的 Key 配置,或者安装 OpenRouter 等第三方服务商插件进行简单的模型支持配置。(确保服务商内有剩余可使用额度)
![](images/image25.png)
对于 `SiliconFlow` 插件,只需要点击 Setup 配置 key 后即可使用 Embedding 和 Rerank 模型进行测试,你可以点击 Get you API Key from SiliconFlow 获得鉴权密钥。
![](images/image26.png)
5. 配置完成后,你可以点击模型列表查看当前支持多少模型,此时已经完成了基础模型的全部配置。
![](images/image27.png)
@@ -310,11 +311,11 @@ Dify 能够灵活接入来自 OpenAI、Azure、Anthropic 等主流服务商的
首先在 **General** 设置中,你可以把这里理解成“文本切分规则”的设置区域。因为我们需要把很长的文本切分成小块,所以必须先定义切分规则。在入门阶段,你只需要关注 **maximum chunk length(最大切分长度)** 。可以尝试设置为 512、2048 或 4096,然后点击 **Preview Chunk** 预览不同设置下的效果。
你也可以调整 **Chunk overlap(切片重叠)** 选项。它决定相邻片段之间是否会保留一部分重叠内容。适当的重叠有助于避免重要信息被拆到不同片段而难以理解。
你也可以调整 **Chunk overlap(切片重叠)** 选项。它决定相邻片段之间是否会保留一部分重叠内容。适当的重叠有助于避免重要信息被拆到不同片段而难以理解。
![](images/image32.png)
在设置中还有一个选项叫做 **Chunk using Q&A format in English** 。启用后,系统会使用大语言模型,将知识库的一部分内容转换成问答形式来存储,这在某些场景下可以显著提升检索效果。
在设置中还有一个选项叫做 **Chunk using Q&A format in English** 。启用后,系统会使用大语言模型,将知识库的一部分内容转换成问答形式来存储,这在某些场景下可以显著提升检索效果。
在真实业务中,根据场景选择合适的切分策略,能够更好地优化检索结果,保证查询能够返回你期望的信息。
@@ -326,7 +327,7 @@ Embedding 模型的选择会显著影响最终的检索效果(例如匹配准
![](images/image33.png)
在此处,你还会看到另一个模型设置叫做 **Rerank model** ,默认值是 **Jina-rerank-m0** 。(如果你非校园内的学生,此时你可能会看到 Rerank 模型缺失的报错,你需要在模型处配置 rerank 模型才能在此处启用使用)
在此处,你还会看到另一个模型设置叫做 **Rerank model** ,默认值是 **Jina-rerank-m0** 。(如果你非校园内的学生,此时你可能会看到 Rerank 模型缺失的报错,你需要在模型处配置 rerank 模型才能在此处启用使用)
Rerank 模型的主要作用,是对“初步筛选出的候选结果”进行二次、更精细的排序,让和用户需求最匹配的结果排在更靠前的位置,从而显著提升最终结果的相关性和用户体验。
@@ -336,11 +337,11 @@ Rerank 模型的主要作用,是对“初步筛选出的候选结果”进行
![](images/image34.png)
当所有设置完成后,点击 **Save & Process** ,系统就会进入知识库向量化阶段。在这一阶段,Embedding 模型会把切分后的文本转换为向量表示。
当所有设置完成后,点击 **Save & Process** ,系统就会进入知识库向量化阶段。在这一阶段,Embedding 模型会把切分后的文本转换为向量表示。
![](images/image35.png)
处理完成后,点击 **Go to document** ,可以查看已经处理完毕并存储好的知识库内容。
处理完成后,点击 **Go to document** ,可以查看已经处理完毕并存储好的知识库内容。
![](images/image36.png)
@@ -459,11 +460,11 @@ Dify 中提供了多种节点,你可以先了解每个节点的基本功能。
此类节点负责工作流中的核心流程。
* LLM节点:核心计算单元,用于调用大语言模型。其配置重点在于提示词工程与参数调优,将业务问题转化为模型的执行指令。
* Knowledge Retrieval 节点:知识检索单元,负责从预设知识库、外部权威数据源中检索与业务问题相关的信息,为 LLM 节点提供精准的知识支撑,帮助减少大语言模型输出的 “幻觉” 问题。
* Answer 节点:结果输出单元,负责接收 LLM 处理后的内容,将其整理为符合业务场景需求的最终成果形式。其配置重点在于输出格式的定义(如话术模板、排版规范)。
* Agent节点:高阶决策单元。它不仅调用模型,还可实施多步骤规划、自主选择并调用外部工具,适用于需要动态决策的复杂任务链。
* Question Classifier 节点:问题分类单元,负责对输入的业务问题进行类型识别与归类(比如按问题意图、主题领域等维度划分),帮助后续流程精准匹配对应的处理节点(如不同类型的问题适配不同的 LLM 提示词或工具链)。
- LLM节点:核心计算单元,用于调用大语言模型。其配置重点在于提示词工程与参数调优,将业务问题转化为模型的执行指令。
- Knowledge Retrieval 节点:知识检索单元,负责从预设知识库、外部权威数据源中检索与业务问题相关的信息,为 LLM 节点提供精准的知识支撑,帮助减少大语言模型输出的 “幻觉” 问题。
- Answer 节点:结果输出单元,负责接收 LLM 处理后的内容,将其整理为符合业务场景需求的最终成果形式。其配置重点在于输出格式的定义(如话术模板、排版规范)。
- Agent节点:高阶决策单元。它不仅调用模型,还可实施多步骤规划、自主选择并调用外部工具,适用于需要动态决策的复杂任务链。
- Question Classifier 节点:问题分类单元,负责对输入的业务问题进行类型识别与归类(比如按问题意图、主题领域等维度划分),帮助后续流程精准匹配对应的处理节点(如不同类型的问题适配不同的 LLM 提示词或工具链)。
2. 逻辑与流程控制节点
@@ -471,22 +472,22 @@ Dify 中提供了多种节点,你可以先了解每个节点的基本功能。
此类节点定义工作流的执行路径与规则。
* 条件节点:如 `IF/ELSE`,通过布尔判断实现流程分支。其设计关键在于条件表达式的严谨性,确保逻辑覆盖所有业务场景。
* Iteration 节点:作为无状态的批量并行处理单元,它专为子任务间无数据依赖、可独立处理的场景设计,例如批量翻译段落、并行审核多条内容或同时生成多份报告。该节点会接收一个输入数组并自动分片,将每个元素分发至相同处理链路并行执行,用户可在迭代体内通过 {{item}} 访问当前元素、{{index}} 获取其索引,输出则会自动聚合成结果数组;配置时需重点设定并行度以平衡效率与系统负载,同时通过重试策略(如重试次数、间隔)和失败处理(如记录日志、返回默认值)保障批量作业的稳定性。
* Loop 节点:有状态的递归迭代器,适用于结果依赖前一轮输出的场景,比如多轮参数调优、递归式内容优化(如反复修订文案直至满意)及依赖上次结果的链式计算。其核心是 “状态变量”,需在循环开始前初始化(如当前迭代次数、中间计算结果),并在每轮迭代中明确更新以作为下一轮输入;为防止无限循环,必须定义终止条件(包括基于计数器的 “最多循环 10 次”、基于结果判定的 “满意度评分 > 9”、基于外部信号的 “检测到‘停止’输入”),同时需设置循环超时配置,并规划异常处理路径(如跳出循环或重置状态后重试),确保流程稳定运行。
- 条件节点:如 `IF/ELSE`,通过布尔判断实现流程分支。其设计关键在于条件表达式的严谨性,确保逻辑覆盖所有业务场景。
- Iteration 节点:作为无状态的批量并行处理单元,它专为子任务间无数据依赖、可独立处理的场景设计,例如批量翻译段落、并行审核多条内容或同时生成多份报告。该节点会接收一个输入数组并自动分片,将每个元素分发至相同处理链路并行执行,用户可在迭代体内通过 {{item}} 访问当前元素、{{index}} 获取其索引,输出则会自动聚合成结果数组;配置时需重点设定并行度以平衡效率与系统负载,同时通过重试策略(如重试次数、间隔)和失败处理(如记录日志、返回默认值)保障批量作业的稳定性。
- Loop 节点:有状态的递归迭代器,适用于结果依赖前一轮输出的场景,比如多轮参数调优、递归式内容优化(如反复修订文案直至满意)及依赖上次结果的链式计算。其核心是 “状态变量”,需在循环开始前初始化(如当前迭代次数、中间计算结果),并在每轮迭代中明确更新以作为下一轮输入;为防止无限循环,必须定义终止条件(包括基于计数器的 “最多循环 10 次”、基于结果判定的 “满意度评分 > 9”、基于外部信号的 “检测到‘停止’输入”),同时需设置循环超时配置,并规划异常处理路径(如跳出循环或重置状态后重试),确保流程稳定运行。
3. 数据操作与集成节点
![](images/image57.png)
* Code 节点:代码处理单元,负责在工作流中执行自定义代码逻辑,可实现数据格式转换、复杂计算等个性化处理需求。其配置重点在于代码语法的正确性与执行环境的适配。
* Template 节点:模板处理单元,负责将动态数据填充至预设模板中,生成符合格式要求的内容(如定制化文案、报告框架)。其配置重点在于模板语法的编写与变量映射规则的设置。
* Variable Aggregator 节点:变量聚合单元,负责收集工作流中多个节点输出的变量数据,将分散的变量整合为统一数据集。其配置重点在于聚合的变量范围与数据合并规则的定义。
* Doc Extractor 节点:文档提取单元,负责从 PDF、Word 等各类文档中提取文本、表格等关键内容,转化为工作流可处理的结构化数据。其配置重点在于文档类型的适配与提取内容的筛选规则。
* Variable Assigner 节点:变量赋值单元,负责定义、初始化或更新工作流中的变量,为流程内的数据传递提供载体。其配置重点在于变量的命名、数据类型及赋值逻辑的设定。
* Parameter Extractor 节点:参数提取单元,负责从用户请求、接口返回等输入内容中提取指定参数,将非结构化信息转化为结构化数据。其配置重点在于提取规则(如正则表达式、JSON 路径)的配置。
* HTTP Request 节点:HTTP 请求单元,负责向外部系统接口发起 HTTP 请求(含 GET、POST 等方法),实现工作流与外部服务的数据交互。其配置重点在于请求地址、请求方法及参数 /headers 的设置。
* List Operator 节点:列表操作单元,负责对数组、列表类型的数据进行处理(如过滤、排序、拆分),调整数据结构以适配后续流程。其配置重点在于操作类型(如过滤条件、排序规则)的定义。
- Code 节点:代码处理单元,负责在工作流中执行自定义代码逻辑,可实现数据格式转换、复杂计算等个性化处理需求。其配置重点在于代码语法的正确性与执行环境的适配。
- Template 节点:模板处理单元,负责将动态数据填充至预设模板中,生成符合格式要求的内容(如定制化文案、报告框架)。其配置重点在于模板语法的编写与变量映射规则的设置。
- Variable Aggregator 节点:变量聚合单元,负责收集工作流中多个节点输出的变量数据,将分散的变量整合为统一数据集。其配置重点在于聚合的变量范围与数据合并规则的定义。
- Doc Extractor 节点:文档提取单元,负责从 PDF、Word 等各类文档中提取文本、表格等关键内容,转化为工作流可处理的结构化数据。其配置重点在于文档类型的适配与提取内容的筛选规则。
- Variable Assigner 节点:变量赋值单元,负责定义、初始化或更新工作流中的变量,为流程内的数据传递提供载体。其配置重点在于变量的命名、数据类型及赋值逻辑的设定。
- Parameter Extractor 节点:参数提取单元,负责从用户请求、接口返回等输入内容中提取指定参数,将非结构化信息转化为结构化数据。其配置重点在于提取规则(如正则表达式、JSON 路径)的配置。
- HTTP Request 节点:HTTP 请求单元,负责向外部系统接口发起 HTTP 请求(含 GET、POST 等方法),实现工作流与外部服务的数据交互。其配置重点在于请求地址、请求方法及参数 /headers 的设置。
- List Operator 节点:列表操作单元,负责对数组、列表类型的数据进行处理(如过滤、排序、拆分),调整数据结构以适配后续流程。其配置重点在于操作类型(如过滤条件、排序规则)的定义。
### 2.6.2 常见工具介绍
@@ -496,13 +497,13 @@ Dify 中提供了多种节点,你可以先了解每个节点的基本功能。
在左侧或右侧的节点面板中,可以查看所有可用工具节点,也可以通过插件市场扩展更多工具能力。简单介绍几个常见工具的作用:
* 网络搜索工具
- 网络搜索工具
以 Tavily Search 为代表,为大模型提供面向 AI 优化的实时检索能力。
它会返回结构化的搜索结果(如标题、摘要、链接等),可以直接作为 LLM 提示词的一部分,用于回答最新资讯类或需要权威依据的问题。
* 数据处理工具
- 数据处理工具
例如 JSON Process 插件,用于对 JSON 数据进行查询、筛选、转换、合并等高级操作。
在处理复杂 API 响应或多层嵌套数据时,你可以将“数据清洗 + 重组”的逻辑交给该工具,从而简化在 Code 节点中频繁手写解析代码的工作。
* 格式处理工具
- 格式处理工具
如 Markdown Exporter,可以将生成内容按指定格式导出,例如 Markdown 文档、特定排版模板等,方便后续用于展示、汇报或集成到其他系统。
你可以在工具列表中看到这些插件的安装量和简介,初期可优先尝试安装“Featured / 推荐”里的工具,往往覆盖了最常见的业务场景。
@@ -524,32 +525,32 @@ Dify 中提供了多种节点,你可以先了解每个节点的基本功能。
本节的目标是让系统能处理一个餐饮场景下的多类对话。你可以跟着操作做一遍加深印象。首先需要做的是定义场景为意图分类:
* **下单购买 (buy_food)** :用户表达明确的购买意愿。
* *例如:“给我来一份炸鸡,再加一杯可乐。”*
* **抱怨投诉 (complain)** :用户在表达不满、催促或负面反馈。
* *例如:“你们也太慢了吧?等一个小时了。”*
* **闲聊咨询 (chitchat)** :用户在进行开放式询问、寻求建议,但无明确下单指令。
* *例如:“今天吃什么好呢,你有什么推荐吗?”*
* **其他意图 (other)** :用户的输入与餐饮场景无关。
* *例如:“帮我写个搞笑文案发朋友圈。”*
- **下单购买 (buy_food)** :用户表达明确的购买意愿。
- _例如:“给我来一份炸鸡,再加一杯可乐。”_
- **抱怨投诉 (complain)** :用户在表达不满、催促或负面反馈。
- _例如:“你们也太慢了吧?等一个小时了。”_
- **闲聊咨询 (chitchat)** :用户在进行开放式询问、寻求建议,但无明确下单指令。
- _例如:“今天吃什么好呢,你有什么推荐吗?”_
- **其他意图 (other)** :用户的输入与餐饮场景无关。
- _例如:“帮我写个搞笑文案发朋友圈。”_
针对这四种意图,我们为系统预设了四种不同的“沟通人格”,分别由四个独立的 LLM 节点承载,每个节点都需要由具有不同人设的 LLM 进行扮演。
* **下单助手 (LLM_BuyFood)** :专业、高效,核心任务是确认订单细节,并主动补全缺失信息。
* **客服专家 (LLM_Complain)** :共情、稳重,首要任务是安抚用户情绪,并提供清晰的解决方案。
* **聊天伙伴 (LLM_Chitchat)** :轻松、友好,旨在提供个性化推荐,引导潜在消费。
* **礼貌门卫 (LLM_Other)** :专注、边界清晰,负责将偏离主题的对话礼貌地引导回核心业务。
- **下单助手 (LLM_BuyFood)** :专业、高效,核心任务是确认订单细节,并主动补全缺失信息。
- **客服专家 (LLM_Complain)** :共情、稳重,首要任务是安抚用户情绪,并提供清晰的解决方案。
- **聊天伙伴 (LLM_Chitchat)** :轻松、友好,旨在提供个性化推荐,引导潜在消费。
- **礼貌门卫 (LLM_Other)** :专注、边界清晰,负责将偏离主题的对话礼貌地引导回核心业务。
#### 工作流编排设计
接下来我们进行工作流的编排设定,决定大概需要有哪些工作流节点。对于新手而言,很难想到需要有哪些节点能被用到(对于老手来说也懒得自己思考,用大模型给建议通常是最快最好的选择),所以我们能够使用大模型给出对应的编排建议,其核心节点结构如下:
* Start (起点):作为数据入口,负责接收用户的原始输入 `user_text`
* Question Classifier (意图分类器):工作流的“大脑”与“调度中心”。它负责对 `user_text` 进行分析,并从我们预设的四种意图标签中选择最匹配的一个。
* Condition (条件分支):扮演“分流阀”的角色。它根据分类器输出的意图标签,决定接下来将任务导向哪一个专处理路径。
* 四个并行的 LLM 节点 (LLM_BuyFood, LLM_Complain, LLM_Chitchat, LLM_Other):这是四个独立的“专家处理单元”。每个节点都接收原始问题,但依据自身独特的 System Prompt(系统提示词)生成风格和目标截然不同的回复。
* Variable Aggregator (变量聚合器):在多条路径处理完成后,需要一个“汇集点”。此节点将四个分支中唯一被激活并产生结果的回复,收束成一个统一的变量 `final_reply`,确保了输出结构的稳定性。
* Output (终点):作为最终的出口,负责将意图标签、原始问题、以及经过处理生成的回复,以结构化的形式(如 JSON)统一输出,便于后续系统调用或调试分析。
- Start (起点):作为数据入口,负责接收用户的原始输入 `user_text`
- Question Classifier (意图分类器):工作流的“大脑”与“调度中心”。它负责对 `user_text` 进行分析,并从我们预设的四种意图标签中选择最匹配的一个。
- Condition (条件分支):扮演“分流阀”的角色。它根据分类器输出的意图标签,决定接下来将任务导向哪一个专处理路径。
- 四个并行的 LLM 节点 (LLM_BuyFood, LLM_Complain, LLM_Chitchat, LLM_Other):这是四个独立的“专家处理单元”。每个节点都接收原始问题,但依据自身独特的 System Prompt(系统提示词)生成风格和目标截然不同的回复。
- Variable Aggregator (变量聚合器):在多条路径处理完成后,需要一个“汇集点”。此节点将四个分支中唯一被激活并产生结果的回复,收束成一个统一的变量 `final_reply`,确保了输出结构的稳定性。
- Output (终点):作为最终的出口,负责将意图标签、原始问题、以及经过处理生成的回复,以结构化的形式(如 JSON)统一输出,便于后续系统调用或调试分析。
#### 工作流编排实现
@@ -567,10 +568,10 @@ Dify 中提供了多种节点,你可以先了解每个节点的基本功能。
随后我们需要点击输入节点后的 + 符号,选择 Question Classifier 节点添加,并且我们需为其配置四类标签,并为每个标签提供清晰的描述和示例。
* `buy_food`: 用户明确想买吃的、点餐、下单。
* `complain`: 用户在抱怨、吐槽、发脾气,通常带有不满情绪。
* `chitchat`: 用户在闲聊、讨论吃什么、咨询推荐。
* `other`: 与餐饮场景无关,或难以判断的内容。
- `buy_food`: 用户明确想买吃的、点餐、下单。
- `complain`: 用户在抱怨、吐槽、发脾气,通常带有不满情绪。
- `chitchat`: 用户在闲聊、讨论吃什么、咨询推荐。
- `other`: 与餐饮场景无关,或难以判断的内容。
此外,你还需要在 ADVANCED SETTING 中写入提示词,让大模型能够正确根据用户输入进行分类测试。示例提示词如下:
@@ -590,19 +591,19 @@ Dify 中提供了多种节点,你可以先了解每个节点的基本功能。
接下来,我们需要给分类器接上后续的大模型输出,例如,当 `label` 等于 `"buy_food"` 时,工作流便会精确地流向 `LLM_BuyFood` 节点。我们需要新建四个 LLM 节点,并设置不同的 System Prompt ;不同 System Prompt 的差异决定了它们不同的回应方式。
* LLM_BuyFood (点餐助手)
- LLM_BuyFood (点餐助手)
你是一个点餐助手。要求:1. 确认用户想点的内容。2. 如果信息不完整,友好地补充询问。3. 语气礼貌简洁。
* LLM_Complain (客服专家)
- LLM_Complain (客服专家)
你是一个餐饮客服,专门处理抱怨。要求:1. 真诚道歉。2. 简要说明可能的原因(不推卸责任)。3. 给出清晰的下一步解决方案。
* LLM_Chitchat (聊天伙伴)
- LLM_Chitchat (聊天伙伴)
你是一个帮人选吃的的聊天小助手。要求:1. 用轻松友好的语气。2. 给出 1~3 个简单推荐。3. 如果用户没有偏好,就给出不同风格的选择。
* LLM_Other (礼貌门卫)
- LLM_Other (礼貌门卫)
你是一个餐饮点餐小助手,只擅长跟‘吃’相关的话题。当用户说的话无关时:1. 礼貌说明自己的能力范围。2. 引导用户回到主场景。
@@ -618,9 +619,9 @@ Dify 中提供了多种节点,你可以先了解每个节点的基本功能。
接下来我们需要对所有的输出进行聚合,最后得到我们想要的结果,包含用户的输入、分类、以及回复。由于我们使用的是 Workflow 而不是 Chatflow,故没有 Answer 节点选择进行结果的聚合,我们能够选择其他节点变相实现结果的聚合与输出,此时选择 Template 节点,在变量部分指定用户意图分类结果、用户的输入值、变量聚合的最终回复,并且在 CODE 中写入最后回复的 json 格式模板,我们可以得到:
* `intent``class_name`
* `original_text``user_text`
* `final_reply``variable_aggregator`
- `intent``class_name`
- `original_text``user_text`
- `final_reply``variable_aggregator`
```Plain
{
@@ -640,18 +641,18 @@ Dify 中提供了多种节点,你可以先了解每个节点的基本功能。
大功告成,我们可以尝试运行这套工作流的效果。它能根据不同的输入,展现出截然不同的行为模式:
* 输入 (点餐): "给我来一份香辣鸡腿堡套餐,大杯可乐。"
* 路径: `buy_food``LLM_BuyFood`
* 输出 reply: "好的,一份香辣鸡腿堡套餐和大杯可乐已为您记录。请问套餐里的薯条需要更换吗?"
* 输入 (抱怨): "你们也太慢了吧?我都等一个多小时了!"
* 路径: `complain``LLM_Complain`
* 输出 reply: "非常抱歉让您等了这么久,这确实是我们的疏忽,给您带来了很不好的体验。我们正在紧急核实您的订单配送情况,并会为您申请相应的补偿,感谢您的耐心与反馈。"
* 输入 (闲聊): "今天吃什么比较健康?"
* 路径: `chitchat``LLM_Complain`
* 输出 reply: "追求健康的话,可以试试我们的轻食沙拉系列,或者烤鸡胸肉配时蔬。您是喜欢口味清淡一些还是稍微丰富一点的呢?我可以给您更具体的推荐。"
* 输入 (无关内容): "帮我想个明天开会的笑话。"
* 路径: `other``LLM_Other`
* 输出 reply: "这听起来是个有趣的挑战!不过我主要是个美食推荐和点餐助手。如果您需要点些什么来犒劳一下辛苦工作的自己,我随时可以帮忙!"
- 输入 (点餐): "给我来一份香辣鸡腿堡套餐,大杯可乐。"
- 路径: `buy_food``LLM_BuyFood`
- 输出 reply: "好的,一份香辣鸡腿堡套餐和大杯可乐已为您记录。请问套餐里的薯条需要更换吗?"
- 输入 (抱怨): "你们也太慢了吧?我都等一个多小时了!"
- 路径: `complain``LLM_Complain`
- 输出 reply: "非常抱歉让您等了这么久,这确实是我们的疏忽,给您带来了很不好的体验。我们正在紧急核实您的订单配送情况,并会为您申请相应的补偿,感谢您的耐心与反馈。"
- 输入 (闲聊): "今天吃什么比较健康?"
- 路径: `chitchat``LLM_Complain`
- 输出 reply: "追求健康的话,可以试试我们的轻食沙拉系列,或者烤鸡胸肉配时蔬。您是喜欢口味清淡一些还是稍微丰富一点的呢?我可以给您更具体的推荐。"
- 输入 (无关内容): "帮我想个明天开会的笑话。"
- 路径: `other``LLM_Other`
- 输出 reply: "这听起来是个有趣的挑战!不过我主要是个美食推荐和点餐助手。如果您需要点些什么来犒劳一下辛苦工作的自己,我随时可以帮忙!"
> 隐藏 Bug :需要说明的是,若你遇到与 aggregation group 相关的奇怪问题,这大概率是 Dify 的一个内置 bug。可能在特定操作下被触发;如果你曾经开启又关闭过 AGGREGATION GROUP,系统可能生成过 group 配置且残留了相关异常参数,即便现在开关看起来是关闭的,这些残留配置也可能导致问题,比如出现 `any` 相关参数的报错。此时你只需要删除该节点并重新创建即可。
@@ -783,7 +784,7 @@ curl -X POST 'http://{DIFY_API_URL}/v1/chat-messages' \
{
"event": "message",
"task_id": "c3800678-a077-43df-a102-53f23ed20b88",
"task_id": "c3800678-a077-43df-a102-53f23ed20b88",
"id": "9da23599-e713-473b-982c-4328d4f5c78a",
"message_id": "9da23599-e713-473b-982c-4328d4f5c78a",
"conversation_id": "45701982-8118-4bc5-8e9b-64562b4555f2",
@@ -888,25 +889,25 @@ curl -X POST 'http://{DIFY_API_URL}/v1/chat-messages' \
## 3.3 学习生活工作流
1. 学术论文深度解析与笔记生成器(复杂)
1. 思路:上传论文PDF,自动生成结构化笔记。
2. 实现:`Start` 上传PDF -> `Document Extractor` 提取全文 -> 并行多个 `LLM` 节点分工总结摘要、方法、发现、参考文献 -> `Variable Aggregator` 汇总 -> `Answer` 输出Markdown笔记。复杂度在于并行处理长文本的不同部分。
2. 个性化旅行计划定制师(中等)
2. 个性化旅行计划定制师(中等)
1. 思路:根据用户偏好,自动规划详尽行程。
2. 实现:`Start` 输入需求(目的地、天数、预算、兴趣)-> `Tool` 节点调用搜索引擎或地图API获取地点信息 -> `LLM` 整合信息,设计每日行程(含时间、活动、预算估算)。复杂度在于外部信息获取与结构化规划。
3. 外语学习互动陪练伙伴(简单)
3. 外语学习互动陪练伙伴(简单)
1. 思路:创建可角色扮演和语法纠错的对话机器人。
2. 实现:系统设定AI角色 -> `Start` 接收用户语句 -> `LLM` 执行两项任务:角色回复 + 语法纠错与解释 -> `Answer` 输出。核心是LLM的多任务指令。
4. 个人知识库问答与链接推荐系统(复杂)
4. 个人知识库问答与链接推荐系统(复杂)
1. 思路:基于你收藏的文档、笔记、网页链接,构建一个可问答并能推荐相关旧知识的智能系统。
2. 实现:离线处理:使用 `Document Extractor``Embedding` 工具将个人知识库切片并向量化存储。在线工作流:`Start` 输入问题 -> `Retrieval` 节点从向量库中查找最相关的知识片段 -> `LLM` 基于检索到的上下文生成答案 -> 同时,另一个分支使用检索到的内容作为输入,通过 `LLM` 生成“相关旧知识”推荐列表 -> `Answer` 合并输出答案与推荐。复杂度在于检索增强生成(RAG)流程的构建。
5. 健身/饮食计划追踪与调整顾问(中等)
5. 健身/饮食计划追踪与调整顾问(中等)
1. 思路:根据用户输入的每日饮食和训练日志,提供营养分析与训练建议。
2. 实现:`Start` 输入文本日志(如“午餐:鸡胸肉150g,米饭一碗,蔬菜若干;训练:深蹲5组”)-> `Parameter Extractor` 节点尝试结构化输入数据 -> `LLM` 扮演健身教练,分析营养摄入是否均衡、训练容量是否合适 -> 对比长期目标,给出微调建议(如“蛋白质摄入充足,建议增加蔬菜种类”)。复杂度在于从非结构化日志中提取结构化信息并提供个性化反馈。
# 6. 工作流平台的局限性
工作流平台(或称低代码平台)并非万能解决方案。它虽然对业务人员友好,降低了直接编码的门槛,但从另一个角度看,“低代码”往往也是一种“高代码”——用户仍需理解平台的概念、规则与操作逻辑,这本身构成了一种新的学习成本。
@@ -930,10 +931,10 @@ curl -X POST 'http://{DIFY_API_URL}/v1/chat-messages' \
在这个解密挑战中,你需要完成以下挑战,让工作流实现下列功能:
* 找出正确的密码!
* 将密码修改为 0925
* 当密码不正确时,提供第二次尝试机会(不提供第三次)
* 当用户提及要再次登录时,为用户提供重新输入密码的机会
- 找出正确的密码!
- 将密码修改为 0925
- 当密码不正确时,提供第二次尝试机会(不提供第三次)
- 当用户提及要再次登录时,为用户提供重新输入密码的机会
![](images/image94.png)
@@ -979,15 +980,15 @@ curl -X POST 'http://{DIFY_API_URL}/v1/chat-messages' \
如果要让服务支持 HTTPS,一般可以:
* 使用其他程序转发请求(例如在有证书的 nginx 上做反向代理),或者
* 绑定域名后为该域名申请证书。
- 使用其他程序转发请求(例如在有证书的 nginx 上做反向代理),或者
- 绑定域名后为该域名申请证书。
但这些操作都比较复杂,在这里我们使用 Zeabur 作为网络转发网关来解决问题。
Zeabur 的网页默认是通过 HTTPS 访问的,因此我们只需要把原来请求的域名转发到 Zeabur 提供的域名,就可以修复这个问题。
* 原始地址:`http://{DIFY_API_URL}/v1/chat-messages`
* 现在地址:`https://{DIFY_NEW_API_URL}.zeabur.app/v1/chat-messages`
- 原始地址:`http://{DIFY_API_URL}/v1/chat-messages`
- 现在地址:`https://{DIFY_NEW_API_URL}.zeabur.app/v1/chat-messages`
你只需要简单地把 URL 中的域名部分(公网 IP 或域名)替换为已经在 Zeabur 上部署好的域名即可,我们已经提前在服务里配置好了转发功能。