零基础AI开发系列教程:基于大模型的智能问数Text2SQL

基于大模型的智能问数Text2SQL

Text2SQL是指通过大语言模型把日常语言翻译成数据库指令。简单来说,它能把我们说的话变成数据库能听懂的"命令语言"(SQL)。
它的最大特点是:普通人不需要懂编程,只要用平时说话的方式提问,比如"帮我查一下上周销售额",系统就能自动从数据库里查询数据,并做出分析。

接下来,我们用Dify来实现一个智能问数的仓库查询助手,通过聊天的方式,来查询以及分析商品库存信息。

一. 准备数据

  1. 商品表(t_product),记录商品信息
  2. 仓库表(t_warehouse),记录仓库信息
  3. 库存表(t_inventory),记录各仓库商品库存
  4. 入库记录表(t_stock_in),记录商品入库流水

前提条件,已经安装了MySQL数据库

没有安装的可以参考以下方式用Docker安装MySQL
https://www.runoob.com/docker/docker-install-mysql.html

用数据库管理工具,比如Navicat直接运行SQL文件init.sql
image-20250411212547218

也可以复制init.sql里面的内容,粘贴在MySQL命令行,回车执行
Image

二. 用Dify实现智能问数Text2SQL

整体思路:

  1. 通过大语言模型将要查询的内容生成对应的SQL查询语句
  2. 将SQL语句分别执行获得查询结果
  3. 拼接查询结果
  4. 将查询结果作为上下文,再结合用户的提问,生成回答。

工作流如下,可以看出节点并不多,核心节点也就几个
image-20250411213733285

核心节点介绍

LLM-生成SQL语句

image-20250411213545600

提示词是生成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语句提取出来,用来查询
image-20250411214322935

迭代-循环执行SQL语句

执行SQL语句,我们用的是Database工具,可以在Dify市场搜索Database安装, 目前支持MySQL、PostgreSQL、SQLite、SQLServer、Oracle数据库
image-20250411214418445

需要填写执行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

拼接查询结果

将上一步的查询结果拼接起来
image-20250411214546836

解析查询结果

将查询结果作为上下文,再结合用户的提问,生成回答。
image-20250411214623338

三. 验证测试

image-20250411211652951

image-20250411212035795

四. 总结

上面我们用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"获取最新更新,免费领取教程资料和源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值