这里写目录标题
随着 DeepSeek 的爆火,众多企业渴望部署专属的本地大模型,并与自身业务系统深度融合。本文将展示如何借助 Dify 的 Agent 与 DeepSeek 大模型,高效查询 MySQL 数据
1.MySQL数据准备
- 创建测试库
create database dify_test
- 创建测试表
创建表1
CREATE TABLE `host` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`ApplicationID` varchar(128) DEFAULT NULL COMMENT '应用ID',
`AssetID` int(11) DEFAULT NULL COMMENT '资产ID',
`BakOperator` varchar(128) DEFAULT '' COMMENT '备份操作人',
`Cpu` int(3) NOT NULL DEFAULT '0' COMMENT 'CPU',
`CreateTime` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '创建日期',
`Description` varchar(256) DEFAULT '' COMMENT '备注',
`Env` varchar(20) DEFAULT NULL,
`DeviceClass` varchar(50) DEFAULT '一级',
`HostName` varchar(32) NOT NULL DEFAULT '' COMMENT '主机名',
`InnerIP` varchar(128) NOT NULL DEFAULT '' COMMENT '网内地址',
`LastTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新日期',
`Mem` int(8) NOT NULL DEFAULT '0',
`OS_kernel` varchar(128) DEFAULT NULL,
`Operator` varchar(128) DEFAULT '' COMMENT '管理员',
`OS_type` varchar(128) NOT NULL DEFAULT '' COMMENT '系统类型',
`OuterIP` varchar(128) NOT NULL DEFAULT '' COMMENT '外网地址',
`Status` varchar(10) DEFAULT '1',
`Extend001` varchar(255) NOT NULL DEFAULT '',
`Extend002` varchar(255) NOT NULL DEFAULT '',
`Extend003` varchar(255) NOT NULL DEFAULT '',
`Extend004` varchar(255) NOT NULL DEFAULT '',
`Extend005` varchar(255) NOT NULL DEFAULT '',
`Disk_mount` varchar(255) DEFAULT NULL COMMENT '硬盘挂载信息',
`Disk` int(8) DEFAULT NULL COMMENT '硬盘信息',
`IdcName` varchar(128) DEFAULT '' COMMENT '机房名称',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=614 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='主机记录表' ;
创建表2
CREATE TABLE `server` (
`ApplicationID` int(11) DEFAULT NULL COMMENT '应用ID',
`ID` int(64) NOT NULL AUTO_INCREMENT COMMENT '主键',
`HardMemo` varchar(16) NOT NULL DEFAULT '' COMMENT '服务器品牌型号',
`Cpu_model` varchar(128) DEFAULT '0' COMMENT 'CPU',
`Cpu_number` int(4) DEFAULT NULL COMMENT '物理cpu个数',
`HostName` varchar(32) NOT NULL DEFAULT '',
`DeviceClass` varchar(50) DEFAULT '一级',
`Region` varchar(8) DEFAULT '' COMMENT '区域-ucloud使用',
`OS_type` varchar(32) DEFAULT '' COMMENT '系统类型',
`OS_kernel` varchar(32) NOT NULL DEFAULT '' COMMENT '系统内核',
`SN` varchar(32) NOT NULL DEFAULT '' COMMENT 'SN编号',
`ServerRack` varchar(16) NOT NULL DEFAULT '' COMMENT '架机号',
`CreateTime` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '创建日期',
`IdcName` varchar(128) DEFAULT '' COMMENT '房机名称',
`LastTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新日期',
`Operator` varchar(128) NOT NULL DEFAULT '' COMMENT '理管员',
`BakOperator` varchar(128) DEFAULT '' COMMENT '备份操作人',
`Status` varchar(10) DEFAULT '1',
`ManagerIP` varchar(128) NOT NULL DEFAULT '' COMMENT '管理地址',
`Raid` varchar(255) DEFAULT NULL COMMENT 'raid级别',
`Is_virtualization` varchar(10) DEFAULT '1',
`InnerIP` varchar(128) NOT NULL DEFAULT '' COMMENT '网内地址',
`OuterIP` varchar(128) DEFAULT '' COMMENT '外网地址',
`Description` varchar(256) NOT NULL DEFAULT '' COMMENT '备注',
`Extend001` varchar(255) DEFAULT NULL,
`Extend003` varchar(255) DEFAULT '',
`Extend004` varchar(255) DEFAULT '',
`Extend005` varchar(255) DEFAULT '',
`Extend002` varchar(255) DEFAULT '',
`Cpu_cores` int(4) DEFAULT NULL COMMENT 'cpu核数',
`Mem` int(18) DEFAULT '0',
`Disk_mount` varchar(2000) DEFAULT NULL COMMENT '硬盘分区',
`Disk_total` int(255) DEFAULT NULL COMMENT '硬盘',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='服务器记录表';
- 插入表数据
host表插入数据
INSERT INTO `host` VALUES (614, 'app001', 1001, 'admin', 4, '2023-10-10 10:00:00', '测试主机1', 'prod', '一级', 'host1', '192.168.1.1', '2025-03-14 16:07:26', 8192, '5.4.0-80-generic', 'admin', 'Linux', '123.123.123.123', '1', 'ext1', 'ext2', 'ext3', 'ext4', 'ext5', '/dev/sda1', 500, 'IDC_A');
INSERT INTO `host` VALUES (615, 'app002', 1002, 'admin', 8, '2023-10-10 10:01:00', '测试主机2', 'dev', '一级', 'host2', '192.168.1.2', '2025-03-14 16:07:26', 16384, '5.4.0-80-generic', 'admin', 'Linux', '123.123.123.124', '1', 'ext1', 'ext2', 'ext3', 'ext4', 'ext5', '/dev/sda1', 1000, 'IDC_A');
INSERT INTO `host` VALUES (616, 'app003', 1003, 'admin', 4, '2023-10-10 10:02:00', '测试主机3', 'test', '一级', 'host3', '192.168.1.3', '2025-03-14 16:07:26', 4096, '5.4.0-80-generic', 'admin', 'Linux', '123.123.123.125', '1', 'ext1', 'ext2', 'ext3', 'ext4', 'ext5', '/dev/sda1', 250, 'IDC_B');
INSERT INTO `host` VALUES (617, 'app004', 1004, 'admin', 2, '2023-10-10 10:03:00', '测试主机4', 'prod', '二级', 'host4', '192.168.1.4', '2025-03-14 16:07:26', 2048, '5.4.0-80-generic', 'admin', 'Linux', '123.123.123.126', '1', 'ext1', 'ext2', 'ext3', 'ext4', 'ext5', '/dev/sda1', 100, 'IDC_B');
INSERT INTO `host` VALUES (618, 'app005', 1005, 'admin', 4, '2023-10-10 10:04:00', '测试主机5', 'dev', '一级', 'host5', '192.168.1.5', '2025-03-14 16:07:26', 8192, '5.4.0-80-generic', 'admin', 'Linux', '123.123.123.127', '1', 'ext1', 'ext2', 'ext3', 'ext4', 'ext5', '/dev/sda1', 500, 'IDC_C');
INSERT INTO `host` VALUES (619, 'app006', 1006, 'admin', 8, '2023-10-10 10:05:00', '测试主机6', 'test', '一级', 'host6', '192.168.1.6', '2025-03-14 16:07:26', 16384, '5.4.0-80-generic', 'admin', 'Linux', '123.123.123.128', '1', 'ext1', 'ext2', 'ext3', 'ext4', 'ext5', '/dev/sda1', 1000, 'IDC_C');
INSERT INTO `host` VALUES (620, 'app007', 1007, 'admin', 4, '2023-10-10 10:06:00', '测试主机7', 'prod', '二级', 'host7', '192.168.1.7', '2025-03-14 16:07:26', 4096, '5.4.0-80-generic', 'admin', 'Linux', '123.123.123.129', '1', 'ext1', 'ext2', 'ext3', 'ext4', 'ext5', '/dev/sda1', 250, 'IDC_D');
INSERT INTO `host` VALUES (621, 'app008', 1008, 'admin', 2, '2023-10-10 10:07:00', '测试主机8', 'dev', '一级', 'host8', '192.168.1.8', '2025-03-14 16:07:26', 2048, '5.4.0-80-generic', 'admin', 'Linux', '123.123.123.130', '1', 'ext1', 'ext2', 'ext3', 'ext4', 'ext5', '/dev/sda1', 100, 'IDC_D');
INSERT INTO `host` VALUES (622, 'app009', 1009, 'admin', 4, '2023-10-10 10:08:00', '测试主机9', 'test', '一级', 'host9', '192.168.1.9', '2025-03-14 16:07:26', 8192, '5.4.0-80-generic', 'admin', 'Linux', '123.123.123.131', '1', 'ext1', 'ext2', 'ext3', 'ext4', 'ext5', '/dev/sda1', 500, 'IDC_E');
INSERT INTO `host` VALUES (623, 'app010', 1010, 'admin', 8, '2023-10-10 10:09:00', '测试主机10', 'prod', '一级', 'host10', '192.168.1.10', '2025-03-14 16:07:26', 16384, '5.4.0-80-generic', 'admin', 'Linux', '123.123.123.132', '1', 'ext1', 'ext2', 'ext3', 'ext4', 'ext5', '/dev/sda1', 1000, 'IDC_E');
server表插入数据
INSERT INTO `server` VALUES (1, 33, 'Dell R740', 'Intel Xeon Gold 6130', 2, 'server1', '一级', 'region1', 'Linux', '5.4.0-80-generic', 'SN123456789', 'Rack1', '2023-10-10 10:00:00', 'IDC_A', '2025-03-14 16:11:29', 'admin', 'admin', '1', '192.168.1.1', 'RAID 10', '1', '192.168.1.1', '123.123.123.123', '测试服务器1', 'ext1', 'ext3', 'ext4', 'ext5', 'ext2', 16, 65536, '/dev/sda1,/dev/sdb1', 2000);
INSERT INTO `server` VALUES (2, 34, 'HP DL380', 'Intel Xeon Silver 4110', 1, 'server2', '一级', 'region2', 'Linux', '5.4.0-80-generic', 'SN987654321', 'Rack2', '2023-10-10 10:01:00', 'IDC_A', '2025-03-14 16:11:29', 'admin', 'admin', '1', '192.168.1.2', 'RAID 5', '1', '192.168.1.2', '123.123.123.124', '测试服务器2', 'ext1', 'ext3', 'ext4', 'ext5', 'ext2', 8, 32768, '/dev/sda1,/dev/sdb1', 1000);
INSERT INTO `server` VALUES (3, 35, 'Dell R740', 'Intel Xeon Gold 6130', 2, 'server3', '一级', 'region1', 'Linux', '5.4.0-80-generic', 'SN123456780', 'Rack1', '2023-10-10 10:02:00', 'IDC_B', '2025-03-14 16:11:29', 'admin', 'admin', '1', '192.168.1.3', 'RAID 10', '1', '192.168.1.3', '123.123.123.125', '测试服务器3', 'ext1', 'ext3', 'ext4', 'ext5', 'ext2', 16, 65536, '/dev/sda1,/dev/sdb1', 2000);
INSERT INTO `server` VALUES (4, 36, 'HP DL380', 'Intel Xeon Silver 4110', 1, 'server4', '一级', 'region2', 'Linux', '5.4.0-80-generic', 'SN987654320', 'Rack2', '2023-10-10 10:03:00', 'IDC_B', '2025-03-14 16:11:29', 'admin', 'admin', '1', '192.168.1.4', 'RAID 5', '1', '192.168.1.4', '123.123.123.126', '测试服务器4', 'ext1', 'ext3', 'ext4', 'ext5', 'ext2', 8, 32768, '/dev/sda1,/dev/sdb1', 1000);
INSERT INTO `server` VALUES (5, 37, 'Dell R740', 'Intel Xeon Gold 6130', 2, 'server5', '一级', 'region1', 'Linux', '5.4.0-80-generic', 'SN123456781', 'Rack1', '2023-10-10 10:04:00', 'IDC_C', '2025-03-14 16:11:29', 'admin', 'admin', '1', '192.168.1.5', 'RAID 10', '1', '192.168.1.5', '123.123.123.127', '测试服务器5', 'ext1', 'ext3', 'ext4', 'ext5', 'ext2', 16, 65536, '/dev/sda1,/dev/sdb1', 2000);
INSERT INTO `server` VALUES (6, 38, 'HP DL380', 'Intel Xeon Silver 4110', 1, 'server6', '一级', 'region2', 'Linux', '5.4.0-80-generic', 'SN987654322', 'Rack2', '2023-10-10 10:05:00', 'IDC_C', '2025-03-14 16:11:29', 'admin', 'admin', '1', '192.168.1.6', 'RAID 5', '1', '192.168.1.6', '123.123.123.128', '测试服务器6', 'ext1', 'ext3', 'ext4', 'ext5', 'ext2', 8, 32768, '/dev/sda1,/dev/sdb1', 1000);
INSERT INTO `server` VALUES (7, 39, 'Dell R740', 'Intel Xeon Gold 6130', 2, 'server7', '一级', 'region1', 'Linux', '5.4.0-80-generic', 'SN123456782', 'Rack1', '2023-10-10 10:06:00', 'IDC_D', '2025-03-14 16:11:29', 'admin', 'admin', '1', '192.168.1.7', 'RAID 10', '1', '192.168.1.7', '123.123.123.129', '测试服务器7', 'ext1', 'ext3', 'ext4', 'ext5', 'ext2', 16, 65536, '/dev/sda1,/dev/sdb1', 2000);
INSERT INTO `server` VALUES (8, 40, 'HP DL380', 'Intel Xeon Silver 4110', 1, 'server8', '一级', 'region2', 'Linux', '5.4.0-80-generic', 'SN987654323', 'Rack2', '2023-10-10 10:07:00', 'IDC_D', '2025-03-14 16:11:29', 'admin', 'admin', '1', '192.168.1.8', 'RAID 5', '1', '192.168.1.8', '123.123.123.130', '测试服务器8', 'ext1', 'ext3', 'ext4', 'ext5', 'ext2', 8, 32768, '/dev/sda1,/dev/sdb1', 1000);
INSERT INTO `server` VALUES (9, 41, 'Dell R740', 'Intel Xeon Gold 6130', 2, 'server9', '一级', 'region1', 'Linux', '5.4.0-80-generic', 'SN123456783', 'Rack1', '2023-10-10 10:08:00', 'IDC_E', '2025-03-14 16:11:29', 'admin', 'admin', '1', '192.168.1.9', 'RAID 10', '1', '192.168.1.9', '123.123.123.131', '测试服务器9', 'ext1', 'ext3', 'ext4', 'ext5', 'ext2', 16, 65536, '/dev/sda1,/dev/sdb1', 2000);
INSERT INTO `server` VALUES (10, 42, 'HP DL380', 'Intel Xeon Silver 4110', 1, 'server10', '一级', 'region2', 'Linux', '5.4.0-80-generic', 'SN987654324', 'Rack2', '2023-10-10 10:09:00', 'IDC_E', '2025-03-14 16:11:29', 'admin', 'admin', '1', '192.168.1.10', 'RAID 5', '1', '192.168.1.10', '123.123.123.132', '测试服务器10', 'ext1', 'ext3', 'ext4', 'ext5', 'ext2', 8, 32768, '/dev/sda1,/dev/sdb1', 1000);
2.生成MySQL查询接口
- 编写python脚本
root@test-server08:/opt/cwh# more sql-query.py
from flask import Flask, request, jsonify
from sqlalchemy import create_engine, text
app = Flask(__name__)
# 配置数据库连接
DATABASE_URI = 'mysql+pymysql://root:test123456@192.168.0.195:3306/dify_test'
engine = create_engine(DATABASE_URI)
@app.route('/query', methods=['POST'])
def query_database():
# 获取请求中的SQL语句
sql_query = request.json.get('sql')
if not sql_query:
return jsonify({"error": "SQL query is required"}), 400
try:
# 执行SQL查询
with engine.connect() as connection:
result = connection.execute(text(sql_query))
rows = result.fetchall()
# 将结果转换为字典列表
columns = result.keys()
result_dict = [dict(zip(columns, row)) for row in rows]
return jsonify(result_dict)
except Exception as e:
return jsonify({"error": str(e)}), 500
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0')
python脚本需要修改的内容
1.test123456—>MySQL密码
2.192.168.0.195——>MySQL ip
3.dify_test——>创建的测试库
- 安装python模块
pip3 install Flask
pip3 install SQLAlchemy
pip3 install pymysql
#我这个机器运行这个脚本的时候报错,提示安装这三个,看不懂报错的ai查一下就行
- 运行脚本
root@test-server08:/opt/cwh# nohup python3 sql-query.py &
[1] 23848
root@test-server08:/opt/cwh# tail -f -n100 nohup.out
* Serving Flask app 'sql-query' (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: on
* Running on all addresses.
WARNING: This is a development server. Do not use it in a production deployment.
* Running on http://192.168.0.195:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 647-732-438
- 测试脚本查询
root@sdgs-server08:/opt# curl -X POST "http://192.168.0.195:5000/query" -H "Content-Type: application/json" -d '{"sql": "select * from host limit 1;"}'
[
{
"ApplicationID": "app001",
"AssetID": 1001,
"BakOperator": "admin",
"Cpu": 4,
"CreateTime": "Tue, 10 Oct 2023 10:00:00 GMT",
"Description": "\u6d4b\u8bd5\u4e3b\u673a1",
"DeviceClass": "\u4e00\u7ea7",
"Disk": 500,
"Disk_mount": "/dev/sda1",
"Env": "prod",
"Extend001": "ext1",
"Extend002": "ext2",
"Extend003": "ext3",
"Extend004": "ext4",
"Extend005": "ext5",
"HostName": "host1",
"ID": 614,
"IdcName": "IDC_A",
"InnerIP": "192.168.1.1",
"LastTime": "Fri, 14 Mar 2025 16:07:26 GMT",
"Mem": 8192,
"OS_kernel": "5.4.0-80-generic",
"OS_type": "Linux",
"Operator": "admin",
"OuterIP": "123.123.123.123",
"Status": "1"
}
]
返回了数据表中的第一条数据,证明该脚本正常
3.配置Dify
3.1 创建工作流
- 命名工作流
3.2 配置工作流
- 添加代码执行
创建完成后只有一个开始,需要添加一个代码执行
- 添加结束功能
添加完代码执行之后再添加一个结束功能
- 配置开始阶段
- 配置代码执行阶段
代码详情
from urllib import request
import urllib.request
import json
def main(sql: str) -> dict:
data = {"sql": sql}
url = 'http://IP:5000/query'
json_data = json.dumps(data)
byte_data = json_data.encode('utf-8')
req = urllib.request.Request(url, data=byte_data, headers={'Content-Type': 'application/json'})
response = urllib.request.urlopen(req)
response_data = response.read().decode('utf-8')
return {
"result": response_data,
}
- 配置结束阶段
- 选择发布即可
- 发布为工具
先执行发布,然后在下面这一步发布成工具
保存之后回到这个页面,更新一下即可
- 运行sql测试工具
结果是字段类型,代表该工具正常
4.配置知识库
- 创建空白知识库
- 导入文件
表结构描述:
表名称: `host` 主机表
字段列表:
`BakOperator`,备份操作人,字符串
`Cpu`, CPU, 整型
`CreateTime`, 创建日期,日期类型
`Description`,备注,字符串
`Env`,环境,字符串
`DeviceClass`,设备级别,字符串
`HostName`,主机名,字符串
`InnerIP`,内网地址,字符串
`LastTime`,更新日期,日前类型
`Mem`,内存,整型
`OS_kernel`,内核,字符串
`Disk_mount`,硬盘挂载信息,字符串
`Disk`,硬盘信息,字符串
`IdcName`,机房名称,字符串
表结构描述:
表名称: `Server` 服务器表
字段列表:
`HardMemo`,服务器品牌型号,字符串
`BakOperator`,备份操作人,字符串
`Cpu_model`, CPU, 整型
`Cpu_number`,物理cpu个数,整型
`Region`,区域, 字符串
`OS_type`,系统类型,字符串
`OS_kernel`,内核,字符串
`CreateTime`, 创建日期,日期类型
`Description`,备注,字符串
`Env`,环境,字符串
`DeviceClass`,设备级别,字符串
`HostName`,主机名,字符串
`InnerIP`,内网地址,字符串
`LastTime`,更新日期,日前类型
`Mem`,内存,整型
`SN`,SN编号,字符串
`Disk_mount`,硬盘挂载信息,字符串
`Disk`,硬盘信息,字符串
`IdcName`,机房名称,字符串
`Operator`,管理员,字符串
`Status`,状态,字符串,0 表示关机, 1 表示开机
`Cpu_cores`,CPU核数,整型
`Raid`,RAID级别,整型
`Is_virtualization`,是否虚拟化,字符串
- 嵌入完成后即可
5.Dify Agent
5.1 创建agent
5.2 配置Agent
#角色:你是一位精通SQL语言的数据库专家,精通MySql,同时擅长解读和分析数据
#任务:你的任务是理解用户的输入和上下文内容,编写SQL查询,并调用工具查询获得结果,结合用户的提问,对查询结果进行呈现、解读和分析
#关键步骤:
1、对用户输入的内容进行识别和判断,如果内容涉及政治、时事、社会问题以及违背道德和法律法规的情形,一律输出:”您提出的问题超出我应当回答的范围,请询问与公司业务相关的问题,否则我无法作出回答
2、根据用户输入的内容和上下文信息,形成内容分类,根据内容分类按照以下规则从知识库“数据结构描述”中检索数据表结构信息:
-内容分类与服务器相关,则检索“server”
-内容分类与主机相关,则检索“host”
注意:务必严格按照上述分类获得对应的检索关键词,不得生成新的检索关键词。如果你认为用户的提问无法匹配到合适的分类,请输出提示:为确保查询获得准确信息,请再把你的需求描述细致一些
3、根据用户输入的内容和上下文信息,形成一个符合用户意图的完整问题,以此作为输入在知识库“sql示例”中检索SQL语句参考示例
4、基于对上下文和对用户提问的理解,按照检索到的数据表结构信息,以及SQL参考示例,编写SQL查询语句。注意,若内容分类与参考示例中的分类不符时,则忽略这个示例。另外,不是所有情况下都有示例参考,没有示例时请按照自己的理解和掌握的知识编写SQL语句
5、去除SQL语句中多余的注释、换行符等无用信息,输出一个纯净的、可直接执行的SQL语句
6、执行SQL查询,获取结果
7、阅读查询结果,结合历史对话内容,对查询结果进行呈现、解读和分析
#编写SQL时的注意事项:
1. 务必根据上下文提供的数据表结构描述来编写SQL语句,确保仅使用数据表结构描述中提到的表名和字段名,并参考对字段的解释
2. 确保SQL兼容Mysql
3. 只输出一个完整SQL语句,无注释,确保可直接执行并获得预期的结果
#其他注意事项
1、不要输出中间的思考过程,只输出最终的结果
6.查询MySQL中的数据
6.1 MySQL查询
6.2 Dify回复
查询到MySQL库中的内容很简单 但是得训练 需要把提示词输入得很好 难一点得sql执行不了