Dify
简体中文
简体中文
  • 入门
    • 欢迎使用 Dify
      • 特性与技术规格
      • 模型供应商列表
    • 云服务
    • 社区版
      • Docker Compose 部署
      • 本地源码启动
      • 宝塔面板部署
      • 单独启动前端 Docker 容器
      • 环境变量说明
      • 常见问题
    • Dify Premium
    • Dify 教育版
  • 手册
    • 接入大模型
      • 增加新供应商
      • 预定义模型接入
      • 自定义模型接入
      • 接口方法
      • 配置规则
      • 负载均衡
    • 构建应用
      • 创建应用
      • 聊天助手
        • 多模型调试
      • Agent
      • 应用工具箱
        • 敏感内容审查
    • 工作流
      • 关键概念
      • 变量
      • 节点说明
        • 开始
        • LLM
        • 知识检索
        • 问题分类
        • 条件分支
        • 代码执行
        • 模板转换
        • 文档提取器
        • 列表操作
        • 变量聚合
        • 变量赋值
        • 迭代
        • 参数提取
        • HTTP 请求
        • Agent
        • 工具
        • 结束
        • 直接回复
        • 循环
      • 快捷键
      • 编排节点
      • 文件上传
      • 异常处理
        • 预定义异常处理逻辑
        • 错误类型
      • 附加功能
      • 预览与调试
        • 预览与运行
        • 单步调试
        • 对话/运行日志
        • 检查清单
        • 运行历史
      • 应用发布
      • 结构化输出
      • 变更公告:图片上传被替换为文件上传
    • 知识库
      • 创建知识库
        • 1. 导入文本数据
          • 1.1 从 Notion 导入数据
          • 1.2 从网页导入数据
        • 2. 指定分段模式
        • 3. 设定索引方法与检索设置
      • 管理知识库
        • 维护知识库内文档
        • 通过 API 维护知识库
      • 元数据
      • 在应用内集成知识库
      • 召回测试/引用归属
      • 知识库请求频率限制
      • 连接外部知识库
      • 外部知识库 API
    • 工具
      • 快速接入工具
      • 高级接入工具
      • 工具配置
        • Google
        • Bing
        • SearchApi
        • StableDiffusion
        • Dall-e
        • Perplexity Search
        • AlphaVantage 股票分析
        • Youtube
        • SearXNG
        • Serper
        • SiliconFlow (支持 Flux 绘图)
        • ComfyUI
    • 发布
      • 发布为公开 Web 站点
        • Web 应用的设置
        • 文本生成型应用
        • 对话型应用
      • 嵌入网站
      • 基于 APIs 开发
      • 基于前端组件再开发
    • 标注
      • 日志与标注
      • 标注回复
    • 监测
      • 集成外部 Ops 工具
        • 集成 LangSmith
        • 集成 Langfuse
        • 集成 Opik
      • 数据分析
    • 扩展
      • API 扩展
        • 使用 Cloudflare Workers 部署 API Tools
        • 敏感内容审查
      • 代码扩展
        • 外部数据工具
        • 敏感内容审查
    • 协同
      • 发现
      • 邀请与管理成员
    • 管理
      • 应用管理
      • 团队成员管理
      • 个人账号管理
      • 订阅管理
      • 版本管理
  • 动手实验室
    • 初级
      • 如何搭建 AI 图片生成应用
      • AI Agent 实战:搭建个人在线旅游助手
    • 中级
      • 使用文件上传搭建文章理解助手
      • 使用知识库搭建智能客服机器人
      • ChatFlow 实战:搭建 Twitter 账号分析助手
  • 社区
    • 寻求支持
    • 成为贡献者
    • 为 Dify 文档做出贡献
  • 插件
    • 功能简介
    • 快速开始
      • 安装与使用插件
      • 插件开发
        • 初始化开发工具
        • Tool 插件
        • Model 插件
          • 创建模型供应商
          • 接入预定义模型
          • 接入自定义模型
        • Agent 策略插件
        • Extension 插件
        • Bundle 插件包
      • 插件调试
    • 插件管理
    • 接口定义
      • Manifest
      • Endpoint
      • Tool
      • Agent
      • Model
        • 模型设计规则
        • 模型接口
      • 通用规范定义
      • 持久化存储
      • 反向调用 Dify 服务
        • App
        • Model
        • Tool
        • Node
    • 最佳实践
      • 开发 Slack Bot 插件
      • Dify MCP 插件指南:一键连接 Zapier 并自动发送邮件
    • 发布插件
      • 自动发布插件
      • 发布至 Dify Marketplace
        • 插件开发者准则
        • 插件隐私政策准则
      • 发布至个人 GitHub 仓库
      • 本地发布与分享
      • 第三方签名验证
    • 常见问题
  • 研发
    • 后端
      • DifySandbox
        • 贡献指南
    • 模型接入
      • 接入 Hugging Face 上的开源模型
      • 接入 Replicate 上的开源模型
      • 接入 Xinference 部署的本地模型
      • 接入 OpenLLM 部署的本地模型
      • 接入 LocalAI 部署的本地模型
      • 接入 Ollama 部署的本地模型
      • 接入 LiteLLM 代理的模型
      • 接入 GPUStack 进行本地模型部署
      • 接入 AWS Bedrock 上的模型(DeepSeek)
    • 迁移
      • 将社区版迁移至 v1.0.0
  • 阅读更多
    • 应用案例
      • DeepSeek 与 Dify 集成指南:打造具备多轮思考的 AI 应用
      • 本地私有化部署 DeepSeek + Dify,构建你的专属私人 AI 助手
      • 如何训练出专属于“你”的问答机器人?
      • 教你十几分钟不用代码创建 Midjourney 提示词机器人
      • 构建一个 Notion AI 助手
      • 如何在几分钟内创建一个带有业务数据的官网 AI 智能客服
      • 使用全套开源工具构建 LLM 应用实战:在 Dify 调用 Baichuan 开源模型能力
      • 手把手教你把 Dify 接入微信生态
      • 使用 Dify 和 Twilio 构建 WhatsApp 机器人
      • 将 Dify 应用与钉钉机器人集成
      • 使用 Dify 和 Azure Bot Framework 构建 Microsoft Teams 机器人
      • 如何让 LLM 应用提供循序渐进的聊天体验?
      • 如何将 Dify Chatbot 集成至 Wix 网站?
      • 如何连接 AWS Bedrock 知识库?
      • 构建 Dify 应用定时任务助手
      • 如何在 Dify 内体验大模型“竞技场”?以 DeepSeek R1 VS o1 为例
      • 在 Dify 云端构建 AI Thesis Slack Bot
      • 将 Dify 快速接入 QQ、微信、飞书、钉钉、Telegram、Discord 等平台
    • 扩展阅读
      • 什么是 LLMOps?
      • 什么是数组变量?
      • 检索增强生成(RAG)
        • 混合检索
        • 重排序
        • 召回模式
      • 提示词编排
      • 如何使用 JSON Schema 让 LLM 输出遵循结构化格式的内容?
    • 常见问题
      • 本地部署
      • LLM 配置与使用
      • 插件
  • 政策
    • 开源许可证
    • 用户协议
      • 服务条款
      • 隐私政策
      • 获取合规报告
Powered by GitBook
On this page
  • 应用场景
  • 异常处理机制
  • 快速开始
  • 状态描述
  • 常见问题
  1. 手册
  2. 工作流

异常处理

作者:Allen, Evan

Previous文件上传Next预定义异常处理逻辑

Last updated 3 months ago

工作流应用通常包含多个节点。如果因为某个节点的异常(例如 API 请求异常或 LLM 输出异常)而造成整个流程的运行失败,会迫使应用开发者不得不花费大量的精力排查故障并修复,这在复杂的工作流应用中尤为困难。

异常处理机制提供多样化的节点错误处理策略,能够在发生局部节点错误时抛出故障信息而不中断主流程。你可以设置出现异常时重新执行节点,或通过备用路径继续任务。为关键节点添加异常处理机制将极大地增强应用整体的灵活性与稳健性。

同时开启错误重试和异常处理功能时,将优先重试运行节点。若重试后仍然失败,再启用异常处理机制。

开发者无需在节点内编排复杂的逻辑代码或额外的节点应对错误情况。异常处理机制将简化工作流的设计复杂度,以多样的预设策略编排工作流的执行逻辑。

应用场景

1. 网络异常处理

示例:在某个工作流中需要通过三个 API 服务(例如天气服务、新闻摘要和社交媒体分析)获取数据并汇总。然而,其中一个服务因请求限制无法响应,导致数据获取失败。通过异常处理功能,主流程将继续处理其它两个成功的数据源,同时记录失败的 API 调用错误日志,供开发者稍后分析并优化服务调用策略。

2. 工作流备用设计

示例:某个 LLM 节点执行生成详细文档摘要任务,但因输入的篇幅过长而触发超出 Token 限制的异常。在节点中配置异常错误机制后,出现此类错误时,可以使用备用路径中的代码节点协助将内容切分为多个小段并重新调用 LLM 节点,避免流程中断。

3. 异常信息预定义

示例:运行工作流时可能会遇到某个节点返回模糊的错误信息(例如简单的“调用失败”),难以快速定位问题。开发者可以通过异常处理机制内编写预定义报错信息,为后续的应用调试提供更加清晰、准确的错误信息。

异常处理机制

以下四个类型的节点新增异常处理机制,点击标题即可阅读详细文档:

异常重试

部分异常可以通过重新运行节点解决,此时可以在节点内开启 “异常重试” 功能,设置尝试次数与重试间隔时间。

如果尝试重试运行节点后依然报错,将按照异常处理机制中的预设策略运行接下来的流程。

异常处理

异常处理机制提供以下三种选项:

• 无:不处理异常,直接抛出节点的报错信息并中断整体流程。

• 默认值:允许开发者预定义异常信息。异常发生后,使用预定义的值替代原节点内置的异常输出信息。

• 异常分支:发生异常后,执行预编排的异常分支

快速开始

场景:为工作流应用添加应对错误输出代码的处理机制

下文将以一个简单的示例应用,演示如何在工作流应用内增设异常处理机制,以备用分支应对节点异常。

应用逻辑: LLM 节点根据输入的指令,生成正确或错误格式的 JSON 代码内容,然后通过 A 代码节点执行代码并输出结果。如果 A 代码节点接收到了错误格式的 JSON 内容,则按照预设的异常处理机制,执行备用路径而继续主流程。

1. 创建 JSON 代码生成节点

新建 Workflow 应用,并添加 LLM 节点和代码节点。通过 Prompt 让 LLM 根据指令生成正确或错误格式的 JSON 内容,然后通过 A 代码节点验证。

LLM 节点内的 Prompt 参考:

You are a teaching assistant. According to the user's requirements, you only output a correct or incorrect sample code in json format.

代码节点中的 JSON 验证代码:

def main(json_str: str) -> dict:
    obj = json.loads(json_str)
    return {'result': obj}

2. 为 A 代码节点添加异常处理机制

A 代码节点是验证 JSON 内容的节点,如果接收到的 JSON 内容格式错误,需要通过异常处理机制运行备用路径,让下一个 LLM 节点修复错误内容并重新验证 JSON 从而继续主流程。在 A 代码节点的“异常处理”选项卡中,选择“异常分支”并新建 LLM 节点。

3. 修正 A 代码节点输出的异常内容

在新的 LLM 节点中,填写 Prompt 并通过变量引用 A 代码节点的异常输出内容,并进行修复。添加 B 代码节点对 JSON 内容进行二次验证。

4. 结束

添加变量聚合节点,汇总正确和错误分支的处理结果并输出至结束节点内,完成整体流程。

状态描述

状态指的是节点状态与流程状态。清晰的状态说明有助于开发者判断当前工作流应用的运行现状,协助进行问题排查,快速了解信息并做出对应决策。引入异常处理机制后,节点状态和流程存在以下状态:

节点状态

  • 成功

    节点正常执行,并正确输出信息。

  • 失败

    未启用异常处理,节点执行失败,输出报错信息。

  • 异常

    在异常处理机制中启用了默认值或异常分支选项。节点执行时遇到了错误,但启用异常机制应对错误。

工作流状态

  • 成功

    流程中的所有节点正常执行,结束节点能够正确输出信息,状态被标记为 Success。

  • 失败

    因出现节点异常,整体流程被中断,状态被标记为 Failed。

  • 局部成功

    节点出现异常,但启用了异常处理机制,整体流程最终运行正常。状态将会被标记为 Partial success。

常见问题

1. 启用异常处理机制前后的区别是什么?

没有错误处理机制时:

  • 节点错误中断流程:当 LLM 调用失败、网络出现问题或工具出错时,整个工作流程会立即中断,应用开发者需要手动查找并修复错误后重新运行流程。

  • 缺乏灵活性:开发者无法对不同错误类型或节点定义特定的处理逻辑。例如,无法在错误发生时继续后续流程或选择替代路径。

  • 手动添加冗余节点:避免错误影响全局需要额外设计大量节点来捕获和处理错误,增加了工作流程的复杂性和开发成本。

  • 日志信息有限:错误日志通常简单或不足,无法快速诊断问题。

启用异常处理机制后:

  • 流程不中断:即使某个节点发生错误,工作流程可以根据用户定义的规则继续运行,减少因单点失败导致的全局影响。

  • 灵活自定义错误处理:应用开发者可以为每个节点指定错误处理策略,如继续流程、记录日志,或切换到替代路径。

  • 简化工作流程设计:通用错误处理器减少了用户手动设计冗余节点的需求,流程更清晰简洁。

  • 详细错误日志支持:提供错误信息的自定义编排机制,便于开发者快速排查问题和优化流程。


2. 如何调试替代路径的执行情况?

你可以通过工作流程的运行日志检查条件判断和路径选择情况。异常分支的运行路线以黄色高亮显示,帮助开发者验证替代路径是否按预期执行。

如需了解各个策略的说明和配置方法,请参考。

Error handling

Demo 应用 DSL 文件。

LLM
HTTP
代码
工具
预定义异常处理逻辑
下载地址