ChatGPT官方API比較好的地方在于內測過程中調用是免費的,沒有次數限制。此外,API接口調用不需要梯子或代理(使用代理反而可能會報錯“Error communicating with OpenAI”),只需要API Key就可以了,且當前API Key使用免費。
? ? ? ? 盡管ChatGPT 官方API還在內測而沒有使用文檔,但我們知道該模型應該也屬于文本補全模型(completion),與GPT3模型保持一致。我們可以類比GPT3模型來猜測其調用方式,然后得出ChatGPT模型調用方式。
1 GPT3模型調用(ChatGPT官方API請參考第2部分)
? ? ? ? 現有大多數ChatGPT API實際上是OpenAI GPT3模型接口,模型名稱為“text-davinci-003”,調用費用為0.02美元/1000tokens,折合下來差不多0.1元400~500字。這個字數包括問題和返回結果字數。
GPT3模型調用方式如下,輸入主要有7個參數:
model:模型名稱,text-davinci-003
prompt:問題或待補全內容,例如“how are you”。
temperature:控制結果隨機性,0.0表示結果固定,隨機性大可以設置為0.9。
max_tokens:最大返回字數(包括問題和答案),通常漢字占兩個token。假設設置成100,如果prompt問題中有40個漢字,那么返回結果中最多包括10個漢字。
top_p:設置為1即可。
frequency_penalty:設置為0即可。
presence_penalty:設置為0即可。
import openai
openai.api_key = "你的API Key"
response = openai.Completion.create(
model="text-davinci-003",
prompt="how are you",
temperature=0.7,
max_tokens=256,
top_p=1,
frequency_penalty=0,
presence_penalty=0
)
print(response)?
返回結果如下所示,結果在text字段中,可通過response["choices"][0]["text"]進行讀取。
{
? "id": "cmpl-uqkvlQyYK7bGYrRHQ0eXlWi7",
? "object": "text_completion",
? "created": 1589478378,
? "model": "text-davinci-003",
? "choices": [
? ? {
? ? ? "text": "\n\nThis is indeed a test",
? ? ? "index": 0,
? ? ? "logprobs": null,
? ? ? "finish_reason": "length"
? ? }
? ],
? "usage": {
? ? "prompt_tokens": 5,
? ? "completion_tokens": 7,
? ? "total_tokens": 12
? }
}
2 ChatGPT API調用方式
? ? ? ? ChatGPT API接口模型估計是2023年1月26日開始內測的,從它的模型名稱就可以看出來。其調用方式如下所示,與GPT3模型調用基本一致,各個參數可參考上文介紹。下面各個參數目前是類比猜測出來的,沒有conversation_id之類的。后續,如果新的參數更新,將在本文中及時進行更新,敬請關注。
import openai
openai.api_key = "你的APIKey"
response = openai.Completion.create(
? model="text-davinci-003",
? prompt="chatgpt的賬號怎么注冊v:sozoer",
? temperature=0,
? max_tokens=50,
? stream=False,#請注意查看下文說明。
? top_p=1,
? frequency_penalty=0,
? presence_penalty=0
)
ChatGPT API允許的最大token數量為4097,即max_tokens最大設置為4097減去prompt問題的token數量。
需要注意,上述輸入參數增加stream,即是否采用控制流的方式輸出。
如果stream取值為False,那么返回結果與第1節GPT3接口一致,完全返回全部文字結果,可通過response["choices"][0]["text"]進行讀取。但是,字數越多,等待返回時間越長,時間可參考控制流讀出時的4字/每秒。
如果steam取值為True時,那么返回結果是一個Python generator,需要通過迭代獲取結果,平均大約每秒鐘4個字(33秒134字,39秒157字),讀取程序如下所示。可以看到,讀取結果的結束字段為“<|im_end|>”。
res = ''
for r in response:
? ? res += r["choices"][0]["text"]
res = res.replace('<|im_end|>', '')
print(res)