Skip to content

Latest commit

 

History

History
149 lines (98 loc) · 6.07 KB

20230331_04.md

File metadata and controls

149 lines (98 loc) · 6.07 KB

Databend AI for DB - 结合openAI实现自然语言指令转换为 SQL 查询

作者

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优化建议等.

demo

使用最新的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 |  
+---------+-------------+-------------+  

digoal's wechat