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:
+89
-88
@@ -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,你会看到如下界面:
|
||||
|
||||

|
||||
|
||||
@@ -276,13 +276,14 @@ Dify 能够灵活接入来自 OpenAI、Azure、Anthropic 等主流服务商的
|
||||
3. 安装结束后,我们能够配置支持新的模型供应商,在设置里的模型提供商部分,我们可以看到目前支持的所有模型商:
|
||||

|
||||
4. 在开始使用前,需要先完成模型的配置。对于 OpenAI-API-compatible 插件,你可以点击 “Add Model” 来添加并配置任意模型。你可以在 “Model Type” 中选择该模型是LLM还是 Embedding,你需要确保模型的类型被正确配置。
|
||||
你需要写入具体的模型名字、模型 endpoint URL 以及 API Key 才能确保模型启用,如果你初步觉得配置该参数麻烦,你可以直接跳到后者的 SiliconFLow 平台的 Key 配置,或者安装 OpenRouter 等第三方服务商插件进行简单的模型支持配置。(确保服务商内有剩余可使用额度)
|
||||
你需要写入具体的模型名字、模型 endpoint URL 以及 API Key 才能确保模型启用,如果你初步觉得配置该参数麻烦,你可以直接跳到后者的 SiliconFLow 平台的 Key 配置,或者安装 OpenRouter 等第三方服务商插件进行简单的模型支持配置。(确保服务商内有剩余可使用额度)
|
||||
|
||||

|
||||
|
||||
对于 `SiliconFlow` 插件,只需要点击 Setup 配置 key 后即可使用 Embedding 和 Rerank 模型进行测试,你可以点击 Get you API Key from SiliconFlow 获得鉴权密钥。
|
||||
|
||||

|
||||
|
||||
5. 配置完成后,你可以点击模型列表查看当前支持多少模型,此时已经完成了基础模型的全部配置。
|
||||

|
||||
|
||||
@@ -310,11 +311,11 @@ Dify 能够灵活接入来自 OpenAI、Azure、Anthropic 等主流服务商的
|
||||
|
||||
首先在 **General** 设置中,你可以把这里理解成“文本切分规则”的设置区域。因为我们需要把很长的文本切分成小块,所以必须先定义切分规则。在入门阶段,你只需要关注 **maximum chunk length(最大切分长度)** 。可以尝试设置为 512、2048 或 4096,然后点击 **Preview Chunk** 预览不同设置下的效果。
|
||||
|
||||
你也可以调整 **Chunk overlap(切片重叠)** 选项。它决定相邻片段之间是否会保留一部分重叠内容。适当的重叠有助于避免重要信息被拆到不同片段而难以理解。
|
||||
你也可以调整 **Chunk overlap(切片重叠)** 选项。它决定相邻片段之间是否会保留一部分重叠内容。适当的重叠有助于避免重要信息被拆到不同片段而难以理解。
|
||||
|
||||

|
||||
|
||||
在设置中还有一个选项叫做 **Chunk using Q&A format in English** 。启用后,系统会使用大语言模型,将知识库的一部分内容转换成问答形式来存储,这在某些场景下可以显著提升检索效果。
|
||||
在设置中还有一个选项叫做 **Chunk using Q&A format in English** 。启用后,系统会使用大语言模型,将知识库的一部分内容转换成问答形式来存储,这在某些场景下可以显著提升检索效果。
|
||||
|
||||
在真实业务中,根据场景选择合适的切分策略,能够更好地优化检索结果,保证查询能够返回你期望的信息。
|
||||
|
||||
@@ -326,7 +327,7 @@ Embedding 模型的选择会显著影响最终的检索效果(例如匹配准
|
||||
|
||||

|
||||
|
||||
在此处,你还会看到另一个模型设置叫做 **Rerank model** ,默认值是 **Jina-rerank-m0** 。(如果你非校园内的学生,此时你可能会看到 Rerank 模型缺失的报错,你需要在模型处配置 rerank 模型才能在此处启用使用)
|
||||
在此处,你还会看到另一个模型设置叫做 **Rerank model** ,默认值是 **Jina-rerank-m0** 。(如果你非校园内的学生,此时你可能会看到 Rerank 模型缺失的报错,你需要在模型处配置 rerank 模型才能在此处启用使用)
|
||||
|
||||
Rerank 模型的主要作用,是对“初步筛选出的候选结果”进行二次、更精细的排序,让和用户需求最匹配的结果排在更靠前的位置,从而显著提升最终结果的相关性和用户体验。
|
||||
|
||||
@@ -336,11 +337,11 @@ Rerank 模型的主要作用,是对“初步筛选出的候选结果”进行
|
||||
|
||||

|
||||
|
||||
当所有设置完成后,点击 **Save & Process** ,系统就会进入知识库向量化阶段。在这一阶段,Embedding 模型会把切分后的文本转换为向量表示。
|
||||
当所有设置完成后,点击 **Save & Process** ,系统就会进入知识库向量化阶段。在这一阶段,Embedding 模型会把切分后的文本转换为向量表示。
|
||||
|
||||

|
||||
|
||||
处理完成后,点击 **Go to document** ,可以查看已经处理完毕并存储好的知识库内容。
|
||||
处理完成后,点击 **Go to document** ,可以查看已经处理完毕并存储好的知识库内容。
|
||||
|
||||

|
||||
|
||||
@@ -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. 数据操作与集成节点
|
||||
|
||||

|
||||
|
||||
* 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
|
||||
- 当密码不正确时,提供第二次尝试机会(不提供第三次)
|
||||
- 当用户提及要再次登录时,为用户提供重新输入密码的机会
|
||||
|
||||

|
||||
|
||||
@@ -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 上部署好的域名即可,我们已经提前在服务里配置好了转发功能。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user