chatgpt接口開發(fā)筆記1:completions接口
chatgpt接口開發(fā)筆記1:completions接口
個人博客地址:?https://note.raokun.top
擁抱ChatGPT,國內(nèi)訪問網(wǎng)站:https://www.playchat.top
序:寫這一系列文章的動機(jī)來源于在部署Chanzhaoyu/**chatgpt-web**項目時發(fā)現(xiàn),體驗并不好,會存在多人同時提問時回答會夾斷,上下文接不上的現(xiàn)象。同時希望搭建的項目能實現(xiàn)前后端分離。于是用webapi寫了一套后端接口。我會把我在對接openai的接口開發(fā)的經(jīng)驗分享給大家。
completions接口
目前我們用到最多的接口就是completions接口
POST ?https://api.openai.com/v1/chat/completions
官方給出的入?yún)⑹纠秊椋?/p>
curl
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 用于控制回復(fù)內(nèi)容的最大長度,一般可以設(shè)置為2000
添加stream 用于控制接口是返回json字符串還是返回stream的流(stream可以實現(xiàn)打字機(jī)效果)
添加presence_penalty或frequency_penalty 用于控制回復(fù)的開放程度,官方稱為懲罰機(jī)制
返回參數(shù)官方示例:
json
{
?"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
?}
}
重點參數(shù)解析:
created 回復(fù)時間的時間戳
message 回復(fù)內(nèi)容,回復(fù)內(nèi)容的role固定為assistant
finish_reason 結(jié)果完成原因 可能是"stop"(代表沒有更多的建議),“cutoff”(代表建議被截斷),或者"completion"(代表建議完成)
prompt_tokens:消息中包含的單詞數(shù)量
completion_tokens:結(jié)果中包含的單詞數(shù)量
total_tokens:消息中總共包含的單詞數(shù)量
如何控制上下文
相信很多部署過chatgpt-web的同學(xué)都有遇到過上下文不連續(xù),接不上的情況。其原因在于會話的數(shù)據(jù)是存在前端緩存里的,返回消息時出現(xiàn)了夾斷,前端獲取不到被夾斷報錯的上一次的聊天回復(fù)的內(nèi)容。
看過chatgpt-web的源碼的同學(xué)應(yīng)該發(fā)現(xiàn)了,在發(fā)起聊天請求時,會傳會話id給接口。我開始也是以為id是上下文的判斷依據(jù)。后來在開發(fā)接口時才注意到OpenAI的接口并沒有Id這樣的參數(shù)。這說明會話的id并不是上下文的檢索條件。
通過測試實現(xiàn),我總結(jié)了下:
上下文的依據(jù)與會話id,還有你使用的key都是沒有關(guān)系的,它只與你的message參數(shù)有關(guān)。
實現(xiàn)精確的上下文
為了實現(xiàn)精確的上下文,你可以在發(fā)起請求時,將接口回復(fù)的內(nèi)容一并帶上。因為message 是一個集合,如下:
json
"messages": [{
? ? ?"role": "assistant",
? ? ?"content": "\n\nHello there, how may I assist you today?",
? ?}{"role": "user", "content": "Hello!"}]
如果條件允許可以多加點(大于等于2),同時這肯定是消耗更多的余額的。
到此,你應(yīng)該對completions接口已經(jīng)有了充足的認(rèn)識了。