如何在10分鐘內(nèi)創(chuàng)建無服務(wù)器 ChatGPT 應(yīng)用程序
自 OpenAI在 2023 年 3 月發(fā)布了 ChatGPT 的官方 API以來,許多開發(fā)人員和企業(yè)家有興趣將其集成到自己的業(yè)務(wù)運(yùn)營中。
但仍然存在一些重大障礙,使他們難以做到這一點(diǎn):
OpenAI 為 ChatGPT 提供了一個(gè)簡單的無狀態(tài) API。開發(fā)人員需要在應(yīng)用程序管理的緩存或數(shù)據(jù)庫中跟蹤每個(gè)對話的歷史和上下文。開發(fā)人員還需要管理和保護(hù) API 密鑰。有很多與應(yīng)用程序的業(yè)務(wù)邏輯無關(guān)的樣板代碼。
ChatGPT API 應(yīng)用程序的“自然”用戶界面是線程聊天。但是很難在傳統(tǒng)的 Web 或應(yīng)用程序框架中創(chuàng)建“聊天 UI”。事實(shí)上,最常用的聊天 UI 已經(jīng)存在于 Slack、Discord 甚至論壇(例如 GitHub Discussions)等消息應(yīng)用程序中。我們需要一種簡單的方法將 ChatGPT API 響應(yīng)連接到現(xiàn)有的消息服務(wù)。
在本文中,我將向您展示如何創(chuàng)建無服務(wù)器 GitHub 機(jī)器人。該機(jī)器人允許 GitHub 用戶在 GitHub Issues 中與 ChatGPT 和彼此聊天。您可以通過提問來嘗試,或通過發(fā)表評(píng)論加入另一個(gè)對話線程。換句話說,這個(gè)項(xiàng)目使用 GitHub Issues 的線程消息 UI 作為它自己的聊天 UI。
該機(jī)器人是用 Rust 編寫的無服務(wù)器功能。只需分叉示例,將您的分叉部署到flows.network上,并將其配置為與您自己的 GitHub 存儲(chǔ)庫和 OpenAI 密鑰交互。您將在 10 分鐘內(nèi)擁有一個(gè)功能齊全的 GitHub 機(jī)器人。無需為 GitHub API 或緩存/數(shù)據(jù)庫服務(wù)器設(shè)置 Web 服務(wù)器或 Webhook。
如何分叉模板回購
首先,從 GitHub fork 這個(gè)模板倉庫。
該src/lib.rs文件包含機(jī)器人應(yīng)用程序(也稱為流函數(shù))。該run()函數(shù)在啟動(dòng)時(shí)被調(diào)用。它偵聽GitHub 存儲(chǔ)庫中的issue_comment事件。當(dāng)在回購中創(chuàng)建新問題評(píng)論或新問題時(shí),會(huì)發(fā)出這些事件。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()函數(shù)處理 接收到的事件listen_to_event()。如果事件是問題中的新評(píng)論,則機(jī)器人會(huì)調(diào)用 OpenAI 的 ChatGPT API 以將評(píng)論文本添加到由issue.number.?它收到來自 ChatGPT 的響應(yīng),并在問題中添加評(píng)論。
此處的流功能自動(dòng)透明地管理本地存儲(chǔ)中與 ChatGPT API 的對話歷史記錄。OpenAI API 密鑰也存儲(chǔ)在本地存儲(chǔ)中,因此無需將密文放在源代碼中,密鑰可以通過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()); ????????????????} ????????????} ????????} ????}}
如果該事件是一個(gè)新問題,流函數(shù)將創(chuàng)建一個(gè)由 標(biāo)識(shí)的新對話issue.number,并請求 ChatGPT 的響應(yīng)。
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功能如何部署
我們可以看到,流程功能代碼調(diào)用SDK API來執(zhí)行復(fù)雜的操作。例如,
該listen_to_event()函數(shù)通過 GitHub API 注冊一個(gè) webhook URL,以便handler()在 GitHub 中發(fā)生某些事件時(shí)調(diào)用該函數(shù)。
該chat_completion()函數(shù)使用指定對話的指定 API 密鑰和過去的歷史/上下文調(diào)用 ChatGPT API。API 密鑰和對話歷史記錄存儲(chǔ)在 Redis 緩存中。
Webhook服務(wù)器和Redis緩存都是SDK依賴的外部服務(wù)。這意味著流功能必須在提供此類外部服務(wù)的托管主機(jī)環(huán)境中運(yùn)行。Flows.network是流功能 SDK 的 PaaS(平臺(tái)即服務(wù))主機(jī)。
為了在 flows.network 上部署流功能,您只需將其源代碼導(dǎo)入 PaaS。
首先,從您的 GitHub 帳戶登錄 flows.network。導(dǎo)入包含流函數(shù)源代碼的分叉 GitHub 存儲(chǔ)庫并選擇“使用環(huán)境變量”。
請注意,這不是您要部署機(jī)器人的 GitHub 存儲(chǔ)庫。這是您的分叉流函數(shù)源代碼的存儲(chǔ)庫。
圖 2. 將您從流函數(shù)模板派生的 GitHub 存儲(chǔ)庫導(dǎo)入 flows.network。
設(shè)置環(huán)境變量以將流函數(shù)指向 OpenAI API 密鑰名稱 (?open_ai_key) 和 GitHub 存儲(chǔ)庫 (owner和repo)。
此處的GitHubowner和repo變量指向您要部署機(jī)器人的 GitHub 存儲(chǔ)庫,而不是流函數(shù)源代碼的存儲(chǔ)庫。
Flows.network 將獲取源代碼并使用標(biāo)準(zhǔn)工具鏈將 Rust 源代碼構(gòu)建為 Wasm 字節(jié)碼cargo。然后它將在WasmEdge Runtime中運(yùn)行 Wasm 流功能。
如何將流功能連接到 GitHub 和 OpenAI
雖然流函數(shù)需要連接到 OpenAI 和 GitHub API,但源代碼沒有硬編碼的 API 密鑰、訪問令牌或 OAUTH 邏輯。流功能 SDK 使開發(fā)人員可以輕松、安全地與外部 SaaS API 服務(wù)進(jìn)行交互。
Flows.network 發(fā)現(xiàn)流函數(shù)需要連接到 OpenAI 和 GitHub API。它為開發(fā)人員提供了 UI 工作流,以便:
登錄 GitHub,授權(quán)訪問事件,并將流函數(shù)注冊為 webhook 以接收這些事件。
將 OpenAI API 密鑰與名稱相關(guān)聯(lián)openai_key_name。
圖 4. 流功能所需的外部服務(wù)已連接并變綠。
連接并授權(quán)外部 SaaS API 后,它們會(huì)在流功能儀表板上變?yōu)榫G色。流程功能現(xiàn)在將接收它所針對的事件listen_to_event()。它還將透明訪問 Redis 以獲取指定的 OpenAI API 密鑰和緩存的對話上下文以支持chat_completion()SDK 功能。
下一步是什么
GitHub 機(jī)器人只是 flows.network 可以支持的眾多機(jī)器人類型之一。通過將流功能連接到 Slack 頻道,您可以獲得 ChatGPT 來參與您的小組討論。下面是一個(gè)基于 Slack 的 ChatGPT 機(jī)器人的示例。
圖 5.Slack ChatGPT 機(jī)器人。
另一個(gè)例子是讓 ChatGPT 在 Slack 頻道中回答法律問題。流程功能在法律問題前加上提示。
圖 6.Slack 機(jī)器人律師機(jī)器人。
除了 GitHub 和 Slack,還有許多 SaaS 產(chǎn)品可以通過它們的 API 集成到 flows.network 中。
雖然示例流函數(shù)是用 Rust 編寫的,但我們的目標(biāo)是支持基于 JavaScript 的流函數(shù) SDK。也就是說,平臺(tái)SDK等功能listen_to_event()都會(huì)chat_completion()有JavaScript版本。JavaScript 流功能通過WasmEdge-QuickJS模塊在 flows.network 平臺(tái)上的WasmEdge Runtime內(nèi)部運(yùn)行。