通过dify实现大模型对接查询数据库内数据,语义转SQL2.0
目的
用户输入查询语句,例如:“张三几岁了”;
大模型通过对话响应输出sql语句;
将dify生成的内容进行截断并发送http请求;
构建web服务,将请求的数据库查询结果返回给dify输出端。
说明
本文档中的所有下载的所需资源都可以在网盘下载或在右上角的群内容获取。
资源包在网盘内容中的 eogee-AI-LLM/提示词工程/语义转sql2.0.zip
本文档的前置内容为语义转SQL,实现大模型对接查询数据库内数据请先查阅并按照文档中的步骤进行安装并实现对应功能。
前置内容的文件资源包请点击这里下载。
前置内容的资源包在网盘内容中的 eogee-AI-LLM/提示词工程/语义转sql.zip
1. 通过dify实现大模型生成SQL语句
你可以在这里Dify在windows系统的docker中向本地部署的deepseek嵌入知识库提问
打开docker确认左下角状态为running,然后打开浏览器输入http://localhost/
进入dify的工作台。
点击左上角的”创建空白应用”,创建一个工作流应用
选择工作流,起个任意的名字,点击”创建”:
创建之后,默认会生成一个”开始”节点,后面会跟着很多可选项的其他节点,这里选择LLM(大语言模型)
创建LLM节点,后在右侧输入相关配置内容,这里主要填写,提示词内容,即“system”,内容如下:
## 角色你是一名数据分析师## 工作内容你需要实现将用户输入的内容转换为SQL查询语句去MySql数据库中查找数据## 被查询的数据表的结构CREATE TABLE `users` ( `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'ID', `name` VARCHAR(50) NOT NULL COMMENT '姓名' COLLATE 'utf8_unicode_ci', `age` INT(11) NULL DEFAULT NULL COMMENT '年龄', `hobby` VARCHAR(50) NULL DEFAULT NULL COMMENT '爱好' COLLATE 'utf8_unicode_ci', `city` VARCHAR(50) NULL DEFAULT NULL COMMENT '所在城市' COLLATE 'utf8_unicode_ci', `high_school_score` FLOAT(12) NULL DEFAULT NULL COMMENT '高考成绩', `cutoff_score` FLOAT(12) NULL DEFAULT NULL COMMENT '分数线', PRIMARY KEY (`id`) USING BTREE)COMMENT='用户表'COLLATE='utf8_unicode_ci'ENGINE=InnoDBAUTO_INCREMENT=5;## 你可以使用的其他方法用户输入类似于“求和”或“总和”时,则在sql语句中使用SUM()。用户输入类似于“平均数”或“平均”时,在在sql语句中使用AVG()。## 要求1.如果用户输入的内容无法生成为sql语句,请直接说“抱歉,该命令无法形成数据库查询操作”。2.当可以生成sql语句时,请确保输出的内容为完整正确的sql语句,不要输出此外的其他任何字符,确保你生成的内容用户可以直接执行查询操作。3.对于字符串内容的查询请使用LIKE操作而不是等于操作。4.请不要在回复中包括除sql语句之外的任何内容。
添加完上述内容之后,需要在提示词的最下方,设置开始节点输入的内容,作为提示词的一部分
这里设置的内容为开始/{x}content
添加完提示词内容后,点击”选择下一个节点”按钮,这里选择”http请求”节点
在右侧API设置中,选择post请求,输入url地址为http://host.docker.internal:8081/
,然后点击”创建”按钮
在BODY设置中,添加两个参数:db_name=tosql;sql_query=LLM{x}text
在结束节点中,设置输出变量:text=http请求{x}body
2. 构建web服务
打开phpstudy,在首页中启动 apache+mysql
设置localhost的默认访问端口为:8081
打开phpstudy中的网站->localhost->管理->打开根目录->创建一个index.php文件,内容如下:
<?phpheader("Content-Type: text/plain; charset=utf-8");// 基础验证if (empty($_POST['db_name']) || empty($_POST['sql_query'])) { die("错误:缺少必要参数");}// 获取参数$db_name = $_POST['db_name'];$sql_query = $_POST['sql_query'];// 获取最后一个换行后的内容(兼容不同换行数量)$lines = explode("\n\n", $sql_query);$sql_query = trim(end(array_filter($lines, function($line) { return trim($line) !== '';})));// 新增代码:去除可能的代码块标记$sql_query = str_replace(['```sql', '```'], '', $sql_query);$sql_query = trim($sql_query);// 连接数据库$conn = mysqli_connect("127.0.0.1", "root", "root", $db_name);// 检测连接if (!$conn) { die("连接失败: ". mysqli_connect_error());}$conn->set_charset('utf8');// 执行SQL查询$result = mysqli_query($conn, $sql_query);// 输出结果if ($result) { if (mysqli_num_rows($result) > 0) { // 动态显示所有字段 $first_row = true; while($row = mysqli_fetch_assoc($result)) { // 输出表头(仅第一次循环) if ($first_row) { echo implode(" | ", array_keys($row)) . "\n"; $first_row = false; } // 输出数据行 echo implode(" | ", array_map(function($v) { return is_null($v) ? 'NULL' : $v; }, $row)) . "\n"; } } else { echo "0 results\n"; }} else { echo "查询错误: ". mysqli_error($conn) . "\n";}// 关闭数据库连接mysqli_close($conn);?>
3. 运行测试
打开dify,将工作流设置为可运行状态:
发布->更新->运行:
在新跳转打开的页面中,输入”张三几岁了”并点击”提交”按钮: