5分钟搭建GitHub版ChatGPT:用Rust和Serverless解锁AI编程助手

2

在人工智能浪潮席卷全球的当下,OpenAI的ChatGPT以其强大的自然语言处理能力,吸引了无数开发者和创业者的目光。自从2023年3月ChatGPT官方API发布以来,特别是近期Plugin开发使用资格的开放,更是激发了大家将其融入自身业务运营的热情。然而,理想与现实之间往往存在着巨大的鸿沟,将ChatGPT无缝整合到现有业务流程中,依然面临着诸多挑战。

首先,OpenAI提供的ChatGPT API本质上是一个简单的无状态API。这意味着开发者需要自行负责跟踪每个对话的历史记录和上下文信息,这通常需要在应用程序管理的缓存或数据库中进行。此外,API密钥的管理和保护也是一项不容忽视的任务。这些与应用程序核心业务逻辑无关的样板代码,无疑增加了开发的复杂度和维护成本。

其次,ChatGPT API应用程序最自然的用户界面是线程聊天。然而,在传统的Web或应用程序框架中,创建聊天界面并非易事。更重要的是,我们已经拥有了许多成熟的聊天界面,例如Slack、Discord,甚至是GitHub Discussions这样的论坛。如何将ChatGPT API的强大功能与这些现有的消息服务无缝连接,成为了一个亟待解决的问题。

为了应对这些挑战,本文将介绍一种创建serverless GitHub机器人的方法。通过这个机器人,GitHub用户可以直接在GitHub Issues中与ChatGPT进行对话。用户可以通过创建新的issue或在现有issue下发表评论的方式,与ChatGPT进行互动。换句话说,该项目巧妙地利用GitHub Issues的线程消息UI作为与ChatGPT交流的界面。

用 ChatGPT学习Rust编程

图1展示了一个用ChatGPT学习Rust编程的示例,具体可查看https://github.com/second-state/chat-with-chatgpt/issues/31

这个GitHub机器人采用Rust编写,并以serverless函数的形式运行。要构建自己的机器人,只需fork提供的example模板,将其部署到flows.network上,并配置GitHub仓库和OpenAI密钥。只需几分钟,你就能拥有一个功能完备的GitHub机器人,无需操心Web服务器或Webhook的设置,也无需管理GitHub API或缓存/数据库服务器。

深入理解模板Repo

第一步是从GitHub fork该模板repo(https://github.com/flows-network/chatgpt-github-app)。其中,src/lib.rs 文件包含了bot应用的核心逻辑(也称为flow函数)。当应用启动时,run() 函数会被自动调用。该函数负责从GitHub仓库接收事件。

#[no_mangle]
#[tokio::main]
pub async fn run() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
    let event = github_flows::get_event();
    let issue = event.issue.expect("Missing issue");
    let comment = event.comment;
    let config = github_flows::get_config();

    if issue.user.login == config.get("github_owner").unwrap() {
        return Ok(())
    }

    let openai_key = config.get("openai_key").unwrap();
    let context = format!("You are a Github bot helping answer questions in the issue. The repo is {}.", issue.repository_url);

    let mut body: String;
    if comment.is_some() {
        body = comment.unwrap().body.unwrap();
    } else {
        body = issue.body.unwrap_or("".to_string());
    }

    let resp = openai_flows::chat_completion(&openai_key, &context, &body).await?;

    github_flows::github_issue_comment(&issue.url, &resp).await?;
    Ok(())
}

run() 函数主要完成以下几个任务:

  1. 从 GitHub 获取事件数据:通过 github_flows::get_event() 函数获取触发 workflow 的 GitHub 事件数据。这些事件包含了 issue 的详细信息,如 issue 的标题、内容、创建者、评论等。
  2. 提取 issue 和评论内容:从事件数据中提取 issue 和评论的内容。如果事件是关于新 issue 的创建,则提取 issue 的内容;如果事件是关于 issue 的评论,则提取评论的内容。
  3. 从 flows.network 获取配置信息:通过 github_flows::get_config() 函数从 flows.network 获取配置信息,例如 OpenAI API 密钥和 GitHub 仓库的所有者。
  4. 调用 OpenAI API:使用 OpenAI API 密钥和提取的 issue/评论内容,调用 openai_flows::chat_completion() 函数与 ChatGPT 进行对话。chat_completion() 函数会将 issue/评论内容作为用户输入,并返回 ChatGPT 生成的回复。
  5. 将 ChatGPT 的回复发布到 GitHub issue:使用 github_flows::github_issue_comment() 函数将 ChatGPT 生成的回复作为评论发布到 GitHub issue 中。

使用 Flows.network 部署

Flows.network 是一个 serverless 计算平台,非常适合部署事件驱动型的应用程序,例如 GitHub 机器人。要将 GitHub 机器人部署到 Flows.network,需要完成以下步骤:

  1. 安装 Flows CLI:Flows CLI 是一个命令行工具,用于与 Flows.network 平台进行交互。可以使用以下命令安装 Flows CLI:
bash -c "$(curl -fsSL https://raw.githubusercontent.com/flows-network/flows/master/install.sh)"
  1. 登录 Flows.network:使用 Flows CLI 登录 Flows.network 平台。需要提供 GitHub 账户信息进行身份验证。
flows login
  1. 创建 Flow:使用 Flows CLI 创建一个新的 Flow。Flow 可以理解为一个 serverless 函数的实例。
flows create
  1. 构建 Flow:使用 Flows CLI 构建 Flow。构建过程会将 Rust 代码编译成 WebAssembly 模块,并将其打包成一个可部署的 Flow。
flows build
  1. 部署 Flow:使用 Flows CLI 部署 Flow。部署过程会将 Flow 上传到 Flows.network 平台,并将其配置为监听 GitHub 事件。
flows deploy
  1. 配置 Flow:使用 Flows CLI 配置 Flow。需要提供 OpenAI API 密钥和 GitHub 仓库的所有者等信息。
flows config set openai_key=<your_openai_key>
flows config set github_owner=<your_github_owner>

完成以上步骤后,GitHub 机器人就成功部署到 Flows.network 平台了。当 GitHub 仓库中发生 issue 相关的事件时,Flows.network 会自动触发 Flow 的执行,从而实现与 ChatGPT 的对话。

总结与展望

本文介绍了一种利用 Rust 和 Flows.network 构建 serverless GitHub 机器人,与 ChatGPT 集成的方案。该方案具有以下优点:

  • 无需管理 Web 服务器或 Webhook,降低了开发和运维成本。
  • 充分利用 GitHub Issues 的线程消息 UI,提供自然流畅的交互体验。
  • 采用 Rust 编写,保证了代码的性能和安全性。
  • 基于 Flows.network 平台,实现了快速部署和弹性伸缩。

当然,该方案还存在一些改进空间,例如:

  • 可以增加对更多 GitHub 事件的支持,例如 pull request、代码提交等。
  • 可以优化 ChatGPT 的回复内容,使其更加贴合 GitHub 的语境。
  • 可以提供更丰富的配置选项,例如自定义 ChatGPT 的角色和行为。

随着人工智能技术的不断发展,我们可以期待更多基于 ChatGPT 的创新应用涌现,为开发者和用户带来更大的便利和价值。