前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL 中如何使用 OpenAI ChatGPT API

SQL 中如何使用 OpenAI ChatGPT API

作者头像
万能数据的小草
发布2024-07-23 15:20:38
940
发布2024-07-23 15:20:38
举报
文章被收录于专栏:万能的小草
原作者:达里奥·拉德西奇(Dario Radečić)。小草编译。

推荐理由:打开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 Cl‍oud上配置的始终免费的Autonomous Database 21c实例上运行的 Oracle SQL 。如果您想继续操作,请注册一个免费帐户,配置一个数据库实例,然后下载一个连接钱包。

您需要的另一件事是OpenAI API 密钥。链接的文章向您展示了如何在几分钟内获得一个。

就这样了!我们开始谈正事吧。

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 中。

SQL 中的 ChatGPT — 如何在自定义 PL/SQL 函数中使用 OpenAI API

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-TypeAuthorization
  • body— JSON 对象转换为 BLOB。它包含您随请求发送的数据,例如您要使用的模型、其温度参数(随机性)以及您希望 GPT 回答的问题。

结果send_request()存储到v_response变量中,然后作为文本返回给用户:

代码语言:javascript
复制
相关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;
/

运行上面的代码片段后,该函数就可以使用了。

让我们看看它是否按预期工作:

代码语言:javascript
复制
相关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 支持,这意味着您可以提取相关字段并将响应格式化为普通数据库表:

代码语言:javascript
复制
相关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 总结

没有多少人期望 SQL 成为对 OpenAI API 进行 HTTP 调用的可行选项。哎呀,许多新手并不知道 SQL 可以做的不仅仅是基本的数据操作。它是数据语言,因此几乎可以做 Python 能做的任何事情,但不需要数据移动。

今天的示例仅限于 Oracle SQL 和 PL/SQL,但我相信您可以找到一种方法在 SQL Server、MySQL 和 Postgres 中实现我的解决方案。

请继续关注更多有趣的 SQL 用例,例如机器学习和空间数据分析。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-04-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 万能数据的小草 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • OpenAI API — 测试聊天完成端点
  • SQL 中的 ChatGPT — 如何在自定义 PL/SQL 函数中使用 OpenAI API
  • 你可以(并且应该)改进什么
  • SQL 中的 OpenAI API 总结
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档