基于大模型的智能问数Text2SQL
Text2SQL是指通过大语言模型把日常语言翻译成数据库指令。简单来说,它能把我们说的话变成数据库能听懂的"命令语言"(SQL)。
它的最大特点是:普通人不需要懂编程,只要用平时说话的方式提问,比如"帮我查一下上周销售额",系统就能自动从数据库里查询数据,并做出分析。
接下来,我们用Dify来实现一个智能问数的仓库查询助手,通过聊天的方式,来查询以及分析商品库存信息。
一. 准备数据
- 商品表(t_product),记录商品信息
- 仓库表(t_warehouse),记录仓库信息
- 库存表(t_inventory),记录各仓库商品库存
- 入库记录表(t_stock_in),记录商品入库流水
前提条件,已经安装了MySQL数据库
没有安装的可以参考以下方式用Docker安装MySQL
https://www.runoob.com/docker/docker-install-mysql.html
用数据库管理工具,比如Navicat直接运行SQL文件init.sql
也可以复制init.sql里面的内容,粘贴在MySQL命令行,回车执行
二. 用Dify实现智能问数Text2SQL
整体思路:
- 通过大语言模型将要查询的内容生成对应的SQL查询语句
- 将SQL语句分别执行获得查询结果
- 拼接查询结果
- 将查询结果作为上下文,再结合用户的提问,生成回答。
工作流如下,可以看出节点并不多,核心节点也就几个
核心节点介绍
LLM-生成SQL语句
提示词是生成SQL语句的关键。如果生成的结果不满意可以根据输出的SQL语句来调整提示词
## 角色
你是一位精通MySQL数据库SQL查询语句的专家。
## 任务
根据提供的数据库的表结构,将用户输入的内容转换为MySQL数据库的SQL查询语句。
## 数据库的表结构
商品表结构如下:
CREATE TABLE t_product (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '商品ID',
name VARCHAR(50) NOT NULL COMMENT '商品名称',
unit VARCHAR(10) NOT NULL COMMENT '单位'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品表';
仓库表结构如下:
CREATE TABLE t_warehouse (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '仓库ID',
name VARCHAR(50) NOT NULL COMMENT '仓库名称'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='仓库表';
库存表结构如下:
CREATE TABLE t_inventory (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '记录ID',
product_id INT NOT NULL COMMENT '商品ID,关联product_id表的id',
product_name VARCHAR(50) NOT NULL COMMENT '商品名称(冗余)',
warehouse_id INT NOT NULL COMMENT '仓库ID,关联t_warehouse表的id',
quantity INT NOT NULL DEFAULT 0 COMMENT '库存数量',
FOREIGN KEY (product_id) REFERENCES t_product(id),
FOREIGN KEY (warehouse_id) REFERENCES t_warehouse(id),
UNIQUE KEY (product_id, warehouse_id) COMMENT '防止重复记录'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='库存表';
入库记录表结构如下:查询时,要加is_deleted = 0
CREATE TABLE t_stock_in (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '记录ID',
product_id INT NOT NULL COMMENT '商品ID,关联product_id表的id',
product_name VARCHAR(50) NOT NULL COMMENT '商品名称(冗余)',
warehouse_id INT NOT NULL COMMENT '仓库ID,关联t_warehouse表的id',
quantity INT NOT NULL COMMENT '入库数量',
operator VARCHAR(20) COMMENT '操作人',
batch_no VARCHAR(30) COMMENT '批次号',
create_time datetime(3) DEFAULT CURRENT_TIMESTAMP(3) COMMENT '入库时间',
is_deleted TINYINT(1) DEFAULT 0 COMMENT '删除标记:0-正常 1-已删除',
FOREIGN KEY (product_id) REFERENCES t_product(id),
FOREIGN KEY (warehouse_id) REFERENCES t_warehouse(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='入库记录表';
## 系统参数
当前时间:{{#1742350083195.text#}}
## 要求
1. 需要严格按照数据库的表结构来生成。
2. 将生成的SQL语句封装到一个JSON数组中。
3. 确保SQL查询语法符合MySQL语法。
代码执行-提取SQL语句
将大语言模型生成的SQL语句提取出来,用来查询
迭代-循环执行SQL语句
执行SQL语句,我们用的是Database工具,可以在Dify市场搜索Database安装, 目前支持MySQL、PostgreSQL、SQLite、SQLServer、Oracle数据库
需要填写执行SQL语句的数据库uri,格式如下:
mysql+pymysql://root:123456@localhost:3306/test
postgresql+psycopg2://postgres:123456@localhost:5432/test
sqlite:///test.db
mssql+pymssql://<username>:<password>@<freetds_name>/?charset=utf8
oracle+oracledb://user:pass@hostname:port[/dbname][?service_name=<service>[&key=value&key=value...]]
由于我本机MySQL是安装在宿主机,Dify是安装在Docker容器,所以填的是:
mysql+pymysql://root:123456@host.docker.internal:3306/wms_test
如果你的数据库和Dify都是安装在Docker容器里,则填写服务器ip即可:
mysql+pymysql://root:123456@ip:3306/wms_test
拼接查询结果
将上一步的查询结果拼接起来
解析查询结果
将查询结果作为上下文,再结合用户的提问,生成回答。
三. 验证测试
四. 总结
上面我们用Dify的工作流实现了智能问数Text2SQL。通过这个工作流我们了解了时间工具以及Database工具的使用,LLM提示词的编写,用代码执行节点来处理数据,用迭代节点来处理重复的逻辑。关于智能问数Text2SQL,用其他的方式也同样可以实现,比如用LLM结合自己写逻辑来实现,或者使用开源工具Vanna.AI
来实现,核心的思想都是通过大语言模型将自然语言转成SQL语句。
🔥《零基础小白AI实战教程:手把手教你打造专属的智能体》🚀 系列教程更新中!
✅ 已更新:AI实践虚拟化平台安装
✅ 已更新:Docker Desktop 安装
✅ 已更新:Ollama安装教程
✅ 已更新:DeepSeek私有化部署
✅ 已更新:Dify私有化部署
✅ 已更新:Dify接入大模型
✅ 已更新:Dify + DeepSeek搭建本地私有化知识库
✅ 已更新:Dify应用类型的选择
✅ 已更新:Dify升级指南
✅ 已更新:Dify节点的详细介绍(上)
✅ 已更新:Dify节点的详细介绍(中)
✅ 已更新:Dify节点的详细介绍(下)
✅ 已更新:RagFlow本地部署和使用
✅ 已更新:基于大模型的智能问数NL2SQL
👉 关注公众号"北灵聊AI"获取最新更新,免费领取教程资料和源码