使用 Rust 實現與 ChatGPT 對話

0x00 開篇

近期 ChatGPT 在國內又㕛叒叕火了,但是其實我覺得這次火的莫名其妙。我爲什麼說 “又” 呢,其實 ChatGPT 在去年 11 月底的時候已經出現了,12 月份我就看到當時很多羣裏的小夥伴都在聊這個事情。但是最近我咋感覺有人在炒作呢???聽說有人靠 chatGPT 又發財了。

開頭又講多了,本篇文章呢,帶大家使用 OpenAI 的 API 來實現與 ChatGPT 的對話。

0x01 找接口

代碼其實非常簡單,感興趣的小夥伴可以進行二次開發。官方文檔提供了 pythonnodejs的 library,第三方社區提供了C#GoJava 等 library,就連虛幻引擎都有庫,但是就是沒有 Rust 的相關 library,Rust 社區的大佬們不給力啊,哈哈。

其實我自己去 Rust 的 crate.io 上搜過,發現也有幾個openai相關的 library,我沒有測試,大家可以試用下。

沒有庫,那隻能是自己調用 API 去實現了。其實,我們僅僅用到了一個接口

POST https://api.openai.com/v1/completions

主要的參數介紹:

model :訓練模型,官方有三種模型,分別是GPT-3CodexContent filter, 這裏我們僅僅選用 GPT 的模型,可以理解和生成自然語言。

而在 GPT-3 模型下又存在了不同等級的 GPT 模型,這裏我們當然選擇的是 GPT-3 中最強的模型 text-davinci-003

prompt :用於生成完成、編碼爲字符串、字符串數組、標記數組或標記數組數組的提示。說白了就是我們與 GPT 對話的內容。

max_token : 在結果中產生的最大數量的 token,可選參數,默認爲 16。我們傳遞的prompttoken 數不能超過模型的上下文長度。大多數模型的上下文長度爲 2048 個 tokentext-davinci-003 模型支持 4000 個)。對於常見的英語文本,一個 token 通常對應 4 個字符的文本。說白了,這個是接口的花費,每 1000 個 token 等於 0.02 美元,該字段影響結果的字數。

temperature:採樣溫度,可選參數,默認爲 1,值的範圍是 0-2 之間閉區間 ([0-2])。該值越大,輸出的結果則更加隨機,值越小結果越準確。

0x02 代碼實現

瞭解清楚接口的使用方法了,我們就可以開搞了。j 有接口請求,異步操作需要用到 reqwesttokio 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