手把手教你使用 Python 呼叫 ChatGPT-3.5-API

語言: CN / TW / HK

大家好,我是老表

前天 OpenAI 開放了兩個新模型的api介面,專門為聊天而生的 gpt-3.5-turbo 和 gpt-3.5-turbo-0301。

ChatGPT is powered by gpt-3.5-turbo, OpenAI’s most advanced language model.

從上面這句話,我們可以知道現在 chat.openai.com 官網就是由 gpt-3.5-turbo 模型提供的服務,現在官方公開了這一模型的呼叫介面,這使得我們這些普通開發者也能直接在自己的應用/服務中使用這個狂攬億萬使用者的模型。

接下來將和大家介紹如何利用 Python 快速玩轉 gpt-3.5-turbo。

本文所有程式碼已開源,持續更新中:XksA-me/ChatGPT-3.5-AP

先跑起來,再理解

首先你需要有一個 openai 賬號,如何註冊我就不多說了,網上教程很多,而且很詳細,如果有問題可以加我微信:pythonbrief,新增通過後請直接描述你的問題+問題截圖

訪問下面頁面,登入 openai 賬號後,建立一個 api keys。 ```bash

api keys 建立頁面

http://platform.openai.com/account/api-keys ```

接下來很簡單了,安裝 openai 官方的 Python SDK,這裡需要注意的是得安裝最新版本 openai,官方推薦的是 0.27.0 版本。 bash pip install openai==0.27.0

直接上請求程式碼: ```python import openai import json

目前需要設定代理才可以訪問 api

os.environ["HTTP_PROXY"] = "自己的代理地址" os.environ["HTTPS_PROXY"] = "自己的代理地址"

def get_api_key(): # 可以自己根據自己實際情況實現 # 以我為例子,我是存在一個 openai_key 檔案裡,json 格式 ''' {"api": "你的 api keys"} ''' openai_key_file = '../envs/openai_key' with open(openai_key_file, 'r', encoding='utf-8') as f: openai_key = json.loads(f.read()) return openai_key['api']

openai.api_key = get_api_key()

q = "用python實現:提示手動輸入3個不同的3位數區間,輸入結束後計算這3個區間的交集,並輸出結果區間" rsp = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "system", "content": "一個有10年Python開發經驗的資深演算法工程師"}, {"role": "user", "content": q} ] ) ``` 程式碼解析: - get_api_key() 函式是我自己寫的一個從檔案讀取 api keys 的方法,我是存在一個 openai_key 檔案裡,json 格式,你可以改成你自己的獲取方法,甚至可以直接寫到程式碼裡(雖然不推薦,但確實最簡單)。

  • q 是請求的問題
  • rsp 是傳送請求後返回結果
  • openai.ChatCompletion.create 中引數
    • model 是使用的模型名稱,是一個字串,用最新模型直接設定成gpt-3.5-turbo 即可
    • messages 是請求的文字內容,是一個列表,列表裡每個元素型別是字典,具體含義如下表:
  • 程式執行返回內容,從響應回覆內容我們可以看到,回覆內容是一個 json 字串, 我們可以通過以下方法直接獲取相關資訊:

    • 返回訊息內容 bash rsp.get("choices")[0]["message"]["content"]
    • 角色 bash rsp.get("choices")[0]["message"]["role"]
    • 問題+回答總長度 bash rsp.get("usage")["total_tokens"] 其他資訊也可以通過類似方法獲取。
  • 測試 ChatGPT 回答程式碼執行情況,可以看出程式碼邏輯和執行都沒啥問題,註釋也到位。

實現多輪對話

如何實現多輪對話?

gpt-3.5-turbo 模型呼叫方法 openai.ChatCompletion.create 裡傳入的 message 是一個列表,列表裡每個元素是字典,包含了角色和內容,我們只需將每輪對話都儲存起來,然後每次提問都帶上之前的問題和回答即可。

  • 效果圖
    • 可以看到,我首先問了“1+1=幾”,然後問“為什麼是這樣”,ChatGPT 會根據前面的提問將新問題識別為“為什麼1+1=2”。
    • 後面繼續問水仙花數有哪些,再問“如何寫個python程式來識別這些數”,ChatGPT 同樣會根據前面的提問將新問題識別為“如何寫個python程式來識別這些水仙花數”,並給出對應解答。
  • 實現程式碼

```bash import openai import json import os

os.environ["HTTP_PROXY"] = "http://127.0.0.1:7890" os.environ["HTTPS_PROXY"] = "http://127.0.0.1:7890"

獲取 api

def get_api_key(): # 可以自己根據自己實際情況實現 # 以我為例子,我是存在一個 openai_key 檔案裡,json 格式 ''' {"api": "你的 api keys"} ''' openai_key_file = '../envs/openai_key' with open(openai_key_file, 'r', encoding='utf-8') as f: openai_key = json.loads(f.read()) return openai_key['api'] openai.api_key = get_api_key()

class ChatGPT: def init(self, user): self.user = user self.messages = [{"role": "system", "content": "一個有10年Python開發經驗的資深演算法工程師"}] self.filename="./user_messages.json"

def ask_gpt(self):
    # q = "用python實現:提示手動輸入3個不同的3位數區間,輸入結束後計算這3個區間的交集,並輸出結果區間"
    rsp = openai.ChatCompletion.create(
      model="gpt-3.5-turbo",
      messages=self.messages
    )
    return rsp.get("choices")[0]["message"]["content"]


def writeTojson(self):
    try:
        # 判斷檔案是否存在
        if not os.path.exists(self.filename):
            with open(self.filename, "w") as f:
                # 建立檔案
                pass
        # 讀取
        with open(self.filename, 'r', encoding='utf-8') as f:
            content = f.read()
            msgs = json.loads(content) if len(content) > 0 else {}
        # 追加
        msgs.update({self.user : self.messages})
        # 寫入
        with open(self.filename, 'w', encoding='utf-8') as f:
            json.dump(msgs, f)
    except Exception as e:
        print(f"錯誤程式碼:{e}")

def main(): user = input("請輸入使用者名稱稱: ") chat = ChatGPT(user)

# 迴圈
while 1:
    # 限制對話次數
    if len(chat.messages) >= 11:
        print("******************************")
        print("*********強制重置對話**********")
        print("******************************")
        # 寫入之前資訊
        chat.writeTojson()
        user = input("請輸入使用者名稱稱: ")
        chat = ChatGPT(user)

    # 提問
    q = input(f"【{chat.user}】")

    # 邏輯判斷
    if q == "0":
        print("*********退出程式**********")
        # 寫入之前資訊
        chat.writeTojson()
        break
    elif q == "1":
        print("**************************")
        print("*********重置對話**********")
        print("**************************")
        # 寫入之前資訊
        chat.writeTojson()
        user = input("請輸入使用者名稱稱: ")
        chat = ChatGPT(user)
        continue

    # 提問-回答-記錄
    chat.messages.append({"role": "user", "content": q})
    answer = chat.ask_gpt()
    print(f"【ChatGPT】{answer}")
    chat.messages.append({"role": "assistant", "content": answer})

if name == 'main': main() `` **程式碼解析:** -ChatGPT類,包含三個函式: - -init初始化函式,初始化了三個個例項變數,user、messages、filename(當前使用者、訊息列表、儲存記錄的檔案路徑)。 - -ask_gpt函式,將當前使用者所有歷史訊息+最新提問傳送給 gpt-3.5-turbo ,並返回響應結果。 - -writeTojson`函式,結束/重置使用者時記錄當前使用者之前的訪問資料。

  • main函式,程式入口函式,使用者輸入使用者名稱後進入與 ChatGPT 的迴圈對話中,輸入 0 退出程式,輸入 1 重置使用者,退出和重置都會將當前使用者之前訪問資料記錄搭配 json 檔案中。

  • 由於 gpt-3.5-turbo 單次請求最大 token 數為:4096,所以程式碼裡限制了下對話次數。

更多拓展

  • 你可以寫個函式,從 json 檔案讀取歷史使用者訪問記錄,然後每次訪問可以選使用者。
  • 你可以寫個 web 服務,使用 session 或者資料庫支援多使用者同時登入,同時訪問。
  • 你可以基於之前分享的釘釘機器人專案,將 gpt-3.5-turbo 接入釘釘機器人。

你還可以上 Github 搜尋更多 ChatGPT 相關專案,或者其他有意思的專案學習練手,歡迎學習交流。

我建立了個 ChatGPT 應用交流群,如果你感興趣可以掃下方二維碼新增我微信申請加入。

專案已開源,持續更新中:XksA-me/ChatGPT-3.5-AP