DIFY教程第七弹:自然语言生成SQL应用

自然语言生成SQL

演示的效果具体工作流设计
帮我设计一个电商系统的数据库。
需要有:
goods:商品表
orders:订单表
inventory:库存表
vendors:商家表
customers:客户表,
表结构的关联关系:
商家和商品表关联
商品表和库存表关联
订单和客户关联
订单和商品关联
核心字段要求
goods:需要有 id 商品名称 商品价格 图片 商家
orders:需要有 id 客户 商品编号 商品名称 收货地址 商家id 订单时间
inventory:需要有 id 商品编号 库存数据
创建的表名用对应的 英文,表中的每个字段也需要用英文描述
创建测试数据:
商家表设计20条数据。
商品表设计50条记录,
库存信息设计30条记录,
订单按照时间生成最近半年的销售记录。每个月生成30~50条记录。
客户生成20条记录。
设计数据的时候注意表结构直接的关联关系。生成的sql语句需要满足mysql的语法要求
可以通过大模型帮我们生成对应的SQL语句
CREATE TABLE vendors (
id INT AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(255) NOT NULL,
contact_info VARCHAR(255)
);
CREATE TABLE customers (
id INT AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(255) NOT NULL,
email VARCHAR(255),
address VARCHAR(255)
);
CREATE TABLE goods (
id INT AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(255) NOT NULL,
price DECIMAL(10,2) NOT NULL,
image_url VARCHAR(255),
vendor_id INT,
FOREIGN KEY (vendor_id) REFERENCES vendors(id)
);
CREATE TABLE inventory (
id INT AUTO_INCREMENT PRIMARY KEY,
goods_id INT,
stock INT NOT NULL,
FOREIGN KEY (goods_id) REFERENCES goods(id)
);
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
customer_id INT,
goods_id INT,
goods_name VARCHAR(255),
shipping_address VARCHAR(255),
vendor_id INT,
order_time DATETIME,
FOREIGN KEY (customer_id) REFERENCES customers(id),
FOREIGN KEY (goods_id) REFERENCES goods(id),
FOREIGN KEY (vendor_id) REFERENCES vendors(id)
);
-- 插入商家数据 (20 条记录)
INSERT INTO vendors (NAME, contact_info) VALUES
("Vendor1", "vendor1@example.com"),
("Vendor2", "vendor2@example.com"),
("Vendor3", "vendor3@example.com"),
("Vendor4", "vendor4@example.com"),
("Vendor5", "vendor5@example.com"),
("Vendor6", "vendor6@example.com"),
("Vendor7", "vendor7@example.com"),
("Vendor8", "vendor8@example.com"),
("Vendor9", "vendor9@example.com"),
("Vendor10", "vendor10@example.com"),
("Vendor11", "vendor11@example.com"),
("Vendor12", "vendor12@example.com"),
("Vendor13", "vendor13@example.com"),
("Vendor14", "vendor14@example.com"),
("Vendor15", "vendor15@example.com"),
("Vendor16", "vendor16@example.com"),
("Vendor17", "vendor17@example.com"),
("Vendor18", "vendor18@example.com"),
("Vendor19", "vendor19@example.com"),
("Vendor20", "vendor20@example.com");
-- 插入商品数据 (50 条记录,随机分配商家)
INSERT INTO goods (NAME, price, image_url, vendor_id) VALUES
("Product1", 10.99, "img1.jpg", 1),
("Product2", 20.99, "img2.jpg", 2),
("Product3", 30.99, "img3.jpg", 3),
("Product4", 40.99, "img4.jpg", 4),
("Product5", 50.99, "img5.jpg", 5),
("Product6", 15.49, "img6.jpg", 6),
("Product7", 25.49, "img7.jpg", 7),
("Product8", 35.49, "img8.jpg", 8),
("Product9", 45.49, "img9.jpg", 9),
("Product10", 55.49, "img10.jpg", 10);
-- 插入库存数据 (30 条记录,随机选择商品)
INSERT INTO inventory (goods_id, stock) VALUES
(1, 100),
(2, 150),
(3, 200),
(4, 250),
(5, 300);
-- 插入客户数据 (20 条记录)
INSERT INTO customers (NAME, email, address) VALUES
("Customer1", "cust1@example.com", "Address1"),
("Customer2", "cust2@example.com", "Address2"),
("Customer3", "cust3@example.com", "Address3"),
("Customer4", "cust4@example.com", "Address4"),
("Customer5", "cust5@example.com", "Address5");
-- 插入订单数据 (最近半年,每月 30~50 条记录)
INSERT INTO orders (customer_id, goods_id, goods_name, shipping_address, vendor_id,
order_time) VALUES
(1, 1, "Product1", "Address1", 1, NOW()),
(2, 2, "Product2", "Address2", 2, NOW()),
(3, 3, "Product3", "Address3", 3, NOW()),
(4, 4, "Product4", "Address4", 4, NOW()),
(5, 5, "Product5", "Address5", 5, NOW());
然后我们可以创建对应的工作流
对应的表结构的说明
以下是每张表的数据结构说明:
### **商家表(vendors)**
- **id**:商家ID,整数类型,主键,自增。
- **name**:商家名称,字符串类型,非空。
- **contact_info**:联系方式,字符串类型,可为空。
### **客户表(customers)**
- **id**:客户ID,整数类型,主键,自增。
- **name**:客户名称,字符串类型,非空。
- **email**:电子邮件,字符串类型,可为空。
- **address**:收货地址,字符串类型,可为空。
### **商品表(goods)**
- **id**:商品ID,整数类型,主键,自增。
- **name**:商品名称,字符串类型,非空。
- **price**:商品价格,十进制(10,2)类型,非空。
- **image_url**:商品图片URL,字符串类型,可为空。
- **vendor_id**:商家ID,整数类型,外键,关联 `vendors(id)`。
### **库存表(inventory)**
- **id**:库存ID,整数类型,主键,自增。
- **goods_id**:商品ID,整数类型,外键,关联 `goods(id)`。
- **stock**:库存数量,整数类型,非空。
### **订单表(orders)**
- **id**:订单ID,整数类型,主键,自增。
- **customer_id**:客户ID,整数类型,外键,关联 `customers(id)`。
- **goods_id**:商品ID,整数类型,外键,关联 `goods(id)`。
- **goods_name**:商品名称,字符串类型,冗余存储,便于查询。
- **shipping_address**:收货地址,字符串类型,非空。
- **vendor_id**:商家ID,整数类型,外键,关联 `vendors(id)`。
- **order_time**:订单时间,日期时间类型,非空。
这样,每张表的数据结构清晰,符合关系型数据库的设计规范。你需要进一步优化或者修改吗?
第一个LLM中的提示词内容
System
你是一位精通SQL语言的数据库专家,熟悉MySQL数据库。你的任务是根据用户的自然语言输入,编写出可直接执行的SQL查
询语句。输出内容必须是可以执行的SQL语句,不能包含任何多余的信息。
核心规则:
1. 根据用户的查询需求,确定涉及的表和字段。
2. 确保SQL语句的语法符合MySQL的规范。
3. 输出的SQL语句必须完整且可执行,不包含注释或多余的换行符。
关键技巧:
- WHERE 子句: 用于过滤数据。例如,`WHERE column_name = 'value'`。
- **日期处理:** 使用`STR_TO_DATE`函数将字符串转换为日期类型。例如,`STR_TO_DATE('2025-03-14', '%Y-
%m-%d')`。
- **聚合函数:** 如`COUNT`、`SUM`、`AVG`等,用于计算汇总信息。
- **除法处理:** 在进行除法运算时,需考虑除数为零的情况,避免错误。
- **日期范围示例:** 查询特定日期范围的数据时,使用`BETWEEN`关键字。例如,`WHERE date_column BETWEEN
'2025-01-01' AND '2025-12-31'`。
**注意事项:**
1. 确保字段名和表名的正确性,避免拼写错误。
2. 对于字符串类型的字段,使用单引号括起来。例如,`'sample_text'`。
3. 在使用聚合函数时,如果需要根据特定字段分组,使用`GROUP BY`子句。
4. 在进行除法运算时,需判断除数是否为零,以避免运行时错误。
5. 生成的sql语句 不能有换行符 比如 \n
6. 在计算订单金额的时候直接计算对应的商品价格就可以了,不用计算订单的商品数量
请根据上述规则,将用户的自然语言查询转换为可执行的MySQL查询语句。
user部分的提示词
数据库结构:
商家表(vendors)
id:商家ID,整数类型,主键,自增。
name:商家名称,字符串类型,非空。
contact_info:联系方式,字符串类型,可为空。
客户表(customers)
id:客户ID,整数类型,主键,自增。
name:客户名称,字符串类型,非空。
email:电子邮件,字符串类型,可为空。
address:收货地址,字符串类型,可为空。
商品表(goods)
id:商品ID,整数类型,主键,自增。
name:商品名称,字符串类型,非空。
price:商品价格,十进制(10,2)类型,非空。
image_url:商品图片URL,字符串类型,可为空。
vendor_id:商家ID,整数类型,外键,关联 vendors(id)。
库存表(inventory)
id:库存ID,整数类型,主键,自增。
goods_id:商品ID,整数类型,外键,关联 goods(id)。
stock:库存数量,整数类型,非空。
订单表(orders)
id:订单ID,整数类型,主键,自增。
customer_id:客户ID,整数类型,外键,关联 customers(id)。
goods_id:商品ID,整数类型,外键,关联 goods(id)。
goods_name:商品名称,字符串类型,冗余存储,便于查询。
shipping_address:收货地址,字符串类型,非空。
vendor_id:商家ID,整数类型,外键,关联 vendors(id)。
order_time:订单时间,日期时间类型,非空。
问题:{{#1741938398688.sql#}}}
代码执行部分是通过Python代码调用对应的接口来执行SQL操作,这部分在前面的案例中有介绍的。
import json
import requests
然后就是数据的整理。通过代码执行获取到对应的结果。然后处理成为我们需要的数据展示
对应的提示词内容
def main(sql: str) -> dict:
url = "http://host.docker.internal:5000/execute_sql"
connection_info = {
"host": "localhost",
"user": "root",
"password": "123456",
"database": "llm_shop"
}
# 构造请求体
payload = {
"sql": sql,
"connection_info": connection_info
}
headers = {
"Content-Type": "application/json"
}
try:
response = requests.post(url, json=payload, headers=headers)
if response.status_code == 200:
try:
return {"result":str(response.json()["result"])}
except Exception as e:
return {"result": f"解析响应 JSON 失败: {str(e)}"}
else:
return {"result": f"请求失败,状态码: {response.status_code}"}
except Exception as e:
return {"result": str(e)}
然后就是数据的整理。通过代码执行获取到对应的结果。然后处理成为我们需要的数据展示对应的提示词内容
System
你是电商行业数据分析专家,分析JSON格式的sql查询结果,回答用户问题。
关键规则:
1.所有数据已符合用户问题中的条件
2.直接使用提供的数据分析,不质疑数据是否符合条件
3.不需要再次筛选或确认数据类别/时间范围
4.数据为[]或空或者None时直接回复"没有查询到相关数据",不得编造数据
User
数据是:{{#1741938410121.result#}}
问题是:{{#1741938398688.sql#}}
回答要求:
1.列出详细数据,优先以表格方式列出数据
2.识别趋势、异常,并提供分析和建议
3.分析SQL语句{{#1741938410121.result#}}和用户的问题{{#1741938398688.sql#}}是否匹配
4.最后附上查询的sql语句

下一弹更新Echarts可视化助手
Dify教程目录
一、Dify的介绍
二、Dify的安装方式

1. 本地部署

2. Docker安装

3.Ollama

4.Dify关联Ollama

三、Dify应用讲解

1. 创建空白应用

2. 创建本地知识库

3.知识库应用

4. AI图片生成工具

5. 旅游助手

6. SQL执行器

7. 科研论文翻译

8. SEO翻译

9. 标题覚文案生成

10.知识库图像检索和展示

11.自然语言生成SQL

12. Echarts可视化助手

13.-如何用DeepSeek+Kimi快速生成PPT来提升你的工作效率

.........

持续更新中,如需DIFY全流程文档可关注博主,查看私信获取哦
————————————————

### 使用 Dify 实现 Text2SQL 的功能 Dify 是一种强大的工具,能够结合大语言模型(LLM)和知识库生成 SQL 查询语句,并将其应用于 PostgreSQL 数据库或其他关系型数据库中。以下是关于如何使用 Dify 来实现从自然语言SQL 换的具体方法。 #### 创建表结构并插入数据 为了使 Dify 正常运行,首先需要准备好目标数据库中的表结构以及相应的测试数据。这一步可以通过标准的 SQL 命令完成[^1]: ```sql CREATE TABLE employees ( id SERIAL PRIMARY KEY, name VARCHAR(100), department VARCHAR(50), salary NUMERIC ); INSERT INTO employees (name, department, salary) VALUES ('Alice', 'HR', 7000); INSERT INTO employees (name, department, salary) VALUES ('Bob', 'Engineering', 9000); INSERT INTO employees (name, department, salary) VALUES ('Charlie', 'Marketing', 8000); ``` #### 导入知识库 在实际应用之前,还需要向 Dify 提供有关业务逻辑的知识库文件。这些文件通常包含领域特定术语及其对应的 SQL 表字段映射关系等内容。例如,在员工管理场景下可能定义如下规则: - “部门”对应 `department` 字段; - “薪资高于 X 元”的条件表达式应翻译成 `salary > X`。 #### 配置 Dify 工作流以支持 SQL 查询 接下来要做的就是设置好整个工作流程让其具备处理用户求的能力。具体来说,这意味着指定哪些 API 接口负责接收前端传来的 Prompts 并返回解析后的结果;同时也涉及调整内部参数使得最终输出更加贴近预期效果^。 #### 设定 Prompt 模板 Prompt 模板的设计直接影响着 LLM 对于输入的理解程度及生成质量的好坏。因此建议尽可能清晰简洁地描述需求的同时保留足够的灵活性以便适应不同类型的询问形式[^2]。比如针对上述例子可以采用这样的模板:“告诉我所有来自 {Department} 部门且工资大于等于 {Salary} 的雇员名单。” #### Agent 配置与对话界面集成 最后一点则是关于 Agents 的部署位置还有 UI/UX 方面考量因素等问题讨论。理想状态下应当让用户感觉不到背后复杂的技术细节存在,仅仅通过简单的文字交流就能获得所需信息反馈回来。 ```python from dify import DifyAgent agent = DifyAgent(api_key="your_api_key") response = agent.query(prompt="找出所有属于工程部并且薪水超过八千元的人", db_connection_string="postgresql://user:password@localhost/mydb") print(response) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值