chatgpt介面開發筆記1:completions介面

rrrrrsddds發表於2023-04-26

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介面已經有了充足的認識了。

相關文章