digoal
2023-03-31
PostgreSQL , PolarDB , databend , openai , 自然语言 , sql
自然语言转SQL的实现套路应该都差不多: 将schema元数据发送给openai, 通过openai的学习, 可以将自然语言转换为SQL. 需要配置openai账号, 而且需要发元数据给openai
《PostgreSQL chatgpt 插件pg_gpt: 支持openai, 自动学习schema, 通过自然语言生成SQL》
databend ai for db 参考:
https://www.zhihu.com/org/datafuse
https://zhuanlan.zhihu.com/p/617861596
https://databend.rs/doc/sql-functions/ai-functions/ai-to-sql
https://www.qcc.com/firm/bd7cf6494bd6aaa2b8eefeb49ecc0e69.html
期待未来更多ai for db的能力: 如报错分析, 性能诊断, schema设计建议, SQL审核, SQL优化建议等.
使用最新的Codex模型将自然语言指令转换为 SQL 查询code-davinci-002。
Databend 通过结合 OLAP 和 AI 为构建 SQL 查询提供了一个有效的解决方案。通过该功能,可以将自然语言编写的指令转换为符合表模式的SQL查询语句。例如,可以为该函数提供像“获取所有价格不超过 10 美元的商品”这样的句子作为输入,并生成相应的 SQL 查询“SELECT * FROM items WHERE price <= 10”作为输出。
注意: 生成的 SQL 查询语句遵循 PostgreSQL 标准,因此它们可能需要手动修改以与 Databend 的语法保持一致。
USE <your-database>;
SELECT * FROM ai_to_sql('<natural-language-instruction>');
获取和配置 OPENAI API 密钥:
要获取您的 openAI API 密钥,请访问https://platform.openai.com/account/api-keys并生成一个新密钥。
使用 openai_api_key 设置配置databend-query.toml文件。
[query]
... ...
openai_api_key = "<your-key>"
本例中,通过AI_TO_SQL函数指令生成一条SQL查询语句,执行结果语句得到查询结果。
1、准备数据。
CREATE DATABASE IF NOT EXISTS openai;
USE openai;
CREATE TABLE users(
id INT,
name VARCHAR,
age INT,
country VARCHAR
);
CREATE TABLE orders(
order_id INT,
user_id INT,
product_name VARCHAR,
price DECIMAL(10,2),
order_date DATE
);
-- Insert sample data into the users table
INSERT INTO users VALUES (1, 'Alice', 31, 'USA'),
(2, 'Bob', 32, 'USA'),
(3, 'Charlie', 45, 'USA'),
(4, 'Diana', 29, 'USA'),
(5, 'Eva', 35, 'Canada');
-- Insert sample data into the orders table
INSERT INTO orders VALUES (1, 1, 'iPhone', 1000.00, '2022-03-05'),
(2, 1, 'OpenAI Plus', 20.00, '2022-03-06'),
(3, 2, 'OpenAI Plus', 20.00, '2022-03-07'),
(4, 2, 'MacBook Pro', 2000.00, '2022-03-10'),
(5, 3, 'iPad', 500.00, '2022-03-12'),
(6, 3, 'AirPods', 200.00, '2022-03-14');
2、以英语编写的指令作为输入运行 AI_TO_SQL 函数。
SELECT * FROM ai_to_sql(
'List the total amount spent by users from the USA who are older than 30 years, grouped by their names, along with the number of orders they made in 2022');
3、函数生成 SQL 语句作为输出:
*************************** 1. row ***************************
database: openai
generated_sql: SELECT name, SUM(price) AS total_spent, COUNT(order_id) AS total_orders
FROM users
JOIN orders ON users.id = orders.user_id
WHERE country = 'USA' AND age > 30 AND order_date BETWEEN '2022-01-01' AND '2022-12-31'
GROUP BY name;
4、运行生成的SQL语句得到查询结果。
+---------+-------------+-------------+
| name | order_count | total_spent |
+---------+-------------+-------------+
| Bob | 2 | 2020.00 |
| Alice | 2 | 1020.00 |
| Charlie | 2 | 700.00 |
+---------+-------------+-------------+