如何使用GPT作为SQL查询引擎的自然语言

译者 | 李睿
审校 | 重楼
如今 , 得益于ChatGPT这种生成式人工智能技术 , 使得用简单的语句查询数据集变得非常简单 。

如何使用GPT作为SQL查询引擎的自然语言

文章插图
与大多数生成式人工智能一样,AI target=_blank class=infotextkey>OpenAI公司开发的API的结果仍然不完美,这意味着用户不能完全信任它们 。幸运的是,用户现在可以编写代码来询问GPT如何计算响应,如果采用这种方法 , 用户可以自己运行代码 。这意味着用户可以使用自然语言询问ChatGPT一些问题 , 例如 , “某产品去年各地区的总销售额是多少?”,并对ChatGPT的回答准确性充满信心 。
以下是使用GPT为数据库设置自然语言查询的一种快速而简单的技术:
  • 将数据的结构、几个示例行或两者都放入单个文本字符串中 。
  • 用这些信息加上采用自然语言提出的问题,为GPT制作一个“提示” 。
  • 将提示发送到OpenAI的GPT-3.5-turbo API ,并请求SQL查询来回答问题 。
  • 运行返回到数据集的SQL来计算答案 。
  • (可选)创建一个交互式应用程序,使查询数据集变得简单 。
在处理实际数据时,这种方法有几个优点 。通过只发送数据结构和一些示例行(其中可能包括假数据),不需要向GPT发送实际的敏感数据 。如果数据规模太大,超出了GPT的提示大小限制,也不用担心 。并且,通过请求SQL而不是最终答案 , 检查GPT如何生成其答案的能力被嵌入到流程中 。
面向企业查询的生成式人工智能如果用户真的想使用生成式人工智能来开发企业级查询 , 可能想要研究像LangChain这样的工具,它是一个用于处理多种不同大型语言模型(LLM)的框架 , 而不仅仅是OpenAI公司的GPT 。OpenAI公司最近还宣布了在API请求中包含函数调用的可能性 , 其目的是使查询和类似的任务更容易、更可靠 。但对于快速原型或自己使用 , 这里描述的过程是一种简单的开始方法 。这里的演示是用R语言完成的,但这种技术可以在任何编程语言中使用 。
步骤1:将示例数据转换为单字符字符串这一步骤中的示例数据可以包括数据库模式或几行数据 。将其全部转换为单个字符串非常重要,因为它将成为将发送到GPT 3.5的更大的文本字符串查询的一部分 。
如果用户的数据已经在SQL数据库中,那么这一步非常简单 。如果不是,建议将其转换为SQL可查询的格式 。为什么?在测试了R语言和SQL代码结果之后,用户对GPT生成的SQL代码比它的R语言代码更有信心 。
在R语言的代码中,sqldf包允许用户在R数据帧上运行SQL查询,这就是在本例中使用的 。Python/ target=_blank class=infotextkey>Python中也有一个类似的sqldf库 。对于性能很重要的大型数据,可能需要查看duckdb项目 。
需要注意的是,在这个演示中,将使用一个包含美国人口普查州人口数据的CSV文件,可以在states.csv中找到 。
下面的代码将数据文件导入R语言 , 使用sqldf查看数据框架是SQL数据库表时的SQL模式,使用dplyr的filter()函数提取三个示例行,并将模式和示例行都转换为字符串 。免责声明:ChatGPT编写了将数据转换为单个字符串的基本R apply()部分代码(通常使用purrr完成这些任务) 。
library(rio)library(dplyr)library(sqldf)library(glue)states <- rio::import("https://raw.Githubusercontent.com/smach/SampleData/main/states.csv") |> filter(!is.na(Region))states_schema <- sqldf("PRAGMA table_info(states)")states_schema_string <- paste(apply(states_schema, 1, paste, collapse = "t"), collapse = "n")states_sample <- dplyr::sample_n(states, 3)states_sample_string <- paste(apply(states_sample, 1, paste, collapse = "t"), collapse = "n")步骤2:为大型语言模型(LM)创建提示符格式应该类似于“表现得像一个数据科学家 。有一个名为{table_name}的SQLite表,具有以下架构:```{schema}`` 。第一行看起来像这样:```{rows_sample}`` 。根据这些数据,编写一个SQL查询来回答以下问题:{query} 。只返回SQL,不包括解释 。”
下面的函数以这种格式创建查询 , 并接受数据模式、示例行、用户查询和表名的参数 。
create_prompt <- function(schema, rows_sample, query, table_name) { glue::glue("Act as if you're a data scientist. You have a SQLite table named {table_name} with the following schema: ``` {schema} ``` The first rows look like this:```{rows_sample}``` Based on this data, write a SQL query to answer the following question: {query}. Return the SQL query ONLY. Do not include any additional explanation.")}


推荐阅读