内容纲要
Dify 与 LangFlow 框架详解
目标:掌握 Dify 低代码平台和 LangFlow 可视化工作流工具
目录
Dify 框架详解
1. Dify 概述
【定义】
Dify 是一个开源的 LLM 应用开发平台,提供可视化的
应用构建、部署和管理能力。
【核心特性】
1. 可视化编排
- 拖拽式工作流设计
- 直观的节点连接
- 实时预览效果
2. 内置组件
- LLM 模型接入
- 向量数据库集成
- RAG 模板
- Agent 编排
3. 灔合生态
- 模型市场
- 插件系统
- API 管理
- 数据集管理
4. 一键部署
- Docker 容器化
- K8s 编排
- 云平台发布
2. Dify 架构
┌─────────────────────────────────────────────┐
│ 用户界面层 │
│ ┌──────────┬──────────┬──────────┐ │
│ │ 工作流编辑 │ 应用管理 │ 模型市场│ │
│ │ 器 │ │ │ │
│ └──────────┴──────────┴──────────┘ │
└────────────────┬────────────────────────────┘
│
┌────────────────┴────────────────────────────┐
│ API 网关层 │
│ ┌────────┬──────────┬──────────┐ │
│ │ workflow │ dataset │ model │ │
│ │ │ │ │ │ │
│ └────────┴──────────┴──────────┘ │
└────────────────┬────────────────────────────┘
│
┌────────────────┴────────────────────────────┐
│ 应用层 │
│ ┌────────┬──────────┬──────────┐ │
│ │ Agent │ RAG │ Chat │ │
│ │ │ │ │ │
│ └────────┴──────────┴──────────┘ │
└────────────────┬────────────────────────────┘
│
┌────────────────┴────────────────────────────┐
│ 基础设施层 │
│ ┌────────┬──────────┬──────────┐ │
│ │ Vector DB │ Redis │ Queue │ │
│ └────────┴──────────┴──────────┘ │
└─────────────────────────────────────────────┘
3. Dify 核心组件
3.1 Workflow(工作流)
# Dify Workflow 定义示例
"""
Dify 工作流 JSON 定义
{
"name": "RAG Chatbot",
"version": "0.1.0",
"mode": "chat",
"environment": {
"variable_declarations": [
{
"id": "vector_db_name",
"value": "my_documents",
"name": "Vector Database Collection Name"
},
{
"id": "embedding_model",
"value": "text-embedding-3-small",
"name": "Embedding Model"
}
]
},
"conversation_variables": [
{
"id": "history",
"value": "[]",
"name": "Conversation History"
}
],
"nodes": [
{
"id": "context",
"position": {
"x": 30,
"y": 200
},
"data": {
"type": "knowledge-retrieval",
"desc": "知识检索节点,使用向量数据库检索相关文档",
"title": "Knowledge Retieval",
"query_variable_selector": [
"sys"
],
"embedding_model_selector": [
"embedding_model"
],
"top_k_selector": [
"3"
],
"return_values_selector": [
"context_str"
],
"vector_database_variable_selector": [
"vector_db_name"
],
"retrieval_mode": "chunk",
"retrieval_resource": [
{
"desc": "知识文档数据集"
}
]
}
},
{
"id": "answer",
"position": {
"x": 30,
"y": 400
},
"data": {
"type": "llm",
"desc": "基于检索到的上下文,使用 LLM 生成回答",
"title": "Answer Generation",
"model": {
"provider": "openai",
"name": "gpt-4",
"mode": "chat",
"completion_params": {
"temperature": 0.7
}
},
"prompt_template": [
"{{sys.system_intro}}",
"根据以下内容回答用户的问题:\n\n",
"{{context_str}}",
"\n\n用户的问题:{{sys.user_query}}",
"\n\n请只输出答案,不要输出其他内容。"
],
"context_variable_selector": [
"history"
],
"memory": {
"window": {
"enabled": true,
"size": 10
},
"type": "simple_chat"
},
"output_selector": [
"sys"
]
}
}
]
}
"""
3.2 RAG 模板
# Dify RAG 模板使用
{
"name": "Document QA System",
"version": "0.1.0",
"mode": "chat",
"nodes": [
{
"id": "context_retrieval",
"data": {
"type": "knowledge-retrieval",
"title": "Context Retrieval",
"query_variable_selector": ["sys"],
"top_k_selector": ["5"],
"retrieval_resource": [{
"desc": "技术文档库"
}],
"embedding_model_selector": ["embedding_model"],
"vector_database_variable_selector": ["vector_db"],
"return_values_selector": ["retrieved_context"]
}
},
{
"id": "prompt_generator",
"data": {
"type": "template-transformer",
"title": "Prompt Generator",
"template": "根据以下信息回答问题:\n\n{{retrieved_context}}\n\n问题:{{sys.user_query}}"
}
},
{
"id": "llm",
"data": {
"type": "llm",
"title": "LLM",
"model": {
"provider": "openai",
"name": "gpt-4"
},
"prompt_template_selector": ["prompt_generator"],
"context_variable_selector": ["history"],
"memory": {
"window": {"enabled": true, "size": 10}
}
}
}
]
}
3.3 Agent 编排
# Dify Agent Workflow
{
"name": "Multi-Agent Research",
"version": "0.1.0",
"mode": "chat",
"nodes": [
{
"id": "intent_classifier",
"data": {
"type": "if-else",
"desc": "根据用户意图路由到不同的 Agent",
"title": "Intent Classifier",
"conditions": [
{
"id": "research",
"variable_selector": [
"sys",
"user_intent"
],
"output_selector": [
"sys",
"selected_agent"
],
"case_id": "research"
},
{
"id": "code",
"variable_selector": [
"sys",
"user_intent"
],
"output_selector": [
"sys",
"selected_agent"
],
"case_id": "code"
},
{
"id": "general",
"variable_selector": [
"sys",
"user_intent"
],
"output_selector": [
"sys",
"selected_agent"
],
"case_id": "general"
}
]
}
},
{
"id": "research_agent",
"data": {
"type": "tool",
"desc": "研究 Agent:负责信息搜集",
"title": "Research Agent",
"provider_id": "research",
"provider_type": "api",
"tool_id": "search",
"tool_name": "Web Search",
"tool_configurations": {},
"tool_parameters": {
"url": "{{sys.search_query}}"
},
"output_selector": ["sys"]
}
},
{
"id": "code_agent",
"data": {
"type": "tool",
"desc": "代码 Agent:负责代码生成",
"title": "Code Agent",
"provider_id": "code",
"provider_type": "api",
"tool_id": "code_generate",
"tool_name": "Code Generator",
"tool_parameters": {
"description": "{{sys.code_description}}"
},
"output_selector": ["sys"]
}
},
{
"id": "general_agent",
"data": {
"type": "llm",
"desc": "通用 Agent:处理一般对话",
"title": "General Agent",
"model": {
"provider": "openai",
"name": "gpt-4"
}
}
}
]
}
4. Dify API 使用
import requests
import json
from typing import Dict, Any, Optional
class DifyClient:
"""Dify 平台客户端"""
def __init__(
self,
base_url: str = "http://localhost/v1",
api_key: Optional[str] = None
):
self.base_url = base_url.rstrip("/")
self.api_key = api_key
self.session = requests.Session()
if api_key:
self.session.headers.update({
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
})
def create_workflow(self, workflow: Dict[str, Any]) -> Dict[str, Any]:
"""创建工作流"""
url = f"{self.base_url}/workflows"
response = self.session.post(url, json=workflow)
response.raise_for_status()
return response.json()
def run_workflow(
self,
workflow_id: str,
inputs: Dict[str, Any],
user: str = "default"
) -> Dict[str, Any]:
"""运行工作流"""
url = f"{self.base_url}/workflows/{workflow_id}/run"
payload = {
"inputs": inputs,
"user": user,
"response_mode": "blocking"
}
response = self.session.post(url, json=payload)
response.raise_for_status()
return response.json()
def stream_workflow(
self,
workflow_id: str,
inputs: Dict[str, Any],
user: str = "default"
):
"""流式运行工作流"""
url = f"{self.base_url}/workflows/{workflow_id}/run"
payload = {
"inputs": inputs,
"user": user,
"response_mode": "streaming"
}
response = self.session.post(url, json=payload, stream=True)
response.raise_for_status()
for line in response.iter_lines():
if line.startswith("data: "):
data = line[5:]
if data == "[DONE]":
break
yield json.loads(data)
def list_workflows(self, page: int = 1, page_size: int = 20) -> Dict[str, Any]:
"""列出工作流"""
url = f"{self.base_url}/workflows"
params = {
"page": page,
"page_size": page_size
}
response = self.session.get(url, params=params)
response.raise_for_status()
return response.json()
def get_workflow(self, workflow_id: str) -> Dict[str, Any]:
"""获取工作流详情"""
url = f"{self.base_url}/workflows/{workflow_id}"
response = self.session.get(url)
response.raise_for_status()
return response.json()
def update_workflow(
self,
workflow_id: str,
workflow: Dict[str, Any]
) -> Dict[str, Any]:
"""更新工作流"""
url = f"{self.base_url}/workflows/{workflow_id}"
response = self.session.put(url, json=workflow)
response.raise_for_status()
return response.json()
def delete_workflow(self, workflow_id: str) -> None:
"""删除工作流"""
url = f"{self.base_url}/workflows/{workflow_id}"
response = self.session.delete(url)
response.raise_for_status()
return None
def get_chat_history(
self,
workflow_id: str,
session_id: str
) -> list:
"""获取对话历史"""
url = f"{self.base_url}/chats/{workflow_id}/messages"
params = {"session_id": session_id}
response = self.session.get(url, params=params)
response.raise_for_status()
return response.json().get("data", [])
def get_datasets(self) -> list:
"""获取数据集列表"""
url = f"{self.base_url}/datasets"
response = self.session.get(url)
response.raise_for_status()
return response.json().get("data", [])
def create_dataset(
self,
name: str,
indexing_technique: str = "high_quality",
permission: str = "only_me"
) -> Dict[str, Any]:
"""创建数据集"""
url = f"{self.base_url}/datasets"
payload = {
"name": name,
"indexing_technique": indexing_technique,
"permission": permission
}
response = self.session.post(url, json=payload)
response.raise_for_status()
return response.json()
def upload_document(
self,
dataset_id: str,
file_path: str,
process_rule: Optional[Dict] = None
) -> Dict[str, Any]:
"""上传文档到数据集"""
url = f"{self.base_url}/datasets/{dataset_id}/document/create_by_text"
with open(file_path, "r") as f:
content = f.read()
payload = {
"name": file_path.split("/")[-1],
"text": content,
"indexing_technique": "high_quality",
"process_rule": process_rule or {}
}
response = self.session.post(url, json=payload)
response.raise_for_status()
return response.json()
# 使用示例
if __name__ == "__main__":
client = DifyClient(
base_url="http://localhost/v1",
api_key="your-api-key"
)
# 创建数据集
dataset = client.create_dataset(
name="技术文档库",
indexing_technique="high_quality"
)
print(f"创建数据集: {dataset['id']}")
# 上传文档
upload_result = client.upload_document(
dataset_id=dataset["id"],
file_path="./python_guide.md"
)
print(f"上传文档: {upload_result['id']}")
# 创建 RAG 工作流
workflow = {
"name": "Python 助手",
"version": "0.1.0",
"mode": "chat",
"nodes": [
{
"id": "context_retrieval",
"data": {
"type": "knowledge-retrieval",
"title": "Context Retrieval",
"query_variable_selector": ["sys"],
"top_k_selector": ["5"],
"retrieval_resource": [{
"desc": "Python 文档",
"id": dataset["id"]
}],
"return_values_selector": ["retrieved_context"]
}
},
{
"id": "llm",
"data": {
"type": "llm",
"title": "Answer",
"model": {
"provider": "openai",
"name": "gpt-4"
},
"prompt_template": [
"根据以下信息回答:",
"{{retrieved_context}}",
"\n问题:{{sys.user_query}}"
]
}
}
]
}
# 保存工作流
created_workflow = client.create_workflow(workflow)
print(f"创建工作流: {created_workflow['id']}")
# 运行工作流
result = client.run_workflow(
workflow_id=created_workflow["id"],
inputs={"sys.user_query": "什么是 Python 的装饰器?"}
)
print(f"回答: {result['data']['outputs'][0]['text']}")
LangFlow 框架详解
1. LangFlow 概述
【定义】
LangFlow 是一个可视化的 LangChain 工作流设计工具,
通过拖拽节点和连接边来构建复杂的 LLM 应用。
【核心特性】
1. 可视化设计
- 节点拖拽式设计
- 实时预览
- 流程图展示
2. 节点组件
- LLM 节点
- 工具节点
- 条件节点
- 数据节点
3. 导出功能
- 导出为 LangChain 代码
- 导出为 JSON 配置
- 部署运行
4. 可扩展性
- 自定义节点
- 自定义工具
- 集成扩展
2. LangFlow 架构
┌─────────────────────────────────────────────┐
│ Canvas 画布 │
│ ┌──────────┬──────────┬──────────┐ │
│ │ Node │ Connector │ Flow │ │
│ │ Palette │ Panel │ Controls│ │
│ └──────────┴──────────┴──────────┘ │
└────────────────┬────────────────────────────┘
│
┌────────────────┴────────────────────────────┐
│ Node Engine │
│ ┌──────────┬──────────┬──────────┐ │
│ │ LLM Nodes│ Tool Nodes│ Logic Nodes│ │
│ └──────────┴──────────┴──────────┘ │
└────────────────┬────────────────────────────┘
│
┌────────────────┴────────────────────────────┐
│ Code Generator │
│ ┌──────────┬──────────┬──────────┐ │
│ │ Python │ TypeScript │ JSON │ │
│ └──────────┴──────────┴──────────┘ │
└─────────────────────────────────────────────┘
3. LangFlow 节点类型
3.1 LLM 节点
{
"id": "llm_node",
"type": "llm",
"data": {
"model": "gpt-4",
"temperature": 0.7,
"max_tokens": 1000,
"prompt": "你是一个有帮助的助手。"
},
"position": {
"x": 200,
"y": 100
}
}
3.2 工具节点
{
"id": "search_tool",
"type": "tool",
"data": {
"name": "search",
"description": "搜索网络信息",
"parameters": {
"query": {
"type": "string",
"required": true
}
},
"input": "{{user_query}}"
}
}
3.3 条件节点
{
"id": "router",
"type": "if-else",
"data": {
"condition": "{{intent_type}}",
"branches": {
"search": "search_node_id",
"chat": "llm_node_id"
}
}
}
3.4 数据节点
{
"id": "input_data",
"type": "data",
"data": {
"value": "Hello, how can I help you?"
}
}
4. LangFlow 流程定义
{
"name": "Customer Service Bot",
"description": "客户服务聊天机器人",
"version": "1.0.0",
"nodes": [
{
"id": "input",
"type": "data",
"data": {
"value": "{{user_input}}"
},
"position": {
"x": 100,
"y": 100
}
},
{
"id": "intent_classifier",
"type": "llm",
"data": {
"model": "gpt-4",
"prompt": "分析用户意图,分类为:search(搜索)、complaint(投诉)、chat(聊天)。\n\n用户输入:{{input}}\n\n只输出类别,不要输出其他内容。",
"temperature": 0.1
},
"position": {
"x": 300,
"y": 100
}
},
{
"id": "router",
"type": "if-else",
"data": {
"condition": "{{intent_classifier_output}}",
"branches": {
"search": "search_tool",
"complaint": "escalate_tool",
"chat": "response_llm"
}
},
"position": {
"x": 500,
"y": 150
}
},
{
"id": "search_tool",
"type": "tool",
"data": {
"name": "web_search",
"description": "搜索网络",
"input": "{{user_input}}"
},
"position": {
"x": 700,
"y": 250
}
},
{
"id": "escalate_tool",
"type": "tool",
"data": {
"name": "escalate",
"description": "升级到人工",
"input": "{{user_input}}"
},
"position": {
"x": 700,
"y": 350
}
},
{
"id": "response_llm",
"type": "llm",
"data": {
"model": "gpt-4",
"prompt": "回答用户问题。\n\n用户:{{user_input}}\n\n提供一个友好、专业的回答。",
"temperature": 0.7
},
"position": {
"x": 700,
"y": 200
}
},
{
"id": "output",
"type": "data",
"data": {
"value": "{{router_output}}"
},
"position": {
"x": 900,
"y": 300
}
}
],
"edges": [
{
"source": "input",
"target": "intent_classifier"
},
{
"source": "intent_classifier",
"target": "router",
"data": {
"variable": "intent_classifier_output"
}
},
{
"source": "router",
"target": "output",
"data": {
"variable": "router_output"
}
},
{
"source": "router",
"target": "search_tool",
"condition": "search"
},
{
"source": "router",
"target": "escalate_tool",
"condition": "complaint"
},
{
"source": "router",
"target": "response_llm",
"condition": "chat"
}
]
}
5. LangFlow 代码生成
# langflow_code_generator.py
"""
将 LangFlow 配置转换为 LangChain 代码
"""
import json
from typing import Dict, List
class LangFlowToLangChain:
def __init__(self, flow_config: Dict):
self.config = flow_config
def generate_code(self) -> str:
"""生成 LangChain 代码"""
nodes = {node["id"]: node for node in self.config["nodes"]}
# 生成导入
code = self._generate_imports()
# 生成工具
code += self._generate_tools(nodes)
# 生成链
code += self._generate_chains(nodes)
# 生成入口
code += self._generate_main(nodes)
return code
def _generate_imports(self) -> str:
"""生成导入语句"""
return '''from langchain.chains import SequentialChain, ParallelChain
from langchain.agents import AgentExecutor, create_openai_functions_agent
from langchain.tools import Tool
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.schema import BaseOutputParser, OutputParser
from langchain.llms import ChatOpenAI
import os
# 配置
os.environ["OPENAI_API_KEY"] = "your-api-key"
'''
def _generate_tools(self, nodes: Dict) -> str:
"""生成工具定义"""
tool_nodes = [n for n in nodes.values() if n.get("type") == "tool"]
code = "# 定义工具\n"
for node in tool_nodes:
tool_name = node["data"]["name"]
code += f'def {tool_name}_func({tool_name}_input: str) -> str:\n'
code += f' """执行 {tool_name} 工具"""\n'
code += f' # 实现 {tool_name} 逻辑\n'
code += f' return f"执行 {tool_name}: {{{tool_name}_input}}"\n\n'
return code
def _generate_chains(self, nodes: Dict) -> str:
"""生成链定义"""
llm_nodes = [n for n in nodes.values() if n.get("type") == "llm"]
code = "# 定义提示模板\n"
for node in llm_nodes:
node_id = node["id"]
prompt = node["data"].get("prompt", "")
if prompt:
code += f'{node_id}_prompt = ChatPromptTemplate.from_messages([\n'
code += f' ("system", "{prompt}"),\n'
code += f' ("user", "{input}"),\n'
code += f' MessagesPlaceholder(variable_name="input")\n'
code += f'])\n\n'
return code
def _generate_main(self, nodes: Dict) -> str:
"""生成主函数"""
edges = self.config.get("edges", [])
code = "\n# 主函数\n"
code += "def main(user_input: str):\n"
code += ' print(f"用户输入: {user_input}")\n'
# 简化边生成执行逻辑
for edge in edges:
source = nodes[edge["source"]]
target = nodes[edge["target"]]
if source.get("type") == "llm" and target.get("type") == "data":
# LLM 到数据节点
output_var = edge["data"].get("variable", "output")
code += f' # 执行 LLM\n'
code += f' chain = LLMChain(llm=llm, prompt={source["id"]}_prompt)\n'
code += f' {output_var} = chain.run(user_input)\n'
code += ' print(f"最终输出: {output_var}")\n'
code += '\nif __name__ == "__main__":\n'
code += ' main("Hello, how can I help you?")\n'
return code
# 使用示例
if __name__ == "__main__":
# 加载 LangFlow 配置
with open("workflow.json", "r") as f:
flow_config = json.load(f)
# 生成代码
generator = LangFlowToLangChain(flow_config)
code = generator.generate_code()
print("生成的 LangChain 代码:")
print(code)
# 保存代码
with open("generated_chain.py", "w") as f:
f.write(code)
对比与选择
Dify vs LangFlow 对比
| 维度 | Dify | LangFlow |
|---|---|---|
| 定位 | 应用平台 | 工作流工具 |
| 部署 | 一键部署 | 代码生成后手动部署 |
| 存储 | 内置向量库 | 需要外部配置 |
| 协作 | 团队协作 | 适合个人开发 |
| 集成 | 丰富插件 | LangChain 原生集成 |
| 导出 | JSON API | 多种语言代码 |
| 适用场景 | 快速构建生产应用 | 可视化设计复杂流程 |
选择建议
【选择 Dify 的场景】
1. 需要快速部署
- 内置部署支持
- 云平台发布
- Docker/K8s 支持
2. 团队协作
- 多人协作编辑
- 权限管理
- 版本控制
3. 数据管理
- 需要内置向量库
- 文档上传管理
- 知识库管理
4. 低代码需求
- 非技术人员也能使用
- 可视化配置
- 预制模板
【选择 LangFlow 的场景】
1. 灔度定制
- 完全控制代码
- 自定义组件
- 灵活扩展
2. 现有 LangChain 项目
- 无缝集成
- 代码复用
- 版本管理
3. 原型开发
- 本地开发调试
- IDE 集成
- 版本控制
4. 复杂流程设计
- 可视化复杂逻辑
- 条件分支清晰
- 实时预览效果
实战案例
案例:Dify RAG 问答系统
# dify_rag_system.py
"""
构建一个基于 Dify 的 RAG 问答系统
"""
class DifyRAGBuilder:
"""Dify RAG 构建器"""
def __init__(self, api_key: str):
self.client = DifyClient(
base_url="http://localhost/v1",
api_key=api_key
)
def build_rag_workflow(
self,
name: str,
vector_db_name: str,
top_k: int = 3,
model_name: str = "gpt-4"
) -> str:
"""构建 RAG 工作流"""
workflow = {
"name": name,
"version": "0.1.0",
"mode": "chat",
"environment": {
"variable_declarations": [
{
"id": "top_k",
"value": str(top_k),
"name": "Top K"
},
{
"id": "model",
"value": model_name,
"name": "Model"
}
]
},
"nodes": [
{
"id": "context_retrieval",
"data": {
"type": "knowledge-retrieval",
"desc": "知识检索",
"title": "Context Retrieval",
"query_variable_selector": ["sys"],
"top_k_selector": ["top_k"],
"retrieval_resource": [{
"desc": "知识库",
"id": vector_db_name
}],
"return_values_selector": ["retrieved_context"]
}
},
{
"id": "prompt_engine",
"data": {
"type": "template-transformer",
"desc": "提示词模板",
"title": "Prompt Engine",
"template": "你是一个专业的问答助手。"
}
},
{
"id": "llm",
"data": {
"type": "llm",
"desc": "LLM 生成",
"title": "Answer Generation",
"model": {
"provider": "openai",
"name": "{{model}}"
},
"prompt_template": [
"{{prompt_engine.output}}",
"\n",
"基于以下信息回答用户问题:",
"{{retrieved_context}}",
"\n",
"用户问题:{{sys.user_query}}",
"\n",
"请直接给出答案,不要包含其他内容。"
],
"memory": {
"window": {
"enabled": True,
"size": 10
},
"type": "simple_chat"
}
}
},
{
"id": "answer",
"data": {
"type": "answer",
"desc": "答案输出",
"title": "Answer",
"output_selector": ["llm"]
}
}
]
}
return workflow
# 使用示例
if __name__ == "__main__":
builder = DifyRAGBuilder(api_key="your-api-key")
# 构建工作流
workflow = builder.build_rag_workflow(
name="技术问答系统",
vector_db_name="="tech_docs",
top_k=5,
model_name="gpt-4"
)
# 保存工作流
import json
with open("rag_workflow.json", "w") as f:
json.dump(workflow, f, indent=2, ensure_ascii=False)
# 提交到 Dify
# client = DifyClient(api_key="...")
# created = client.create_workflow(workflow)
print("RAG 工作流已创建")
面试高频问问法
Q1: Dify 和 LangFlow 的选择?
【标准回答】
选择标准:
1. 团队协作场景 → Dify
- 团队成员都需要访问
- 需要统一的平台管理
- 权限控制重要
2. 快速部署需求 → Dify
- 内置部署功能
- 云平台集成
- 监控告警完善
3. 开发灵活需求 → LangFlow
- 完全代码控制
- 本地调试方便
- IDE 集成
4. 复杂流程设计 → LangFlow
- 可视化复杂逻辑
- 实时预览效果
- 支持条件分支
混合方案:
- 使用 LangFlow 设计流程
- 导出 LangChain 代码
- 集成到现有项目
- 或发布到 Dify 平台
记忆要点
【Dify】
开源平台
可视化编排
一键部署
数据集管理
向量库集成
【LangFlow】
工作流工具
代码生成
可视化设计
LangChain 集成
【对比】
Dify:团队协作、快速部署
LangFlow:个人开发、灵活定制
【选择】
团队协作 → Dify
快速部署 → Dify
代码控制 → LangFlow
复杂流程 → LangFlow
文档版本: 1.0
最后更新: 2026-01-21