Dify 1.15 人工介入功能详解:构建可控AI工作流实战指南
在 AI 应用开发中,如何让模型在关键时刻“刹车”,并引入人类的专业判断,是提升应用可靠性与专业性的关键。Dify 作为领先的 LLM 应用开发平台,其“人工介入”功能正是为此而生。本文将深入解析 Dify 1.15 版本中人工介入功能的完整配置与实战应用,从核心概念到代码集成,手把手教你构建一个可控、可信的 AI 工作流。
本文适合正在使用或计划使用 Dify 构建企业级 AI 应用的开发者、产品经理和技术负责人。通过阅读,你将掌握如何配置审批节点、如何通过 API 与人工审核流程交互,以及如何将人工介入无缝融入你的业务逻辑,最终打造出人机协同的高效应用。
1. 人工介入:概念、价值与应用场景
在完全自动化的 AI 工作流中,模型可能会生成不准确、不恰当或不符合业务规则的内容。尤其是在金融风控、内容审核、法律咨询、医疗建议等高风险领域,纯粹的 AI 决策存在潜在风险。
人工介入,顾名思义,就是在 AI 工作流的特定环节,暂停自动化执行,将决策权或审核权交由人类处理。在 Dify 中,这通常体现为一个“审批”节点。当工作流执行到该节点时,流程会暂停,并生成一个待处理的任务,等待指定的人员或系统进行审核。审核通过后,工作流才会继续执行;若驳回,则流程可能终止或转向其他分支。
核心价值:
- 风险控制:在关键决策点设置人工审核,防止 AI 产生重大错误。
- 质量保证:利用人类的专业知识和经验,对 AI 的初步结果进行校验和优化。
- 合规性:满足某些行业法规要求,确保关键流程有“人”的参与和监督。
- 数据标注与迭代:人工审核的结果(通过/驳回及修改意见)可以反哺 AI 模型,用于后续的微调和优化。
典型应用场景:
- 智能客服工单升级:当 AI 客服无法解决复杂问题时,自动转交人工客服。
- 内容生成与审核:AI 生成营销文案、新闻稿后,需由编辑审核后才能发布。
- 金融交易审批:AI 系统识别出可疑交易模式后,提交给风控专员进行最终裁定。
- 代码审查助手:AI 生成代码片段后,需由资深工程师审核通过才能合并。
- 法律文档初审:AI 提取合同关键条款后,由律师确认其准确性和完整性。
Dify 的工作流引擎将这一能力产品化,使得开发者无需从零构建复杂的任务队列和状态管理系统,通过可视化配置和简单的 API 调用即可实现。
2. 环境准备与版本说明
在开始实操前,请确保你的环境已就绪。
1. Dify 部署与版本
- 部署方式:你可以使用 Dify 官方文档 推荐的 Docker Compose 或 Kubernetes 方式进行部署。本文假设你已有一个正在运行的 Dify 实例。
- 核心版本:本文功能基于Dify 1.15及以上版本。部分较旧的版本可能功能不全或界面有差异。请通过 Dify 管理后台的“系统状态”或部署时指定的镜像标签确认版本。
- 访问地址:确保你能通过浏览器访问 Dify 的控制台(通常为
http://your-server-ip:3000)。
2. 账户与权限
- 你需要一个 Dify 账户,并拥有创建应用和工作流的权限(通常是“所有者”或“编辑者”角色)。
- 理解 Dify 中的“团队”和“成员”概念,因为人工介入的审批者通常指定为团队内的成员。
3. 测试工具准备
- API 测试工具:推荐使用 Postman 或 Insomnia ,用于模拟前端调用工作流并处理人工介入任务。
- 命令行工具:
curl,用于快速测试 API。 - Python 环境(可选):如果你计划编写后端服务与 Dify 的“人工介入”回调 API 集成,需要准备 Python 3.8+ 环境及
requests库。
项目结构示意(用于后端集成示例):
dify-human-in-the-loop-demo/ ├── app.py # 主应用,模拟业务系统 ├── callback_server.py # 模拟人工审核后台服务 ├── requirements.txt # Python 依赖 └── README.md3. 核心功能与配置拆解
Dify 的“人工介入”功能主要通过工作流中的“审批”节点来实现。我们需要深入理解这个节点的配置项。
3.1 审批节点详解
在工作流编辑器中,你可以从节点库中添加“审批”节点。其主要配置区域如下:
1. 审批人设置这是核心配置,决定由谁来进行审核。
- 指定成员:从当前团队中选择一个或多个具体成员。任务会出现在他们的“待办”列表中。
- 变量指定:更灵活的方式。你可以连接一个上游节点(如“知识库检索”或“LLM”节点)的输出变量,该变量应包含审批人的用户ID或邮箱。这使得审批人可以动态决定,例如,将技术问题分配给技术负责人,将财务问题分配给财务负责人。
# 假设上游 LLM 节点根据问题类型,输出了一个审批人邮箱 { “reviewer_email”: “tech-lead@company.com” } - 角色指定(企业版):可以指定具有特定“角色”的成员组,任务会分配给该角色下的任意成员。
2. 审批方式
- 任一审批人通过:只要指定的任意一个审批人通过,流程即继续。
- 全部审批人通过:需要所有指定的审批人都通过,流程才能继续。
3. 任务标题与描述
- 标题:定义待办任务在审批列表中的显示标题。支持使用变量,如
{{query}}(引用用户输入的问题)。 - 描述:详细说明该任务需要审核的内容、背景或审核要点。同样支持变量,可以嵌入上游 AI 生成的完整内容供审核者参考。
4. 超时设置为防止任务被无限期挂起,可以设置超时时间。超时后,任务自动按预设规则(通过或驳回)处理,确保工作流不会阻塞。
5. 输出变量审批节点执行后,会产生输出变量,供下游节点使用。关键变量包括:
status: 审批结果,如approved(通过)、rejected(驳回)、pending(等待中)。reason: 审批人填写的审批意见或理由。approved_by: 审批人的信息。
3.2 工作流状态与人工介入生命周期
理解整个生命周期有助于调试和集成:
- 触发:用户通过 WebApp 或 API 触发一个启用了“审批”节点的工作流。
- 执行至审批节点:工作流引擎执行到“审批”节点时,会暂停当前流程的执行。
- 创建待办任务:在 Dify 后台的“待办”模块(或通过 API)生成一个任务,并通知指定的审批人。
- 人工处理:审批人在 Dify 控制台查看任务详情(包括输入、AI 中间结果等),并做出“通过”或“驳回”决定,可附上意见。
- 工作流恢复:一旦审批完成,工作流引擎会立即收到通知,并根据审批结果(
status)决定后续路径。你可以通过“条件判断”节点来路由流程。 - 返回最终结果:工作流继续执行剩余节点,并将最终结果返回给初始的调用者。
4. 完整实战:构建一个带人工审核的智能内容生成应用
让我们构建一个实际的应用:一个 AI 文章大纲生成器。AI 先生成大纲,然后交由编辑审核,审核通过后,再让 AI 根据大纲撰写详细文章。
4.1 在 Dify 中创建工作流
步骤 1:创建应用与工作流
- 登录 Dify,点击“创建应用”,选择“工作流”类型,命名为“智能文章创作(带审核)”。
- 进入工作流编辑器。
步骤 2:编排工作流节点按顺序拖拽以下节点并连接:
- 开始节点:接收用户
topic(文章主题)输入。 - LLM节点(命名为“生成大纲”):
- 模型:选择 GPT-4 或 Claude 等。
- 系统提示词:
你是一位资深编辑,请根据用户提供的主题,生成一份详细的文章大纲,包括引言、3-5个主要章节及其子要点、结论。 - 连接
开始节点的topic变量到用户输入问题。 - 输出变量设为
outline。
- 审批节点(命名为“编辑审核大纲”):
- 审批人:指定你团队中的一位成员(例如你自己)。
- 审批方式:任一审批人通过。
- 标题:
审核文章大纲:{{topic}} - 描述:
请审核以下由 AI 生成的文章大纲,检查其结构是否合理、要点是否全面。\n\n## 生成的大纲:\n{{outline}} - 输出变量:保持默认(
status,reason等)。
- 条件判断节点(命名为“判断是否通过”):
- 条件设置:
审批节点.status等于approved。 - 这将创建两个分支:“是”分支和“否”分支。
- 条件设置:
- LLM节点(命名为“撰写文章”,放在“是”分支):
- 系统提示词:
你是一位专业作家,请根据以下审核通过的文章大纲,撰写一篇完整、流畅的文章。 - 用户输入问题:
大纲:{{outline}}\n\n请基于此大纲撰写文章。 - 输出变量设为
article。
- 系统提示词:
- 答案节点(命名为“返回文章”,连接“撰写文章”节点):将
article作为最终输出。 - 答案节点(命名为“返回驳回信息”,连接“否”分支):返回一个固定提示,如
“大纲未通过审核,原因:{{审批节点.reason}}。请修改主题或要求后重试。”。
最终工作流图应类似:开始 -> 生成大纲 -> 编辑审核大纲 -> 判断是否通过 -> (是) -> 撰写文章 -> 返回文章; (否) -> 返回驳回信息。
步骤 3:发布工作流点击右上角“发布”。发布后,记下生成的app_id和access_token(在应用概览页的 API 访问部分),后续 API 调用需要。
4.2 通过 API 触发工作流并处理人工介入
工作流发布后,可以通过 API 调用。当执行到审批节点时,流程会暂停。
1. 触发工作流(模拟用户请求)使用curl或 Postman 调用执行 API。
curl -X POST \ https://api.dify.ai/v1/workflows/run \ -H “Authorization: Bearer YOUR_ACCESS_TOKEN” \ -H “Content-Type: application/json” \ -d ‘{ “inputs”: { “topic”: “人工智能在医疗诊断中的应用与挑战” }, “response_mode”: “blocking”, // 或 “streaming” “user”: “user_123” // 标识终端用户 }’YOUR_ACCESS_TOKEN:替换为你的应用访问令牌。response_mode:blocking为同步阻塞,会一直等待直到工作流最终完成(包括人工介入时间),这可能超时。对于含人工介入的场景,更推荐使用streaming(流式)或通过task_id异步查询。
调用后,如果使用blocking模式,API 会挂起,直到审批完成或超时。在 Dify 后台的“待办”列表中,你会看到一个新任务。
2. 模拟审批人在 Dify 后台处理任务
- 使用被指定为审批人的账户登录 Dify 控制台。
- 点击左侧菜单的“待办”。
- 找到标题为“审核文章大纲:人工智能在医疗诊断中的应用与挑战”的任务,点击进入。
- 查看“描述”中 AI 生成的大纲。
- 在底部,选择“通过”或“驳回”,并可以输入审批意见,例如“大纲结构良好,但请在‘挑战’部分增加数据隐私相关要点。”
- 点击“提交”。
3. 获取工作流最终结果审批提交后,被挂起的工作流会继续执行。如果你使用streaming模式,客户端会收到后续的事件流。你也可以通过“任务ID”来查询最终状态和输出。
首先,从初始调用的响应中获取task_id(如果使用流式,它可能在事件中传递)。
# 查询任务结果 curl -X GET \ “https://api.dify.ai/v1/tasks/{task_id}” \ -H “Authorization: Bearer YOUR_ACCESS_TOKEN” \ -H “Content-Type: application/json”响应会包含任务状态(success,failed,pending)和最终的outputs。
4.3 进阶:通过回调 API 与外部系统集成
上述流程依赖审批人登录 Dify 后台操作。在企业场景,你可能希望将审批任务集成到自有的 OA、钉钉或飞书等系统中。Dify 提供了Webhook支持。
原理:当工作流在审批节点暂停时,Dify 可以向一个你预设的 URL(Webhook)发送任务创建的通知。你的外部系统接收后,可以在自有界面展示任务并处理。处理完成后,再调用 Dify 的 API 来提交审批结果。
1. 在 Dify 中配置 Webhook(企业版功能)在工作流的“审批”节点配置中,或是在应用设置的“Webhook”部分,配置一个用于接收“任务创建”事件的 URL,例如https://your-company.com/api/dify/review-task。
2. 构建一个简单的回调服务器(Python Flask 示例)callback_server.py
from flask import Flask, request, jsonify import requests app = Flask(__name__) # Dify 会向这个端点发送任务创建事件 @app.route(‘/api/dify/review-task’, methods=[‘POST’]) def handle_review_task(): data = request.json event = data.get(‘event’) if event == ‘workflow.started’: # 工作流开始,可以记录日志 pass elif event == ‘workflow.node.awaiting’: # 关键事件:节点等待(即进入人工介入) task_id = data.get(‘task_id’) node_id = data.get(‘node_id’) workflow_run_id = data.get(‘workflow_run_id’) # 提取任务信息 task_info = { ‘task_id’: task_id, ‘run_id’: workflow_run_id, ‘node_id’: node_id, ‘title’: data.get(‘data’, {}).get(‘title’), ‘description’: data.get(‘data’, {}).get(‘description’), ‘app_id’: data.get(‘app_id’) } # TODO: 在这里将 task_info 存入你的数据库,并推送通知到你的OA系统 print(f“收到审核任务: {task_info}”) # 模拟在外部系统处理完成后,调用 Dify API 提交审批结果 # 这里为了演示,我们假设自动通过。实际应由人工在外部系统触发。 # submit_review_to_dify(task_id, ‘approved’, ‘外部系统自动通过’) return jsonify({‘status’: ‘success’}), 200 def submit_review_to_dify(task_id, action, reason): “”“调用 Dify API 提交审批结果”“” api_url = f“https://api.dify.ai/v1/workflows/tasks/{task_id}/approve” headers = { ‘Authorization’: ‘Bearer YOUR_DIFY_APP_ACCESS_TOKEN’, ‘Content-Type’: ‘application/json’ } payload = { ‘action’: action, # ‘approve’ 或 ‘reject’ ‘reason’: reason } response = requests.post(api_url, json=payload, headers=headers) return response.json() if __name__ == ‘__main__’: app.run(host=‘0.0.0.0’, port=5001, debug=True)3. 外部系统调用 Dify API 提交审批当你的 OA 系统处理完任务后,需要调用 Dify 的特定 API 来继续工作流。
curl -X POST \ https://api.dify.ai/v1/workflows/tasks/{task_id}/approve \ -H “Authorization: Bearer YOUR_ACCESS_TOKEN” \ -H “Content-Type: application/json” \ -d ‘{ “action”: “approve”, // 或 “reject” “reason”: “内容符合标准,同意发布。” }’此调用会直接驱动工作流从审批节点继续执行。
5. 常见问题与排查思路
在配置和使用人工介入功能时,你可能会遇到以下问题:
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 工作流一直处于“运行中”,不结束。 | 1. 审批节点无人处理,且未设置超时。 2. 使用了 blocking模式调用 API,客户端在等待超时。 | 1. 检查 Dify 后台“待办”列表是否有对应任务。 2. 为审批节点设置合理的超时时间。 3. 调用 API 时使用 streaming模式,并通过task_id异步查询结果。 |
| 审批人收不到任务通知。 | 1. 审批人配置错误(成员不存在或未激活)。 2. 通知渠道未配置(如邮件、Slack)。 | 1. 在审批节点确认指定的成员邮箱或 ID 正确无误。 2. 在 Dify 管理后台的“团队设置”中检查并配置邮件/SMTP 或第三方消息集成。 |
| Webhook 未触发。 | 1. Webhook URL 配置错误或不可达。 2. 网络防火墙或安全组策略阻止。 3. 仅企业版支持。 | 1. 使用curl或 Postman 测试你的 Webhook 端点是否正常响应。2. 检查 Dify 服务器到你的回调服务器的网络连通性。 3. 确认你的 Dify 版本是企业版。 |
| 条件判断节点无法正确路由。 | 审批节点的输出变量名引用错误。 | 1. 在工作流编辑器中,点击审批节点,确认其输出变量名称(默认为status,reason)。2. 在条件判断节点中,使用 {审批节点别名.status}的格式进行引用。例如,如果审批节点别名为review,则条件应为review.status等于approved。 |
| API 调用返回“未授权”错误。 | 1. Access Token 错误或已失效。 2. API 密钥权限不足。 | 1. 在 Dify 应用概览页重新复制正确的access_token。2. 确认该密钥具有工作流执行的权限。 |
6. 最佳实践与工程建议
将人工介入有效融入生产级应用,需要考虑更多工程细节。
1. 审批人策略设计
- 动态指派:尽量使用“变量指定”方式,根据工单类型、问题复杂度、值班表等业务逻辑动态计算审批人,实现灵活的负载均衡和专业化分工。
- 备选审批人:在“指定成员”时,可以添加多位,并利用“任一审批人通过”规则,避免因单人缺席导致流程阻塞。
- 审批链:对于重要决策,可以串联多个审批节点,实现多级审核(如初级审核->高级审核)。
2. 超时与降级策略
- 设置合理超时:根据业务紧急程度设置审批超时时间(如2小时、24小时)。超时后的自动处理规则(通过或驳回)需与业务方共同确定。
- 降级处理:在超时或审批系统异常时,可以考虑设计一个降级分支,例如将任务转给默认审批人,或由另一个 LLM 节点进行二次校验并记录日志,保证流程最终完成。
3. 上下文信息与审核体验
- 提供充分上下文:在审批节点的“描述”中,不仅要放 AI 的产出,还应尽可能注入初始用户输入、上游处理的关键中间结果、知识库检索片段等,帮助审批人快速理解背景,做出准确判断。
- 结构化输出:让上游 LLM 节点输出结构化的 JSON 数据,审批节点的描述模板可以更清晰地展示这些字段,提升可读性。
4. 安全与权限
- 最小权限原则:审批人只能看到完成任务所必需的信息。避免在审批描述中泄露敏感数据。Dify 的工作流变量传递是可控的。
- 审计日志:确保 Dify 的审计日志功能开启,记录下“谁、在什么时候、通过了/驳回了哪个任务、理由是什么”,满足合规要求。
5. 性能与可观测性
- 异步处理:前端调用工作流时,尽量使用异步模式(
response_mode: streaming或通过task_id轮询),避免 HTTP 长连接超时。 - 监控告警:监控“待办”任务队列的长度和平均处理时间。如果积压过多或处理时间过长,应触发告警,通知管理员进行干预。
- 数据闭环:将审批结果(尤其是驳回理由)收集起来,作为高质量数据,用于后续对提示词(Prompt)或微调模型的优化,持续提升 AI 的首次通过率。
6. 集成扩展
- 与 IM 工具深度集成:除了使用 Dify 的官方插件(如飞书、钉钉),可以通过 Webhook 将审批任务直接推送至 IM 群聊或特定人员,并允许在聊天窗口中快速审批(通过点击按钮回调你的服务)。
- 自定义审批面板:对于复杂的审批场景(如需要查看多个关联系统数据),可以利用 Dify 的 API 获取任务详情,并嵌入到你自有的业务系统中进行展示和操作,提供无缝的用户体验。
通过以上实践,你可以将 Dify 的人工介入功能从一个简单的“开关”,升级为驱动复杂业务人机协同的核心枢纽。记住,人工介入的目标不是取代 AI,而是让 AI 在确定的边界内更安全、更可靠地发挥价值。
