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


步骤3:将数据发送到的API
你可以先将数据复制粘贴到的Web界面之一中,以在或 API 中查看结果 。不收费,但无法调整结果 。允许设置诸如温度(即回答的“随机性”或创造性程度)和要使用的模型等参数 。对于SQL代码,我将温度设置为0 。
接下来,我将一个自然语言问题保存到变量中,使用我的函数创建一个提示,并查看将该提示粘贴到API 中会发生什么:
> my_query <- "What were the highest and lowest Population changes in 2020 by Division?"> my_prompt <- get_query(states_schema_string, states_sample_string, my_query, "states")> cat(my_prompt)Act as if you're a data scientist. You have a SQLite table named states with the following schema:?```0StateTEXT0NA01Pop_2000INTEGER0NA02Pop_2010INTEGER0NA03Pop_2020INTEGER0NA04PctChange_2000REAL0NA05PctChange_2010REAL0NA06PctChange_2020REAL0NA07State CodeTEXT0NA08RegionTEXT0NA09DivisionTEXT0NA0```?The first rows look like this: ?```Delaware78360089793498994817.614.610.2DESouthSouth AtlanticMontana902195989415108422512.99.79.6MTWestMountainArizona51306326392017715150240.024.611.9AZWestMountain```?Based on this data, write a SQL query to answer the following question: What were the highest and lowest Population changes in 2020 by Division?. Return the SQL query ONLY. Do not include any additional explanation.
提示输入 API 和生成的SQL代码
以下是我运行建议的SQL时的结果:
sqldf("SELECT Division, MAX(PctChange_2020) AS Highest_PctChange_2020,MIN(PctChange_2020) AS Lowest_PctChange_2020 FROM states GROUP BY Division;")Division Highest_PctChange_2020 Lowest_PctChange_20201 East North Central4.7-0.12 East South Central8.9-0.23Middle Atlantic5.72.44Mountain18.42.35New England7.40.96Pacific14.63.37South Atlantic14.6-3.28 West North Central15.82.89 West South Central15.92.7
步骤4:执行由GPT返回的SQL代码结果
通过编程方式将数据发送到并从中返回会比将其复制粘贴到Web界面中更方便 。有一些R包可以用于与 API进行交互 。以下代码块使用该包向API发送提示,存储API响应,提取包含所请求SQL代码的文本部分,复制该代码,并在数据上运行SQL 。
library(openai)my_results <- openai::create_chat_completion(model ="gpt-3.5-turbo", temperature = 0, messages =list(list(role = "user", content = my_prompt))) the_answer <- my_results$choices$message.content?cat(the_answer)SELECT Division, MAX(PctChange_2020) AS Highest_Population_Change, MIN(PctChange_2020) AS Lowest_Population_ChangeFROM statesGROUP BY Division;?sqldf(the_answer)Division Highest_Population_Change Lowest_Population_Change1 East North Central4.7-0.12 East South Central8.9-0.23Middle Atlantic5.72.44Mountain18.42.35New England7.40.96Pacific14.63.37South Atlantic14.6-3.28 West North Central15.82.89 West South Central15.92.7
如果你想使用 API,你需要一个 API密钥 。对于这个包,密钥应该存储在系统环境变量中,例如 。请注意,这个API不是免费使用的,但在我把它变成我的编辑器之前,我一天运行了这个项目十几次,我的总账户使用量是1美分 。
步骤5(可选):创建一个交互式应用程序
现在你已经拥有了在R工作流中运行查询的所有所需代码,可以在脚本或终端中使用它 。但是,如果你想创建一个用于以自然语言查询数据的交互式应用程序,我提供了一个基本的Shiny应用程序的代码供你使用 。如果你打算发布一个供他人使用的应用程序,而不仅仅是自己使用,你需要加固代码以防止恶意查询,添加更好的错误处理和解释性标签,改进样式,并对企业使用进行扩展 。与此同时,以下代码可以帮助开始创建一个用于使用自然语言查询数据集的交互式应用程序:
library(shiny)library(openai)library(dplyr)library(sqldf)?# Load hard-coded datasetstates