chatgpt介面開發筆記1:completions介面
個人部落格地址: https://note.raokun.top
擁抱ChatGPT,國內訪問網站:https://www.playchat.top
序:寫這一系列文章的動機來源於在部署Chanzhaoyu/chatgpt-web專案時發現,體驗並不好,會存在多人同時提問時回答會夾斷,上下文接不上的現象。同時希望搭建的專案能實現前後端分離。於是用webapi寫了一套後端介面。我會把我在對接openai的介面開發的經驗分享給大家。
completions介面
目前我們用到最多的介面就是completions介面
POST https://api.openai.com/v1/chat/completions
官方給出的入參示例為:
curl https://api.openai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-3.5-turbo",
"messages": [{"role": "user", "content": "Hello!"}]
}'
header部分:
- Authorization 身份驗證 $OPENAI_API_KEY 替換成你用到的key
請求體:
- model 使用的模型,這裡使用的是gpt 3.5的模型
- messages 會話
**注意點:這裡的messages 是介面的核心,分為三類:user、assistant、system **
同時,我們可以
- 新增max_tokens 用於控制回覆內容的最大長度,一般可以設定為2000
- 新增stream 用於控制介面是返回json字串還是返回stream的流(stream可以實現打字機效果)
- 新增presence_penalty或frequency_penalty 用於控制回覆的開放程度,官方稱為懲罰機制
返回引數官方示例:
{
"id": "chatcmpl-123",
"object": "chat.completion",
"created": 1677652288,
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": "\n\nHello there, how may I assist you today?",
},
"finish_reason": "stop"
}],
"usage": {
"prompt_tokens": 9,
"completion_tokens": 12,
"total_tokens": 21
}
}
重點引數解析:
- created 回覆時間的時間戳
- message 回覆內容,回覆內容的role固定為assistant
- finish_reason 結果完成原因 可能是"stop"(代表沒有更多的建議),"cutoff"(代表建議被截斷),或者"completion"(代表建議完成)
- prompt_tokens:訊息中包含的單詞數量
- completion_tokens:結果中包含的單詞數量
- total_tokens:訊息中總共包含的單詞數量
如何控制上下文
相信很多部署過chatgpt-web的同學都有遇到過上下文不連續,接不上的情況。其原因在於會話的資料是存在前端快取裡的,返回訊息時出現了夾斷,前端獲取不到被夾斷報錯的上一次的聊天回覆的內容。
看過chatgpt-web的原始碼的同學應該發現了,在發起聊天請求時,會傳會話id給介面。我開始也是以為id是上下文的判斷依據。後來在開發介面時才注意到OpenAI的介面並沒有Id這樣的引數。這說明會話的id並不是上下文的檢索條件。
透過測試實現,我總結了下:
上下文的依據與會話id,還有你使用的key都是沒有關係的,它只與你的message引數有關。
實現精確的上下文
為了實現精確的上下文,你可以在發起請求時,將介面回覆的內容一併帶上。因為message 是一個集合,如下:
"messages": [{
"role": "assistant",
"content": "\n\nHello there, how may I assist you today?",
}{"role": "user", "content": "Hello!"}]
如果條件允許可以多加點(大於等於2),同時這肯定是消耗更多的餘額的。
到此,你應該對completions介面已經有了充足的認識了。