How accurate can AI generate SQL? (vanna.ai)
老吴聊技术的个人空间-老吴聊技术个人主页-哔哩哔哩视频 (bilibili.com)
文档地址
dify 结合 agent构建自然语言查询数据库信息并展示 (qq.com)
视频地址:
Dify + Agent实现自然语言查询Mysql数据库并分析实战_哔哩哔哩_bilibili
1-创建2张表:
server表
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表
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个生成模拟数据的python 代码:
代码执行节点:
代码如下:
from urllib import request
import json
def main(sql: str) -> dict:
data = {"sql": sql}
url = 'http://192.168.3.237:5001/query'
json_data = json.dumps(data)
byte_data = json_data.encode('utf-8')
req = request.Request(url, data=byte_data, headers={'Content-Type': 'application/json'})
response = request.urlopen(req)
response_data = response.read().decode('utf-8')
return {
"result": response_data,
}
2.5 工作流发布为工具
3 配置agent
3.1 表结构信息导入知识库
表结构描述:
表名称: `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`,是否虚拟化,字符串
3.2 准备sql查询提示词
提示词:
#角色:你是一位精通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、不要输出中间的思考过程,只输出最终的结果
3.3 创建Agent,输入提示词,知识库,选中数据库查询工具,大模型选择闭源大模型
欢迎来撩 : 汇总all