如何将 SQL 与常见 AI 工具 GPT 集成
随着GPT模型的快速发展和卓越表现,越来越多的应用开始集成GPT模型以提升其功能和性能。在本文章中,将总结构建SQL提示的方法,并探讨如何将一个开源SQL工程进行产品化。文末有送书福利!!!
总结SQL提示内容
有两个方面决定了能否构建高质量SQL提示内容,分别是个人SQL能力和大语言模型性能。
1. 个人SQL能力
构建高质量的SQL提示内容对个人提出较高的要求。这要求个人具备熟练的SQL语言和数据库知识,深入理解SQL执行过程,并能够将自然语言理解应用于实际情境,将这些理解和知识转化为有效的SQL提示内容和功能。个人需具备以下两种能力,以构建高质量的提示。
(1) 持续学习能力。构建SQL提示内容并不适合SQL初学者,它更需要工程师级别的知识和技能作为基础。然而,通过使用ChatGPT,可以降低学习的难度。在介绍的“费曼学习法提示” 方法的指导下,初学者完全可以自学并掌握这一领域的知识。
(2) 熟悉SQL语言知识。熟悉SQL语言的各种语句类型,如DDL、DML、DQL语句,以及它们的具体语法是生成SQL提示的基础。
2. 大语言模型性能
构建高质量的SQL提示内容需要大语言模型在自然语言理解、数据库元数据理解、SQL语句生成与优化等方面具备较强的能力。为评估大语言模型的性能,可以从以下三个方面考虑。
(1)自然语言理解。评估大语言模型是否能够准确理解自然语言描述的SQL操作要求和查询要求。
(2)数据库元数据理解。评估大语言模型是否能够理解数据库版本、数据类型、表间关系等元数据信息。
(3)SQL语句生成。评估大语言模型的性能,包括其是否能够根据需求生成正确的DDL语句、DML查询、SQL优化建议和SQL风险预警。
sql-translator产品介绍
sql-translator是使用Node.JS调用ChatGPT API的开源工具,可将SQL语句与自然语言互相转换,对于没有ChatGPT账号的读者可使用该工具学习SQL、构建测试提示。
1.操作界面介绍
如下图所示为 sql-translator 工具将自然语言转为SQL的操作界面。在左侧的输入框中输入提示内容,然后点击“Generate SQL”在右侧的文本框中生成对应的SQL语句。
点击上图中的 1 标识处,可切换为SQL转换自然语言的操作界面,如下图所示。在左侧输入框中输入SQL语句,然后点击“Generate Natural Language”在右侧文本框中生成对应的自然语言。
实践操作
(1) 将SQL翻译为自然语言。如图3所示,将生成的SQL转换为自然语言。由于sqltranslator工具功能还不完善,为了将SQL语句翻译为中文,第一行SQL语句为:SELECT "翻译为中文"。
(2) 将自然语言翻译为SQL。如下图所示,将提示内容翻译为SQL。
sql-translator运行方式
sql-translator是开源工具,可通过查看其源代码了解运行方式,即调用了哪些ChatGPT API、构建了哪些提示内容。为了能更好地理解本节内容,可复习下第3 章和第 4 章中ChatGPT API的内容。
1. 自然语言转SQL
sql-translator开源工程中有一个名为“translateToSQL.js”的脚本,作用是将输入的自然语言查询翻译成SQL语句,以下简要解析代码。
(1) 定义translateToSQL函数。translateToSQL函数接收三个参数:query参数是自然语言查询文本;apiKey参数是 API 密钥;参数tableSchema是可选参数,是表结构信息。
// 从"isomorphic-unfetch"模块导入fetch函数,这个函数在不同环境(如 Node.js 和浏览器)中都能使用
import fetch from "isomorphic-unfetch";
// 定义一个异步函数translateToSQL
const translateToSQL = async (query, apiKey, tableSchema = "") => {……
(2) 构建提示内容。在translateToSQL函数中首先定义一个名为prompt的变量,将参数query和 tableSchema作为提示内容拼接到prompt变量中。
// 构造一个字符串变量prompt,该变量被发送到OpenAI的GPT-3 API,用于生成SQL语句
const prompt = Translate this natural language query into SQL
without changing the case of the entries given by me:\n\n"${query}"\n\ n${tableSchema ? 'Use this table schema:\n\n${tableSchema}\n\n' : ''}SQL
Query:;
为了能更好地理解translateToSQL函数中的提示内容,以下将prompt变量内容翻译为中文。
>提示翻译为中文:
将这个自然语言查询翻译为SQL,不要改变我给出的信息的大小写:
"query参数内容"
表结构信息:tableSchema参数内容
SQL查询语句为:
(3) 调用ChatGPT API。构建完提示内容后,在translateToSQL函数中发起API请求,代码如下所示。调用的API端点为“/v1/completions”,提示内容为prompt变量的值,使用的模型为“textdavinci-003”。
// 发送一个POST请求到OpenAI的API地址
const response = await fetch("https://api.openai.com/v1/completions", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: 'Bearer ${apiKey}', // 在请求头中设置API密钥
},
body: JSON.stringify({ // 请求体中包含将发送给API的数据
prompt, // 提示内容
temperature: 0.5, // 控制输出的随机性
max_tokens: 2048, // 最大生成的文本长度
n: 1, // 生成的文本数量
stop: "\\n", // 生成停止的标志
model: "text-davinci-003", // 使用的模型
frequency_penalty: 0.5, // 频率惩罚
presence_penalty: 0.5, // 存在惩罚
logprobs: 10, // 生成对数概率
}),
});
(4)解析返回结果。调用ChatGPT API后,对返回的JSON格式结果进行解析,代码如下所示。
// 解析响应数据为JSON
const data = await response.json();
// 如果响应状态不好,输出响应并抛出错误
if (!response.ok) {
console.log(response);
throw new Error(data.error || "Error translating to SQL.");
}
// 返回生成的SQL语句
return data.choices[0].text.trim();
};
2. SQL转自然语言
sql-translator开源工程中有一个名为“translateToHuman.js”的脚本,作用是将输入的SQL语句转换为自然语言,以下简要解析代码。(1) 定义 translateToHuman函数。translateToHuman函数接收 2 个参数:query参数是SQL语句文本;apiKey参数是 API 密钥。
// 从isomorphic-unfetch模块导入fetch函数,这个函数在不同环境(如 Node.js 和浏览器)中都能使用
import fetch from "isomorphic-unfetch";
// 定义一个异步函数 'translateToHuman'
const translateToHuman = async (query, apiKey) => {……
(2) 调用ChatGPT API。在translateToHuman函数中发起API请求,代码如下所示。调用的API 端点为“/v1/completions”,提示内容为prompt参数,使用的模型为“text-davinci-003”。
// 发送一个POST请求到OpenAI的API地址
const response = await fetch("https://api.openai.com/v1/completions", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: 'Bearer ${apiKey}', // 在请求头中设置API密钥
},
body: JSON.stringify({ // 请求体中包含将发送给API的数据
// prompt 指向GPT-3模型,告诉它我们需要翻译的SQL查询
prompt: 'Translate this SQL query into natural language:\n\ n"${query}"\n\nNatural language query:',
temperature: 0.5, // 控制输出的随机性
max_tokens: 2048, // 最大生成的文本长度
n: 1, // 生成的文本数量
stop: "\\n", // 生成停止的标志
model: "text-davinci-003", // 使用的模型
frequency_penalty: 0.5, // 频率惩罚
presence_penalty: 0.5, // 存在惩罚
logprobs: 10, // 生成对数概率
}),
});
为了能更好地理解translateToHuman函数中的提示内容,以下将prompt参数内容翻译为中文。
>prompt参数的英文提示:
prompt: Translate this SQL query into natural language:\n\n"${query}"\n\ nNatural language query:
>提示翻译为中文:
将此SQL查询翻译为自然语言:
"query参数内容"
自然语言内容为:
(3)解析返回结果。调用ChatGPT API后,对返回的JSON格式结果进行解析,代码如下所示。
// 解析响应数据为JSON
const data = await response.json();
// 如果响应状态不好,输出响应并抛出错误
if (!response.ok) {
console.log(response);
throw new Error(data.error || "Error translating to SQL.");
}
// 返回生成的自然语言查询
return data.choices[0].text.trim();
};
SQL集成GPT产品化探讨
sql-translator为了将SQL与GPT模型集成并进行产品化提供了一个良好的思路。基于以下三点,说明以sql-translator代码为基础逐步完善,并将其发展为特定的产品。
(1) SQL教学平台。开发一款用于教学的平台,用户可以输入自然语言的数据查询请求,平台即返回对应的SQL代码。这样一来,用户可以在实际操作中学习并理解SQL查询是如何工作的,逐渐掌握SQL语言。
(2) 智能数据报告生成工具。这个工具可以从数据库中获取数据,并自动生成相应的报告。例如,输入“显示上个月的销售额”,工具将自动翻译为相应的SQL查询语句获取数据,并生成易于理解的分析报告。
(3) 智能数据分析聊天机器人。构建一个聊天机器人,用户可以向它提问,例如,“去年同期的销售数据是多少?”或“显示今年第二季度的用户增长”。机器人会把这些自然语言问题转化为SQL查询,获取数据,并给出人类语言的答案。本文章出自北京大学出版社《AI提示工程实战:从零开始利用提示工程学习应用大语言模型》一书中,经授权此公号。
福利时刻:先到先得
下面我再推荐一个好工具,来自阿里的Chat2DB,https://github.com/alibaba/Chat2DB
。
帮我创建表:姓名、年龄、出生年月
--- BEGIN ---
帮我创建表:姓名、年龄、出生年月
--- 自然语言转换 ---
CREATE TABLE 表名 (姓名 VARCHAR(50), 年龄 INT, 出生年月 DATE);
--- END ---
帮往数据表插入10条数据,注意:出生年月跨度要大
--- BEGIN ---
帮往数据表插入10条数据,注意:出生年月跨度要大
--- 自然语言转换 ---
于10年,年龄随机生成。
SQL查询语句:
INSERT INTO 表名 (姓名, 年龄, 出生年月)
VALUES
('张三', 23, '1998-05-12'),
('李四', 31, '1990-09-23'),
('王五', 27, '1994-02-18'),
('赵六', 19, '2002-11-05'),
('钱七', 35, '1986-07-30'),
('孙八', 28, '1993-04-15'),
('周九', 26, '1995-12-08'),
('吴十', 22, '1999-08-21'),
('郑十一', 30, '1991-03-27'),
('陈十二', 24, '1997-06-02');
--- END ---
帮我查询 1995年之后有几人?
--- BEGIN ---
帮我查询 1995年之后有几人?
--- 自然语言转换 ---
SELECT COUNT(*) FROM 表名 WHERE 出生年月 >= '1995-01-01'
--- END ---
好了,更多案例集,推荐大家阅读《AI提示工程实战:从零开始利用提示工程学习应用大语言模型》这本书。这本书,这周我这里做活动,评论区留言,留言中点赞数排名前五的网友,加我微信:xmtxtt,私我地址,我免费邮寄给大家!