5分鐘實現呼叫ChatGPT介面API實現多輪問答

靠譜楊發表於2023-05-08

5分鐘實現呼叫ChatGPT介面API完成多輪問答


最近ChatGPT也是火爆異常啊,在親自使用了幾個月之後,我發現這東西是真的好用,實實在在地提高了生產力。那麼對於開發人員來說,有時候可能需要在自己的程式碼里加入這樣一個智慧問答的功能,我最近就出現了這樣的想法和需求,所以簡單研究了一下。網上類似的方法有很多,這裡我提供一種我目前測試成功的也正在使用的一種,有其他需求可以自行上網查詢。

1、下載openai庫

我們可以直接使用Python中的openai庫來實現對ChatGPT的呼叫。

首先第一步就是下載,下載方式也很簡單,只需要一條命令pip install openai 。下載過程中可能會出現各種問題:比如pip版本太低,可以使用pip install --upgrade pip命令來升級。如果在命令列已經顯示安裝成功,但是呼叫的時候找不到庫,可能是openai版本有問題,可以嘗試使用這條命令pip install -U openai

我的已經安裝成功了,所以給我顯示的是openai已安裝的版本資訊:

image-20230508174711485

Windows進入命令列是WIN+R後輸入cmd,然後執行相關命令。但是有個點需要注意,最好選擇管理員許可權來執行cmd命令列視窗。如果還有其他問題,可以嘗試切換網路或者使用Anaconda來安裝。

image-20230508174411733

2、獲取API KEY

在呼叫介面之前,我們需要申請一個API KEY來獲取使用許可權。獲取方式有兩種,可以自行去OpenAI官網(https://platform.openai.com/account/api-keys)註冊賬號,然後申請(需要魔法上網)。不過也可以選擇其他方式去獲取,網上有很多渠道,可以自行查詢。這個key的格式大概是這個樣子的:sk-[一大串混亂的字母和數字]。

3、模型簡述

OpenAI 開放了兩個新模型的api介面(也就是我們用的這個),專門為聊天而生的 gpt-3.5-turbo 和 gpt-3.5-turbo-0301。我查了一下這兩個模型的區別:

gpt-3.5-turbo 需要在 content 中指明具體的角色和問題內容,而 gpt-3.5-turbo-0301 更加關注問題內容,而不會特別關注具體的角色部分。另外,gpt-3.5-turbo-0301 模型有效期到 6 月 1 日,而 gpt-3.5-turbo 會持續更新。

4、引數介紹

首先介紹一下主要引數的含義:

  • model:模型名稱,可選gpt-3.5-turbo或gpt-3.5-turbo-0301。
  • messages:資料格式為json,問題描述或者角色定義,也是我們需要重點關注的欄位。
  • temperature:控制返回結果的隨機性,0.0表示結果固定,隨機性大可以設定為0.9。
  • max_tokens:最大字數,通常一個漢字佔兩個長度,API最多支援的token數量為4096,需要注意的是這個字數同時包含了問題和答案的字數和。
  • top_p:也即top probability,是指在生成文字時,模型將考慮機率最高的詞語。設定為1即可。透過調節該值可以控制模型生成文字時的多樣性。較小的 top_p 值會導致生成的文字更加確定性,而較大的 top_p 值則會導致生成的文字更加多樣化但可能存在不連貫、不合理的情況。
  • frequency_penalty:該引數用於對詞彙進行懲罰(penalty),以減少重複性和不必要的單詞或短語。當引數設定為較大的值時,模型會傾向於避免使用已經出現過的單詞或短語。透過調節該值可以控制模型對文字的流暢度。較小的值會導致生成的文字更加流暢但可能存在重複或者不太符合邏輯的情況,而較大的值則會導致生成的文字更加嚴謹但可能會出現斷句或者語義不連貫的情況。一般建議設定在0.6到1之間。
  • stream:控制是否為流式輸出。當引數設定為 True 時,API 的返回結果會以流的方式不斷推送給客戶端,無需等待全部結果生成完成。當引數設定為 False 時,則需要等待所有結果生成才能一次性返回給客戶端。

messages欄位需要重點解釋一下:我們可以在程式碼中指定角色型別,在gpt-3.5-turbo模型中。主要包含三種角色,分別是系統system系統、user使用者和assistant助手。

下面這一段是對此比較官方的闡釋:

  1. System:系統角色指的是聊天機器人所執行的計算機系統或者軟體平臺。在對話過程中,System 負責接受使用者請求並將其轉發給 Assistant 進行處理或響應,並最終將結果返回給 User。
  2. User:使用者角色指的是與聊天機器人進行對話的人。在對話互動中,User 可以提出各種問題,包括需要獲取資訊、解決問題、諮詢建議等等。User 一般透過輸入文字、語音等方式向 Assistant 發出請求,並透過系統獲取相應的回覆或結果。
  3. Assistant:Assistant 角色指的是聊天機器人中的智慧助手程式,主要負責對使用者請求進行處理和響應,並生成相應的回答或結果。Assistant 可以使用自然語言處理技術,如文字理解、知識庫查詢、邏輯推理等,從而實現與 User 的智慧化互動。

程式碼示例

  model="gpt-3.5-turbo",
  messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "What year is this year?"},
        {"role": "assistant", "content": "2023"},
        {"role": "user", "content": " xxxx ?"}
    ]

5、呼叫介面

在我們完成了openai庫的安裝並瞭解了上述引數的含義之後,就可以著手寫程式碼了,下面一個簡單的多次問答機器人程式碼示例:

# -*- coding: utf-8 -*-
import openai

api_key = "在這裡填入你的KEY"

openai.api_key = api_key

def askChatGPT(messages):
    MODEL = "gpt-3.5-turbo"
    response = openai.ChatCompletion.create(
        model=MODEL,
        messages = messages,
        temperature=1)
    return response['choices'][0]['message']['content']

def main():
    messages = [{"role": "user","content":""}]
    while 1:
        try:
            text = input('問:')
            if text == 'quit':
                break
            # 問
            d = {"role":"user","content":text}
            messages.append(d)
            text = askChatGPT(messages)
            d = {"role":"assistant","content":text}
            # 答
            print('答:'+text+'\n')
            messages.append(d)
        except:
            messages.pop()
            print('ChatGPT:error\n')
            
if __name__ == '__main__':
    main()

執行上述程式碼之後,在控制檯會提示我們輸入問題。每輸入一個問題並敲回車之後,等待片刻會顯示ChatGPT的回答,我們可以進行連續問答,下圖是執行效果(測試問題無任何價值導向)。

image-20230508183535885

下面這段程式碼實現了單次問答呼叫,本質上和上面的程式碼是一樣的,各位按需自取:

# -*- coding: utf-8 -*-
import openai
def openai_reply(content, apikey):
    openai.api_key = apikey
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo-0301",  # gpt-3.5-turbo-0301
        messages=[
            {"role": "user", "content": content}
        ],
        temperature=0.5,
        max_tokens=2048,
        top_p=1,
        frequency_penalty=0.7,
    )
    # print(response)
    return response.choices[0].message.content


if __name__ == '__main__':
    content = '我比較喜歡大海,請給我推薦幾個景點。'
    ans = openai_reply(content, '在這裡填入你的KEY')
    print(ans)

image-20230508183634801

原始的返回值資料格式示例如下:

{
  "choices": [
    {
      "finish_reason": "stop",
      "index": 0,
      "message": {
        "content": "xxxx",
        "role": "assistant"
      }
    }
  ],
  "created": 1683542226,
  "id": "chatcmpl-",
  "model": "gpt-3.5-turbo-0301",
  "object": "chat.completion",
  "usage": {
    "completion_tokens": 373,
    "prompt_tokens": 30,
    "total_tokens": 403
  }
}

6、總結

以上就是針對程式呼叫ChatGPT介面的全部步驟了,如果執行程式碼出現了問題可以最後嘗試一下這個方法:找到目前所使用的python環境的安裝目錄,進入openai庫資料夾下(D:\environment\python39\Lib\site-packages\openai),替換api_requestor.py檔案。所需的替換檔案可以關注我的訂閱號【靠譜楊的挨踢生活】回覆【chat】獲取。

image-20230508184423063

理性看待人工智慧的發展,正確認識人的不可替代性。讓AI作為一個越來越實用的工具服務於我們的生產和生活(僅代表個人觀點)。

相關文章