請啟用 JavaScript 來查看內容

OpenAI ChatGPT API 如何使用?(附上 Python 範例程式)

·

    前言

    ChatGPT 是由 OpenAI 所開發的一個基於 GPT-3.5 架構的大型語言模型,自從去年底發表到現在依然話題不斷、人氣超高。而在三月初,OpenAI 公開了 ChatGPT 的 API,也就是 gpt-3.5-turbo 模型的 API,讓我們不再被限制只能透過官方網頁使用,並且提供更多可調整的參數選項。

    這篇文章就是要一起來了解 ChatGPT API,並實際使用 Python 串接 API (當然有 Python 範例程式碼),帶著大家快速上手。


    這兩份官方文件建議可以看看:


    OpenAI 公開 ChatGPT API
    OpenAI 公開 ChatGPT API


    API key 申請

    進到帳號的 API key 頁面,登入帳號後,點擊 “Create new secret key” 來產生 API key,這時候就要把 key 複製並保存下來了,如果忘記的話,再產生一次即可。

    API key 申請
    API key 申請

    使用量與計費方式

    而帳號實際的總使用量可以到 帳號 Usage 頁面查看。

    目前每個帳號會贈送 18 美元的額度讓你試用 (如果你是用同一組手機去開多個帳號,那就不一定了),並且有使用期限要留意,不要白白浪費了~
    如果免費額度用完過到期,就應該要綁信用卡才能使用了。

    每種模型的計費方式可參考 官網 Pricing 頁面說明。

    帳號實際的總使用量
    帳號實際的總使用量

    範例程式碼

    馬上給各位看看範例程式碼。

    這邊分別使用使用兩種套件來示範,我們之前常用的 requests,與官方提供的 openai 套件。

    Model 使用 ChatGPT 的 gpt-3.5-turbo,如果之後 GPT-4 的也開放後可以使用 gpt-4
    目前 OpenAI API 有提供這些 Model,裡面有對每一種 Model 做詳細說明。


    使用 requests 套件

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    
    import requests
    
    API_KEY = '<YOUR_API_KEY>'
    
    response = requests.post(
        'https://api.openai.com/v1/chat/completions',
        headers={
            'Content-Type': 'application/json',
            'Authorization': f'Bearer {API_KEY}'
        },
        json={
            'model': 'gpt-3.5-turbo',
            'messages': [{"role": "user", "content": "說句話吧"}],
        }
    )
    
    print(response.json())
    

    使用官方 openai 套件

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    
    import openai
    
    openai.api_key = '<YOUR_API_KEY>'
    
    completion = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "user", "content": "說句話吧"}
        ]
    )
    
    print(completion)
    

    參數

    輸入參數除了上方範例中的 modelmessages,還有以下這些。

    此表格是依照官方 API Reference 所整理出來的。

    參數名稱資料型態必填/選填預設值說明
    modelstring必填-要使用的 Model ID。 (可使用的model)
    messagesarray必填-以對話格式生成對話的訊息。 (格式參考,或以下說明)
    temperaturenumber選填1介於 0 和 2 之間。較高的值(如 0.8)將使輸出更加隨機,而較低的值(如 0.2)將使輸出更加集中和確定。
    top_pnumber選填1一種替代temperature的方法(nucleus sampling)。Model 考慮具有 top_p 概率質量的標記的結果。所以 0.1 意味著只考慮構成前 10% 概率質量的標記。
    ninteger選填1輸出幾種回覆結果。 (參考以下說明)
    streamboolean選填false開啟 stream 方式傳送,就像 ChatGPT 網頁版那樣會一個一個字跑出來。(官方範例)
    stopstring or array選填null指定字串,如果回覆有出現這些字串將會停止輸出。
    max_tokensinteger選填inf聊天完成時生成的最大令牌數。如果太小它可能回覆到一半就會斷掉,但每種 Model 都有各自的最大值。
    presence_penaltynumber選填0-2.0 和 2.0 之間的數字。正值會根據到目前為止是否出現在文本中來懲罰新標記,從而增加 Model 談論新主題的可能性。
    frequency_penaltynumber選填0-2.0 和 2.0 之間的數字。正值會根據新標記在文本中的現有頻率對其進行懲罰,從而降低 Model 逐字重複同一行的可能性。
    logit_biasmap選填null修改指定標記出現在完成中的可能性。
    userstring選填-代表你的用戶的ID,幫助 OpenAI 監控和檢測濫用行為。 (更多說明)

    * 官方建議不要同時更改 temperature 和 top_p,可以參考這邊的說明

    * 表格內有幾個說明你可能看不懂,因為我也不太懂 XP


    messages 是個陣列的格式,放著你們之間的對話。
    裡面的 role 欄位可以放三種身分:“system”、“user”、“assistant”。

    對話可以先有一則 “system”,對 Model 先做出指示,例如 “你是一隻貓” (?,不過官方說 gpt-3.5-turbo 對 “system” 消息的關注度不高,因此重要的說明建議還是放在 “user” 的消息比較好。
    “user” 是我們使用者的發問;“assistant” 則是 Model 的回話。

    如果你想要讓對話有上下文關係(要讓 Model 記得之前講過的話),要把全部對話紀錄都在傳給它,然後這些都算進 token(使用量) 裡…,像是底下這樣。

    第一次問它:

    1
    2
    3
    
    "messages": [
        {"role": "user", "content": "王建民是誰"}
    ]
    

    它回覆:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    "usage": {
        "prompt_tokens": 14,
        "completion_tokens": 217,
        "total_tokens": 231
    },
    "choices": [
        {
            "message": {
                "role": "assistant",
                "content": "\n\n王建民是一位台灣籍棒球運動員,曾效力於美國職棒大聯盟紐約洋基隊、匹茲堡海盜隊、倫敦青年隊、堪薩斯城皇家隊等隊伍,擅長投球,被譽為是台灣最優秀的投手之一。他在職業生涯期間獲得多項獎項,包括台灣大賽MVP、亞洲聯盟MVP、美國聯盟先發投手等。他在2015年正式宣布退役,現在是一位棒球分析師和教練。"
            }
        }
    ]
    

    想再繼續深入詢問,第二次問它,就要把剛剛我問的跟他回的都放進去:

    1
    2
    3
    4
    5
    
    'messages': [
        {"role": "user", "content": "王建民是誰"},
        {"role": "assistant", "content": "\n\n王建民是一位台灣籍棒球運動員,曾效力於美國職棒大聯盟紐約洋基隊、匹茲堡海盜隊、倫敦青年隊、堪薩斯城皇家隊等隊伍,擅長投球,被譽為是台灣最優秀的投手之一。他在職業生涯期間獲得多項獎項,包括台灣大賽MVP、亞洲聯盟MVP、美國聯盟先發投手等。他在2015年正式宣布退役,現在是一位棒球分析師和教練。"},
        {"role": "user", "content": "他在美國大聯盟最多一年曾經拿過幾勝"},
    ]
    

    它回覆:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    "usage": {
        "prompt_tokens": 268,
        "completion_tokens": 63,
        "total_tokens": 331
    },
    "choices": [
        {
            "message": {
                "role": "assistant",
                "content": "王建民在美國大聯盟生涯中最多一年的勝場數為19勝,是在2008年效力於倫敦青年隊時所取得的成績。"
            }
        }
    ]
    

    可以感受到 total_tokens 的使用量了嗎?
    如果想讓它記得以前講過的話,每次請求所消耗的 token 是要繼續往上疊的,也是蠻恐怖的 XD

    以上內容可以參考官方說明


    參數 n 是代表你想要它給出幾種回覆,例如 n=3 會產生如下三則訊息回覆:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    
    "choices": [
        {
            "message": {
                "role": "assistant",
                "content": "\n\n你好,有什麼我可以幫助您的?"
            },
            "finish_reason": "stop",
            "index": 0
        },
        {
            "message": {
                "role": "assistant",
                "content": "\n\n您好,有什麼我能幫助您的嗎?"
            },
            "finish_reason": "stop",
            "index": 1
        },
        {
            "message": {
                "role": "assistant",
                "content": "\n\n您好,有什麼我可以為您做的嗎?"
            },
            "finish_reason": "stop",
            "index": 2
        }
    ]
    

    回覆內容

    依照上方的範例程式,他回傳的格式與內容會類似這樣:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    {
        "id": "chatcmpl-6v4faabcd9gXfUerJvBf123Co",
        "object": "chat.completion",
        "created": 1679060660,
        "model": "gpt-3.5-turbo-0301",
        "usage": {
            "prompt_tokens": 14,
            "completion_tokens": 24,
            "total_tokens": 38
        },
        "choices": [
            {
                "message": {
                    "role": "assistant",
                    "content": "\n\n你好,有什麼我可以為你效勞的嗎?"
                },
                "finish_reason": "stop",
                "index": 0
            }
        ]
    }
    

    usage 欄位顯示你本次消耗的 token 數量。

    • prompt_tokens:你問他(輸入)所消耗的 token。
    • completion_tokens:它回覆(輸出)所消耗的 token。
    • total_tokens:本次請求總共消耗多少 token,也就是 prompt_tokenscompletion_tokens

    如果想知道一句話代表幾個 token,可以使用官方提供的 Python 套件 — tiktoken:https://github.com/openai/tiktoken
    也有計算 token 相關的使用說明

    本來想說可以使用官方的 Tokenizer 網頁來計算,但它是 GPT-3 Model 的,官方有說轉換 token 的計算方式可能因不同 Model 而異,因此我實際使用其實跟 gpt-3.5-turbo 出來的結果有落差。

    帳號實際的總使用量可以到 帳號 Usage 頁面查看。

    * 你會發現中文消耗的 token 比英文還多很多😭


    choices 內就是主要我們想知道的部分 — ChatGPT 的回覆。

    • message > content:回覆的內容。
    • index:代表第幾種回覆。(如果輸入參數有設定 n 的話)
    • finish_reason:代表此次回覆結束的原因(狀態),可能會有以下四種值:
      • stop:完整的輸出。
      • length:由於 max_tokens 參數或 token 限制,導致輸出不完整。
      • content_filter:由於內容過濾器中的標誌而省略了內容。
      • null:API 響應仍在進行中或未完成。

    Playground 遊樂場

    OpenAI 還有提供 Playground 遊樂場,可以在上面測試不同的模型、調整不同的參數,觀察其結果,方便我們去快速了解。

    Playground 遊樂場:https://platform.openai.com/playground

    Playground 遊樂場
    Playground 遊樂場

    對了,使用 Playground 也是會消耗你自己的 token,這點要稍微注意一下,不要以為是 ChatGPT 網頁而玩過頭了🤣


    其他說明

    串接 OpenAI API 發出請求可能會收到錯誤,而完整詳細的錯誤代碼說明與進一步的解決辦法,可以參考這邊官方的文章:https://platform.openai.com/docs/guides/error-codes

    OpenAI API 在使用上還有一些速率限制,如果使用會比較大量的朋友可以過去了解一下:https://platform.openai.com/docs/guides/rate-limits/overview



    結語

    使用 OpenAI API 上非常簡單,只是有些小地方要注意一下。
    在看完以上介紹,趕快實際動手做,看看有沒有什麼 idea 可以進一步放大 ChatGPT 的用途~


    歡迎追蹤『IT空間』FB 粉專,取得最新發文通知🔔




    參考:
    OpenAI 官方說明文件
    OpenAI 官方 API 參考
    OpenAI 帳號後台
    OpenAI 各種 Model 說明
    OpenAI 各種 Model 價格
    OpenAI Playground 遊樂場
    OpenAI API 錯誤代碼
    OpenAI API 速率限制


    別讓沒有夢想的人摧毀你的夢想。


    🔻 如果覺得喜歡,歡迎在下方獎勵我 5 個讚~
    分享

    Jia
    作者
    Jia
    軟體工程師 - Software Engineer