八、dify部署与应用
本文介绍了Dify开源LLM应用开发平台的部署与应用。核心内容包括:Dify平台定义及五种应用类型(聊天助手、文本生成、Agent、对话流、工作流);Docker Compose本地化部署步骤(克隆代码、配置环境变量、启动服务、初始化);Chatflow与Workflow的核心区别(对话式交互vs批处理);以及四个实战案例之一——LLM联网搜索工作流的搭建方法(开始→LLM提取关键词→Tavily搜索→LLM总结→结束)。
# 八、dify部署与应用 ## 一、学习目标 1. 掌握 Dify 开发平台核心概念与能力 2. 学会 Dify 的两种本地化部署方式及日常使用操作 3. 完成 4 个 Dify 实战案例:LLM 联网搜索、古诗词 WorkFlow、智能客服 ChatFlow、智能文档分析助手(MinerU+Dify) 4. 掌握 Agent API 的应用方法(Coze、Dify) ## 二、Dify 开发平台 ### 2.1 平台定义 Dify 是**开源的 LLM 应用开发平台**,提供 Agent 构建、AI workflow 编排、RAG 检索、模型管理等能力,可快速构建和运营生成式 AI 原生应用,相比 LangChain 更易上手。 ### 2.2 五种应用类型 | **应用类型** | **核心能力** | **适用场景** | | --- | --- | --- | | 聊天助手 | 基于 LLM 实现对话式交互 | 基础智能问答、日常对话助手 | | 文本生成应用 | 专注文本生成类任务 | 故事撰写、文本分类、翻译等 | | Agent | 任务分解、推理思考、工具调用 | 复杂任务处理、多工具协同的智能助手 | | 对话流(Chatflow) | 多轮对话、记忆功能、动态应用编排 | 智能客服、AI 助教、引导式任务机器人 | | 工作流(Workflow) | 自动化、批处理、单向生成结果 | 无实时交互的复杂数据处理、内容生成、系统集成 | **思考**:不同应用类型的核心区别是什么?实际业务中如何快速选择适配的应用类型? ## 三、Dify 部署 Dify 本地化部署有**Docker Compose 部署(推荐)** 和源代码部署两种方式,以下为核心的 Docker Compose 部署流程。 ### 3.1 部署前提 1. 安装 Docker 和 Docker Compose:https://www.docker.comFile(选择对应操作系统的 Docker Desktop) 2. 安装 Git:用于克隆 Dify 代码仓库 3. 了解核心工具: - Docker:开源应用容器引擎,打包应用及依赖至可移植容器,保证跨环境运行一致性 - Docker Compose:定义和运行多容器 Docker 应用的工具,通过 YAML 配置服务,单命令启动所有服务 ### 3.2 Docker Compose 部署步骤 #### Step1:克隆 Dify 代码仓库 ``` git clone https://github.com/langgenius/dify.git ``` #### Step2:进入 Docker 目录并配置环境变量 ``` cd dify/docker cp .env.example .env ``` **关键配置项修改**: - APP_URL:Dify 访问地址(本地为http://localhost或服务器 IP) - 数据库配置:默认使用 Docker 内置数据库,如需外部数据库需单独配置 - 模型供应商 API Keys:OpenAI、Anthropic、Qwen 等大模型的 API 密钥(必填,否则无法调用模型)**思考**:如果更换模型供应商,是否需要重新修改.env 文件并重启服务? #### Step3:启动 Dify 服务 ``` docker compose up -d ``` - 参数`-d`:表示后台运行服务 #### Step4:访问并初始化 Dify 1. 等待所有服务启动后,访问`http://你的IP地址/install\`进入管理员初始化页面,设置管理员账户 2. 初始化完成后,访问`http://你的IP地址\`进入 Dify 主页面开始使用 ### 3.3 Dify 后续管理操作 1. **更新 Dify**(在 dify/docker 目录下执行): ``` git pull docker compose pull docker compose up -d ``` 2. **重新启动服务**: ``` docker compose up -d ``` **思考**:更新 Dify 时是否会丢失已创建的应用和配置?如何做数据备份? ### 3.4 Dify 使用入口 1. 本地部署:`http://部署服务器IP:端口/signin\`(需先初始化管理员账户) 2. 官方云服务:https://cloud.dify.ai/appsFile(开箱即用,支持套餐付费) ## 四、Chatflow 与 Workflow 核心区别 二者是 Dify 核心应用编排工具,服务于不同 AI 应用场景,核心差异如下: ### 4.1 对话流(Chatflow) 1. 核心特性:对话式交互、上下文记忆、动态响应、流式输出、用户交互增强(开场白、问题建议等) 2. 专属节点:Answer 节点(中间步骤流式输出文本) 3. 适用场景:智能客服、语义搜索、AI 助教、多轮引导式对话机器人 ### 4.2 工作流(Workflow) 1. 核心特性:自动化批处理、单轮任务执行、无实时对话交互、复杂流程编排 2. 适用场景:数据处理分析、批量内容生成、系统集成任务、无交互的工具链调用**思考**:如果需要实现 “用户多轮提问 + 实时数据查询 + 批量结果生成”,应如何结合 Chatflow 和 Workflow 使用? ## 五、Dify 实战案例 ### 5.1 案例 1:LLM 联网搜索 **实战目标**:用户输入问题→AI 提取关键字→Bing(Tavily)搜索→结果总结 #### 5.1.1 前期准备 1. 申请 Tavily Search API Key:https://tavily.com/File 2. 在 Dify 中安装 Tavily 工具(市场插件:langgenius/tavily) 3. 对 TavilySearch 工具进行 API Key 授权 #### 5.1.2 工作流搭建步骤 1. **开始节点**:设置 input 变量,接收用户联网搜索主题 2. **LLM 节点**:提取关键字 - 系统提示词:对用户的问题,提取关键字,多个关键字用空格隔开 - 用户提示词:关联开始节点的 input 变量 3. **TavilySearch 节点**:执行联网搜索 - 查询变量:关联前一 LLM 节点的 text 输出 4. **LLM2 节点**:总结搜索结果 - 系统提示词:对网上搜索到的内容进行总结整理 - 用户提示词:关联 TavilySearch 节点的 text 输出 5. **结束节点**:设置 output 变量,关联 LLM2 节点的 text 输出 #### 5.1.3 实战成果 以 “黄金价格和哪些因素有关” 为例,可输出包含**影响因素(实际利率、地缘政治、通胀、央行购金等)、历史趋势、未来预测**的结构化总结报告 #### 5.1.4 打卡要求 1. 掌握 TavilySearch 网页搜索插件的安装与授权 2. 掌握大模型在 “关键字提取” 和 “搜索结果总结” 中的使用方法 ### 5.2 案例 2:搭建古诗词 WorkFlow **实战目标**:用户输入古诗→AI 描绘画面→翻译为英文提示词→调用绘图工具生成对应图像 #### 5.2.1 绘图工具准备 Dify 本身不提供绘图工具,需集成外部工具,可选方案: 1. 官方工具:DALL-E(Dify 第一方工具) 2. 开源模型:Stable Diffusion、Flux(通过 SiliconFlow 调用) 3. 关键操作:申请 SiliconCloud API Key,在 Dify 工具页中对 SiliconCloud 进行授权 #### 5.2.2 工作流搭建步骤 1. **开始节点**:设置 input 变量,接收用户输入的古诗词 2. **LLM 节点**(qwen-turbo):描绘画面 - 系统提示词:用户给你古诗词,请描绘一幅画面 - 用户提示词:关联开始节点的 input 变量 3. **LLM2 节点**(qwen-turbo):翻译为英文提示词 - 系统提示词:将描述的内容翻译成英文,前面加上 acient china - 用户提示词:关联前一 LLM 节点的 text 输出 4. **Flux 节点**(基于 SiliconFlow):生成图像 - 提示词变量:关联 LLM2 节点的 text 输出(英文提示词生成效果更优) - 配置:图像尺寸 1024x1024 等参数 5. **结束节点**:关联 Flux 节点的输出(text、files、json) #### 5.2.3 实战示例 输入 “离离原上草”,LLM 先生成中文画面描述,再翻译为带`acient china`的英文提示词,最终 Flux 生成草原风光图像 #### 5.2.4 打卡要求 搭建文生图工具工作流,包含**图片描述节点、翻译节点、text2image 节点**三个核心节点 ### 5.3 案例 3:智能客服 ChatFlow **实战目标**:搭建多分类智能客服,实现**营销咨询自动解答、投诉处理精准响应、其他问题友好回复** #### 5.3.1 客服分类与能力配置 1. **营销专员**:配置证券知识库,解答证券产品、交易规则等高频问题 2. **投诉专员**:配置用户行为数据、用户标签,提取关键信息并解答产品使用问题 3. **其他问题**:固定回复 “抱歉,这些问题我无法回答” #### 5.3.2 ChatFlow 搭建步骤 ##### Step1:添加问题分类器节点(qwen-turbo-latest/Qwen3) 设置 3 个分类: - 分类 1:营销咨询,证券知识 - 分类 2:投诉处理,产品使用不成功 - 分类 3:其他问题 ##### Step2:营销咨询分支配置 1. **知识检索节点**: - 配置证券知识库(需先创建并上传文件) - 查询变量:关联开始节点的 sys.query - 检索设置:高质量・向量检索 2. **LLM 节点**(qwen-turbo-latest):推理回答 - 系统提示词:基于标签内的知识库内容回答,不知则说不知,避免提及上下文来源 - 上下文:关联知识检索节点的结果 3. **直接回复节点**:将 LLM 回答返回给用户 ##### Step3:投诉处理分支配置 1. **LLM 节点**:提取用户关键信息 - 系统提示词:从用户文本中提取 user_id、event_time(日期格式)、event_type(固定枚举值),无信息则设为 null - 用户提示词:关联开始节点的 sys.query 2. **知识检索节点**:检索用户数据 - 配置用户知识库(上传 user_behavior_event.xlsx、user_tag.xlsx) - 检索策略:混合检索(语义 + 关键词),适当扩大 TopK 范围 3. **LLM 节点**(qwen-turbo-latest):共情解答并给出建议 - 系统提示词:定位为专业投诉处理顾问,共情安抚、核查信息、筛选匹配 user_id 的数据、简洁回答(≤200 字) - 上下文:关联用户数据知识检索结果 4. **直接回复节点**:将 LLM 回答返回给用户 ##### Step4:其他问题分支配置 添加**直接回复节点**,固定输出 “抱歉,这些问题我无法回答” #### 5.3.3 知识库创建与配置要点 1. **文件上传**:支持 TXT、PDF、DOCX、XLSX 等格式,单文件≤15MB 2. **分段设置**:结构不佳的文本需预设强分隔符;最大长度匹配模型窗口,重叠度建议 10-20% 3. **索引模式**:“高质量” 模式适合专业内容,切换需重索引(成本高) 4. **检索配置**: - Embedding 模型:text-embedding-v1(更换需重新向量化) - Rerank 模型:gte-rerank(提升相关性,增加延迟和成本) - TopK:3,Score 阈值:0.5(需根据模型调优) - 检索方式:混合检索(向量 + 全文)为推荐方案**思考**:证券知识库和用户知识库的检索策略为何不同?如何根据业务场景调优 TopK 和 Score 阈值? #### 5.3.4 实战示例 1. 营销问题:“什么是竞价盘?”→从证券知识库检索并返回专业解答 2. 投诉问题:“我的用户 id:7501690985227960354,我在 5 月 4 日登录了软件,但是没有成功”→提取信息→检索用户行为数据→给出登录失败原因和解决方案 #### 5.3.5 打卡要求 1. 使用 ChatFlow 模式实现意图识别(3 类分类) 2. 完成证券知识库、用户行为 / 标签数据表的准备与配置 3. 实现营销咨询自动解答和投诉处理精准响应 ### 5.4 案例 4:智能文档分析助手(MinerU+Dify) **实战目标**:用户上传复杂格式科研论文 PDF→MinerU 解析提取内容→LLM 基于解析内容回答用户问题 #### 5.4.1 核心工具 MinerU:专业的文档解析工具,可提取 PDF 中的图表、公式、多栏排版内容,通过 API 封装为 Dify 可调用插件 #### 5.4.2 工作流搭建步骤 ##### Step1:设置用户输入变量 1. uploaded_pdf:单文件类型,支持 PDF,显示名称 “请上传 PDF 文件” 2. user_question:文本类型,最大长度 100,显示名称 “请输入您的问题”(必填) ##### Step2:添加 MinerU 插件节点 1. 配置 MinerU 官方 API: - Base URL:https://mineru.netFile - 令牌 token:从https://mineru.net/apiManage/tokenFile获取 2. 功能:解析用户上传的 uploaded_pdf,输出解析后的 text 内容 ##### Step3:添加 LLM 节点(qwen-turbo) 1. 系统提示词:作为论文助手,基于 MinerU 解析的论文全文回答用户问题 2. 用户提示词:关联开始节点的 user_question 3. 上下文:关联 MinerU 插件节点的 text 输出 ##### Step4:添加结束节点 设置 output 变量,关联 LLM 节点的 text 输出 #### 5.4.3 实战示例 上传 INTERNVIDEO2.5.pdf,提问 “论文的实验结果怎么样?”→MinerU 解析论文→LLM 输出结构化的实验结果总结(含模型性能、基准测试提升、视觉能力增强等) #### 5.4.4 打卡要求 1. 掌握 MinerU 插件的配置与使用(Base URL、token 获取) 2. 实现 “PDF 解析→内容作为上下文→LLM 智能回答” 的完整工作流 ## 六、Agent API 应用(Coze + Dify) ### 6.1 Coze API 使用(基于 cozepy) cozepy 是 Coze 平台官方 Python SDK,支持同步 / 异步调用、流式输出、分页查询,以下为核心使用步骤。 #### 6.1.1 前期准备 1. **获取 API Token**:访问https://www.coze.cn/open/oauth/patsFile,创建个人访问令牌(设置权限和过期时间) 2. **获取智能体 ID**:从 Coze 智能体详情页 URL 中提取(例:URL 中`7507272032905199655`即为智能体 ID) #### 6.1.2 代码实现步骤 1. **初始化客户端** ``` import os from cozepy import Coze, TokenAuth, COZE_CN_BASE_URL # 配置参数 coze_api_token = "your_api_token_here" coze_bot_id = "your_bot_id_here" # 初始化 coze = Coze(auth=TokenAuth(token=coze_api_token), base_url=COZE_CN_BASE_URL) ``` 2. **普通聊天(非流式)** ``` from cozepy import ChatStatus chat_poll = coze.chat.create_and_poll( bot_id="your_bot_id", user_id="user_123", additional_messages=[Message.build_user_question_text("你好")] ) if chat_poll.chat.status == ChatStatus.COMPLETED: for message in chat_poll.messages: if message.role == "assistant" and message.content: print(f"智能体回复: {message.content}") ``` 3. **流式聊天(推荐)** ``` from cozepy import Message, ChatEventType, MessageContentType for event in coze.chat.stream( bot_id="your_bot_id", user_id="user_123", additional_messages=[Message.build_user_question_text("你好,请介绍一下你自己")] ): if event.event == ChatEventType.CONVERSATION_MESSAGE_DELTA: if hasattr(event.message, 'content') and event.message.content: if event.message.content.type == MessageContentType.TEXT: print(event.message.content.text, end="", flush=True) ``` #### 6.1.3 实战案例:古诗词绘画 Coze API 1. 在 config.py 中配置 Coze API 信息(TOKEN、BOT_ID、BASE_URL) 2. 实现流式接收回复,支持模式切换(流式 / 普通)、退出、查看智能体信息 3. 输入 “离离原上草”,可获取多维度的画面描述 + 英文翻译 + 生成的图像 #### 6.1.4 打卡要求 1. 掌握 cozepy 工具的安装与使用 2. 完成 Coze API 的核心步骤:获取 Token→获取智能体 ID→初始化客户端→调用聊天接口(普通 / 流式) ### 6.2 Dify API 使用 Dify 为不同应用类型提供专属 API 端点,通过 API Key 身份验证,支持调用聊天、文本生成、工作流等应用。 #### 6.2.1 基础准备 1. **获取 API Key**:进入 Dify 应用→访问 API→右上角 “创建密钥”(保护密钥,避免前端明文引用) 2. **API Base URL**:每个应用的专属基础访问地址 3. **核心目录结构**plaintext ``` ├── dify_agent_client.py # 核心客户端类(封装API调用) ├── dify_workflow_example.py # 工作流调用示例 ├── requirements.txt # 依赖包 └── README.md # 使用说明 ``` #### 6.2.2 核心客户端类(DifyAgentClient) 封装 API 基础配置,实现请求头构建、服务器地址和密钥管理: ``` class DifyAgentClient: def __init__(self, base_url: str, api_key: str): self.base_url = base_url.rstrip('/') self.api_key = api_key self.headers = { 'Authorization': f'Bearer {api_key}', 'Content-Type': 'application/json', 'Accept': 'application/json' } ``` #### 6.2.3 三大 API 端点(核心) 表格 | **端点类型** | **接口地址** | **核心特性** | **适用应用类型** | | --- | --- | --- | --- | | 聊天应用 | /chat-messages | 支持多轮对话(conversation_id)、流式 / 阻塞响应 | 聊天助手、Chatflow | | 完成应用 | /completion-messages | 单次任务、无对话状态、流式 / 阻塞响应 | 文本生成应用 | | 工作流应用 | /workflows/run | 需先发布工作流、通过 inputs 传参、支持复杂逻辑 | Workflow | | **思考**:如何通过 conversation_id 维持 Dify 聊天应用的多轮对话上下文?会话过期时间如何设置? | | | | #### 6.2.4 智能应用类型检测 DifyAgentClient 实现自动检测机制,按**聊天→完成→工作流**顺序尝试调用,根据错误码判断应用类型,实现容错: ``` def chat_completion(self, user_input: str, app_type: str = "auto"): if app_type == "auto": # 尝试聊天端点 result = self._try_chat_endpoint(...) if "not_chat_app" in result.get("message", ""): # 尝试完成端点 result = self._try_completion_endpoint(...) if "app_unavailable" in result.get("message", ""): # 尝试工作流端点 return self._try_workflow_endpoint(...) ``` #### 6.2.5 工作流调用示例 ``` def simple_workflow_example(): # 配置 BASE_URL = "你的Dify URL" API_KEY = "你的API KEY" # 创建客户端 client = DifyAgentClient(BASE_URL, API_KEY) # 调用LLM联网搜索工作流 user_input = "黄金价格和哪些因素有关" result = client.run_workflow(inputs={"input": user_input}, user_id="demo_user") print(result) ``` #### 6.2.6 打卡要求 1. 掌握 Dify 三大 API 端点的调用方式和适用场景 2. 实现 Dify 应用类型的智能检测 3. 调用已完成的 Dify 智能体(如 LLM 联网搜索)的 API 接口 ## 七、核心总结与关键疑问 ### 7.1 核心总结 1. Dify 是低门槛的开源 LLM 应用开发平台,提供 5 种应用类型,Chatflow 和 Workflow 是核心编排工具,分别适配多轮对话和自动化批处理场景 2. Docker Compose 是 Dify 推荐的部署方式,核心步骤为**克隆代码→配置环境→启动服务→初始化管理员** 3. 4 个实战案例覆盖了**工具调用、文生图、多分类智能客服、文档解析 + 问答**,是 Dify 核心能力的典型应用 4. Agent API 调用分为 Coze(cozepy SDK)和 Dify(三大端点),均需完成**密钥获取→客户端初始化→接口调用**核心步骤,流式输出为推荐方式