当前位置:首页|资讯|ChatGPT|OpenAI

chatgpt接口开发笔记1:completions接口

作者:单纯的饶同学发布时间: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


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 用于控制回复的开放程度,官方称为惩罚机制

返回参数官方示例:

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  } }

重点参数解析:

  • 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 是一个集合,如下:

json


"messages": [{      "role": "assistant",      "content": "\n\nHello there, how may I assist you today?",    }{"role": "user", "content": "Hello!"}]

如果条件允许可以多加点(大于等于2),同时这肯定是消耗更多的余额的。

到此,你应该对completions接口已经有了充足的认识了。



Copyright © 2024 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1