综述由AI生成如何利用模型上下文协议(MCP)将 Dify 大语言模型应用平台与 MySQL 数据库进行深度整合。通过搭建 MCP Server 环境、配置 Dify 插件与工作流、设置 Agent 策略及提示词,实现了自然语言到 SQL 查询的转换。文章涵盖了环境准备、表结构创建、数据录入、工作流测试及常见问题排查,展示了 AI 驱动数据库操作的实际落地方案。
RustyLab26 浏览
引言:技术融合的奇妙开篇
在当今数字化时代,数据管理与人工智能技术的融合日益紧密。Dify 作为一款强大的大语言模型应用开发平台,通过 MCP(模型上下文协议)与 MySQL 这一广泛使用的关系型数据库进行整合,为开发者们打开了一扇通往高效数据处理与智能应用开发的新大门。这种整合不仅能充分发挥 Dify 在自然语言处理和 AI 应用构建方面的优势,还能借助 MySQL 出色的数据存储和管理能力,实现更复杂、更智能的数据驱动型应用开发,极大地拓展了应用的功能边界和实用性。
认识主角:Dify、MCP 与 MySQL
(一)Dify:大语言模型应用开发利器
Dify 是一款极具创新性的开源大语言模型(LLM)应用开发平台,它将后端即服务(Backend as Service, BaaS)与 LLMOps 理念巧妙融合,为开发者打造了一个便捷高效的 AI 应用开发环境。其低代码/无代码开发模式堪称一大亮点,通过直观的可视化界面,开发者只需简单的拖拽和配置操作,就能轻松定义 Prompt(提示词)、上下文以及插件等关键要素,无需在底层技术细节中耗费过多精力,这使得开发门槛大幅降低,即使是编程经验相对较少的人员也能参与到 AI 应用的开发中来。
Dify 还采用了模块化设计,各个模块功能明确、接口清晰,开发者可以根据具体的项目需求,灵活选择并组合使用这些模块,从而构建出高度个性化的 AI 应用。在功能组件方面,Dify 更是提供了丰富多样的选择,涵盖 AI 工作流、RAG 管道、Agent、模型管理等多个领域,全面支持从应用原型设计到实际生产部署的整个过程。同时,Dify 对多种主流大型语言模型提供了良好的支持,包括 OpenAI 的 GPT 系列、Claude3 等,开发者可以根据应用场景和性能要求,自由选择最契合的模型,进一步提升应用的智能水平和适应性。
(二)MCP:连接的桥梁
MCP,即模型上下文协议(Model Context Protocol),在 Dify 与 MySQL 的整合中扮演着至关重要的桥梁角色。作为一项新兴的开放协议,MCP 为大语言模型与外部应用之间搭建了一条双向通信通道,宛如 AI 世界里的'USB-C'接口,让模型能够便捷地发现、理解并安全调用各种外部工具或 API。
在 Dify 通过 MCP 整合 MySQL 的场景中,MCP 主要发挥了两方面关键作用。一方面,它提供了统一的协议支持,使得 Dify 中的大语言模型能够以标准化的方式与 MySQL 进行交互,避免了因不同数据库接口差异而带来的复杂适配工作。另一方面,MCP 还具备强大的工具调用能力,允许 Dify 根据用户的需求和指令,动态地调用 MySQL 相关的工具和功能,实现对数据库中数据的查询、更新、插入等操作,从而将大语言模型的智能处理能力与 MySQL 的数据存储和管理能力紧密结合起来,为开发者创造出更多的应用可能性。
(三)MySQL:经典数据库
MySQL 作为一款开源的关系型数据库管理系统,在数据存储和管理领域拥有着广泛的应用和卓越的声誉。它具备众多显著的优势,使其成为了众多企业和开发者的首选数据库之一。
MySQL 以其高度的可靠性和稳定性著称,经过长时间的发展和大规模应用的验证,它能够在各种复杂的环境下稳定运行,确保数据的安全存储和可靠访问,无论是面对小规模的个人项目,还是大规模的企业级应用,MySQL 都能从容应对。在性能方面,MySQL 表现出色,采用了高效的索引和查询优化技术,能够快速处理大规模数据和高并发的访问请求,迅速响应用户的查询和操作指令,为应用提供流畅的运行体验。此外,MySQL 还具备出色的可扩展性,支持水平和垂直扩展,能够根据业务的发展和数据量的增长,灵活地进行部署和配置调整,满足不断变化的业务需求。同时,MySQL 丰富的生态系统也为开发者提供了便利,大量的开源工具、第三方插件和扩展可供选择,进一步增强了其功能和应用场景。
准备工作:搭建融合舞台
(一)环境搭建
在开始整合 Dify 与 MySQL 之前,需要确保开发环境准备就绪。主要涉及 Python 环境以及相关插件的安装,建议使用 Python 3.8 及以上版本,以确保与后续安装的库和工具具有良好的兼容性。同时,为了实现 Dify 与 MySQL 之间基于 MCP 的通信和数据交互,还需要安装一些关键的插件和依赖库。例如,用于支持 MCP 协议的相关插件,以及能够实现 Dify 与 MySQL 进行连接和数据操作的数据库驱动插件等,具体版本可根据官方文档和实际测试来确定,以保障系统的稳定性和功能的完整性。
docker compose ps
NAME IMAGE SERVICE CREATED STATUS PORTS
docker-api-1 langgenius/dify-api:1.2.0 api 25 hours ago Up 25 hours 5001/tcp
docker-db-1 postgres:15-alpine db 25 hours ago Up 25 hours (healthy) 5432/tcp
docker-nginx-1 nginx:latest nginx 25 hours ago Up 25 hours 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::80->80/tcp
docker-plugin_daemon-1 langgenius/dify-plugin-daemon:0.0.7-local plugin_daemon 25 hours ago Up 25 hours 0.0.0.0:5003->5003/tcp, :::5003->5003/tcp
docker-redis-1 redis:6-alpine redis 25 hours ago Up 25 hours (healthy) 6379/tcp
docker-sandbox-1 langgenius/dify-sandbox:0.2.11 sandbox 25 hours ago Up 25 hours (healthy)
docker-ssrf_proxy-1 ubuntu/squid:latest ssrf_proxy 25 hours ago Up 25 hours 3128/tcp
docker-weaviate-1 semitechnologies/weaviate:1.19.0 weaviate 25 hours ago Up 25 hours
docker-web-1 langgenius/dify-web:1.2.0 web 25 hours ago Up 25 hours 3000/tcp
docker-worker-1 langgenius/dify-api:1.2.0 worker 25 hours ago Up 25 hours 5001/tcp
CREATE TABLE `students` (
`id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '学号,示例:S20230101',
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '学生姓名,示例:王强',
`gender` enum('男','女') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULLDEFAULT'男' COMMENT '性别,"男"或"女",示例:男',
`birthDate` datetime NOT NULL COMMENT '出生日期,示例:2005-01-15',
`classId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '班级 ID,外键 (classes.id),示例:202301',
`phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '联系电话,示例:13812345678',
`email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '电子邮箱,示例:[email protected]',
`emergencyContact` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '紧急联系人电话,示例:13876543210',
`address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '家庭住址,示例:北京市海淀区中关村大街 1 栋 101 室',
`height` intNOT NULL COMMENT '身高 (cm),示例:175',
`weight` intNOT NULL COMMENT '体重 (kg),示例:65',
`healthStatus` enum('良好','一般','较差') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULLDEFAULT'良好' COMMENT '健康状况,示例:良好',
PRIMARY KEY (`id`),
KEY `classId` (`classId`),
CONSTRAINT `classId` FOREIGN KEY (`classId`) REFERENCES `classes` (`id`) ONDELETE CASCADE ONUPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='学生表';
教师表
CREATE TABLE `teachers` (
`id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '教师 ID,示例:T001',
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '教师姓名,示例:张建国',
`gender` enum('男','女') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULLDEFAULT'男' COMMENT '性别,"男"或"女",示例:男',
`subject` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '教授科目,示例:数学',
`title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '职称,示例:教授',
`phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '联系电话,示例:13812345678',
`office` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '办公室位置,示例:博学楼 301',
`wechat` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULTNULL COMMENT '微信,示例:lily_teacher',
`isHeadTeacher` enum('true','false') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT'false' COMMENT '是否为班主任,示例:true',
PRIMARY KEY (`id`,`office`) USING BTREE,
KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='教师表';
工作原理:Agent 节点根据配置的指令和策略,识别出这是一个需要查询 MySQL 数据库的任务,然后通过 MCP 协议调用相应的 MySQL 工具。该工具将问题转化为 SQL 查询语句,并发送到 MySQL 数据库进行执行。假设数据库中存储教师和学生信息的表分别为 teachers 和 students,且 students 表中有一个字段 teacher_id 用于关联 teachers 表,那么生成的 SQL 查询语句可能类似于:
SELECT teachers.teacher_name, COUNT(students.student_id) AS student_count FROM teachers JOIN students ON teachers.teacher_id = students.teacher_id GROUPBY teachers.teacher_name ORDERBY student_count DESC LIMIT 1;
地址或端口错误:在配置 MCP SSE 的 MySQL 服务地址和端口时,填写错误。如将 IP 地址写错,或者端口号与 MySQL 实际监听的端口不一致。
MySQL 服务未正常运行:MySQL 服务器端的服务可能未启动,或者在运行过程中出现异常停止,导致无法响应 Dify 的连接请求。
解决方案:
检查网络和防火墙:在 MySQL 服务器上,检查防火墙设置,确保 Dify 所在服务器的 IP 地址能够访问 MySQL 的端口。在 Linux 系统中,若使用的是 ufw 防火墙,可通过 sudo ufw allow 3306 命令开放 3306 端口(假设 MySQL 使用默认端口)。对于 CentOS 系统,使用 firewall-cmd --zone=public --add-port=3306/tcp --permanent 命令添加端口规则,并执行 sudo firewall-cmd --reload 使规则生效。同时,可使用 ping 命令测试两台服务器之间的网络连通性,使用 telnet 命令测试端口是否可访问,如 telnet mysql_server_ip 3306。
确认地址和端口:仔细检查 MCP SSE 配置中填写的 MySQL 服务地址和端口,确保与 MySQL 服务器的实际配置一致。可登录 MySQL 服务器,查看 MySQL 配置文件(通常是 my.cnf 或 my.ini),确认 bind-address 和 port 参数的设置。
检查 MySQL 服务状态:在 MySQL 服务器上,使用 sudo systemctl status mysql 命令检查 MySQL 服务是否正在运行。若服务未运行,可使用 sudo systemctl start mysql 命令启动服务。如果服务启动失败,查看 MySQL 的错误日志(通常位于 /var/log/mysql/error.log),根据日志信息排查具体原因,如数据库文件损坏、配置错误等。
(二)工具调用错误
错误描述:在 Dify 工作流中,配置好 Agent 策略和工具列表后,调用 MySQL 相关工具时,提示'找不到工具'或'工具调用失败'等错误。