当前位置: 首页 > news >正文

dify工作流之text-2-e-sql,大模型写sql并执行

市面上有太多的text-to-sql工具,但是我这次突发灵感,为什么不做一个可以执行sql得text2sql呢。

dify的安装我不再赘述,我采用的是win10本地docker部署的方式。

mysql的安装也不再介绍,如有需要还请移步其他博主。

1.dify创建工作流,选择创建空白应用既即可。

2.大概看下整体的处理逻辑,分为5部分

1)第一部分为开始,入参部分。

2)第二部分为大模型处理sql

提示词参考如下:

## 角色
你是一名数据分析师
## 工作内容
你需要实现将用户输入的内容转换为SQL查询语句去MySql数据库中查找数据
## 被查询的数据表的结构
CREATE TABLE `sys_dept`  (xxxxxx
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '部门表' ROW_FORMAT = Dynamic;CREATE TABLE `sys_log`  (xxxxx
) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '日志表' ROW_FORMAT = Dynamic;## 你可以使用的其他方法
用户输入类似于“求和”或“总和”时,则在sql语句中使用SUM()。
用户输入类似于“平均数”或“平均”时,在在sql语句中使用AVG()。
## 要求
1.如果用户输入的内容无法生成为sql语句,请直接说“抱歉,该命令无法形成数据库查询操作”。
2.当可以生成sql语句时,请确保输出的内容为完整正确的sql语句,不要输出此外的其他任何字符,确保你生成的内容用户可以直接执行查询操作。
3.对于字符串内容的查询请使用LIKE操作而不是等于操作。
4.请不要在回复中包括除sql语句之外的任何内容。

记得在提示词后面,加上开始模块输入的content和表名

3)构建http请求,进行查库操作。

我使用java连接本地的数据库,并使用Springboot暴露http服务,您可以根据自己的实际需要编写代理服务。


import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class MySQLConnector {private static final String JDBC_URL = "jdbc:mysql://localhost:3306/";private static final String USERNAME = "root";private static final String PASSWORD = "Root";public static List<Map<String, Object>> executeQuery(String database, String table, String todoSql) {String sql = SqlExtractorUtils.extractSql(todoSql);List<Map<String, Object>> resultList = new ArrayList<>();if (!sql.startsWith("select") && !sql.startsWith("SELECT")){// 仅允许查询return resultList;}try (Connection connection = DriverManager.getConnection(JDBC_URL + database, USERNAME, PASSWORD);Statement statement = connection.createStatement();ResultSet resultSet = statement.executeQuery(sql)) {ResultSetMetaData metaData = resultSet.getMetaData();int columnCount = metaData.getColumnCount();while (resultSet.next()) {Map<String, Object> row = new HashMap<>();for (int i = 1; i <= columnCount; i++) {row.put(metaData.getColumnName(i), resultSet.getObject(i));}resultList.add(row);}} catch (SQLException e) {e.printStackTrace();}return resultList;}
}

4)根据返回的结果集,调用大模型进行清洗,将返回的json数组,转换成markdown格式,便于输出。

5)输出步骤4的结果。

相关文章:

  • 《 C++ 点滴漫谈: 三十四 》从重复到泛型,C++ 函数模板的诞生之路
  • 【C++】vector<bool>特化
  • [二叉树]关于前序、中序、后序、层序序列
  • 【机器学习】决策树算法中的 “黄金指标”:基尼系数深度剖析
  • w~视觉~3D~合集2
  • C# foreach 循环中获取索引的完整方案
  • VIN解析API开发指南:从年检报告构建智能定损系统
  • [创业之路-377]:企业法务 - 有限责任公司与股份有限公司的优缺点对比
  • 【KWDB 创作者计划】KWDB 2.2.0深度解析:架构设计、性能优化与企业级实践全指南
  • Python 爬虫如何伪装 Referer?从随机生成到动态匹配
  • Kotlin集合全解析:List和Map高频操作手册
  • 01-STM32基本知识点和keil5的安装
  • Cyber SpaceGuidance网安学习指南见解
  • GraphQL接口采集:自动化发现和提取隐藏数据字段
  • C#抽象类和虚方法的作用是什么?
  • [数据结构]树和二叉树
  • 来啦,烫,查询达梦表占用空间
  • 鸣潮赞妮技能机制解析 鸣潮赞妮配队推荐
  • Docker 部署 MySQL 数据库
  • LeetCode 第 262 题全解析:从 SQL 到 Swift 的数据分析实战
  • 商务部新闻发言人:截至目前,中美之间未进行任何经贸谈判
  • 大理洱源4.8级地震致442户房屋受损,无人员伤亡
  • 金湘军辞去山西省省长职务
  • 央行副行长:上海国际金融中心建设是我国参与国际金融竞争的核心载体
  • 王毅将出席中国一中亚外长第六次会晤、金砖国家外长会晤和第十五次金砖国家安全事务高级代表会议
  • 广州一男子早高峰爬上猎德大桥顶部疑似要跳桥,路段一度拥堵