认识 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 在对话中自主调用。

步骤:

  1. 在 Dify 界面添加自定义工具

    • 进入工具 -> 自定义工具 -> 创建工具
    • 填写工具名称、描述、参数说明
    • 填写你的 API 地址和认证信息
    • 保存
  2. 在 Agent 应用中启用这个工具

  3. 你的后端提供 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 值得一试。


参考链接:

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐