如何使用Azure OpenAI Studio建立一个NL2SQL系统

使用Azure OpenAI Studio创建一个强大的NL2SQL系统' (How to Build a Powerful NL2SQL System with Azure OpenAI Studio)

我们将看到如何使用Azure OpenAI Studio设置一个推理终端点,我们可以调用它来生成SQL命令。

本文是免费开放的大规模语言模型课程的一部分,可在GitHub上获取。

Created by Author with Dall-E2

上一篇文章中,我们学习了如何设置一个能够根据用户请求生成SQL命令的提示。

现在,我们将看到如何使用Azure OpenAI Studio创建一个推理终端点,我们可以调用它来生成SQL命令。

虽然您正在阅读这些内容,您很可能已经满足了要求,但我想提醒您,需要具备以下条件:

  • 您将需要一个Azure订阅,免费的初次注册时会赠送初始免费额度。创建Azure订阅
  • 您还需要获取OpenAI资源的访问权限。目前,Microsoft已经减少了要求和等待时间。申请表格可能看起来比实际情况更令人害怕。我使用一个注册域的电子邮件申请访问,并提到我想获取一个课程的信息。他们几乎立即授予了我访问权限。申请访问Azure OpenAI Studio

很可能很快就不需要申请访问权限了。所以,我建议无论如何都试一试,即使您还没有申请许可。

设置Azure OpenAI Studio。

我们可以直接从Azure门户进行访问:https://portal.azure.com/#home

进入后,在服务中,我们需要选择Azure AI服务

我们点击Azure OpenAI帐户

在这个界面中,我们需要选择订阅。如果您有学生订阅,可能不会起作用。创建一个不同的订阅。

对于资源组,我会创建一个新的。您可以给它任何您喜欢的名称。它只是一个逻辑分组,将所有资源放在一个组下。这样,当您删除该组时,会删除所有创建的资源,而不会影响任何其他项目或组。由于这只是一个临时项目,最好的做法是在最后删除它,以避免产生任何费用。

对于区域,我会选择离您所在位置最近的一个。Azure只会显示OpenAI服务可用的区域。

对于名称,为您的项目选择一个唯一的名称

对于定价层,选择Standard S0。这可能是您唯一可用的选项。

通过这个步骤,你可以点击”Review+Create”按钮,验证数据后就可以开始享受该服务了。

配置将会花费几分钟的时间完成,在完成后,你将会看到一个类似于下图的屏幕:

点击Go to Resource

现在,你可以从Model Deployments部分创建一个新的部署。只需给它一个名称并选择模型:GPT-3.5-Turbo

只需几秒钟,Azure OpenAI Studio的部署就会准备好。

只需点击部署名称,我们就可以开始工作了。

PlayGround部分,选择Chat,然后你可以开始输入提示信息。

我们根据论文“How to Prompt LLMs for Text-to-SQL: A Study in Zero-shot, Single-domain, and Cross-domain Settings.”创建了提示。

create table employees(        ID_Usr INT primary key,        name VARCHAR);    /*3 example rows    select * from employees limit 3;    ID_Usr    name    1344      George StPierre    2122      Jon jones    1265      Anderson Silva    */    create table salary(        ID_Usr INT,        year DATE,        salary FLOAT,        foreign key (ID_Usr) references employees(ID_Usr));    /*3 example rows    select * from salary limit 3    ID_Usr    date          salary    1344      01/01/2023    61000    1344      01/01/2022    60000    1265      01/01/2023    55000    */    create table studies(        ID_study INT,        ID_Usr INT,        educational_level INT,  /* 5=phd, 4=Master, 3=Bachelor */        Institution VARCHAR,        Years DATE,        Speciality VARCHAR,        primary key (ID_study, ID_Usr),        foreign key(ID_Usr) references employees (ID_Usr));    /*3 example rows    select * from studies limit 3    ID_Study ID_Usr educational_level Institution    Years       Speciality    2782     1344   3                 UC San Diego   01/01/2010  Bachelor of Science in Marketing    2334     1344   5                 MIT            01/01/2023  Phd. Data Science.    2782     2122   3                 UC San Diego   01/01/2010  Bachelor of Science in Marketing    */-Maintain the SQL order simple and efficient as you can, using valid SQL Lite, answer the following questions for the table provided above. Question: How Many employes we have with a salary bigger than 50000?SELECT COUNT(*) AS total_employeesFROM employees eINNER JOIN salary s ON e.ID_Usr = s.ID_UsrWHERE s.salary > 50000;  Question: Return the names of the three people who have had the highest salary increase in the last three years.SELECT e.nameFROM employees eJOIN salary s ON e.ID_usr = s.ID_usrWHERE s.year >= DATE_SUB(CURDATE(), INTERVAL 3 YEAR)GROUP BY e.nameORDER BY (MAX(s.salary) - MIN(s.salary)) DESCLIMIT 3;Question: The name of the best paid employee.

这是我们完整的提示信息。我们需要将其分成多个部分,以将每个部分放置在相应的框中。

System message框中,我们将放入所有提示内容,但不包括示例内容:

创建表employees(        ID_Usr INT primary key,        name VARCHAR);    /*3个示例行    选择* from employees limit 3;    ID_Usr    name    1344      George StPierre    2122      Jon Jones    1265      Anderson Silva    */    创建表salary(        ID_Usr INT,        year DATE,        salary FLOAT,        外键(ID_Usr)参考employees(ID_Usr));    /*3个示例行    选择* from salary limit 3    ID_Usr    date          salary    1344      01/01/2023    61000    1344      01/01/2022    60000    1265      01/01/2023    55000    */    创建表studies(        ID_study INT,        ID_Usr INT,        educational_level INT,  /* 5=博士, 4=硕士, 3=学士 */        Institution VARCHAR,        Years DATE,        Speciality VARCHAR,        primary key (ID_study, ID_Usr),        foreign key(ID_Usr)参考employees (ID_Usr));    /*3个示例行    选择* from studies limit 3    ID_Study ID_Usr educational_level Institution    Years       Speciality    2782     1344   3                 UC San Diego   01/01/2010  Bachelor of Science in Marketing    2334     1344   5                 MIT            01/01/2023  博士。数据科学。    2782     2122   3                 UC San Diego   01/01/2010  Bachelor of Science in Marketing    */- 保持SQL命令简单高效,使用有效的SQL Lite,回答上面提供的表的以下问题。

在这一部分,我们提供了数据库结构,一些示例内容以及模型生成SQL查询的说明。

现在是时候用我们的提示示例填充示例部分了。在原始提示中,我们有两个示例:

问题:工资大于50000的雇员有多少人?SELECT COUNT(*) AS total_employeesFROM employees eINNER JOIN salary s ON e.ID_Usr = s.ID_UsrWHERE s.salary > 50000;  问题:返回过去三年内工资增长最高的三个人的姓名。SELECT e.nameFROM employees eJOIN salary s ON e.ID_usr = s.ID_usrWHERE s.year >= DATE_SUB(CURDATE(), INTERVAL 3 YEAR)GROUP BY e.nameORDER BY (MAX(s.salary) - MIN(s.salary)) DESCLIMIT 3;问题:最高工资的员工的姓名。

正如您所看到的,我们为每个查询创建了一个示例。这种技术被称为少样本抽样,允许模型了解如何响应用户查询。

最佳示例数量通常在一到六个之间,添加更多示例可能不会对模型的响应产生显着的积极影响。

我们还可以修改超参数设置。

对于代码生成,我建议使用温度为0。模型没有必要在回答中过于富有想象力。

现在是时候开始玩耍和测试提示了。

从这里开始,如果我们喜欢回答,我们可以做两件事:

  • 导出配置。这将保存一个文件,我们可以用来重新配置Playground。
  • 点击查看代码,它将提供一个调用我们的模型的示例代码。

从笔记本中调用Azure OpenAI服务。

该笔记本可在Github上的Large Language Models Course仓库中找到。

Large-Language-Model-Notebooks-Course/P1-NL2SQL/NL2SQL_OpenAI_Azure.ipynb at main ·…

关于大型语言模型的实用课程。. 参与peremartra/Large-Language-Model-Notebooks-Course…

github.com

让我们开始安装并导入OpenAI库。

#安装openai !pip install -q "openai<1.0.0"import osimport openai

现在我们需要设置我们的Azure访问。

#Azure配置openai.api_type = "azure"#这里是从Azure获取的推理点openai.api_base = "https://openaicourseperemartra.openai.azure.com/"openai.api_version = "2023-07-01-preview"openai.api_key = "你的Azure OpenAI密钥"

输入提示:

context = [ {'role':'system', 'content':"""create table employees(    ID_Usr INT primary key,    name VARCHAR);/* 3 example rowsselect * from employees limit 3;ID_Usr    name1344      George StPierre2122      Jon jones1265      Anderson Silva*/create table salary(    ID_Usr INT,    year DATE,    salary FLOAT,    foreign key (ID_Usr) references employees(ID_Usr));/* 3 example rowsselect * from salary limit 3ID_Usr    date          salary1344      01/01/2023    610001344      01/01/2022    600001265      01/01/2023    55000*/create table studies(    ID_study INT,    ID_Usr INT,    educational_level INT,  /* 5=phd, 4=Master, 3=Bachelor */    Institution VARCHAR,    Years DATE,    Speciality VARCHAR,    primary key (ID_study, ID_Usr),    foreign key(ID_Usr) references employees (ID_Usr));/* 3 example rowsselect * from studies limit 3ID_Study ID_Usr educational_level Institution    Years       Speciality2782     1344   3                 UC San Diego   01/01/2010  Bachelor of Science in Marketing2334     1344   5                 MIT            01/01/2023  Phd. Data Science.2782     2122   3                 UC San Diego   01/01/2010  Bachelor of Science in Marketing*/-请尽可能简化和高效地保持SQL顺序,使用有效的SQLite,回答上述所提供表格的以下问题。问题:我们有多少名薪水超过50000的员工?SELECT COUNT(*) AS total_employeesFROM employees eINNER JOIN salary s ON e.ID_Usr = s.ID_UsrWHERE s.salary > 50000;问题:返回过去三年内薪水增长最高的三个人的姓名。SELECT e.nameFROM employees eJOIN salary s ON e.ID_Usr = s.ID_UsrWHERE s.year >= DATE_SUB(CURDATE(), INTERVAL 3 YEAR)GROUP BY e.nameORDER BY (MAX(s.salary) - MIN(s.salary)) DESCLIMIT 3;"""} ]

我将创建一个函数来封装对OpenAI API的调用。

#调用模型的函数def return_CCRMSQL(user_message, context):    newcontext = context.copy()    newcontext.append({'role':'user', 'content':"question: " + user_message})    response = openai.ChatCompletion.create(      engine="GPT3NL2SQLSample1Deployment", #我们的部署      messages = newcontext,      temperature=0,      max_tokens=800)    return (response.choices[0].message["content"])

现在我们可以进行必要的测试,并获取查询我们数据库的SQL代码:

context_user = context.copy()print(return_CCRMSQL("最高薪水的员工姓名", context_user))

SELECT e.name FROM employees e JOIN salary s ON e.ID_usr = s.ID_usr WHERE s.salary = (SELECT MAX(salary) FROM salary); 这个查询将返回收入最高的员工的姓名。

print(return_CCRMSQL("平均薪水较高的机构", context_user))

SELECT st.Institution, AVG(sa.salary) AS avg_salary FROM studies st JOIN employees e ON st.ID_Usr = e.ID_Usr JOIN salary sa ON e.ID_Usr = sa.ID_Usr GROUP BY st.Institution ORDER BY avg_salary DESC LIMIT 1;

结论。

确定要使用哪个提示后,配置Azure OpenAI服务并使用Azure上托管的OpenAI模型而不是OpenAI API是一项简单的任务。

使用其中一个的选择取决于公司的决策。通过Azure Open Services使用的OpenAI模型不驻留在OpenAI中。换句话说,您提供的数据永远不会离开您的Azure订阅,并且永远不会用于训练未来的OpenAI模型。

从技术角度来看,差异微小,复杂性几乎不存在。

资源。

有关 大型语言模型 的完整课程在Github上提供。要及时了解新文章,请考虑关注或给其加星标仓库。这样,你将在添加新内容时收到通知。

GitHub – peremartra/Large-Language-Model-Notebooks-Course: 大型语言模型实用课程

大型语言模型实用课程。. 参与到peremartra/Large-Language-Model-Notebooks-Course …

github.com

解决方案中使用的提示基于论文“如何为文本到SQL提供提示:对零射击、单领域和跨领域设置的研究”。

本文是一个系列文章的一部分,我们在其中探讨大型语言模型的实际应用。您可以在以下列表中找到其他文章:

Pere Martra

Pere Martra

大型语言模型实用课程

查看列表12个故事

我经常写关于深度学习和人工智能的文章。请考虑 在VoAGI上关注我以获取有关新文章的更新。当然,欢迎与我在LinkedInTwitter上建立联系。