Dify是一个强大的LLM应用开发平台,旨在帮助开发者快速构建基于大型语言模型的应用。作为一个开源项目,Dify提供了直观的可视化界面,使开发者能够通过拖拽方式创建复杂的AI工作流,而无需深入编写代码。Dify支持多种模型提供商,包括OpenAI、Anthropic、Google等,同时也支持接入自部署的开源模型。
Dify平台的核心功能包括:
Dify的一个关键特性是其工作流系统,它分为两种主要类型:ChatFlow和WorkFlow,这两种工作流类型适用于不同的应用场景,本文将深入探讨它们之间的区别和各自的适用场景。
ChatFlow是Dify平台中专为对话类应用设计的工作流类型。它主要面向需要持续交互的场景,如客户服务、语义搜索以及其他需要在构建响应时进行多步逻辑的对话式应用程序。
用户给出指令 → 生成内容 → 就内容进行多次讨论 → 重新生成结果 → 结束
ChatFlow的开始节点内置了以下系统变量:
sys.query
:用户输入的查询内容sys.files
:用户上传的文件sys.conversation_id
:会话IDsys.user_id
:用户IDWorkFlow是Dify平台中为自动化和批处理场景设计的工作流类型。它适合需要一次性处理并生成结果的场景,如高质量翻译、数据分析、内容生成、电子邮件自动化等应用。
用户给出指令 → 生成内容 → 结束
WorkFlow的开始节点内置了以下系统变量:
sys.files
:用户上传的文件sys.user_id
:用户ID与ChatFlow不同,WorkFlow没有对话历史相关的变量,因为它不支持多轮对话交互。
| 特性 | ChatFlow | WorkFlow |
| --- | --- | --- |
| 应用场景 | 对话类应用,支持多轮交互 | 自动化和批处理,一次性执行 |
| 对话记忆 | 支持(Memory功能) | 不支持 |
| 输出方式 | 支持流式输出和中间步骤输出 | 仅在流程结束时输出 |
| 结束节点 | 使用Answer节点 | 使用End节点 |
| 内置变量 | 包含对话相关变量(sys.query, sys.conversation_id等) | 不包含对话相关变量 |
| 用户交互 | 支持多轮交互和讨论 | 不支持多轮交互 |
使用Python调用ChatFlow API:
import requests
import json
url = 'https://api.dify.ai/v1/chat-messages'
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
}
data = {
"inputs": {},
"query": "你好,请介绍一下ChatFlow和WorkFlow的区别",
"response_mode": "streaming",
"user": "user-123"
}
response = requests.post(url, headers=headers, data=json.dumps(data))
print(response.text)
注意在多轮对话中,需要保存和传递conversation_id
:
# 第一轮对话
data = {
"inputs": {},
"query": "你好,请介绍一下ChatFlow",
"response_mode": "blocking",
"user": "user-123"
}
response = requests.post(url, headers=headers, data=json.dumps(data))
response_data = response.json()
conversation_id = response_data["conversation_id"]
# 第二轮对话,使用之前的conversation_id
data = {
"inputs": {},
"query": "谢谢,那WorkFlow又是什么?",
"response_mode": "blocking",
"conversation_id": conversation_id, # 使用上一轮对话的conversation_id
"user": "user-123"
}
response = requests.post(url, headers=headers, data=json.dumps(data))
import uuid
from dify_client import Client, models
# 初始化客户端
client = Client(
api_key="YOUR_API_KEY",
api_base="https://api.dify.ai/v1",
)
user = str(uuid.uuid4())
# 创建聊天请求
chat_req = models.ChatRequest(
query="请对比分析ChatFlow和WorkFlow的使用场景",
inputs={},
user=user,
response_mode=models.ResponseMode.BLOCKING,
)
# 发送聊天消息
chat_response = client.chat_messages(chat_req, timeout=60.)
print(chat_response)
# 创建流式聊天请求
streaming_chat_req = models.ChatRequest(
query="WorkFlow如何实现自动化任务?",
inputs={},
user=user,
response_mode=models.ResponseMode.STREAMING,
)
# 发送流式聊天消息
for chunk in client.chat_messages(streaming_chat_req, timeout=60.):
print(chunk)
使用Python调用WorkFlow API:
import requests
import json
url = 'https://api.dify.ai/v1/workflows'
headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
}
data = {
"inputs": {"text": "我需要一篇关于人工智能的文章大纲"},
"response_mode": "blocking",
"user": "user-123"
}
response = requests.post(url, headers=headers, data=json.dumps(data))
print(response.json())
data = {
"inputs": {"text": "我需要一篇关于人工智能的文章大纲"},
"response_mode": "streaming",
"user": "user-123"
}
response = requests.post(url, headers=headers, data=json.dumps(data), stream=True)
for line in response.iter_lines():
if line:
print(line.decode('utf-8'))
package main
import (
"context"
"fmt"
"log"
dify "github.com/kervinchang/dify-go"
)
func main() {
config := dify.ClientConfig{
BaseURL: "https://api.dify.ai/v1",
APIKey: "YOUR_API_KEY",
}
client, err := dify.NewClient(config)
if err != nil {
log.Fatalf("failed to create Dify client: %v\n", err)
}
// 运行WorkFlow
request := dify.RunWorkflowRequest{
Inputs: map[string]interface{}{"text": "我需要一篇关于人工智能的文章大纲"},
User: "user-123",
ResponseMode: dify.BlockingMode,
}
response, err := client.RunWorkflow(context.Background(), request)
if err != nil {
log.Fatalf("failed to run workflow: %v\n", err)
}
fmt.Printf("response: %v\n", response)
// 流式运行WorkFlow
streamRequest := dify.RunWorkflowRequest{
Inputs: map[string]interface{}{"text": "我需要一篇关于人工智能的文章大纲"},
User: "user-123",
ResponseMode: dify.StreamingMode,
}
stream, err := client.RunWorkflowStream(context.Background(), streamRequest)
if err != nil {
log.Fatalf("failed to run workflow in streaming mode: %v\n", err)
}
for response := range stream {
fmt.Printf("chunk: %v\n", response)
}
}
客户服务机器人
语义搜索应用
教育辅导工具
健康咨询助手
社交媒体分析
内容生成工具
数据分析报告
翻译服务
电子邮件自动化
定时任务处理
文档处理和摘要
在选择使用ChatFlow还是WorkFlow时,可以考虑以下几个关键问题:
是否需要多轮对话?
用户是否需要对结果进行反馈和调整?
任务是否需要定时或事件触发?
应用的主要目的是什么?
处理逻辑的复杂性
Dify平台通过ChatFlow和WorkFlow两种不同类型的工作流,为开发者提供了灵活构建各类AI应用的能力。它们各自针对不同的应用场景进行了优化:ChatFlow专注于创建对话式体验,而WorkFlow则致力于自动化处理任务。
通过深入理解两者的区别和适用场景,开发者可以选择最适合自己应用需求的工作流类型,充分发挥Dify平台的潜力,构建功能强大、用户体验出色的AI应用。无论是需要持续交互的客户服务机器人,还是一次性执行的内容生成工具,Dify都能提供合适的解决方案。
随着AI技术的不断发展,Dify平台也在持续优化和扩展其功能。未来,我们有理由期待ChatFlow和WorkFlow将支持更多的高级特性,为开发者创造更广阔的应用可能性。