认识_Dify_开源大模型应用开发平台的核心能力
认识 Dify:开源大模型应用开发平台的核心能力
一、Dify 是什么?
Dify 是一个开源的大模型应用开发平台,它把可视化编排、知识库管理、LLM 调用、Agent 编排这些复杂的能力打包成开箱即用的服务。你不需要从零搭建全套技术栈,在浏览器上拖拽就能设计出完整的 AI 应用,同时也支持通过 API 调用灵活集成到你自己的系统中。
简单来说:
- 如果你不会编程:用 Dify 的可视化界面,拖拖拽拽就能做 AI 应用
- 如果你会编程:Dify 给你提供完善的 API,后端架构已经搭好了,你只需要专注业务逻辑
本文面向刚入门的开发者,我们会一步步认识 Dify 的核心能力,并且通过 Python 代码示例展示如何调用 Dify API。
二、Dify 的核心能力概览
Dify 的核心能力可以归纳为五个部分:
| 能力 | 作用 |
|---|---|
| 可视化工作流编排 | 在浏览器拖拽设计 LLM 应用的执行流程 |
| 内置 RAG 知识库 | 上传文档 -> 自动分割 -> 自动向量化 -> 问答检索,一站式搞定 |
| Prompt 编排与版本管理 | 图形化编辑提示词,支持版本回滚 |
| 插件与工具调用 | 支持自定义工具,让 Agent 能调用你的 API |
| 完善的 API | 所有界面能做的事情都可以通过 API 调用 |
官方 GitHub:https://github.com/langgenius/dify
三、本地快速启动 Dify
如果你想体验 Dify,可以使用 Docker Compose 一键启动:
# 克隆官方仓库
git clone https://github.com/langgenius/dify.git
cd dify/docker
# 复制配置文件
cp .env.example .env
# 启动所有服务
docker compose up -d
启动完成后,浏览器打开 http://localhost/install,按照提示完成管理员账号初始化即可使用。
四、通过 Python SDK 调用 Dify API
Dify 提供了完整的 RESTful API,你可以用 Python 轻松集成到自己的项目中。
4.1 安装依赖
# 使用 pip 安装 Dify Python SDK
pip install dify-sdk requests
4.2 基础对话示例
from dify_client import DifyClient
# ----- 初始化客户端 -----
# API_KEY 需要从 Dify 控制台获取:
# 进入你的应用 -> 开发 -> API 密钥 -> 复制 "API 密钥"
API_KEY = "your-app-api-key-here"
BASE_URL = "http://localhost/v1" # Dify 服务地址,本地部署默认就是这个
# 创建 Dify 客户端实例
client = DifyClient(api_key=API_KEY, base_url=BASE_URL)
# ----- 调用对话接口 -----
# user 字段是用户标识,用来区分不同用户,通常用你系统里的用户 ID
response = client.chat.create_chat_message(
inputs={
# inputs 是传给 Dify 的变量,对应你在 Dify 中定义的表单变量
# 比如你定义了变量叫做 "user_question",就传在这里
"user_question": "如何评价 LangChain 这个框架?"
},
user="user_001" # 用户标识,必填
)
# 查看完整响应
print("API 完整响应:")
print(response.json())
# 获取回答内容
answer = response.json().get("answer")
print(f"\nAI 回答: {answer}")
4.3 流式响应示例
对于大段回复,使用流式响应可以逐字输出,提升用户体验:
import requests
import json
# 流式响应需要使用 SSE(Server-Sent Events)协议
# Dify 会逐块推送回复,我们可以逐块处理
def stream_chat(api_key: str, base_url: str, question: str, user_id: str):
"""
流式调用 Dify 对话接口,逐块输出回答
"""
url = f"{base_url}/chat-messages"
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json",
}
data = {
"inputs": {
"user_question": question
},
"user": user_id,
"response_mode": "streaming" # 指定使用流式模式
}
# 发起请求,启用流式接收
response = requests.post(url, json=data, headers=headers, stream=True)
response.raise_for_status() # 如果请求出错,抛出异常
# 逐行读取 SSE 事件
print("AI 流式回答:", end="", flush=True)
full_answer = ""
for line in response.iter_lines():
if not line:
continue
# SSE 格式:data: {...}
if line.startswith(b"data: "):
line = line[6:].decode("utf-8")
# SSE 使用 [DONE] 标记结束
if line == "[DONE]":
break
event = json.loads(line)
# 每个块有一个 answer 字段,包含当前块的文本
chunk = event.get("answer", "")
full_answer += chunk
print(chunk, end="", flush=True) # 逐块输出
print("\n")
return full_answer
# 测试流式响应
api_key = "your-app-api-key-here"
base_url = "http://localhost/v1"
user_id = "user_001"
question = "请简单介绍一下什么是 RAG?"
full_answer = stream_chat(api_key, base_url, question, user_id)
print(f"\n完整回答:\n{full_answer}")
五、调用 Dify 知识库检索
Dify 内置了完整的知识库管理,你只需要在界面上传文档,就可以通过 API 进行检索问答。
from dify_client import DifyClient
# ----- 初始化 -----
API_KEY = "your-app-api-key-here"
BASE_URL = "http://localhost/v1"
client = DifyClient(api_key=API_KEY, base_url=BASE_URL)
# ----- 基于知识库问答 -----
# 前提:
# 1. 你已经在 Dify 中创建了知识库
# 2. 你已经上传并处理好了文档
# 3. 在应用配置中,已经关联了这个知识库
# 调用对话接口,Dify 会自动进行检索增强
# 不需要你自己处理向量化和检索,这些工作 Dify 都帮你做好了
response = client.chat.create_chat_message(
inputs={
# 你的问题,Dify 会自动去知识库找相关内容
"query": "Dify 支持哪些文档格式?"
},
user="user_001"
)
result = response.json()
print(f"问题:{result.get('inputs')}")
print(f"Dify 回答:\n{result.get('answer')}")
# 如果开启了引用来源,还可以获取文档引用
if "retriever_resources" in result:
print("\n--- 引用来源 ---")
for resource in result["retriever_resources"]:
print(f"文档:{resource.get('document_name')}")
print(f"片段:{resource.get('content')[:100]}...\n")
六、使用 Dify 工作流
Dify 最强大的功能之一就是可视化工作流编排。你可以在界面上设计复杂的条件分支、多轮 LLM 调用、工具调用等。设计完成后,同样通过 API 触发即可。
import requests
# 假设你已经在 Dify 界面上设计好了一个工作流:
# 1. 用户输入一个产品需求
# 2. LLM 生成 PRD 文档
# 3. 另一个 LLM 拆分任务列表
# 4. 返回最终结果
# 通过 API 触发工作流,传入输入变量
def run_dify_workflow(
api_key: str,
base_url: str,
workflow_inputs: dict,
user_id: str
) -> dict:
"""
触发 Dify 工作流,等待执行完成后返回结果
"""
url = f"{base_url}/workflows/run"
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json",
}
data = {
"inputs": workflow_inputs, # 工作流输入变量,和你在 Dify 中定义的对应
"user": user_id, # 用户标识
"response_mode": "blocking" # 阻塞模式:执行完成后一次性返回结果
}
response = requests.post(url, json=data, headers=headers)
response.raise_for_status()
return response.json()
# 调用示例
api_key = "your-workflow-api-key"
base_url = "http://localhost/v1"
user_id = "user_001"
# 工作流输入:对应你在 Dify 工作流中定义的开始节点变量
# 比如你的工作流定义了两个变量:product_name 和 requirements
workflow_inputs = {
"product_name": "个人博客系统",
"requirements": "需要支持 Markdown 写作,有分类和标签功能,SEO 友好。"
}
result = run_dify_workflow(api_key, base_url, workflow_inputs, user_id)
# 输出工作流执行结果
print("工作流执行结果:")
print(f"执行 ID: {result.get('workflow_run_id')}")
print(f"状态: {result.get('status')}")
print(f"输出: {result.get('data', {}).get('outputs')}")
如果你需要流式输出工作流,只需要把 response_mode 改成 streaming,然后像之前流式对话一样逐块读取即可。
七、自定义工具:让 Dify Agent 调用你的 API
Dify 支持自定义工具,你可以在界面上配置工具,然后让 Agent 在对话中自主调用。
步骤:
-
在 Dify 界面添加自定义工具:
- 进入工具 -> 自定义工具 -> 创建工具
- 填写工具名称、描述、参数说明
- 填写你的 API 地址和认证信息
- 保存
-
在 Agent 应用中启用这个工具
-
你的后端提供 API:
from fastapi import FastAPI
from pydantic import BaseModel
import uvicorn
# ----- 示例:为 Dify Agent 提供一个天气查询工具 -----
# Dify Agent 会根据用户提问,判断是否需要调用你的工具
# 如果需要,会调用你这里暴露的 API
app = FastAPI(title="Dify 自定义工具示例")
# 定义请求体格式:Dify 会传入工具参数
class WeatherRequest(BaseModel):
city: str # 我们定义的工具需要一个 city 参数
# 模拟天气数据
WEATHER_DATA = {
"北京": {"temperature": 25, "condition": "晴", "humidity": 40},
"上海": {"temperature": 28, "condition": "多云", "humidity": 65},
"广州": {"temperature": 32, "condition": "阵雨", "humidity": 80},
}
@app.post("/get_weather")
def get_weather(req: WeatherRequest):
"""
天气查询接口,供 Dify Agent 调用
Dify 会传入 city 参数,我们返回天气信息
返回的结果会被 Dify 传递给 LLM,由 LLM 整理成自然语言回复
"""
city = req.city
if city in WEATHER_DATA:
data = WEATHER_DATA[city]
return {
"success": True,
"data": data
}
else:
return {
"success": False,
"message": f"找不到 {city} 的天气数据"
}
if __name__ == "__main__":
# 启动服务,监听 0.0.0.0:8000
# 如果 Dify 和你这个服务在同一网络,可以通过内网地址访问
uvicorn.run(app, host="0.0.0.0", port=8000)
print("服务已启动,地址:http://localhost:8000/get_weather")
配置完成后,Dify Agent 就可以在需要的时候自动调用你的天气接口了。整个流程是:
用户提问 -> Dify LLM 判断是否需要调用工具 -> 如果需要 -> Dify 调用你的 API ->
你的 API 返回结果 -> Dify 将结果传给 LLM -> LLM 整理成自然语言 -> 返回给用户
你不需要写任何 LLM 相关逻辑,只需要实现工具逻辑即可。
八、Dify vs LangChain:该怎么选?
很多人会问,Dify 和 LangChain 有什么区别?应该选哪个?
| 维度 | Dify | LangChain |
|---|---|---|
| 使用方式 | 可视化编排 + API 输出 | 代码级框架 |
| 开发速度 | 快,拖拖拽拽就出原型 | 相对慢,需要自己写代码串组件 |
| 灵活性 | 满足大多数常见场景 | 高度灵活,可以实现任意复杂逻辑 |
| 知识库 | 内置开箱即用 | 需要自己整合向量库 |
| 学习曲线 | 平缓,对新手友好 | 陡峭,需要理解很多概念 |
选择建议:
- 如果你想快速验证想法,做一个 AI 应用出来 -> 选 Dify
- 如果你需要高度定制,复杂的流水线,深度集成到现有系统 -> 选 LangChain
- 两者可以结合:用 Dify 做快速原型验证,验证通过后再用 LangChain 重构生产代码
九、总结
Dify 作为一个开源的大模型应用开发平台,它的核心价值就是降低门槛:
- 对新手友好:可视化界面让不会编程的人也能做 AI 应用
- 开箱即用:RAG、Agent、工作流这些复杂功能都已经整合好了
- 灵活集成:所有能力都有 API,开发者可以方便地集成到自己的系统中
如果你正在寻找一个快速构建 LLM 应用的方案,Dify 值得一试。
参考链接:
更多推荐

所有评论(0)