使用 Rust 實現與 ChatGPT 對話
0x00 開篇
近期 ChatGPT
在國內又㕛叒叕火了,但是其實我覺得這次火的莫名其妙。我爲什麼說 “又” 呢,其實 ChatGPT
在去年 11 月底的時候已經出現了,12 月份我就看到當時很多羣裏的小夥伴都在聊這個事情。但是最近我咋感覺有人在炒作呢???聽說有人靠 chatGPT
又發財了。
開頭又講多了,本篇文章呢,帶大家使用 OpenAI 的 API 來實現與 ChatGPT
的對話。
0x01 找接口
代碼其實非常簡單,感興趣的小夥伴可以進行二次開發。官方文檔提供了 python
、nodejs
的 library,第三方社區提供了C#
、Go
、Java
等 library,就連虛幻引擎都有庫,但是就是沒有 Rust 的相關 library,Rust 社區的大佬們不給力啊,哈哈。
其實我自己去 Rust 的 crate.io
上搜過,發現也有幾個openai
相關的 library,我沒有測試,大家可以試用下。
沒有庫,那隻能是自己調用 API 去實現了。其實,我們僅僅用到了一個接口
POST https://api.openai.com/v1/completions
主要的參數介紹:
model
:訓練模型,官方有三種模型,分別是GPT-3
、Codex
、Content filter
, 這裏我們僅僅選用 GPT 的模型,可以理解和生成自然語言。
而在 GPT-3 模型下又存在了不同等級的 GPT 模型,這裏我們當然選擇的是 GPT-3 中最強的模型 text-davinci-003
。
prompt
:用於生成完成、編碼爲字符串、字符串數組、標記數組或標記數組數組的提示。說白了就是我們與 GPT
對話的內容。
max_token
: 在結果中產生的最大數量的 token
,可選參數,默認爲 16
。我們傳遞的prompt
的 token
數不能超過模型的上下文長度。大多數模型的上下文長度爲 2048 個 token
(text-davinci-003
模型支持 4000 個)。對於常見的英語文本,一個 token
通常對應 4 個字符的文本。說白了,這個是接口的花費,每 1000 個 token
等於 0.02 美元,該字段影響結果的字數。
temperature
:採樣溫度,可選參數,默認爲 1
,值的範圍是 0-2 之間閉區間 ([0-2])。該值越大,輸出的結果則更加隨機,值越小結果越準確。
0x02 代碼實現
瞭解清楚接口的使用方法了,我們就可以開搞了。j 有接口請求,異步操作需要用到 reqwest
和 tokio
library。返回的結果需要 json 解析,還需要用到 serde
library (不是必須)。
注:爲了演示結果,並沒有按照規範去處理每個錯誤結果,在代碼中使用了大量的 unwrap
,實際開發場景並不推薦。
#[tokio::main]
async fn main() {
// 請填入自己賬號的openai 的 api_key
let api_key = "";
// 對話內容
let prompt = "chatgpt是什麼";
// 完成時要生成的最大 token 數
let max_tokens = 4000;
// 訓練模型
// 功能最強大的 GPT-3 模型。可以完成其他模型可以完成的任何任務,通常具有更高的質量、更長的輸出和更好的指令遵循。還支持在文本中插入補全。
let model = "text-davinci-003";
let url = "https://api.openai.com/v1/completions";
let mut headers = HeaderMap::new();
headers.insert(CONTENT_TYPE, "application/json".parse().unwrap());
headers.insert(AUTHORIZATION, format!("Bearer {}", api_key).parse().unwrap());
let body = format!(r#"{{"model": "{}", "prompt": "{}", "max_tokens": {}, "temperature": 0}}"#, model, prompt, max_tokens);
let response = reqwest::Client::builder().build().unwrap()
.post(url)
.headers(headers)
.body(body)
.send().await.unwrap()
.json::<GPTResult>().await.unwrap();
// dbg!(&response);
let choices = response.choices.unwrap();
let choice = choices.get(0).unwrap();
println!("{:?}", choice.text.as_ref().unwrap().trim());
}
代碼輸出結果:
代碼實現其實很簡單,總共不過幾十行代碼。
0x03 獲取自己的 API KEY
簡單說下如何拿到 openAI 的 apikey 吧。前提你需要一個 openAI 賬號,沒有的話可以想辦法註冊,也可以在羣內艾特我,告訴你們註冊的方法。
登錄 OpenAI 的後臺 https://platform.openai.com/login
,找到 Uses - API Keys
,點擊 Create new secret key
,即可生成。
每個新賬號都會贈送 18 美元,接口調用會慢慢消耗贈送的 18 美元,換算關係如下,上面我也提到了,大約每 4 個英文字符等於 1 個token
,1000 個 token
大約 750 個單詞。Davinci 模型 1000 個 token 花費 0.02 美元。如果不調用 API 接口,只是正常使用官網的 Chat GPT
聊天,那這個是免費的。
0x04 小結
Chat-GPT
火了,它會替代人類部分的工作嗎?它的應用場景有哪些呢?這些都需要我們去思考,目前在國內已經很多公司將 Chat-GPT
接入了微信公衆號、小程序等等,這也算是二次開發吧。如果有朋友想更深入的瞭解 Chat-GPT
還可以做哪些事情, 可以參考 OpenAI 的官方文檔(文末附上)。
0x05 參考資料
OpenAI API 官方文檔:https://platform.openai.com/docs/introduction
0x06 源碼
Gitee 源碼: 點擊下方 “閱讀原文” 免費獲取本節課程源碼
Github 源碼: 請前往公衆號菜單 - 教程源碼 - Github 來獲取
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/H7QuqhcxLCpagoY3htZ72A