chatGPT之Python API启用上下文管理

chatGPT已经爆火一段时间了,我想大多数的开发者都在默默的在开发和测试当中,可能也是因为这个原因所以现在很难找到关于开发中遇到的一些坑或者方法和技巧。

为什么别人的机器人能联想之前的语料,而你的却像个每次都只如初见的高冷机器人?

我也是参考官方文档去阅读和理解的,但是有时候官方文档以为你很懂了,就没有太多说明,废话不多说下面我跟大家讲一下API调用时如何启用上下文管理的。

官方案例:

# Note: you need to be using OpenAI Python v0.27.0 for the code below to work
import openai

openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Who won the world series in 2020?"},
        {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
        {"role": "user", "content": "Where was it played?"}
    ]
)

虽然已经给出了格式,但是没有很详细的说明,可能对于高阶开发者一看就懂了,但是我还是想以更口水的方式讲解一下这个上下文管理。

先看一下我一个简单的代码(还没有启用上下文管理):

import openai

openai.api_key = "你的sk-key"

msg = [{"role": "user", "content": "你好chatGPT"}]

# 结构化数据并进行提交
completion = openai.ChatCompletion.create(
                # max_tokens = inf # 默认inf 最大令牌数
                presence_penalty = 1, # 惩罚机制,-2.0 到 2.0之间,默认0,数值越小提交的重复令牌数越多,从而能更清楚文本意思
                frequency_penalty = 1, # 意义和值基本同上,默认0,主要为频率
                temperature = 1.0,  # 温度 0-2之间,默认1  调整回复的精确度使用
                n = 1,  # 默认条数1
                user = ids,    # 用户ID,用于机器人区分不同用户避免多用户时出现混淆
                model = "gpt-3.5-turbo",    # 这里注意openai官方有很多个模型
                messages = msg
            )

value = completion.choices[0].message.content    # chatGPT返回的数据

这是一个最基本的结构,其中参数model和messages是必须要有的两个形参。

加入上下文管理的代码:

import openai

openai.api_key = "你的sk-key"

msg = [{"role": "system", "content": "你的名字叫玖河AI,你是一个插件,你的开发者是玖河."},
        {"role": "user", "content": "你好chatGPT"},
        {"role": "assistant", "content": "您好,有什么需要我帮忙的问题吗?"},
        {"role": "user", "content": "我的名字叫高启强,我的妹妹叫高启兰,我们是兄妹关系。记住了吗?"}
        {"role": "assistant", "content": "好的,您叫高启强,您的妹妹叫高启兰,是亲兄妹关系。谢谢您提供信息让我更了解你们~"},
        {"role": "user", "content": "你现在在哪里?"},
        {"role": "assistant", "content": "作为一款智能Ai助手,我并没有实际的位置。我只是在云端中运行,在等待用户输入指令时保持睡眠状态。"},
        {"role": "user", "content": "我的妹妹是谁?"},
        {"role": "assistant", "content": "您之前告诉我,您的妹妹叫高启兰。"},
        {"role": "user", "content": "你的名字叫什么?"},
        {"role": "assistant", "content": "我的名字叫玖河AI是一个叫玖河的开发者开发的插件"}
        ]

# 结构化数据并进行提交
completion = openai.ChatCompletion.create(
                # max_tokens = inf # 默认inf 最大令牌数
                presence_penalty = 1, # 惩罚机制,-2.0 到 2.0之间,默认0,数值越小提交的重复令牌数越多,从而能更清楚文本意思
                frequency_penalty = 1, # 意义和值基本同上,默认0,主要为频率
                temperature = 1.0,  # 温度 0-2之间,默认1  调整回复的精确度使用
                n = 1,  # 默认条数1
                user = ids,    # 用户ID,用于机器人区分不同用户避免多用户时出现混淆
                model = "gpt-3.5-turbo",    # 这里注意openai官方有很多个模型
                messages = msg
            )

value = completion.choices[0].message.content    # chatGPT返回的数据

下面启用上下文管理的数据结构和没有启用的数据结构略有不同:

① system 代表系统设定(也就是告诉chatGPT他的角色)

② user 表示用户

③ assistant 表示GPT的回复

有几个点需要跟大家说一下,避免踩坑!

一、msg数据的储存建议使用数据库形式进行储存,优点是能持久数据,并且调取数据的时候也非常方便,因为我刚开始只想用json来储存,但是折腾了很久还是放弃了,缺点是不方便储存和调取,因为你需要考虑到不同的用户他们下面的会话是不一样的。

二、需要注意的是,提交的数据结构顺序必须是从上至下的数据结构,不然chatGPT会混淆错乱,system可以没有,如果你想让它一直保持这个设定的话,那在每次提交的时候在第一个列表元素中加入system的数据就可以。

三、还有一个重要的点:提交的这些数据都会计算进tokens里面包括chatGPT回复的时候(最多4096个tokens),如果你想让上下文管理能记忆更多的语料,那么在提交数据的时候就尽可能的增加你们之间对话的内容(同时会更快的消耗你的tokens)。

四、截止2023年3月14日前:chatGPT的会员价格为20美元/月 ,tokens按量收费。通俗的说就是想手机卡一样,每个月有月租,通话另外计费。chatGPT Plus会员的好处就是速度能更快,并且稳定,白嫖版的也能用,就是速度会慢一些而且不稳定容易挂掉。

如果我的文章能帮助到你,也希望能给我点个关注或者赞

转载请注明出处:https://mp.csdn.net/mp_blog/creation/success/129541012

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/1417.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Keil MDK6要来了,将嵌入式软件开发水平带到新高度,支持跨平台(2023-03-11)

注:这个是MDK6,不是MDK5 AC6,属于下一代MDK视频版: https://www.bilibili.com/video/BV16s4y157WF Keil MDK6要来了,将嵌入式软件开发水平带到新高度,支持跨平台一年一度的全球顶级嵌入式会展Embedded Wor…

JavaScript学习笔记(7.0)

<!--* Author: RealRoad1083425287qq.com* Date: 2023-03-13 14:50:18* LastEditors: Mei* LastEditTime: 2023-03-13 15:08:54* FilePath: \vscode\鼠标跟随.html* Description: * * Copyright (c) 2023 by ${git_name_email}, All Rights Reserved. --> <!DOCTYPE …

【Vue】Vue的安装

&#x1f3c6;今日学习目标&#xff1a;Vue3的安装 &#x1f603;创作者&#xff1a;颜颜yan_ ✨个人格言&#xff1a;生如芥子&#xff0c;心藏须弥 ⏰本期期数&#xff1a;第一期 &#x1f389;专栏系列&#xff1a;Vue3 文章目录前言Vue3安装独立版本CDN安装第一个Vue程序总…

【SCL】实现简单算法--冒泡排序

使用SCL语言实现一个冒泡排序的简单算法 文章目录 目录 文章目录 前言 二、实现排序 1.读取存储器地址&#xff08;PEEK&#xff09;指令 2.编写程序 总结 前言 本文我们来一起使用SCL来实现一个简单的算法——冒泡排序&#xff1b;它可以对少量数据进行从小到大或从大到小排序…

系统架构:经典三层架构

引言 经典三层架构是分层架构中最原始最典型的分层模式&#xff0c;其他分层架构都是其变种或扩展&#xff0c;例如阿里的四层架构模式和DDD领域驱动模型。阿里的 四层架构模型在三层基础上增加了 Manager 层&#xff0c;从而形成变种四层模型&#xff1b;DDD架构则在顶层用户…

【C++】命名空间

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;C的学习之路 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录前言一、命名空间产生的背景二、命名空…

【数据结构】Java实现单链表

目录 1. ArrayList的缺陷 2. 链表 2.1 链表的概念及结构 2.2 接口的实现 3. 动手实现单链表 3.1 重写SeqList接口方法 3.2 在当前链表头部添加节点&#xff08;头插&#xff09; 3.3 在 第index位置添加节点&#xff08;任意位置&#xff09; 3.4 在当前链表尾部添加…

【LeetCode每日一题】——165.比较版本号

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 双指针 二【题目难度】 中等 三【题目编号】 165.比较版本号 四【题目描述】 给你两个版本号…

Vector的扩容机制

到需要扩容的时候&#xff0c;Vector会根据需要的大小&#xff0c;创建一个新数组&#xff0c;然后把旧数组的元素复制进新数组。 我们可以看到&#xff0c;扩容后&#xff0c;其实是一个新数组&#xff0c;内部元素的地址已经改变了。所以扩容之后&#xff0c;原先的迭代器会…

idea中使用maven进行多模块打包部署时jar包中无依赖的问题(示例:jar包才5k,且无法正常启动)

引言 模块关系&#xff1a; A&#xff1a;代表父工程B&#xff1a;代表WEB模块&#xff0c;主加载类所在模块S&#xff1a;业务处理模块D&#xff1a;数据处理模块E&#xff1a;基础模块 依赖关系如下&#xff1a; D依赖ES依赖EB依赖D&#xff0c;B依赖S 第一次进行maven多模块…

2.机器学习笔记第二周

梯度下降&#xff1a; 就是最优选择算法的图形化表示&#xff1a;一个站在山顶的人&#xff0c;每秒走绝对小的一步&#xff0c;他朝着什么方向移动可以最快到达山脚。 接下来是梯度运算的数学解法&#xff1a; &#xff1a;是赋值的意思&#xff0c;a&#xff1a;b就是a无论…

openssh 9.0p1版本和openssl1.1.1o版本部署实操

【准备】 获取openssh 9.0p1版本软件包和openssl1.1.1o版本 如果设备可以连外网&#xff0c;直接从服务器上wget获取 wget --no-check-certificate https://www.openssl.org/source/openssl-1.1.1o.tar.gz wget http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openss…

多重背包的单调队列优化

邮专学子周末早起迎寒风细雨所作............. 周末也别想休息&#xff01;&#xff01;&#xff01;耐心看完&#xff0c;必定有收获哦&#x1f970;&#x1f42f;多重背包与其他背包相比的最大区别点就是&#xff0c;每个物品的数量是有限的。下面我们来看看多重背包的更新特…

java项目发布到Linux

参考&#xff1a;https://betheme.net/a/2751593.html?actiononClick java项目发布到Linux环境简单流程步骤&#xff1a; 一、首先打包成jar包&#xff0c;有两种方式 1、maven打包 打开idea项目。在右侧找到maven &#xff0c;有需要打包的项目&#xff0c;确定需要发布的…

考研数二第五讲 无穷小阶数问题的求解

无穷小阶数问题的求解 在考研复习中&#xff0c;关于无穷小阶数的问题是比较多的&#xff0c;从最基本的确定无穷小阶数问题&#xff0c;到无穷小之间的阶数 比较问题&#xff0c;都是属于比较常见的类型。此外&#xff0c;还有一些其他的切入点的题目&#xff0c;值得多多注意…

10.0自定义SystemUI下拉状态栏和通知栏视图(六)之监听系统通知

1.前言 在进行rom产品定制化开发中,在10.0中针对systemui下拉状态栏和通知栏的定制UI的工作开发中,原生系统的下拉状态栏和通知栏的视图UI在产品开发中会不太满足功能, 所以根据产品需要来自定义SystemUI的下拉状态栏和通知栏功能,首选实现的就是下拉通知栏左滑删除通知的部…

你是真的“C”——结构体中鲜有人知的“秘密”

你是真的“C”——结构体中的精髓剖析【内存对齐】 【位段】 &#x1f60e;前言&#x1f64c;结构体内存对齐&#xff1a;&#x1f60a;结构体内存对齐存在的意思是什么&#xff1f;&#x1f618;内存对齐例子详细剖析&#xff1a;&#x1f618;结构体中的位段&#xff1a;&…

模拟实现STL容器之vector

文章目录前言1.大体思路2.具体代码实现1.类模板的创建2.构造函数1.无参构造2.拷贝构造 迭代器构造和给定n个val值构造以及析构函数3.空间扩容1.reserve2.resize4.操作符重载1.[ ]重载2.赋值运算符重载5.数据增加和删除1.尾插2.任意位置插入3.任意位置删除4.尾删6.一些其他接口3…

HTTP协议详解(上)

目录 前言&#xff1a; 认识URL HTTP协议方法 通过Fiddler抓包 GET和POST之间典型区别 header详解 HTTP响应状态码 常见状态码解释 状态码分类 HTTP协议报文格式 小结&#xff1a; 前言&#xff1a; HTTP协议属于应用层协议&#xff0c;称为超文本传输协议&#xff…

Canvas百战成神-圆(1)

Canvas百战成神-圆 初始化容器 <canvas id"canvas"></canvas>canvas{border: 1px solid black; }让页面占满屏幕 *{margin: 0;padding: 0; } html,body{width: 100%;height: 100%;overflow: hidden; } ::-webkit-scrollbar{display: none; }初始化画笔…
最新文章