如何使用Azure OpenAI Studio建立一个NL2SQL系统
使用Azure OpenAI Studio创建一个强大的NL2SQL系统' (How to Build a Powerful NL2SQL System with Azure OpenAI Studio)
我们将看到如何使用Azure OpenAI Studio设置一个推理终端点,我们可以调用它来生成SQL命令。
本文是免费开放的大规模语言模型课程的一部分,可在GitHub上获取。

在上一篇文章中,我们学习了如何设置一个能够根据用户请求生成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提供提示:对零射击、单领域和跨领域设置的研究”。
本文是一个系列文章的一部分,我们在其中探讨大型语言模型的实际应用。您可以在以下列表中找到其他文章:

大型语言模型实用课程
查看列表12个故事


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





