Dify工作流与MCP服务:构建企业级AI智能副驾的实战指南
在实际企业级 AI 应用开发中,一个常见的困境是:如何让大语言模型(LLM)不仅能够进行对话,还能深度融入具体岗位的工作流程,执行查询、分析、审批等实际业务操作?单纯依赖提示词工程和知识库检索,往往难以实现稳定、可控且可复用的复杂业务逻辑。这正是 Dify 工作流与 MCP 服务组合方案要解决的核心问题。通过将业务逻辑封装为可视化的工作流,并利用 MCP 协议将外部系统(如数据库、API、文件系统)的能力标准化为“工具”,我们可以为销售、客服、财务、研发等不同岗位,构建一个能够理解业务上下文、按规则执行操作、并返回结构化结果的“智能副驾”。本文将以一个具体的“销售线索跟进”场景为例,带你从零开始,在 Dify 中设计一个工作流,并集成一个模拟的 MCP 服务,最终打造一个可运行、可复现的岗位专属智能应用。无论你是希望将 AI 能力落地到具体业务线的开发者,还是寻求自动化解决方案的技术负责人,都能通过本文掌握从环境部署、工作流编排、MCP 集成到问题排查的完整路径。
1. 理解 Dify 工作流与 MCP 服务的核心价值
在深入实操之前,我们需要先厘清几个核心概念,以及它们组合起来为何能解决企业级应用的关键痛点。
1.1 Dify 工作流:从对话到可编排的业务流程
Dify 的工作流功能,本质上是一个可视化的 LLM 应用编排引擎。它允许你通过拖拽节点的方式,将 LLM 调用、条件判断、代码执行、API 调用、知识库检索等多个环节串联成一个有向无环图(DAG)。这与仅靠一个提示词驱动对话的 Agent 应用有本质区别。
工作流的核心优势在于:
- 确定性高:流程步骤固定,减少了 LLM 自由发挥导致的输出不稳定问题。
- 逻辑复杂:支持分支、循环(通过迭代器)、并行处理,能处理多步骤决策任务。
- 集成能力强:可以方便地插入 HTTP 请求、Python 代码等节点,与外部系统交互。
- 可复用:一个封装好的工作流可以作为“工具”被其他应用或工作流调用。
例如,一个“销售线索质量评估”工作流可能包含:接收用户输入的客户描述 -> 调用 LLM 提取关键信息(公司规模、需求紧迫度等)-> 根据规则判断优先级 -> 查询 CRM 系统(通过工具)检查历史记录 -> 生成综合评估报告并推荐跟进动作。这个过程是结构化的,而非一次性的问答。
1.2 MCP 服务:标准化外部能力的“插件”协议
MCP(Model Context Protocol)是一种开放协议,旨在为 LLM 定义一种标准化的方式来访问外部工具、数据源和计算资源。你可以把它理解为 LLM 世界的“USB 标准”或“驱动模型”。
MCP 服务解决了什么问题?在没有 MCP 之前,为每个 LLM 应用连接数据库、内部 API 或文件系统,都需要编写特定的适配器代码,工作重复且难以维护。MCP 协议定义了一套标准的服务器-客户端通信方式(如通过 HTTP 或 stdio)。一个 MCP 服务器封装了对特定资源(如 PostgreSQL 数据库、GitHub API、公司内部 CRM)的所有操作,并以“工具”列表的形式暴露给客户端。
在 Dify 中,MCP 服务的价值是:
- 即插即用:Dify 作为 MCP 客户端,可以连接任何符合协议的 MCP 服务器,并自动将其工具导入到 Dify 的工具箱中。
- 统一管理:在 Dify 的“集成”->“工具”中集中管理所有 MCP 服务器连接和鉴权。
- 安全隔离:业务系统的凭证和连接细节保存在 MCP 服务器端或 Dify 的工具配置中,不会泄露给 LLM 或前端用户。
1.3 “工作流 + MCP”组合:构建岗位智能副驾的蓝图
将两者结合,就形成了构建企业级智能应用的强大模式:
- MCP 服务作为“手”和“眼”:负责与具体的业务系统交互,执行查询、更新、写入等原子操作。例如,一个“Salesforce MCP 服务器”提供了
search_contacts、create_opportunity等工具。 - Dify 工作流作为“大脑”和“流程控制器”:负责理解用户意图,组织调用一个或多个 MCP 工具,处理中间结果,进行逻辑判断,并生成最终响应。
这种架构使得“智能副驾”既能理解自然语言指令,又能可靠地操作业务系统,同时整个流程可视化、可调试、可迭代。接下来,我们将通过一个实战案例来具体实现这一蓝图。
2. 环境准备与 Dify 部署
为了完成后续的实操,你需要一个运行中的 Dify 环境。我们提供基于 Docker 的部署方式,这是最通用且易于管理的方式。
2.1 系统与环境要求
请确保你的部署机器满足以下最低要求:
| 组件 | 要求 | 说明 |
|---|---|---|
| 操作系统 | Linux, macOS, Windows (WSL2) | 生产环境推荐 Linux。Windows 用户请使用 WSL2。 |
| Docker | 20.10+ | 必须安装 Docker Engine 和 Docker Compose (v2)。 |
| Docker Compose | v2.0+ | 用于编排多容器服务。 |
| CPU | 4 核+ | 运行 LLM 服务或向量数据库时需求更高。 |
| 内存 | 8 GB+ | 16 GB 或以上能获得更好体验。 |
| 磁盘 | 50 GB+ | 用于存储镜像、数据库和文件。 |
在终端中执行以下命令验证环境:
# 检查 Docker 版本 docker --version # 检查 Docker Compose 版本 docker compose version # 检查系统资源(Linux/Mac) free -h df -h2.2 使用 Docker Compose 部署 Dify
Dify 官方提供了标准的docker-compose.yml文件,可以一键启动所有依赖服务(包括数据库、Redis 等)。
创建项目目录并下载配置文件:
# 创建一个工作目录 mkdir dify-enterprise-demo && cd dify-enterprise-demo # 下载官方 docker-compose 配置文件 curl -o docker-compose.yml https://raw.githubusercontent.com/langgenius/dify/main/docker/docker-compose.yaml # 下载环境变量示例文件 curl -o .env.example https://raw.githubusercontent.com/langgenius/dify/main/docker/.env.example cp .env.example .env配置环境变量: 编辑
.env文件,这是配置 Dify 的关键。对于本地测试,你至少需要关注以下变量:# 编辑 .env 文件 vim .envOPENAI_API_KEY:如果你使用 OpenAI 的模型(如 GPT-4),在此填入你的 API Key。你也可以配置其他模型供应商,如 Azure OpenAI、Anthropic 等,对应修改MODEL_PROVIDER等变量。SECRET_KEY:用于加密的密钥,务必修改为一个强随机字符串。可以使用命令生成:openssl rand -base64 32。DB_PASSWORD和REDIS_PASSWORD:为数据库和 Redis 设置密码。- 其他配置如监听端口 (
HTTP_PORT)、日志级别等可按需调整。
一个最小化的
.env配置示例如下(使用 OpenAI):# 模型供应商配置 MODEL_PROVIDER=openai OPENAI_API_KEY=sk-your-openai-api-key-here # 安全密钥 SECRET_KEY=your-generated-secret-key-here # 数据库密码 DB_PASSWORD=your-db-password REDIS_PASSWORD=your-redis-password # 服务端口 HTTP_PORT=80启动 Dify 服务:
# 在后台启动所有服务 docker compose up -d首次启动会拉取多个镜像,包括 Dify 的 API 服务器、前端 Web 应用、PostgreSQL、Redis 等,需要一些时间。
验证部署:
# 查看容器运行状态 docker compose ps当所有容器的状态均为
running后,在浏览器中访问http://你的服务器IP:端口(默认是http://localhost:80)。你应该能看到 Dify 的登录界面。首次使用需要注册一个管理员账号。
2.3 常见部署问题排查
部署过程中可能会遇到一些问题,以下是快速排查指南:
| 问题现象 | 可能原因 | 检查与解决 |
|---|---|---|
访问localhost:80连接被拒绝 | 1. 容器未成功启动。 2. 端口被占用。 3. Windows 未使用 WSL2。 | 1.docker compose logs查看日志。2. netstat -tuln | grep :80检查端口。3. 修改 .env中的HTTP_PORT为其他端口(如3000)。 |
日志显示db或redis连接失败 | 1. 数据库容器启动慢。 2. 网络问题。 3. 密码错误。 | 1. 等待几分钟再试,或docker compose logs db查看数据库日志。2. 确保 .env中DB_PASSWORD和REDIS_PASSWORD与docker-compose.yml中对应。 |
| 前端页面能打开,但登录/注册后白屏或报错 | 1. API 服务未正常运行。 2. 浏览器跨域问题(非标准端口)。 3. 前端资源加载失败。 | 1.docker compose logs api查看后端 API 日志。2. 检查浏览器控制台 (F12) 的网络请求错误。 3. 尝试清除浏览器缓存或使用无痕模式。 |
启动时提示Got error code: -500 | 常见于升级后或文件权限问题。 | 1. 确保storage目录(如果挂载了)有正确权限。2. 尝试完全清理后重新部署: docker compose down -v然后docker compose up -d。 |
注意:生产环境部署需要考虑更多因素,如使用独立的数据库、配置 HTTPS、设置资源限制、配置备份和监控等。本文以开发测试环境为例。
3. 设计并实现一个销售线索跟进工作流
假设我们为销售团队构建一个“智能副驾”,其核心功能是:当销售输入一个潜在客户的公司名称或描述时,副驾能自动查询该客户的公开信息、评估线索质量、并生成初步的跟进建议。我们将分步实现这个工作流。
3.1 工作流规划与节点设计
在开始拖拽之前,先在纸上或脑中规划流程:
- 输入:销售输入客户描述(如“一家做跨境电商的深圳初创公司,最近在寻求A轮融资”)。
- 信息提取:调用 LLM 从描述中结构化提取关键字段(公司名、行业、地点、需求等)。
- 信息增强:调用一个“企业信息查询”工具(这里我们先模拟,后续用 MCP 实现)获取更多公开信息。
- 质量评估:根据预设规则(如行业匹配度、融资阶段、地点)对线索打分。
- 建议生成:调用 LLM 结合所有信息,生成个性化的跟进话术和下一步行动建议。
- 输出:将结构化评估结果和建议返回给销售。
3.2 在 Dify 中创建工作流
- 登录 Dify,进入主控制台。
- 创建新应用:点击“创建新应用”,选择“工作流”类型,命名为“销售线索智能评估副驾”,并添加描述。
- 进入工作流编辑器:创建后会自动进入画布编辑器。你会看到两个默认节点:“开始”和“对话输入”。
3.3 编排核心工作流节点
我们将从左到右搭建流程。以下是关键节点的添加和配置方法:
第一步:设置输入
- “对话输入”节点已经存在。你可以双击它,在右侧面板中修改“变量”名称,例如改为
customer_description,并给一个提示语占位符,如“请描述您发现的潜在客户”。
第二步:添加 LLM 节点进行信息提取
- 从左侧节点库的“AI 模型”分类中,拖拽一个“LLM”节点到画布,放在“对话输入”节点右侧。
- 连接“对话输入”的输出到“LLM”节点的输入。
- 配置 LLM 节点:
- 模型:选择你已配置的模型(如 gpt-4o-mini)。
- 提示词:编写一个系统提示词,要求模型进行结构化提取。
你是一个销售助理。请从用户的描述中提取关于潜在客户的关键信息,并以严格的 JSON 格式返回。 JSON 必须包含以下字段: - company_name: 公司名称,如果未提及则推断一个通用名称。 - industry: 所属行业。 - location: 所在城市或地区。 - customer_need: 客户当前明确的需求或痛点。 - scale: 公司规模,如“初创”、“中小型”、“大型”。 - funding_stage: 融资阶段,如“未融资”、“天使轮”、“A轮”等。 用户描述:{{customer_description}} - 上下文:勾选“添加上下文”,将
customer_description变量引入。 - 输出:在“回复模式”下,选择“JSON”。这样节点会尝试解析 LLM 的输出为 JSON 对象。将输出变量命名为
extracted_info。
第三步:添加代码节点模拟信息增强由于我们还没有真实的 MCP 服务,先用一个“代码”节点模拟查询。
- 从“工具”分类拖拽一个“代码”节点(Python)到画布,放在 LLM 节点右侧。
- 连接
extracted_info到代码节点的输入。 - 配置代码节点:
- 编写 Python 代码,模拟根据公司名和行业查询到一些额外信息。
from typing import Dict, Any import json def main(extracted_info: Dict[str, Any]) -> Dict[str, Any]: # 模拟从某个数据源查询到的增强信息 mock_enhanced_data = { "registered_capital": "500万人民币", "established_year": 2020, "competitors": ["Shopify", "Magento"], "credit_rating": "良好", "recent_news": "近期获得红杉资本关注" } # 将提取的信息和增强信息合并 result = {**extracted_info, **mock_enhanced_data} return result- 将输出变量命名为
enhanced_info。
第四步:添加分类器节点进行质量评估
- 从“逻辑”分类拖拽一个“分类器”节点到画布。
- 连接
enhanced_info到分类器节点的输入。 - 配置分类器节点:
- 分类依据:选择“条件”。我们将根据规则给线索打分。
- 添加条件:
- 条件1:
{{enhanced_info.industry}}包含电商或跨境-> 输出值设为high_priority(高分)。 - 条件2:
{{enhanced_info.funding_stage}}等于A轮-> 输出值设为high_priority。 - 条件3:
{{enhanced_info.scale}}等于大型-> 输出值设为medium_priority(中分)。 - 默认条件:输出值设为
low_priority(低分)。
- 条件1:
- 将输出变量命名为
lead_score。
第五步:添加第二个 LLM 节点生成建议
- 再拖拽一个“LLM”节点。
- 连接
enhanced_info和lead_score到该节点的输入。 - 配置该 LLM 节点:
- 提示词:
你是一名资深销售总监。请根据以下客户信息和线索评分,为销售同事撰写一份跟进建议。 客户信息: {{enhanced_info}} 线索评分:{{lead_score}} 请从以下方面给出建议: 1. 开场白话术建议(针对客户需求)。 2. 本次沟通的核心目标。 3. 需要提前准备的资料或问题。 4. 如果评分高,建议的跟进紧迫度。 请以清晰、专业的要点形式输出。 - 将输出变量命名为
followup_advice。
- 提示词:
第六步:设置最终输出
- 从“节点库”拖拽一个“回答”节点到画布最右侧。
- 连接
followup_advice到“回答”节点的输入。 - 你还可以在“回答”节点前加一个“变量组合器”节点,将
enhanced_info、lead_score、followup_advice组合成一个更结构化的 JSON 再输出,便于其他系统调用。
最终,你的工作流画布应该类似下图(文字描述):
[开始] -> [对话输入: customer_description] -> [LLM提取: extracted_info] -> [代码模拟增强: enhanced_info] -> [分类器评分: lead_score] -> [LLM生成建议: followup_advice] -> [回答](注:enhanced_info同时通向分类器和第二个 LLM)
3.4 测试与调试工作流
- 保存工作流:点击右上角“保存”。
- 进入对话测试:点击右上角“发布”,然后选择“体验地址”或直接在编辑器点击右上角“测试”。
- 输入测试:在右侧对话窗输入“一家做智能硬件的北京公司,大概50人,正在寻找B轮融资”。
- 查看运行过程:提交后,你可以点击画布上的每个节点,在右侧查看其详细的输入/输出,这对于调试至关重要。你应该能看到
extracted_info是一个 JSON,lead_score可能是high_priority,最后得到一段文本建议。 - 迭代优化:根据测试结果,调整提示词、分类规则或模拟数据。
至此,一个纯逻辑的、模拟外部数据的工作流已经完成。但它的“信息增强”环节还是硬编码的模拟数据。接下来,我们将用真实的 MCP 服务来替换这个模拟环节。
4. 集成 MCP 服务:连接真实业务系统
MCP 服务是连接 Dify 工作流与外部世界的桥梁。我们将创建一个简单的 MCP 服务器来模拟“企业信息查询”服务,然后在 Dify 中连接它,并改造之前的工作流。
4.1 创建一个简单的 MCP 服务器(示例)
我们将使用 Node.js 和@modelcontextprotocol/sdk来快速创建一个 MCP 服务器。请确保你的环境已安装 Node.js (>=18)。
初始化项目:
mkdir mcp-company-info-server && cd mcp-company-info-server npm init -y npm install @modelcontextprotocol/sdk创建服务器文件
server.js:import { Server } from '@modelcontextprotocol/sdk/server/index.js'; import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js'; // 1. 创建 Server 实例 const server = new Server( { name: 'company-info-server', version: '0.1.0', }, { capabilities: { tools: {}, }, } ); // 2. 定义工具列表 const tools = [ { name: 'query_company_info', description: '根据公司名称和行业,查询公开的企业基本信息、融资历史和舆情。', inputSchema: { type: 'object', properties: { companyName: { type: 'string', description: '公司全称或简称', }, industry: { type: 'string', description: '所属行业', } }, required: ['companyName'], }, }, { name: 'search_company_news', description: '搜索公司近期的相关新闻。', inputSchema: { type: 'object', properties: { companyName: { type: 'string', description: '公司名称', }, keywords: { type: 'string', description: '额外的搜索关键词', } }, required: ['companyName'], }, } ]; // 3. 处理 ListTools 请求(客户端查询可用工具) server.setRequestHandler(ListToolsRequestSchema, async () => { return { tools: tools, }; }); // 4. 处理 CallTool 请求(客户端调用工具) server.setRequestHandler(CallToolRequestSchema, async (request) => { const { name, arguments: args } = request.params; console.error(`[MCP Server] Tool called: ${name}`, args); // 模拟工具执行逻辑 if (name === 'query_company_info') { const { companyName, industry } = args; // 这里应该是真实的数据库或 API 调用,此处模拟返回 return { content: [ { type: 'text', text: JSON.stringify({ companyName: companyName, industry: industry || '未指定', registrationStatus: '存续', estimatedRevenue: '1000-5000万', latestFunding: '2023年A轮,数千万人民币', riskIndicators: '无异常', suggestion: '该客户成长性较好,建议重点跟进融资需求。' }, null, 2) } ], }; } else if (name === 'search_company_news') { const { companyName, keywords } = args; return { content: [ { type: 'text', text: JSON.stringify({ companyName: companyName, news: [ { title: `${companyName}发布新一代产品`, source: '科技媒体', date: '2024-06-01' }, { title: `传${companyName}正进行新一轮融资洽谈`, source: '财经网', date: '2024-05-15' } ] }, null, 2) } ], }; } else { throw new Error(`Unknown tool: ${name}`); } }); // 5. 启动服务器,使用 stdio 传输(便于 Dify 通过子进程调用) async function main() { const transport = new StdioServerTransport(); await server.connect(transport); console.error('[MCP Server] Started on stdio'); } main().catch((error) => { console.error('[MCP Server] Error:', error); process.exit(1); });更新
package.json,添加type字段和启动脚本:{ "name": "mcp-company-info-server", "version": "0.1.0", "type": "module", "scripts": { "start": "node server.js" }, "dependencies": { "@modelcontextprotocol/sdk": "^1.0.0" } }测试服务器(可选): 你可以使用 MCP 客户端工具(如
mcp-cli)进行测试,但更简单的方式是直接运行看是否有错误:node server.js程序会挂起,等待 stdio 输入,这是正常的。按
Ctrl+C退出。
这个服务器模拟了两个工具:query_company_info和search_company_news。在实际生产中,你需要将其替换为真正的数据库查询、内部 API 调用或第三方服务集成。
4.2 在 Dify 中连接 MCP 服务器
Dify 支持通过 HTTP 或 stdio 连接 MCP 服务器。对于本地开发,使用 stdio 更简单。我们需要将服务器包装成一个 Dify 能调用的命令。
创建连接脚本(推荐): 在与
server.js同目录下,创建一个可执行脚本run_server.sh(Linux/Mac)或run_server.bat(Windows)。- Linux/Mac (
run_server.sh):
然后赋予执行权限:#!/bin/bash cd /path/to/your/mcp-company-info-server node server.jschmod +x run_server.sh - Windows (
run_server.bat):@echo off cd C:\path\to\your\mcp-company-info-server node server.js
- Linux/Mac (
在 Dify 中添加 MCP 服务器:
- 登录 Dify,进入“集成” -> “工具”。
- 点击“添加工具”,选择“MCP”。
- 配置服务器:
- 名称:企业信息查询服务
- 服务器标识符:
company_info_server(保持唯一性,应用会引用此ID) - 传输方式:选择“命令”。在“命令”字段中,填写你的脚本的绝对路径。例如:
/home/user/dify-demo/mcp-company-info-server/run_server.sh或C:\dify-demo\mcp-company-info-server\run_server.bat。 - 鉴权:我们的示例服务器不需要鉴权,保持“无”即可。
- 点击“添加”。Dify 会尝试执行命令并连接服务器,成功后会在下方显示导入的工具列表(
query_company_info和search_company_news)。
重要提示:确保 Dify 的 Docker 容器有权限执行该脚本,并且 Node.js 环境可用。在生产环境中,通常会将 MCP 服务器部署为独立的 HTTP 服务,然后在 Dify 中使用“URL”方式连接,这样更稳定且易于管理。
4.3 在工作流中使用 MCP 工具
现在,我们可以用真实的 MCP 工具替换掉之前工作流中的模拟“代码”节点。
- 修改工作流:回到“销售线索智能评估副驾”工作流编辑器。
- 删除或禁用之前的“代码(Python)”节点。
- 添加工具节点:从左侧节点库“工具”分类中,拖拽一个“工具”节点到画布,放在“LLM(信息提取)”节点之后。
- 配置工具节点:
- 在右侧面板,点击“选择工具”。
- 你应该能在列表中找到来自
company_info_server的query_company_info工具。选中它。 - 参数映射:将工具所需的参数与上游变量绑定。
companyName:绑定为{{extracted_info.company_name}}industry:绑定为{{extracted_info.industry}}
- 将工具节点的输出变量命名为
queried_company_info(注意,输出是一个包含content的复杂对象)。
- 处理工具输出:MCP 工具返回的
content通常是文本。我们需要用另一个“代码”节点将其解析为 JSON,以便后续使用。- 添加一个“代码(Python)”节点。
- 连接
queried_company_info到其输入。 - 编写解析代码:
from typing import Dict, Any import json def main(queried_company_info: Dict[str, Any]) -> Dict[str, Any]: # MCP 工具返回的结构是 {"content": [{"type": "text", "text": "..."}]} # 提取 text 字段并解析为 JSON if queried_company_info and "content" in queried_company_info: for item in queried_company_info["content"]: if item.get("type") == "text": try: info = json.loads(item["text"]) return info except json.JSONDecodeError: return {"error": "Failed to parse tool response", "raw_text": item["text"]} return {"error": "No valid content from tool"} - 将输出变量命名为
enhanced_info_real。
- 更新下游节点:将“分类器”节点和第二个“LLM”节点的输入,从原来的
enhanced_info(模拟)改为enhanced_info_real(来自 MCP)。 - 保存并测试:发布工作流并测试。现在,当输入客户描述时,工作流会先提取结构化信息,然后调用 MCP 服务器查询模拟的企业信息,再进行评分和建议。你可以在工具节点的运行详情中看到调用请求和返回的原始数据。
通过以上步骤,我们成功将外部能力(即使是模拟的)通过标准化的 MCP 协议集成到了 Dify 工作流中。你可以用同样的方式集成数据库、CRM、ERP 等任何系统的 MCP 服务器。
5. 进阶配置、排错与最佳实践
将工作流和 MCP 跑通只是第一步。要让其成为稳定可靠的企业级应用,还需要关注配置细节、错误处理和运维实践。
5.1 MCP 服务器连接与鉴权进阶
- HTTP 传输:对于生产环境,强烈建议将 MCP 服务器部署为 HTTP 服务。在 Dify 中添加时选择“URL”,并填写服务器的端点(如
http://your-mcp-server:8080)。这提供了更好的可观测性、负载均衡和故障恢复能力。 - OAuth 鉴权:如果 MCP 服务器需要 OAuth,Dify 支持“动态客户端注册”。在添加工具时,如果服务器支持,Dify 可以自动完成注册。否则,需要手动提供
Client ID、Client Secret和Redirect URL。 - 自定义请求头:对于使用 API Key 或静态 Token 鉴权的服务,可以在“高级选项”中添加自定义请求头,例如
Authorization: Bearer your-api-key-here。 - 超时设置:如果工具调用缓慢,可以在“高级选项”中调整“请求超时”和“SSE 读取超时”。
5.2 工作流优化与错误处理
- 变量类型与转换:注意 Dify 中变量的类型。LLM 的 JSON 输出是对象,工具输出可能是包含
content的对象,代码节点可以处理各种类型。在变量引用时,使用{{variable.field}}访问对象属性。对于可能出错的解析,像我们上面做的那样,在代码节点中加入try...except。 - 条件分支与错误流:工作流目前是直线式的。在实际应用中,应为关键步骤(如工具调用、LLM 调用)添加错误处理分支。例如,可以在工具节点后连接一个“分类器”,判断输出是否包含
error字段,如果是,则跳转到一个直接返回错误信息的“回答”节点,而不是继续执行后续流程。 - 迭代器处理列表:如果 MCP 工具返回一个公司列表,你可以使用“迭代器”节点来遍历列表,并对每一项执行相同的处理流程(如逐个评估)。
- 提示词工程:工作流中的 LLM 提示词需要精心设计。明确指令、提供示例(Few-shot)、规定输出格式(如 JSON)能极大提高稳定性。将长篇提示词保存在“提示词编排”中复用是好的实践。
5.3 常见问题排查清单
当你的“智能副驾”应用出现问题时,可以按以下顺序排查:
| 问题域 | 现象 | 排查步骤 |
|---|---|---|
| 工作流不执行 | 点击测试无反应,或卡在某个节点。 | 1. 检查工作流是否已“发布”。 2. 在“运行历史”中查看具体任务的日志和每个节点的输入输出。 3. 检查起始节点(对话输入)的变量是否被正确传递。 |
| LLM 节点报错 | 节点显示执行失败,错误信息涉及模型。 | 1. 检查 Dify 后台“模型供应商”配置是否正确,API Key 是否有效、有余额。 2. 检查提示词中变量引用 {{var}}语法是否正确,变量是否存在。3. 如果要求 JSON 输出,检查 LLM 是否返回了合法 JSON。可在提示词中强化格式要求。 |
| MCP 工具调用失败 | 工具节点显示红色,提示连接失败或超时。 | 1. 在“集成”->“工具”中,找到对应的 MCP 服务器,点击“更新工具列表”测试连接。 2. 检查 MCP 服务器进程是否在运行( ps aux | grep node)。3. 查看 Dify 容器日志 docker compose logs api,寻找 MCP 相关错误。4. 检查命令或 URL 是否正确,网络是否连通(对于 HTTP,可在容器内用 curl测试)。5. 检查 MCP 服务器自身的日志(我们示例中用了 console.error)。 |
| 工具返回结果解析错误 | 代码节点报错,无法解析工具输出。 | 1. 在工具节点的运行详情中,查看其返回的原始数据结构。 2. 调整代码节点中的解析逻辑,匹配实际数据结构。MCP 标准返回是 {"content": [{"type": "text", "text": "..."}]},但具体内容取决于服务器实现。 |
| 分类器条件不生效 | 分类器总是走到默认分支。 | 1. 检查输入到分类器的变量路径是否正确,例如{{enhanced_info_real.industry}}。2. 检查条件表达式,字符串比较是否大小写敏感, 包含和等于的使用是否正确。3. 在分类器节点的运行详情中,查看输入变量的实际值。 |
| 应用响应慢 | 一次查询耗时很长。 | 1. 检查每个节点的执行时间。LLM 调用通常是瓶颈。 2. 考虑是否可以将非顺序依赖的节点并行化(工作流支持并行分支)。 3. 检查 MCP 服务器响应时间,优化其性能或增加超时设置。 |
5.4 生产环境最佳实践
- MCP 服务器部署:将 MCP 服务器容器化(Docker),并使用 Kubernetes 或 Docker Swarm 进行编排,确保高可用。为 MCP 服务器配置独立的监控和日志收集。
- 凭证管理:不要在代码或配置文件中硬编码 API Key、数据库密码等敏感信息。对于 Dify,使用环境变量或密钥管理服务。对于 MCP 服务器,同样通过环境变量注入配置。
- 工作流版本控制:Dify 的工作流更改是实时生效的。对于重要应用,在修改前,使用“复制为版本”功能创建备份。考虑建立工作流变更的评审流程。
- 测试与监控:为关键工作流创建自动化测试用例,模拟各种输入。利用 Dify 的“日志与标注”功能,持续收集用户反馈,优化提示词和工作流逻辑。
- 权限控制:在 Dify 工作空间中,利用成员和角色功能,控制谁可以编辑工作流、谁只能使用应用。对于 MCP 服务器,根据调用方实施 API 级别的访问控制。
- 性能与成本:优化提示词,减少不必要的 Token 消耗。对于频繁调用的 MCP 工具,考虑增加缓存层。监控 LLM API 和自有 MCP 服务器的调用量和响应时间。
通过 Dify 工作流编排业务逻辑,通过 MCP 服务集成外部能力,这种架构为构建岗位专属的“智能副驾”提供了清晰、可维护的路径。从简单的信息查询到复杂的多系统协同操作,你都可以通过可视化拖拽和标准协议连接来实现,从而让 AI 真正融入业务流程,提升具体岗位的效率和决策质量。