大家好,我是玖日大大,总爱在晨光漫过窗台时翻开书页,指尖划过文字的沙沙声,是我与世界对话的方式。日常里喜欢记录细碎美好 —— 可能是街角咖啡店飘来的焦糖香气,地铁上陌生人递来的一张纸巾,或是雨后树叶上颤动的水珠,这些微光般的瞬间,都被我藏进随身的便签本里。前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。
https://www.captainbed.cn/jrhttps://www.captainbed.cn/jr

        话不多说,接下来开始正文部分

1. 引言:AI 应用开发的痛点与 Dify 的解决方案

在人工智能技术飞速发展的今天,企业和开发者对 AI 应用的需求日益增长。然而,传统 AI 应用开发面临着诸多痛点:一是技术门槛高,需要掌握大模型 API 调用、prompt 工程、知识库构建等多领域知识;二是开发周期长,从需求分析到功能落地往往需要数周甚至数月;三是维护成本高,模型迭代、数据更新、权限管理等工作繁琐;四是集成难度大,不同模型、工具、数据源的整合需要大量定制化开发。

Dify 作为一款开源低代码 AI 应用开发平台,恰好解决了这些痛点。它具备以下核心优势:

  • 低代码可视化开发:通过拖拽式界面设计应用流程,无需复杂编码即可快速搭建 AI 应用;
  • 多模型无缝集成:支持 OpenAI、Anthropic、阿里云通义千问、字节跳动火山大模型等主流 API 模型,同时兼容 Llama 3、Qwen、Mistral 等开源模型的本地部署;
  • 内置检索增强生成(RAG):一键创建私有知识库,解决大模型 "幻觉" 问题,提升回答准确性;
  • 灵活的工作流引擎:支持复杂业务逻辑设计,可串联模型调用、数据处理、第三方工具集成等步骤;
  • 完善的插件生态:提供天气查询、数据库连接、邮件发送等常用插件,同时支持自定义插件开发;
  • 全流程管理能力:涵盖应用开发、测试、部署、监控、迭代的完整生命周期。

本文将以 "理论 + 实战" 的形式,带领读者从 Dify 环境搭建开始,逐步开发文本摘要、私有知识库问答、多模态图片分析三类典型 AI 应用,并讲解工作流设计、插件开发、生产部署与优化等高级内容,最终帮助读者掌握基于 Dify 快速构建企业级 AI 应用的能力。

2. Dify 核心概念与架构解析

在开始开发前,我们需要先理解 Dify 的核心概念与架构设计,这将帮助我们更高效地使用平台。

2.1 核心概念

  1. 应用(Application):Dify 的开发成果载体,根据功能可分为文本生成、问答、多模态交互等类型,每个应用包含 prompt 配置、模型选择、功能模块等核心组件。
  1. Prompt 工程:Dify 提供可视化 prompt 编辑器,支持变量注入、条件判断、模板管理,帮助开发者设计高质量的模型指令,提升 AI 响应效果。
  1. 知识库(Knowledge Base):用于存储私有数据(如 PDF、Word、TXT 文档),通过 RAG 技术将知识库内容与大模型结合,实现基于私有数据的精准问答。
  1. 工作流(Workflow):可视化流程设计工具,支持拖拽式添加 "模型调用"" 数据检索 ""工具执行"" 条件分支 " 等节点,实现复杂业务逻辑。
  1. 插件(Plugin):扩展 Dify 功能的组件,分为 "工具插件"(如天气查询、地图服务)和 "数据源插件"(如 MySQL、Elasticsearch),支持自定义开发。
  1. API 密钥(API Key):应用对外提供服务的认证凭证,通过 API 密钥可将 Dify 应用集成到自有系统(如网站、APP、小程序)。

2.2 架构设计

Dify 采用分层架构设计,确保系统的灵活性、可扩展性和稳定性,架构分为四层:

  1. 前端层:基于 React 开发的可视化界面,包含应用管理、知识库管理、工作流设计、插件配置等模块,提供直观的操作体验。
  1. 后端服务层:采用 Python FastAPI 框架开发,负责处理业务逻辑,包括用户认证、应用配置管理、模型调用调度、知识库检索等核心功能。
  1. 模型集成层:提供统一的模型调用接口,兼容 API 模型(如 OpenAI GPT-4)和本地部署模型(如 Llama 3),支持模型负载均衡、超时重试、缓存管理。
  1. 数据存储层:采用多数据库协同存储,PostgreSQL 存储应用配置、用户数据,Redis 存储缓存数据,MinIO 存储知识库文档、图片等文件数据。

2.3 支持的模型类型

Dify 支持两类模型,满足不同场景需求:

  • API 模型:无需本地部署,通过 API 调用的模型,如 OpenAI GPT-3.5/4、Anthropic Claude 3、阿里云通义千问 Plus、百度文心一言 4.0。
  • 开源模型:可本地部署的模型,支持通过 Ollama、vLLM、LangChain 等框架集成,如 Meta Llama 3(70B)、阿里 Qwen(14B)、Mistral(8x7B)、智谱清言 GLM-4。

3. Dify 环境准备:部署与初始化

Dify 提供两种部署方式:Docker Compose 快速部署(适合新手)和本地源码部署(适合二次开发),本节将详细讲解两种部署流程。

3.1 Docker Compose 快速部署(推荐)

Docker Compose 部署无需复杂的依赖配置,只需几分钟即可完成 Dify 启动,适合快速体验和生产环境使用。

3.1.1 前置条件
  • 操作系统:Linux(Ubuntu 20.04+/CentOS 7+)、Windows 10+(WSL2)、macOS 12+
  • 软件依赖:Docker 20.10+、Docker Compose 2.0+
  • 硬件要求:至少 2 核 CPU、4GB 内存、20GB 磁盘空间(若部署开源模型,需 16GB + 内存)
3.1.2 部署步骤
  1. 安装 Docker 与 Docker Compose

以 Ubuntu 22.04 为例,执行以下命令安装依赖:

# 更新软件源

sudo apt update && sudo apt upgrade -y

# 安装Docker

sudo apt install -y apt-transport-https ca-certificates curl software-properties-common

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io

# 安装Docker Compose

sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

# 验证安装

docker --version

docker-compose --version
  1. 拉取 Dify 部署配置文件
# 创建Dify目录

mkdir -p /opt/dify && cd /opt/dify

# 下载docker-compose.yml文件

wget https://raw.githubusercontent.com/langgenius/dify/main/docker-compose.yml

# 下载环境变量配置文件

wget https://raw.githubusercontent.com/langgenius/dify/main/.env.example -O .env
  1. 配置环境变量(可选)

编辑.env文件,修改关键配置(如端口、数据库密码):

vim .env

常用配置项说明:

    • PORT: Dify 访问端口,默认 8000
    • DB_PASSWORD: PostgreSQL 数据库密码,建议修改为复杂密码
    • REDIS_PASSWORD: Redis 密码,建议修改
    • STORAGE_TYPE: 文件存储类型,默认 local(本地存储),可改为 s3/minio
  1. 启动 Dify 服务
# 后台启动所有服务

docker-compose up -d

# 查看服务启动状态

docker-compose ps

启动成功后,输出应显示所有服务(api、web、db、redis、worker 等)状态为Up

界面展示 docker-compose ps 命令执行结果,包含 7 个服务:dify-api、dify-web、dify-db、dify-redis、dify-worker、dify-nginx、dify-websocket,所有服务状态均为 "Up (healthy)",表示启动成功。

  1. 访问 Dify 平台

打开浏览器,输入http://服务器IP:端口(如http://192.168.1.100:8000),进入 Dify 登录界面,如图 21所示:

图 1:Dify 登录界面

界面左侧为 Dify 品牌标识和产品介绍,右侧为登录表单,包含 "邮箱" 和 "密码" 输入框,下方有 "忘记密码" 和 "注册账号" 按钮,首次访问需点击 "注册账号" 创建管理员账户。

首次访问需注册管理员账户,填写邮箱、密码后完成注册,注册成功后自动登录到 Dify 控制台主界面,如图 2所示:

图 2:Dify 控制台主界面

界面顶部为导航栏(包含首页、应用、知识库、工作流、插件、设置),左侧为功能菜单,中间为控制台首页,显示应用数量、知识库数量、最近访问的应用列表,右侧为快速操作按钮(新建应用、新建知识库)。

3.2 本地源码部署(适合二次开发)

若需要对 Dify 进行二次开发(如定制界面、扩展功能),可采用本地源码部署方式。

3.2.1 前置条件
  • 软件依赖:Python 3.10+、Node.js 16+、npm 8+、PostgreSQL 14+、Redis 6+
  • 开发工具:Git、PyCharm(或 VS Code)、WebStorm
3.2.2 部署步骤
  1. 拉取源码
git clone https://github.com/langgenius/dify.git

cd dify
  1. 部署后端服务
# 进入后端目录

cd api

# 创建虚拟环境

python -m venv venv

source venv/bin/activate # Linux/macOS

# venv\Scripts\activate # Windows

# 安装依赖

pip install -r requirements.txt

# 初始化数据库

cp .env.example .env

# 编辑.env文件,配置数据库、Redis连接信息

vim .env

# 执行数据库迁移

flask db upgrade

# 启动后端服务

flask run --host=0.0.0.0 --port=5001
  1. 部署前端服务
# 进入前端目录

cd ../web

# 安装依赖

npm install

# 配置环境变量

cp .env.example .env

# 编辑.env文件,设置REACT_APP_API_URL为后端服务地址

vim .env

# 启动前端开发服务

npm start
  1. 访问服务

前端服务启动后,访问http://localhost:3000,后端服务地址为http://localhost:5001

3.3 常见部署问题解决

  1. 端口占用问题

若启动时提示 "端口已被占用",可修改.env文件中的PORT配置(Docker 部署)或启动命令中的--port参数(源码部署),选择未被占用的端口(如 8001、5002)。

  1. 服务启动失败

执行docker-compose logs -f查看日志,定位失败原因:

    • 若数据库连接失败,检查.env文件中DB_HOST、DB_PORT、DB_PASSWORD配置是否正确;
    • 若 Redis 连接失败,检查REDIS_HOST、REDIS_PORT、REDIS_PASSWORD配置;
    • 若依赖缺失,执行docker-compose down && docker-compose up -d --build重新构建服务。
  1. 浏览器无法访问
    • 检查服务器防火墙是否开放 Dify 端口(如 8000),执行sudo ufw allow 8000开放端口;
    • 若为云服务器,检查安全组规则是否允许对应端口的入站流量。

4. 实战一:开发文本摘要 AI 应用(基础应用)

文本摘要应用是最基础的 AI 应用之一,功能为 "用户输入长文本,AI 自动生成简洁摘要"。本节将详细讲解基于 Dify 开发文本摘要应用的完整流程,包括应用创建、prompt 设计、模型配置、API 集成等步骤。

4.1 需求分析与设计

4.1.1 功能需求
  • 支持用户输入任意长度的文本(如新闻、报告、文章);
  • AI 自动提取文本核心信息,生成简洁摘要(长度可配置);
  • 支持摘要长度调整(短 / 中 / 长);
  • 提供 API 接口,可集成到第三方系统。
4.1.2 技术选型
  • 模型:OpenAI GPT-3.5 Turbo(性价比高,适合文本生成场景);
  • 交互方式:Web 界面 + API 接口;
  • 部署方式:基于 Dify 平台开发,无需单独部署前端。

4.2 开发步骤

4.2.1 1. 创建应用
  1. 登录 Dify 控制台,点击左侧导航栏 "应用"→"新建应用",进入应用创建界面

界面顶部为 "新建应用" 标题,中间为应用类型选择区,包含 "文本生成"、"问答"、"多模态交互" 三个选项,每个选项下方有功能描述;右侧为应用配置区,包含 "应用名称"、"应用描述"、"应用图标" 输入框。

  1. 选择应用类型为 "文本生成",填写应用信息:
    • 应用名称:文本摘要工具;
    • 应用描述:输入长文本,自动生成简洁摘要,支持摘要长度调整;
    • 应用图标:选择默认图标或上传自定义图标。
  1. 点击 "创建" 按钮,完成应用创建,进入应用开发界面(包含 "prompt 设计"、"模型配置"、"交互设置"、"API 配置" 四个标签页)。
4.2.2 2. 设计 prompt(核心步骤)

prompt 设计直接影响 AI 摘要的质量,需明确模型的角色、任务、输出格式和约束条件。

  1. 进入 "prompt 设计" 标签页,Dify 提供可视化 prompt 编辑器,支持 "系统提示" 和 "用户提示" 两部分配置:
    • 系统提示:定义模型的角色和任务规则;
    • 用户提示:定义用户输入的内容格式。
  1. 设计系统提示:
你是一名专业的文本摘要工程师,擅长提取文本核心信息并生成简洁、准确的摘要。请按照以下规则处理用户提供的文本:

1. 摘要需包含文本的核心主题、关键人物/事件、主要结论(若有);

2. 避免遗漏重要信息,同时不添加文本中没有的内容;

3. 根据用户选择的摘要长度调整内容详略:

- 短摘要(100字以内):仅保留核心主题和关键结论;

- 中摘要(100-300字):包含核心主题、关键事件、主要结论;

- 长摘要(300字以上):详细描述文本结构、核心内容、关键细节、主要结论;

4. 摘要语言需与用户输入文本语言一致(如用户输入中文,摘要也为中文);

5. 输出格式:先说明摘要长度类型,再输出摘要内容,示例:

【短摘要】

本文介绍了人工智能技术在医疗领域的应用现状,包括疾病诊断、药物研发等场景,指出当前技术面临的数据安全和伦理问题,建议加强行业监管。
  1. 设计用户提示:

在编辑器中点击 "添加变量",创建两个变量:

最终用户提示模板为:

需要摘要的文本:{{text}}

摘要长度要求:{{summary_length}}

配置完成后的 prompt 设计界面

界面左侧为 prompt 编辑器,分为 "系统提示" 和 "用户提示" 两部分,系统提示区域显示上述设计的规则文本,用户提示区域显示包含两个变量的模板;右侧为变量管理区,显示text和summary_length两个变量的配置信息(类型、提示语、默认值),下方有 "预览" 按钮可查看用户输入界面效果。

    • 变量 1:text(文本内容),类型为 "长文本",提示用户 "请输入需要摘要的文本内容";
    • 变量 2:summary_length(摘要长度),类型为 "下拉选择",选项为 "短摘要(100 字以内)"、"中摘要(100-300 字)"、"长摘要(300 字以上)",默认值为 "中摘要(100-300 字)"。
4.2.3 3. 配置模型
  1. 进入 "模型配置" 标签页,选择模型类型为 "API 模型",然后选择 "OpenAI"→"GPT-3.5 Turbo"

界面顶部为模型类型选择区(API 模型 / 开源模型),中间为模型列表(OpenAI、Anthropic、阿里云等),当前选中 "OpenAI GPT-3.5 Turbo";右侧为模型参数配置区,包含 "API 密钥"、"温度"、"最大 Token 数"、"超时时间" 等参数输入框。

  1. 配置模型参数:
    • 温度(Temperature):设置为 0.3(温度越低,输出越稳定、准确,适合摘要场景);
    • 最大 Token 数:设置为 1024(确保有足够的 Token 生成摘要,GPT-3.5 Turbo 支持最大 4096 Token);
    • 超时时间:设置为 30 秒;
    • 频率惩罚:设置为 0(避免模型过度避免重复内容,影响摘要完整性);
    • 存在惩罚:设置为 0。
  1. 点击 "测试连接" 按钮,验证模型是否能正常调用,若提示 "连接成功",则模型配置完成。
4.2.4 4. 测试应用
  1. 点击应用开发界面顶部的 "测试" 按钮,进入应用测试界面

界面左侧为用户输入区,包含 "文本内容" 输入框(多行)和 "摘要长度" 下拉选择框;右侧为 AI 响应区,显示 "等待输入" 提示;底部有 "提交" 和 "清空" 按钮。

  1. 输入测试文本(示例:一段关于人工智能发展的新闻):
2024年以来,人工智能技术进入高速发展阶段,尤其是生成式AI的应用场景不断拓展。在医疗领域,AI辅助诊断系统的准确率已达到95%以上,可帮助医生快速识别肺癌、糖尿病等疾病;在教育领域,AI助教能够根据学生的学习数据制定个性化学习计划,提升学习效率;在工业领域,AI质检系统可实现24小时不间断检测,将产品缺陷率降低30%。然而,AI技术的快速发展也带来了一系列挑战,如数据隐私泄露、算法偏见、就业结构变化等问题。为此,全球多个国家已开始制定AI监管政策,欧盟的《人工智能法案》于2024年5月正式生效,对高风险AI应用实施严格监管;美国也推出了《AI风险管理框架》,指导企业规范AI应用。专家预测,未来5年,AI技术将与各行业深度融合,形成新的产业生态,同时监管体系将逐步完善,推动AI技术健康发展。
  1. 选择摘要长度为 "中摘要(100-300 字)",点击 "提交" 按钮,等待 3-5 秒后,AI 生成摘要:
【中摘要】

2024年生成式AI应用场景持续拓展,医疗领域AI辅助诊断准确率超95%,可快速识别多种疾病;教育领域AI助教能制定个性化学习计划;工业领域AI质检系统可24小时检测,降低产品缺陷率30%。但AI发展面临数据隐私泄露、算法偏见、就业结构变化等挑战,欧盟《人工智能法案》已生效,美国推出《AI风险管理框架》。专家预测未来5年AI将与各行业深度融合,监管体系也将完善,推动AI健康发展。
  1. 优化调整:若摘要存在信息遗漏或冗余,可返回 "prompt 设计" 界面修改系统提示(如增加 "需包含各领域具体数据" 的规则),重新测试直至满足需求。
4.2.5 5. 集成 API(对接第三方系统)

Dify 为每个应用自动生成 API 接口,可将文本摘要工具集成到网站、APP、小程序等第三方系统。

  1. 进入 "API 配置" 标签页,获取 API 信息:
    • API 地址:http://你的Dify地址/v1/applications/你的应用ID/completions;
    • 请求方式:POST;
    • 认证方式:Bearer Token(API 密钥在页面中点击 "生成" 按钮获取)。
  1. 编写 Python API 调用代码(示例):
import requests

import json

# 配置API信息

API_KEY = "你的Dify应用API密钥"

API_URL = "http://192.168.1.100:8000/v1/applications/65f8a7b2-3c4d-4e5f-8a9b-0c1d2e3f4a5b/completions"

HEADERS = {

"Authorization": f"Bearer {API_KEY}",

"Content-Type": "application/json"

}

def generate_summary(text, summary_length):

"""

调用Dify文本摘要API生成摘要

:param text: 需要摘要的文本内容

:param summary_length: 摘要长度(短/中/长)

:return: 摘要结果或错误信息

"""

# 构造请求体

payload = {

"inputs": {

"text": text,

"summary_length": summary_length

},

"query": text, # 用于Dify日志跟踪,可与text一致

"user": "user_001" # 用户名,用于区分不同用户的请求

}

try:

# 发送POST请求

response = requests.post(API_URL, headers=HEADERS, data=json.dumps(payload), timeout=30)

# 检查响应状态码

response.raise_for_status() # 若状态码非200,抛出异常

# 解析响应结果

result = response.json()

return result["output"]["text"]

except requests.exceptions.RequestException as e:

return f"API调用失败:{str(e)}"

# 测试代码

if __name__ == "__main__":

# 测试文本

test_text = """2024年以来,人工智能技术进入高速发展阶段,尤其是生成式AI的应用场景不断拓展...(同4.2.4中的测试文本)"""

# 调用函数生成摘要

summary = generate_summary(test_text, "中摘要(100-300字)")

# 打印结果

print("文本摘要结果:")

print(summary)
  1. 运行代码,查看输出结果(与测试界面结果一致),如图 8 所示:

图 8:API 调用代码运行结果界面

界面为 Python 终端运行结果,显示 "文本摘要结果:",下方为 AI 生成的中摘要内容,无错误信息,表明 API 调用成功。

  1. 其他语言调用示例(以 JavaScript 为例):
const axios = require('axios');

// 配置API信息

const API_KEY = "你的Dify应用API密钥";

const API_URL = "http://192.168.1.100:8000/v1/applications/65f8a7b2-3c4d-4e5f-8a9b-0c1d2e3f4a5b/completions";

async function generateSummary(text, summaryLength) {

try {

const response = await axios.post(

API_URL,

{

inputs: { text, summary_length: summaryLength },

query: text,

user: "user_001"

},

{

headers: {

"Authorization": `Bearer ${API_KEY}`,

"Content-Type": "application/json"

},

timeout: 30000

}

);

return response.data.output.text;

} catch (error) {

return `API调用失败:${error.message}`;

}

}

// 测试

generateSummary("测试文本...", "中摘要(100-300字)")

.then(summary => console.log("文本摘要结果:", summary))

.catch(err => console.error(err));
4.2.6 6. 前端界面定制(可选)

若需要修改应用的前端界面(如调整颜色、添加公司 logo),可通过 Dify 的 "交互设置" 标签页进行配置:

  • 界面标题:修改应用在 Web 界面的显示标题;
  • 主题颜色:选择或自定义界面主色调;
  • logo 设置:上传公司 logo,替换默认图标;
  • 提示文本:修改用户输入框的提示语(如 "请粘贴需要摘要的文章内容");
  • 按钮文本:修改 "提交"、"清空" 按钮的显示文本。

4.3 应用发布与分享

应用开发完成后,可通过 Dify 的 "发布" 功能对外提供服务:

  1. 点击应用开发界面顶部的 "发布" 按钮,选择发布环境(测试环境 / 生产环境);
  1. 配置访问权限(公开访问 / 密码保护 / 指定用户访问);
  1. 生成访问链接,用户可通过链接直接使用 Web 版应用,或通过 API 集成到第三方系统。

5. 实战二:开发私有知识库问答 AI 应用(RAG 应用)

在实际应用中,很多 AI 问答场景需要基于企业私有数据(如产品手册、内部文档、行业报告),此时需要结合检索增强生成(RAG)技术。本节将开发一个 "产品手册问答 AI 应用",支持用户基于上传的产品手册提问,AI 结合手册内容给出精准回答。

5.1 需求分析与设计

5.1.1 功能需求
  • 支持上传产品手册(PDF/Word/TXT 格式);
  • 自动处理文档(分块、嵌入、存储);
  • 用户可针对产品手册内容提问;
  • AI 结合手册内容生成回答,并标注引用来源;
  • 支持文档更新、删除、检索测试。
5.1.2 技术原理

RAG 技术流程:

  1. 文档处理:将上传的文档分割为小文本块(避免超出模型 Token 限制);
  1. 文本嵌入:使用嵌入模型(如 OpenAI Embeddings)将文本块转换为向量;
  1. 向量存储:将向量存储到向量数据库(Dify 内置 Chroma 向量库);
  1. 检索过程:用户提问后,将问题转换为向量,在向量库中检索相似度最高的文本块;
  1. 生成回答:将检索到的文本块作为上下文,传递给大模型,生成基于私有数据的回答。

5.2 开发步骤

5.2.1 1. 创建知识库

首先需要创建知识库并上传产品手册,Dify 提供完整的知识库管理功能。

  1. 登录 Dify 控制台,点击左侧导航栏 "知识库"→"新建知识库",进入知识库创建界面

界面包含 "知识库名称"、"知识库描述" 输入框,"文档处理设置"(分块策略、嵌入模型),"向量数据库" 选择(内置 Chroma / 外部向量库如 Pinecone),下方有 "创建" 按钮。

  1. 配置知识库信息:
    • 知识库名称:产品手册知识库;
    • 知识库描述:存储产品手册文档,用于产品问答 AI 应用;
    • 分块策略:选择 "按段落分块",块大小设置为 500 字符,重叠率设置为 50 字符(确保上下文连贯性);
    • 嵌入模型:选择 "OpenAI Embeddings"(适合英文和中文,准确率高);
    • 向量数据库:选择 "内置 Chroma"(无需额外部署,适合快速开发)。
  1. 点击 "创建" 按钮,完成知识库创建,进入知识库文档管理界面。
  1. 上传产品手册文档:

点击 "上传文档" 按钮,选择本地的产品手册 PDF 文件(示例:某款智能手机产品手册),进入文档上传与处理界面

界面左侧显示上传的文档名称、大小、格式,右侧为文档处理进度(上传中→解析中→分块中→嵌入中→完成),下方显示处理后的文本块数量、嵌入模型、分块策略信息。

文档处理完成后,系统会显示 "处理成功",并列出处理后的文本块数量(如 100 个文本块)。

5.2.2 2. 创建问答应用
  1. 点击左侧导航栏 "应用"→"新建应用",选择应用类型为 "问答",填写应用名称(产品手册问答 AI)和描述,点击 "创建"。
  1. 进入应用开发界面,首先进行 "prompt 设计":
    • 系统提示
你是一款产品手册问答AI,负责基于用户上传的产品手册内容回答问题。请按照以下规则处理:

1. 仅基于知识库中的产品手册内容回答,不添加外部知识;

2. 若问题超出手册范围,明确告知用户"该问题不在产品手册范围内,无法回答";

3. 回答需引用手册内容,在回答末尾标注引用来源(格式:【引用:文档名称,页码X】);

4. 语言需简洁、准确,避免使用专业术语堆砌,确保用户易懂。
    • 用户提示

创建变量question(问题内容),类型为 "短文本",提示用户 "请输入关于产品手册的问题"。

5.2.3 3. 配置 RAG(关联知识库)
  1. 进入应用开发界面的 "知识库配置" 标签页,点击 "关联知识库",选择之前创建的 "产品手册知识库"

界面顶部为知识库选择区,当前选中 "产品手册知识库";中间为检索参数配置区,包含 "检索 Top K"、"相似度阈值"、"上下文拼接方式";右侧为检索测试区,可输入测试问题,查看检索结果。

  1. 配置检索参数:
    • 检索 Top K:设置为 5(检索相似度最高的 5 个文本块,确保覆盖足够的上下文);
    • 相似度阈值:设置为 0.7(过滤相似度低于 0.7 的文本块,避免无关信息干扰);
    • 上下文拼接方式:选择 "按相似度排序拼接"(将检索到的文本块按相似度从高到低拼接);
    • 上下文最大长度:设置为 2000 字符(避免超出模型 Token 限制)。
  1. 检索测试:

在检索测试区输入问题(如 "这款手机的电池容量是多少?"),点击 "检索" 按钮,系统会显示检索到的文本块(包含内容、相似度得分、来源),验证检索结果是否准确。

5.2.4 4. 配置模型

进入 "模型配置" 标签页,选择模型为 "OpenAI GPT-3.5 Turbo",配置参数:

  • API 密钥:输入 OpenAI API 密钥;
  • 温度:设置为 0.2(问答场景需准确性,温度较低);
  • 最大 Token 数:设置为 1500;
  • 其他参数:默认即可。
5.2.5 5. 测试应用
  1. 点击 "测试" 按钮,进入应用测试界面

界面左侧为用户提问区,包含 "问题" 输入框和 "提交" 按钮;右侧为 AI 回答区,显示回答内容和引用来源;下方为 "相关文档" 列表,显示检索到的文本块。

  1. 输入测试问题:"这款智能手机支持快充吗?快充功率是多少?",点击 "提交" 按钮。
  1. AI 生成回答(示例):
这款智能手机支持快充功能,其快充功率为66W。根据产品手册描述,使用原装充电器时,30分钟可充电至80%,完全充满需约45分钟。

【引用:智能手机产品手册,页码12】

回答下方会显示引用的文档片段,用户可查看原文验证准确性。

  1. 测试边界场景:
    • 输入超出手册范围的问题(如 "这款手机的竞争对手有哪些?"),AI 应提示 "该问题不在产品手册范围内,无法回答";
    • 输入模糊问题(如 "手机怎么充电?"),AI 应结合手册中的充电说明,给出详细步骤。
5.2.6 6. API 集成(带 RAG 的 API 调用)

与文本摘要应用相比,带 RAG 的 API 调用无需额外配置,Dify 会自动处理检索流程,只需在请求体中指定知识库 ID 即可。

Python API 调用代码示例:

import requests

import json

# 配置API信息

API_KEY = "你的产品问答应用API密钥"

API_URL = "http://192.168.1.100:8000/v1/applications/78a9b0c1-2d3e-4f5a-6b7c-8d9e0f1a2b3c/chat-messages"

HEADERS = {

"Authorization": f"Bearer {API_KEY}",

"Content-Type": "application/json"

}

def product_qa(question, user_id):

"""

调用产品手册问答API

:param question: 用户问题

:param user_id: 用户ID(区分不同用户)

:return: 回答结果、引用来源

"""

payload = {

"inputs": {

"question": question

},

"query": question,

"user": user_id,

"knowledge_base_id": "89c0d1e2-3f4a-5b6c-7d8e-9f0a1b2c3d4e" # 知识库ID

}

try:

response = requests.post(API_URL, headers=HEADERS, data=json.dumps(payload), timeout=60)

response.raise_for_status()

result = response.json()

# 提取回答和引用来源

answer = result["output"]["text"]

sources = [f"【{source['document_name']},页码{source['page']}】" for source in result["retrieval_contexts"][0]["sources"]]

return f"{answer}\n{' '.join(sources)}"

except requests.exceptions.RequestException as e:

return f"API调用失败:{str(e)}"

# 测试

if __name__ == "__main__":

question = "这款智能手机的电池容量是多少?支持无线充电吗?"

result = product_qa(question, "user_002")

print("问答结果:")

print(result)

运行代码,输出结果包含回答和引用来源,与 Web 测试界面一致。

5.2.7 7. 知识库管理

Dify 支持知识库的全生命周期管理:

  1. 文档更新:点击知识库中的 "上传文档",可上传新版本的产品手册,系统会自动替换旧文档;
  1. 文档删除:选择需要删除的文档,点击 "删除" 按钮,系统会删除文档及对应的向量数据;
  1. 检索优化:若检索结果不准确,可调整分块策略(如减小块大小)、更换嵌入模型(如使用中文优化的嵌入模型);
  1. 权限管理:设置知识库访问权限(仅自己可见 / 团队可见 / 所有用户可见)。

5.3 高级配置:优化 RAG 效果

若 RAG 问答效果不理想(如回答不准确、引用错误),可通过以下方式优化:

  1. 分块策略优化
    • 对于 PDF 文档,若包含大量表格,选择 "按页面分块";
    • 对于长文档,块大小设置为 300-500 字符,重叠率设置为 50-100 字符;
  1. 嵌入模型优化
    • 中文文档推荐使用 "通义千问 Embeddings" 或 "文心一言 Embeddings",准确率高于 OpenAI Embeddings;
  1. 检索参数优化
    • 若回答遗漏信息,增大 "检索 Top K"(如从 5 调整为 8);
    • 若回答包含无关信息,提高 "相似度阈值"(如从 0.7 调整为 0.8);
  1. Prompt 优化
    • 在系统提示中明确 "优先使用检索到的上下文,若上下文不足,告知用户无法回答";
    • 要求模型 "在回答中逐点引用上下文,每个引用标注具体页码和段落"。

6. 实战三:开发多模态图片内容分析 AI 应用

随着多模态模型(如 GPT-4V、Claude 3 Vision)的发展,AI 应用已从纯文本扩展到图片、音频、视频等领域。本节将开发一个 "图片内容分析 AI 应用",支持用户上传图片,AI 分析图片内容并生成描述,同时回答与图片相关的问题。

6.1 需求分析与设计

6.1.1 功能需求
  • 支持上传图片(JPG/PNG 格式,最大 10MB);
  • AI 自动分析图片内容(场景、物体、文字、颜色等);
  • 生成图片详细描述;
  • 支持用户针对图片提问(如 "图片中的物体是什么颜色?"" 图片中有多少人?");
  • 支持图片历史记录查看。
6.1.2 技术选型
  • 多模态模型:OpenAI GPT-4V(支持图片分析,准确率高);
  • 图片存储:Dify 内置 MinIO 存储服务;
  • 交互方式:Web 界面(支持图片上传)+ API 接口。

6.2 开发步骤

6.2.1 1. 配置多模态模型

首先需要在 Dify 中配置多模态模型(GPT-4V),确保支持图片分析功能。

  1. 登录 Dify 控制台,点击左侧导航栏 "设置"→"模型管理"→"添加模型",进入模型配置界面,

界面顶部为模型类型选择(API 模型 / 开源模型),当前选择 "API 模型"→"OpenAI"→"GPT-4V (Vision)";中间为模型参数配置区,包含 "API 密钥"、"最大 Token 数"、"超时时间";下方为 "图片处理设置"(支持的图片格式、最大大小)。

  1. 配置模型参数:
    • API 密钥:输入 OpenAI API 密钥(需确保账号已开通 GPT-4V 权限);
    • 最大 Token 数:设置为 2048;
    • 超时时间:设置为 60 秒(图片分析耗时较长);
    • 支持的图片格式:勾选 JPG、PNG;
    • 最大图片大小:设置为 10MB。
  1. 点击 "保存" 按钮,完成多模态模型配置。
6.2.2 2. 创建多模态应用
  1. 点击左侧导航栏 "应用"→"新建应用",选择应用类型为 "多模态交互",填写应用名称(图片内容分析 AI)和描述,点击 "创建",进入应用创建界面

界面包含 "应用名称"、"应用描述" 输入框,"模型选择"(已选择 GPT-4V),"交互设置"(图片上传功能开启、问题输入框配置),下方有 "创建" 按钮。

  1. 配置应用交互设置:
    • 开启 "图片上传功能",设置支持的图片格式(JPG/PNG)和最大大小(10MB);
    • 添加变量:
      • image:类型为 "图片",提示用户 "请上传需要分析的图片";
      • question:类型为 "短文本",提示用户 "请输入关于图片的问题(可选)"。
6.2.3 3. 设计 prompt

多模态 prompt 需要包含图片处理指令和文本生成规则,进入 "prompt 设计" 标签页:

  • 系统提示
你是一名专业的图片内容分析师,擅长分析图片中的场景、物体、文字、颜色、人物等元素。请按照以下规则处理:

1. 首先生成图片详细描述,包含:

- 场景(如室内/室外、家庭/办公/自然);

- 主要物体(名称、数量、颜色、位置);

- 人物(数量、动作、穿着、表情,若有);

- 文字(图片中的文字内容,若有);

- 整体氛围(如明亮/昏暗、温馨/严肃);

2. 若用户有提问,结合图片内容回答问题,确保回答基于图片实际内容;

3. 若图片内容不清晰或无法识别,明确告知用户;

4. 语言需简洁、有条理,分点描述(使用1.2.3.格式)。
  • 用户提示
上传的图片:{{image}}

用户问题(可选):{{question}}
6.2.4 4. 测试应用
  1. 点击 "测试" 按钮,进入多模态应用测试界面

界面左侧为用户交互区,包含 "图片上传" 按钮(显示 "点击上传或拖拽文件")、"问题输入框"、"提交" 按钮;右侧为 AI 响应区,显示 "等待上传图片" 提示;下方为图片预览区(上传后显示)。

  1. 上传测试图片(示例:一张包含 "红色苹果、黄色香蕉、绿色橙子" 的水果静物图),输入问题 "图片中有哪些水果?分别是什么颜色?",点击 "提交" 按钮。
  1. 等待 10-20 秒(GPT-4V 分析图片耗时较长),AI 生成分析结果:
一、图片详细描述

1. 场景:室内静物场景,背景为白色桌面,无其他装饰元素;

2. 主要物体:

- 苹果:1个,红色,位于图片左侧;

- 香蕉:2根,黄色,位于图片中间,呈弯曲状;

- 橙子:1个,绿色(未完全成熟),位于图片右侧;

3. 人物:无;

4. 文字:无;

5. 整体氛围:明亮、简洁,突出水果主体。

二、问题回答

图片中的水果及颜色如下:

1. 苹果:红色;

2. 香蕉:黄色;

3. 橙子:绿色。
  1. 测试其他场景:
    • 上传包含文字的图片(如书籍封面),AI 应识别并转录文字内容;
    • 上传人物图片,AI 应描述人物数量、动作、穿着;
    • 上传模糊图片,AI 应提示 "图片内容不清晰,无法准确分析"。
6.2.5 5. API 集成(多模态 API 调用)

多模态 API 调用需要处理图片文件(二进制数据),需将图片转换为 Base64 编码或通过表单上传。Dify 支持两种方式,本节以 Base64 编码为例。

Python API 调用代码示例:

import requests

import json

import base64

# 配置API信息

API_KEY = "你的图片分析应用API密钥"

API_URL = "http://192.168.1.100:8000/v1/applications/90a1b2c3-4d5e-6f7a-8b9c-0d1e2f3a4b5c/multimodal-completions"

HEADERS = {

"Authorization": f"Bearer {API_KEY}",

"Content-Type": "application/json"

}

def image_analysis(image_path, question=None):

"""

调用图片内容分析API

:param image_path: 图片本地路径

:param question: 用户问题(可选)

:return: 分析结果

"""

# 将图片转换为Base64编码

with open(image_path, "rb") as image_file:

image_base64 = base64.b64encode(image_file.read()).decode("utf-8")

# 构造请求体

payload = {

"inputs": {

"image": {

"type": "base64",

"data": image_base64,

"filename": image_path.split("/")[-1] # 图片文件名

},

"question": question or "请分析图片内容"

},

"query": question or "图片分析请求",

"user": "user_003"

}

try:

response = requests.post(API_URL, headers=HEADERS, data=json.dumps(payload), timeout=60)

response.raise_for_status()

result = response.json()

return result["output"]["text"]

except requests.exceptions.RequestException as e:

return f"API调用失败:{str(e)}"

# 测试

if __name__ == "__main__":

# 图片本地路径

image_path = "/home/user/test_images/fruits.jpg"

# 用户问题

question = "图片中有几种水果?每种水果的数量是多少?"

# 调用函数

analysis_result = image_analysis(image_path, question)

# 打印结果

print("图片分析结果:")

print(analysis_result)

代码说明:

  • 图片处理:使用base64库将图片文件转换为 Base64 编码,确保 API 能正确解析;
  • 请求体结构:image字段包含type(base64)、data(Base64 编码字符串)、filename(文件名);
  • 超时设置:图片分析耗时较长,设置 60 秒超时。

7. Dify 高级功能:工作流与插件开发

Dify 的工作流和插件功能可满足复杂业务场景需求,本节将介绍如何通过工作流设计复杂流程,以及如何开发自定义插件。

7.1 工作流设计:可视化流程编排

工作流支持拖拽式设计复杂业务逻辑,例如 "用户提问→检索知识库→调用模型→发送邮件通知" 的完整流程。

7.1.1 工作流设计步骤
  1. 登录 Dify 控制台,点击左侧导航栏 "工作流"→"新建工作流",进入工作流设计界面

界面左侧为节点库(包含 "触发节点"、"模型节点"、"知识库节点"、"工具节点"、"条件节点"、"输出节点");中间为画布,用于拖拽节点并连接;右侧为节点配置区,显示当前选中节点的参数配置。

  1. 设计 "用户提问→知识库检索→模型回答→邮件通知" 流程:
    1. 添加触发节点:拖拽 "用户输入触发" 节点到画布,配置触发参数(用户输入变量:question);
    1. 添加知识库节点:拖拽 "知识库检索" 节点,连接到触发节点,配置知识库 ID 和检索参数(Top K=5);
    1. 添加模型节点:拖拽 "模型调用" 节点,连接到知识库节点,选择模型(GPT-3.5 Turbo),配置 prompt(包含用户问题和检索到的上下文);
    1. 添加工具节点:拖拽 "邮件发送" 节点,连接到模型节点,配置邮件参数(收件人、主题、内容模板,内容包含模型回答);
    1. 添加输出节点:拖拽 "结果输出" 节点,连接到模型节点,配置输出参数(模型回答);
    1. 连接节点:用连接线将各节点按流程顺序连接,形成完整工作流。
  1. 点击 "测试" 按钮,输入测试问题,验证工作流是否正常执行(检索知识库→生成回答→发送邮件)。
7.1.2 工作流应用场景
  • 多步骤数据处理:如 "用户上传 Excel→数据提取→数据分析→生成报告→发送报告";
  • 条件分支逻辑:如 "根据用户问题类型,分支到不同知识库(产品问题→产品知识库,技术问题→技术知识库)";
  • 定时任务:如 "每天定时检索行业新闻→生成摘要→推送至企业微信群"。

7.2 自定义插件开发:扩展 Dify 功能

Dify 支持自定义插件开发,若内置插件无法满足需求,可开发专属插件(如对接企业内部系统、第三方 API)。本节将开发一个 "天气查询插件",支持根据城市名称查询实时天气。

7.2.1 插件开发步骤
  1. 创建插件项目

插件采用 Python 开发,需遵循 Dify 插件开发规范,项目结构如下:

weather_plugin/

├── __init__.py

├── main.py # 插件核心逻辑

├── config.py # 配置文件

└── manifest.json # 插件描述文件

编写插件描述文件(manifest.json)

{

"name": "天气查询插件",

"description": "根据城市名称查询实时天气",

"version": "1.0.0",

"author": "Dify开发者",

"type": "tool",

"parameters": [

{

"name": "city",

"type": "string",

"required": true,

"description": "城市名称(如北京、上海)"

}

],

"outputs": [

{

"name": "weather_info",

"type": "string",

"description": "实时天气信息(包含温度、湿度、风力、天气状况)"

}

]

}
  1. 编写插件核心逻辑(main.py

使用第三方天气 API(如高德天气 API)实现天气查询功能:

import requests

from config import AMAP_API_KEY

class WeatherPlugin:

def __init__(self):

self.base_url = "https://restapi.amap.com/v3/weather/weatherInfo"

self.api_key = AMAP_API_KEY

def run(self, parameters):

"""

插件执行入口

:param parameters: 输入参数(包含city)

:return: 天气信息

"""

# 获取城市名称

city = parameters.get("city")

if not city:

raise ValueError("城市名称不能为空")

# 调用高德天气API

params = {

"key": self.api_key,

"city": city,

"extensions": "base", # 基础天气信息

"output": "json"

}

try:

response = requests.get(self.base_url, params=params, timeout=10)

response.raise_for_status()

data = response.json()

# 解析天气数据

if data["status"] != "1":

raise Exception(f"天气查询失败:{data.get('info', '未知错误')}")

weather_data = data["lives"][0]

weather_info = (

f"城市:{weather_data['city']}\n"

f"天气状况:{weather_data['weather']}\n"

f"温度:{weather_data['temperature']}℃\n"

f"湿度:{weather_data['humidity']}%\n"

f"风力:{weather_data['winddirection']}{weather_data['windpower']}\n"

f"更新时间:{weather_data['reporttime']}"

)

return {"weather_info": weather_info}

except Exception as e:

raise Exception(f"天气查询异常:{str(e)}")
  1. 编写配置文件(config.py
# 高德天气API密钥(需在高德开放平台申请:https://lbs.amap.com/)

AMAP_API_KEY = "你的高德天气API密钥"
  1. 在 Dify 中集成插件
    1. 登录 Dify 控制台,点击左侧导航栏 "插件"→"上传插件",选择插件项目压缩包(ZIP 格式)

界面包含 "插件压缩包上传" 区域、"插件信息预览"(显示 manifest.json 中的名称、描述、参数)、"插件测试" 区域(输入城市名称,测试插件功能)。

    1. 上传完成后,点击 "测试" 按钮,输入城市名称(如 "北京"),验证插件是否能正常返回天气信息;
    1. 测试通过后,点击 "启用" 按钮,插件即可在应用和工作流中使用。
  1. 插件应用
    • 在应用中使用:创建应用时,添加 "工具调用" 节点,选择 "天气查询插件",配置输入参数(城市名称);
    • 在工作流中使用:拖拽 "工具节点",选择 "天气查询插件",连接到其他节点(如将天气信息插入到邮件中发送)。

8. Dify 应用部署与生产优化

开发完成的 AI 应用需要部署到生产环境,并进行性能、成本、稳定性优化,确保满足企业级应用需求。

8.1 生产环境部署

8.1.1 Docker Swarm 部署(适合多节点集群)

对于生产环境,推荐使用 Docker Swarm 实现服务编排和高可用:

  1. 初始化 Docker Swarm
# 在管理节点执行

docker swarm init --advertise-addr 管理节点IP
  1. 编写 docker-compose.prod.yml 配置文件
version: '3.8'

services:

api:

image: langgenius/dify-api:latest

deploy:

replicas: 2 # 部署2个副本,实现负载均衡

restart_policy:

condition: on-failure

environment:

- PORT=5000

- DB_HOST=db

- DB_PORT=5432

- DB_USER=dify

- DB_PASSWORD=你的复杂密码

- DB_NAME=dify

- REDIS_HOST=redis

- REDIS_PORT=6379

- REDIS_PASSWORD=你的Redis密码

- OPENAI_API_KEY=你的OpenAI API密钥

- STORAGE_TYPE=s3 # 生产环境推荐使用S3存储文件

- S3_ACCESS_KEY=你的S3 Access Key

- S3_SECRET_KEY=你的S3 Secret Key

- S3_BUCKET=dify-storage

- S3_REGION=ap-southeast-1

depends_on:

- db

- redis

web:

image: langgenius/dify-web:latest

deploy:

replicas: 2

restart_policy:

condition: on-failure

environment:

- REACT_APP_API_URL=https://api.your-dify-domain.com

depends_on:

- api

db:

image: postgres:14

deploy:

replicas: 1

restart_policy:

condition: on-failure

environment:

- POSTGRES_USER=dify

- POSTGRES_PASSWORD=你的复杂密码

- POSTGRES_DB=dify

volumes:

- postgres-data:/var/lib/postgresql/data

redis:

image: redis:6

deploy:

replicas: 1

restart_policy:

condition: on-failure

command: redis-server --requirepass 你的Redis密码

volumes:

- redis-data:/data

nginx:

image: nginx:latest

deploy:

replicas: 1

restart_policy:

condition: on-failure

ports:

- "80:80"

- "443:443"

volumes:

- ./nginx/conf:/etc/nginx/conf.d

- ./nginx/ssl:/etc/nginx/ssl

depends_on:

- api

- web

volumes:

postgres-data:

redis-data:
  1. 配置 HTTPS(Let's Encrypt 证书)
# 安装Certbot

sudo apt install certbot python3-certbot-nginx

# 获取证书

sudo certbot --nginx -d your-dify-domain.com -d api.your-dify-domain.com

# 配置Nginx,将HTTP请求重定向到HTTPS
  1. 启动服务
docker stack deploy -c docker-compose.prod</doubaocanvas>
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐