当前位置:首页|资讯|ChatGPT|OpenAI|编程

如何在10分钟内创建无服务器 ChatGPT 应用程序

作者:科技前沿AI发布时间:2023-06-05

自 OpenAI在 2023 年 3 月发布了 ChatGPT 的官方 API以来,许多开发人员和企业家有兴趣将其集成到自己的业务运营中。

但仍然存在一些重大障碍,使他们难以做到这一点:

  • OpenAI 为 ChatGPT 提供了一个简单的无状态 API。开发人员需要在应用程序管理的缓存或数据库中跟踪每个对话的历史和上下文。开发人员还需要管理和保护 API 密钥。有很多与应用程序的业务逻辑无关的样板代码。

  • ChatGPT API 应用程序的“自然”用户界面是线程聊天。但是很难在传统的 Web 或应用程序框架中创建“聊天 UI”。事实上,最常用的聊天 UI 已经存在于 Slack、Discord 甚至论坛(例如 GitHub Discussions)等消息应用程序中。我们需要一种简单的方法将 ChatGPT API 响应连接到现有的消息服务。

在本文中,我将向您展示如何创建无服务器 GitHub 机器人。该机器人允许 GitHub 用户在 GitHub Issues 中与 ChatGPT 和彼此聊天。您可以通过提问来尝试,或通过发表评论加入另一个对话线程。换句话说,这个项目使用 GitHub Issues 的线程消息 UI 作为它自己的聊天 UI。


该机器人是用 Rust 编写的无服务器功能。只需分叉示例,将您的分叉部署到flows.network上,并将其配置为与您自己的 GitHub 存储库和 OpenAI 密钥交互。您将在 10 分钟内拥有一个功能齐全的 GitHub 机器人。无需为 GitHub API 或缓存/数据库服务器设置 Web 服务器或 Webhook。

如何分叉模板回购

首先,从 GitHub fork 这个模板仓库。

src/lib.rs文件包含机器人应用程序(也称为流函数)。该run()函数在启动时被调用。它侦听GitHub 存储库中的issue_comment事件。当在回购中创建新问题评论或新问题时,会发出这些事件。issuesowner/repo

#[no_mangle]#[tokio::main(flavor = "current_thread")]pub async fn run() {
    // Setup variables for
    //   ower: GitHub org to install the bot
    //   repo: GitHub repo to install the bot
    //   openai_key_name: Name for your OpenAI API key
    // All the values can be set in the source code or as env vars
    
    listen_to_event(&owner, &repo, vec!["issue_comment", "issues"], |payload| {
        handler(&owner, &repo, &openai_key_name, payload)
    })
    .await;}

handler()函数处理 接收到的事件listen_to_event()。如果事件是问题中的新评论,则机器人会调用 OpenAI 的 ChatGPT API 以将评论文本添加到由issue.number. 它收到来自 ChatGPT 的响应,并在问题中添加评论。

此处的流功能自动透明地管理本地存储中与 ChatGPT API 的对话历史记录。OpenAI API 密钥也存储在本地存储中,因此无需将密文放在源代码中,密钥可以通过openai_key_name.

EventPayload::IssueCommentEvent(e) => {
    if e.comment.user.r#type != "Bot" {
        if let Some(b) = e.comment.body {
            if let Some(r) = chat_completion (
                    openai_key_name,
                    &format!("issue#{}", e.issue.number),
                    &b,
                    &ChatOptions::default(),
            ) {
                if let Err(e) = issues.create_comment(e.issue.number, r.choice).await {
                    write_error_log!(e.to_string());
                }
            }
        }
    }}

如果该事件是一个新问题,流函数将创建一个由 标识的新对话issue.number,并请求 ChatGPT 的响应。

EventPayload::IssuesEvent(e) => {
    if e.action == IssuesEventAction::Closed {
        return;
    }
    let title = e.issue.title;
    let body = e.issue.body.unwrap_or("".to_string());
    let q = title + "
" + &body;
    if let Some(r) = chat_completion (
            openai_key_name,
            &format!("issue#{}", e.issue.number),
            &q,
            &ChatOptions::default(),
    ) {
        if let Err(e) = issues.create_comment(e.issue.number, r.choice).await {
            write_error_log!(e.to_string());
        }
    }}

Serverless Flow功能如何部署

我们可以看到,流程功能代码调用SDK API来执行复杂的操作。例如,

  • listen_to_event()函数通过 GitHub API 注册一个 webhook URL,以便handler()在 GitHub 中发生某些事件时调用该函数。

  • chat_completion()函数使用指定对话的指定 API 密钥和过去的历史/上下文调用 ChatGPT API。API 密钥和对话历史记录存储在 Redis 缓存中。

Webhook服务器和Redis缓存都是SDK依赖的外部服务。这意味着流功能必须在提供此类外部服务的托管主机环境中运行。Flows.network是流功能 SDK 的 PaaS(平台即服务)主机。

为了在 flows.network 上部署流功能,您只需将其源代码导入 PaaS。

首先,从您的 GitHub 帐户登录 flows.network。导入包含流函数源代码的分叉 GitHub 存储库并选择“使用环境变量”。

请注意,这不是您要部署机器人的 GitHub 存储库。这是您的分叉流函数源代码的存储库。

图 2. 将您从流函数模板派生的 GitHub 存储库导入 flows.network。

设置环境变量以将流函数指向 OpenAI API 密钥名称 ( open_ai_key) 和 GitHub 存储库 (ownerrepo)。

此处的GitHubownerrepo变量指向您要部署机器人的 GitHub 存储库,而不是流函数源代码的存储库。

图 3. 为要部署机器人的 GitHub 存储库设置环境变量,以及 OpenAI API 密钥名称。

Flows.network 将获取源代码并使用标准工具链将 Rust 源代码构建为 Wasm 字节码cargo。然后它将在WasmEdge Runtime中运行 Wasm 流功能。

如何将流功能连接到 GitHub 和 OpenAI

虽然流函数需要连接到 OpenAI 和 GitHub API,但源代码没有硬编码的 API 密钥、访问令牌或 OAUTH 逻辑。流功能 SDK 使开发人员可以轻松、安全地与外部 SaaS API 服务进行交互。

Flows.network 发现流函数需要连接到 OpenAI 和 GitHub API。它为开发人员提供了 UI 工作流,以便:

  • 登录 GitHub,授权访问事件,并将流函数注册为 webhook 以接收这些事件。

  • 将 OpenAI API 密钥与名称相关联openai_key_name

图 4. 流功能所需的外部服务已连接并变绿。

连接并授权外部 SaaS API 后,它们会在流功能仪表板上变为绿色。流程功能现在将接收它所针对的事件listen_to_event()。它还将透明访问 Redis 以获取指定的 OpenAI API 密钥和缓存的对话上下文以支持chat_completion()SDK 功能。

下一步是什么

GitHub 机器人只是 flows.network 可以支持的众多机器人类型之一。通过将流功能连接到 Slack 频道,您可以获得 ChatGPT 来参与您的小组讨论。下面是一个基于 Slack 的 ChatGPT 机器人的示例。

图 5.Slack ChatGPT 机器人。

另一个例子是让 ChatGPT 在 Slack 频道中回答法律问题。流程功能在法律问题前加上提示。

图 6.Slack 机器人律师机器人。

除了 GitHub 和 Slack,还有许多 SaaS 产品可以通过它们的 API 集成到 flows.network 中。

虽然示例流函数是用 Rust 编写的,但我们的目标是支持基于 JavaScript 的流函数 SDK。也就是说,平台SDK等功能listen_to_event()都会chat_completion()有JavaScript版本。JavaScript 流功能通过WasmEdge-QuickJS模块在 flows.network 平台上的WasmEdge Runtime内部运行。


Copyright © 2024 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1