推荐理由:打开SQL技能树的新思路。原文地址:https://medium.com/towards-data-science/how-to-use-openai-chatgpt-api-in-sql-9b60d2526a9e
当谈到 ChatGPT 和使用 OpenAI API 时,SQL 并不是第一个想到的语言。但它应该 — 它是数据语言,并且您可以从 SQL 发送 HTTP 请求这一事实开启了一个充满可能性的世界。
今天的文章将向您展示如何使用 PL/SQL 编写自定义 Oracle SQL 函数。它将接收问题字符串并返回格式化的 JSON。Oracle 的dbms_cloud
包将完成大部分繁重的工作,因为它负责进行 API 调用。如果您使用不同的数据库供应商,我相信您可以找到替代包和功能集来完成这项工作。
让我们首先介绍您需要遵循的先决条件。
SQL 中的 ChatGPT — 先决条件
正如简介中提到的,我使用的是在Oracle Cloud上配置的始终免费的Autonomous Database 21c实例上运行的 Oracle SQL 。如果您想继续操作,请注册一个免费帐户,配置一个数据库实例,然后下载一个连接钱包。
您需要的另一件事是OpenAI API 密钥。链接的文章向您展示了如何在几分钟内获得一个。
就这样了!我们开始谈正事吧。
我们将在 SQL 中实现的聊天完成示例非常简单。OpenAI 的官方文档向您展示了向其 API 发出请求的过程:
图 1 — OpenAI 请求文档(作者提供的图片)
由于 SQL 中的 OpenAI 没有第三方库(如 Python),因此您必须选择更手动的方法。理论上来说,如果您可以运行上面的curl 命令并获得响应,那么您也可以在 SQL 中执行相同的操作。
演示这一点的最简单方法是通过Postman。填充新 POST 请求的标头和 JSON 正文https://api.openai.com/v1/chat/completions
,您应该会得到与我类似的响应:
图 2 — 通过 Postman 向 OpenAI API 发出请求(作者提供的图片)
这不是最令人印象深刻的 GPT 响应,但它正在发挥作用。接下来让我们把它带到 SQL 中。
PL/SQL 允许您定义自定义函数等。该get_gpt_response()
函数接受字符串问题并返回 CLOB,这是一种特殊的数据类型,用于存储对于默认 VARCHAR2 类型来说可能太大的字符串。
在函数内部,该v_api_key
常量保存您的 OpenAI API 密钥的值,因此不要忘记更改它。
该函数使用 Oracle 的dbms_cloud
包向 OpenAI 的聊天完成端点发送 HTTP 请求。该send_request()
过程需要以下参数:
uri
— 端点的 URL。method
— 用于请求的 HTTP 方法。您需要将您的设置为 POST。headers
— 指定请求标头的 JSON 对象。正如您在本文前面所看到的,您需要指定Content-Type
和Authorization
。body
— JSON 对象转换为 BLOB。它包含您随请求发送的数据,例如您要使用的模型、其温度参数(随机性)以及您希望 GPT 回答的问题。结果send_request()
存储到v_response
变量中,然后作为文本返回给用户:
相关SQL
create or replace function get_gpt_response(
p_question varchar2
) return clob
is
v_api_key constant varchar2(100) := '<your-api-key>';
v_response dbms_cloud_types.resp;
begin
v_response := dbms_cloud.send_request(
uri => 'https://api.openai.com/v1/chat/completions',
method => dbms_cloud.method_post,
-- Headers must be of type JSON_OBJECT
headers => json_object(
'Content-Type' value 'application/json',
'Authorization' value 'Bearer ' || v_api_key
),
-- Request body must be a JSON structure converted to BLOB
body => utl_raw.cast_to_raw(
json_object(
'model' value 'gpt-3.5-turbo',
'messages' value json_array(
json_object(
'role' value 'user',
'content' value p_question
)
),
'temperature' value 0.5
)
)
);
return dbms_cloud.get_response_text(v_response);
end get_gpt_response;
/
运行上面的代码片段后,该函数就可以使用了。
让我们看看它是否按预期工作:
相关SQL
select
json_query(get_gpt_response('What is the capital of United States?'), '$' returning clob pretty) as response
from dual;
这是我得到的回复:
图 3 — 通过 SQL 向 OpenAI API 发出请求(作者提供的图片)
奇迹般有效!唯一的问题是 — 响应显示为 JSON,这不是您在使用关系数据库时通常想要的。
幸运的是,Oracle 具有出色的 JSON 支持,这意味着您可以提取相关字段并将响应格式化为普通数据库表:
相关SQL
with response as (
select get_gpt_response('What is the capital of United States?') as data
from dual
)
select
jt.*
from response r,
json_table(
r.data,
'$'
columns(
id varchar2(50) path '$.id',
answer varchar2(1000) path '$.choices[0].message.content',
prompt_tokens number path '$.usage.prompt_tokens',
completion_tokens number path '$.usage.completion_tokens',
total_tokens number path '$.usage.total_tokens'
)
) jt;
这是输出:
图 4 — OpenAI 响应,格式为表格(图片由作者提供)
从这里开始,世界尽在掌握。您可以按原样使用结果,也可以将它们保存到表中。令牌使用信息应该是消耗资源的良好指标,如果您计划经常运行此功能,这是一个很大的优势。
您今天实施的解决方案有效,但相当基础,可以从一些调整中受益:
dbms_cloud
错误以及其他更通用的错误。如果您有一些基本的 SQL 技能,那么所有这些领域都很容易解决,所以我将其留给您。
没有多少人期望 SQL 成为对 OpenAI API 进行 HTTP 调用的可行选项。哎呀,许多新手并不知道 SQL 可以做的不仅仅是基本的数据操作。它是数据语言,因此几乎可以做 Python 能做的任何事情,但不需要数据移动。
今天的示例仅限于 Oracle SQL 和 PL/SQL,但我相信您可以找到一种方法在 SQL Server、MySQL 和 Postgres 中实现我的解决方案。
请继续关注更多有趣的 SQL 用例,例如机器学习和空间数据分析。