chatgpt接口开发笔记1:completions接口
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接口已经有了充足的认识了。
chatgpt接口开发笔记1:completions接口的更多相关文章
- PHP九大接口视频教程( 支付宝,QQ,短信接口,微信接口开发, 支付宝即时到账接口开发三级分销全套)
PHP九大接口视频教程( 支付宝,QQ,短信接口,微信接口开发, 支付宝即时到账接口开发三级分销全套) 需要的联系我:QQ: 1844912514 PHP九大接口视频教程( 支付宝,QQ,短信接口 ...
- windows下shopex农行支付接口开发笔记
1.首先是配置Java和tomcat 农行文档里的是linux下的说明.window下我们要按照以下在setclasspath.bat里设置JAVA_HOME,JRE_HOME(红色字体部分).设置这 ...
- FastAPI(六十八)实战开发《在线课程学习系统》接口开发--用户 个人信息接口开发
在之前的文章:FastAPI(六十七)实战开发<在线课程学习系统>接口开发--用户登陆接口开发,今天实战:用户 个人信息接口开发. 在开发个人信息接口的时候,我们要注意了,因为我们不一样的 ...
- wechat开发笔记之1.接口示例代码
修改后的php示例代码! <?php /** * wechat php test */ //define your token define("TOKEN", "w ...
- 夺命雷公狗---微信开发55----微信js-sdk接口开发(2)接口功能介绍之签名算法
我们JS-SDK里面其实有不少的接口 startRecord---录音 stopRecord---停止录音 playVoice---播放 pauseVoice---暂停播放 uploadImage-- ...
- Dcloud课程4 如何进行APP接口开发
Dcloud课程4 如何进行APP接口开发 一.总结 一句话总结:通过json或者xml. 1.APP如何进行通信? 通过在地址上接参数指明传递的数据的类型.而数据传递的类型一般是XML和json. ...
- Django Web接口开发
什么是接口 接口一般来讲分为两种: (1)程序内部的接口:方法与方法.模块与模块之间的交互,程序内部抛出的接口,如登录发帖,发帖就必须要登录,如果不登录不能发帖,发帖和登录这两个模块之间就要有交互,就 ...
- FastAPI(六十九)实战开发《在线课程学习系统》接口开发--修改密码
之前我们分享了FastAPI(六十八)实战开发<在线课程学习系统>接口开发--用户 个人信息接口开发.这次我们去分享实战开发<在线课程学习系统>接口开发--修改密码 我们梳理一 ...
- Java开发笔记(五十八)简单接口及其实现
前面介绍了抽象方法及抽象类的用法,看似解决了不确定行为的方法定义,既然叫唤动作允许声明为抽象方法,那么飞翔.游泳也能声明为抽象方法,并且鸡类涵盖的物种不够多,最好把这些行为动作扩展到鸟类这个群体,于是 ...
- Java开发笔记(五十九)Java8之后的扩展接口
前面介绍了接口的基本用法,有心的朋友可能注意到这么一句话“在Java8以前,接口内部的所有方法都必须是抽象方法”,如此说来,在Java8之后,接口的内部方法也可能不是抽象方法了吗?之所以Java8对接 ...
随机推荐
- java输入一个字符串,要求将该字符串中出现的英文字母, * 按照顺序输出,区分大小写,且大写优先
public static void main(String[] args) { String input ="A8r4c5jaAjp#7"; //转为char[] char[] ...
- This will upgrade your R installation.
sudo add-apt-repository ppa:marutter/rrutter sudo apt update sudo apt full-upgrade
- protobuf怎么处理java中的Object和Object[],protobuf的bytestring和object[]
如题,作者一开始也遇到了这个比较棘手的问题. 话不多说,直接说解决方案. 这里使用bytestring,如果是object[]的话则用repeated定义即可. 那么问题又来了,用这个类型怎么做到与j ...
- JavaScript 函数的方法
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- class3
#include<stdio.h> #include<stdlib.h> #include<time.h> #include<windows.h> #d ...
- 循环读取mysql表,合并后去重获取行数
sdt=`date -d"$(date -d'20210108 ' +'%Y%m01')" +"%Y%m%d"`edt=`date -d "$(dat ...
- 关于windows cmd 控制台输出中文
由于中文在window 输出总是优乱码可能性 ,先建cmd.reg 负责下面内容 ,双击运行即可. Windows Registry Editor Version 5.00 [HKEY_CURR ...
- Drf_序列化and反序列化基础
序列化类 from rest_framework import serializers class BookSerializer(serializers.Serializer): # 要序列化的字段 ...
- win10试安装docker部署hyperf
一:部署虚拟机,这里使用的win系统带的Hyper-V虚拟机,其它虚拟机也行 1.win+R打开命令行 2.安装Hyper-V . 失败放弃安装,选择其它吧 3.win10安装VMware 这里参考 ...
- 2.C/C++的const
1.C语言的const修饰的变量都有空间 2.C语言的const修饰的全局变量具有外部链接属性 3.C++语言的const修饰的变量有时有空间,有时没有空间(发生常量折叠,且没有对变量进行取址操作) ...