最近在部署本地大模型时突然想到了,能不能通过自然语言提问,并通过模型转换为sql,直接查询数据库,经过一番尝试,也是成功做出来了,直接上dify流程图及成果:
下面是详细过程:
环境配置
将 dify 和 ollama 安装到本地并运行,在ollama上安装你想使用的ai模型和Embedding模型,此过程不再赘述。本地需要有数据库,我这里准备的是mysql。准备好后在地址栏输入http://localhost/install 即可进入dify。
数据准备
先在数据库中创建表,填充数据,我这里使用ai生成了20条测试数据:
注意:最好是在创建表时加上字段备注,方便后续使用自然语言提问。
CREATE TABLE `movies` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
`title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '电影名',
`director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '导演',
`release_year` int DEFAULT NULL COMMENT '上映年份',
`genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '类型',
`rating` decimal(3,1) DEFAULT NULL COMMENT '评分',
`duration` int DEFAULT NULL COMMENT '电影时长',
`column` longtext COMMENT '表字段',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (1, '霸王别姬', '陈凯歌', 1993, '剧情', 9.6, 171, 'CREATE TABLE `movies` (\n `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n `duration` int DEFAULT NULL COMMENT \'电影时长\',\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (2, '英雄', '张艺谋', 2002, '动作', 8.0, 99, 'CREATE TABLE `movies` (\n `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n `duration` int DEFAULT NULL COMMENT \'电影时长\',\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (3, '活着', '张艺谋', 1994, '剧情', 8.7, 125, 'CREATE TABLE `movies` (\n `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n `duration` int DEFAULT NULL COMMENT \'电影时长\',\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (4, '唐山大地震', '冯小刚', 2010, '灾难', 7.6, 130, 'CREATE TABLE `movies` (\n `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n `duration` int DEFAULT NULL COMMENT \'电影时长\',\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (5, '让子弹飞', '姜文', 2010, '喜剧', 8.0, 132, 'CREATE TABLE `movies` (\n `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n `duration` int DEFAULT NULL COMMENT \'电影时长\',\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (6, '无间道', '刘伟强, 陈木胜', 2002, '犯罪', 8.0, 101, 'CREATE TABLE `movies` (\n `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n `duration` int DEFAULT NULL COMMENT \'电影时长\',\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (7, '大话西游之大圣娶亲', '刘镇伟', 1995, '喜剧', 8.1, 87, 'CREATE TABLE `movies` (\n `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n `duration` int DEFAULT NULL COMMENT \'电影时长\',\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (8, '东成西就', '刘镇伟', 1993, '喜剧', 7.7, 100, 'CREATE TABLE `movies` (\n `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n `duration` int DEFAULT NULL COMMENT \'电影时长\',\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (9, '红高粱', '张艺谋', 1987, '剧情', 8.0, 95, 'CREATE TABLE `movies` (\n `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n `duration` int DEFAULT NULL COMMENT \'电影时长\',\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (10, '少年派的奇幻漂流', '李安', 2012, '冒险', 8.0, 127, 'CREATE TABLE `movies` (\n `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n `duration` int DEFAULT NULL COMMENT \'电影时长\',\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (11, '流浪地球', '郭帆', 2019, '科幻', 7.9, 125, 'CREATE TABLE `movies` (\n `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n `duration` int DEFAULT NULL COMMENT \'电影时长\',\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (12, '饮食男女', '李安', 1994, '剧情', 7.9, 123, 'CREATE TABLE `movies` (\n `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n `duration` int DEFAULT NULL COMMENT \'电影时长\',\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (13, '无问西东', '李芳芳', 2018, '剧情', 7.6, 135, 'CREATE TABLE `movies` (\n `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n `duration` int DEFAULT NULL COMMENT \'电影时长\',\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (14, '盗墓笔记', '李仁港', 2016, '冒险', 5.1, 124, 'CREATE TABLE `movies` (\n `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n `duration` int DEFAULT NULL COMMENT \'电影时长\',\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (15, '风声', '高群书', 2009, '悬疑', 7.9, 117, 'CREATE TABLE `movies` (\n `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n `duration` int DEFAULT NULL COMMENT \'电影时长\',\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (16, '亲爱的', '陈可辛', 2014, '剧情', 8.2, 118, 'CREATE TABLE `movies` (\n `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n `duration` int DEFAULT NULL COMMENT \'电影时长\',\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (17, '心花路放', '宁浩', 2014, '喜剧', 7.4, 104, 'CREATE TABLE `movies` (\n `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n `duration` int DEFAULT NULL COMMENT \'电影时长\',\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (18, '海上钢琴师', '朱塞佩·托纳多雷', 1998, '剧情', 8.6, 165, 'CREATE TABLE `movies` (\n `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n `duration` int DEFAULT NULL COMMENT \'电影时长\',\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (19, '少年', '李想', 2019, '剧情', 7.2, 100, 'CREATE TABLE `movies` (\n `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n `duration` int DEFAULT NULL COMMENT \'电影时长\',\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (20, '茶馆', '谢晋', 1982, '剧情', 8.4, 120, 'CREATE TABLE `movies` (\n `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n `duration` int DEFAULT NULL COMMENT \'电影时长\',\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
接口配置
生成完数据后还需要写一个接口来处理请求,直接ai生成python程序,生成完运行即可:
注意:代码开头与末尾需替换为自己(数据库)的IP
from flask import Flask, request, jsonify
import pymysql
# 数据库配置
DATABASE_CONFIG = {
'host': '你的ip',
'port': 3306,
'user': '账号',
'password': '密码',
'db': '数据库名',
'charset': 'utf8mb4',
'cursorclass': pymysql.cursors.DictCursor
}
app = Flask(__name__)
@app.route('/query', methods=['POST'])
def query_database():
print("接收到请求")
# 获取查询sql
querySql = request.json.get('querySql')
print("querySql为:" + querySql)
if querySql:
# 去除 Markdown 标识和不必要的字符
querySql = querySql.replace('```sql\n', '').replace('\n<<EOF>>', '')
querySql = querySql.strip()
querySql = querySql.replace('\n', ' ').replace('```', ' ')
querySql = ' '.join(querySql.split())
if not querySql:
return jsonify({"error": "querySql is required"}), 400
try:
# 建立数据库连接
connection = pymysql.connect(**DATABASE_CONFIG)
with connection.cursor() as cursor:
# 执行查询
cursor.execute(querySql)
result = cursor.fetchall()
connection.commit()
connection.close()
if not result:
return jsonify({"error": "未查询到有效数据"}), 400
# 生成 Markdown 表格
markdown_table = generate_markdown_table(result)
return markdown_table, 200
except Exception as e:
print("数据库错误: ", e)
return jsonify({"error": str(e)}), 500
def generate_markdown_table(results):
""" 生成 Markdown 表格 """
if not results:
return ""
# 获取列名
columns = results[0].keys()
# 表头
table_md = "| " + " | ".join([col for col in columns]) + " |\n"
# 分隔线
table_md += "| " + " --- |" * len(columns) + "\n"
# 表格内容
for row in results:
table_md += "| " + " | ".join([str(cell) for cell in row.values()]) + " |\n"
return table_md
if __name__ == '__main__':
app.run(host='localhost', port=5000)
本地知识库
将刚才生成的表的建表语句导入到dify知识库中
新建知识库
导入建表语句
设置知识库参数
创建应用
完成即可开始创建应用:点击工作室--新建空白应用。
我这里有就不再新建了,在开始后面加上知识检索,即本地知识库,在这里添加
在知识检索后点加号添加 LLM 配置如下:
提示词:
你是一个SQL专家或数据分析师,根据检索到{{#context#}}以及用户输入的{{#sys.query#}}需求,生成对应的查询sql,sql必须经过严格的校验。
#硬性要求
1.严格使用检素到的表字段
2.确保MySQL语法兼容
3.一定要在生成的sql前后各加一个$符号
4.仅输出最终结果sql语句的txt文本,不要加任何信息
5.禁止中问过程输出
6.sql中不要查询column列(如果有)
经过测试,虽然提示词中不允许生成除了 sql 以外的内容,但 deepseek 在此处生成 sql 时总会夹杂一些文字,所以要在提示词中加上 “一定要在生成的sql前后各加一个$符号” 便于后续处理。
在LLM后点加号,添加一个代码执行,在代码执行中需要将LLM返回的字符串截取为纯 sql :
代码执行中的JS代码:
function main(input) {
// 检查输入是否为对象并且包含 input 字段
if (typeof input === 'object' && input !== null && input.input) {
const text = input.input;
// 查找最后两个 $ 符号的位置
const dollarStartIndex = text.lastIndexOf("$");
const dollarEndIndex = text.lastIndexOf("$", dollarStartIndex - 1);
if (dollarStartIndex !== -1 && dollarEndIndex !== -1) {
// 获取两个 $ 符号之间的内容
const content = text.substring(dollarEndIndex + 1, dollarStartIndex);
return { result: content };
} else {
return { error: "输入的字符串没有正确的 $ 符号" };
}
} else {
return { error: "输入必须是对象且包含 input 字段" };
}
}
在代码执行后点加号,添加一个http请求,该请求会将上一步生成的 sql 发送给 python 接口,配置如下:
最后一步,在http请求后加上直接回复,把查询结果返回
最后点击预览,输入问题即可回答。
注意:在使用前要将python文件运行起来
这里我的模型反馈时间有点慢,不过好在能运行出来。