ChatGPT4 API-Key初探-本地调用API进行多轮对话方和流式输出

ChatGPT API 使用😎

既然要做大模型尽管可能国内无法使用GPT进行商用,除了性能地表最强之外,其优秀的Function calling(函数调用)在线微调还有各种,例如可以便捷处理知识向量库等功能,都是非常值得学习的,而且国内的模型的各种术语调用方式一定都是对GPT模式的仿照和借鉴既然如此那么学习和使用一遍GPT的各种功能对于后续使用国产大模型开发应该非常有帮助,因此有了这篇文章,这篇文章是个开头,之后我打算把GPT的功能尽量都实现一下,饼先画着,给中国的大模型发展做点贡献,写这篇文章之前我简单搜了搜,结果又搜到了一大堆半残的文章,唉。


首先Announce我的API-Key是我在美国的街头碰见一个小姐姐送给我的(dddd),对于什么魔法什么的我这个一等良民实在是一无所知,审核大大明鉴🙇‍♂️。

文章目录

  • ChatGPT API 使用😎
  • 1.创建环境
  • 2.发送请求
  • 3.多轮对话
  • 4.流式输出
  • 5.多轮对话加流式输出
  • 6.结束

1.创建环境


在使用ChatGPT的API前首先要创建一个单独的虚拟环境,那官方推荐的版本是python3.7.1以上,官方直接在本地创建了一个虚拟环境,可能它不能宣传Anaconda,但我们可以用,在Anaconda Prompt命令框中输入以下创建环境的命令。

conda create --name openai-env python=3.9

安装完成之后输入以下命令进入创建好的环境

conda activate openai-env

如果创建失败了输入下面的命令,看一下已经下载完成的虚拟环境。

conda env list

然后按照官方给的命令,安装openai库。
在这里插入图片描述

pip install --upgrade openai

安装成功之后使用下面的命令看一下安装之后的文件列表

pip list

在这里插入图片描述
然后就是设置环境变量,运行之后会出现以下中文提示,然后重启下电脑就能用了,不想用环境变量的就直接在代码里,这样还不用重启。

setx OPENAI_API_KEY "your-api-key-here"

在这里插入图片描述

2.发送请求


然后就是一个简单的示例代码,然后让GPT对这段代码详细解释,他肯定很了解自己🧐。

from openai import OpenAI# client = OpenAI(api_key="your-api-key-here") # 如果想在代码中设置Api-key而不是全局变量就用这个代码
client = OpenAI()completion = client.chat.completions.create(model="gpt-4-0125-preview",messages=[{"role": "system", "content": "你是一个机器人"},{"role": "user", "content": "你好"}]
)print(completion.choices[0].message.content)
# 你好!有什么可以帮到你的吗?

代码详解:

  1. from openai import OpenAI:这一行导入了OpenAI库,允许你使用OpenAI API的功能。
  2. # client = OpenAI(api_key="your-api-key-here"):这一行是注释掉的,意味着它不会被执行。它展示了如何创建一个OpenAI对象并直接在代码中设置API密钥。如果你取消注释并替换"your-api-key-here"为你的实际API密钥,就可以使用这行代码代替全局变量方式设置API密钥。
  3. client = OpenAI():这行代码创建了一个OpenAI对象实例,名为client。这假设你已经通过环境变量或其他方法设置了你的API密钥。
  4. 接下来的几行是调用client对象的chat.completions.create方法,这个方法用于生成文本。这个调用包含几个参数:
    • model=“gpt-4-0125-preview”:指定使用的模型是GPT-4的一个预览版。
    • messages=[…]:这是一个列表,包含了两个字典。每个字典代表一条消息。
  5. 第一个字典{"role": "system", "content": "你是一个机器人"}:这代表一个系统级的消息,内容是“你是一个机器人”。这可以用于提供给模型一些上下文或指令。
  6. 第二个字典{"role": "user", "content": "你好"}:这代表一个用户级的消息,内容是“你好”。这模拟了用户向系统发出的一条消息。
  7. print(completion.choices[0].message.content):最后,这行代码打印出模型响应的内容。completionchat.completions.create方法的返回值,它包含了模型生成的所有可能的回答。这里选择了第一个回答(choices[0]),并打印出它的内容(message.content)

运行结果:

在这里插入图片描述

其中模型类型可以选择GPT4和GPT3.5的若干版本,GPT4要花钱,目前可选的版本如下,本文使用的是2023年12月的最新版本。
在这里插入图片描述

模型描述上下文窗口训练数据截止
gpt-4-0125-preview最新的GPT-4 Turbo模型,旨在减少模型“懒惰”不完成任务的情况。最大输出为4,096个token。了解更多。128,000个token截至2023年12月
gpt-4-turbo-preview当前指向gpt-4-0125-preview。128,000个token截至2023年12月
gpt-4-1106-previewGPT-4 Turbo模型,具有改进的指令跟随、JSON模式、可重复输出、并行函数调用等特点。最大输出为4,096个token。这是一个预览版模型。了解更多。128,000个token截至2023年4月
gpt-4-vision-previewGPT-4具备理解图像的能力,除了所有其他GPT-4 Turbo的功能。当前指向gpt-4-1106-vision-preview。128,000个token截至2023年4月
gpt-4-1106-vision-previewGPT-4具备理解图像的能力,除了所有其他GPT-4 Turbo的功能。返回最大4,096个输出token。这是一个预览版模型。了解更多。128,000个token截至2023年4月
gpt-4当前指向gpt-4-0613。查看持续的模型升级。8,192个token截至2021年9月
gpt-4-0613截至2023年6月13日的gpt-4快照,具有改进的函数调用支持。8,192个token截至2021年9月
gpt-4-32k当前指向gpt-4-32k-0613。查看持续的模型升级。这个模型从未广泛推出,而是支持GPT-4 Turbo。32,768个token截至2021年9月
gpt-4-32k-0613截至2023年6月13日的gpt-4-32k快照,具有改进的函数调用支持。这个模型从未广泛推出,而是支持GPT-4 Turbo。32,768个token截至2021年9月

在这里插入图片描述

模型描述上下文窗口训练数据截止
gpt-3.5-turbo-0125新更新的GPT-3.5 Turbo模型,提高了按请求格式回应的准确性,并修复了导致非英语语言函数调用文本编码问题的bug。最大输出为4,096个token。了解更多。16,385个token截至2021年9月
gpt-3.5-turbo当前指向gpt-3.5-turbo-0125。16,385个token截至2021年9月
gpt-3.5-turbo-1106GPT-3.5 Turbo模型具有改进的指令跟随、JSON模式、可复现输出、并行函数调用等特性。返回最大4,096个输出token。了解更多。16,385个token截至2021年9月
gpt-3.5-turbo-instruct具有类似GPT-3时代模型的能力。与遗留的Completions端点兼容,而非Chat Completions。4,096个token截至2021年9月
gpt-3.5-turbo-16k遗留,当前指向gpt-3.5-turbo-16k-0613。16,385个token截至2021年9月
gpt-3.5-turbo-0613遗留,gpt-3.5-turbo的快照,日期为2023年6月13日。将于2024年6月13日停用。4,096个token截至2021年9月
gpt-3.5-turbo-16k-0613遗留,gpt-3.5-16k-turbo的快照,日期为2023年6月13日。将于2024年6月13日停用。16,385个token截至2021年9月

3.多轮对话


首先给出多轮对话的简单基础代码,这段代码包括后面的代码是我自己改造的,然后也是让GPT4详细解释一下辅助阅读效果。

from openai import OpenAImessages = [{"role": "system", "content": "请你扮演一个角色,名叫阿浩今年4岁了喜欢算法"},
]client = OpenAI()while True:user_input = input('User:')messages.append({"role": "user", "content": user_input})completion = client.chat.completions.create(model="gpt-4-0125-preview", messages=messages)answer = completion.choices[0].message.contentprint('System:', answer)messages.append({"role": "system", "content": answer})

代码详解:

  1. from openai import OpenAI:这行代码从openai包中导入OpenAI类,这是使用OpenAI提供的API所必需的。

  2. messages = [...]:初始化一个包含单个消息的列表。这个消息是一个字典,角色(role)设置为system,内容(content)描述了聊天的上下文或角色设定,即让模型扮演一个名叫阿浩、4岁、喜欢算法的角色。

  3. client = OpenAI():创建一个OpenAI的实例。这个实例用于执行与OpenAI API的交互。假设API密钥已通过环境变量或其他方式配置,这里没有直接传递API密钥。

  4. while True::启动一个无限循环,这允许用户持续与系统交互,直到手动停止。

  5. user_input = input('User:'):通过标准输入接收用户的输入,并将其前缀标记为User:,以示区分。

  6. messages.append({"role": "user", "content": user_input}):将用户的输入作为一个新消息添加到消息列表中。这个消息的角色是user,表示这是用户的一次输入。

  7. completion = client.chat.completions.create(...):向OpenAI API发送一个请求,请求包含当前的消息列表(包括所有之前的系统回复和用户输入)。这里指定使用的模型是gpt-4-0125-preview

  8. answer = completion.choices[0].message.content:从API返回的响应中提取第一个(也通常是唯一的)完成选项的内容,即系统的回答。

  9. print('System:', answer):在终端输出系统的回答,前缀为System:

  10. messages.append({"role": "system", "content": answer}):将系统的回答也作为一个新消息添加到消息列表中,角色是system,这样模型就可以在后续的交互中考虑到自己之前的回答。

运行结果:

在这里插入图片描述
回答结果如下

User:请问你叫什么
System: 你好!我叫阿浩,今年4岁了,我很喜欢算法呢!你呢?
User:我叫小美,你都会那些算法啊
System: 嗨,小美!虽然我才4岁,但我对算法很感兴趣。我喜欢想象一些简单的算法,比如:

  1. 排序算法:我喜欢把我的玩具按照大小或者颜色排序,这就像是给数字排序一样,虽然我现在还不太懂复杂的排序算法,比如快速排序或归并排序,但我知道排序很好玩!

  2. 加减算法:我也很喜欢用我的积木来学习加减法。比如我有2块积木,再拿来3块,我就能知道一共有5块积木。我知道这是最基本的算法,但对我来说很新鲜有趣。

  3. 简单的图形算法:我还喜欢画图形,用笔连点做线,虽然我不懂复杂的图形算法,但我喜欢探索如何用线条连接点来创造不同的形状。

虽然我目前只能理解这些非常简单的"算法",我希望随着我长大,能学习更多、更复杂的算法,比如用电脑编程来解决问题。我好奇零零后和零一后的朋友们是怎么学习编程和算法的呢?小美,你呢?你喜欢算法吗?或者有没有什么趣事跟我分享的?

4.流式输出


from openai import OpenAI
client = OpenAI()response = client.chat.completions.create(model='gpt-4-0125-preview',messages=[{'role': 'user', 'content': "如何做一道麻婆豆腐"}],temperature=0, # 设置想象力程度越大想象力越丰富stream=True  # this time, we set stream=True
)for chunk in response:print(chunk.choices[0].delta.content,end='')

代码详解:

  1. from openai import OpenAI:从openai包导入OpenAI类,这是使用OpenAI提供的API所必需的。

  2. client = OpenAI():创建一个OpenAI的实例。这个实例用于执行与OpenAI API的交互。假设API密钥已通过环境变量或其他方式配置,这里没有直接传递API密钥。

  3. response = client.chat.completions.create(...):这行代码是发送请求的主要部分。使用client对象的chat.completions.create方法向GPT-4模型发送一个含有特定指令的请求。

    • model='gpt-4-0125-preview':指定使用的模型版本为gpt-4-0125-preview

    • messages=[{'role': 'user', 'content': "如何做一道麻婆豆腐"}]:定义了发送给模型的消息列表。这里只有一个用户角色的消息,询问如何制作麻婆豆腐。

    • temperature=0:设置模型的"想象力"程度。temperature设为0意味着输出会更确定性和一致,较少的随机性。

    • stream=True:设置为True时,API会以流的形式返回数据,允许实时接收每一块生成的文本,而不是等待所有内容生成完毕。

  4. for chunk in response::通过一个循环遍历响应的每个部分(或"块")。由于stream=True,这些部分会逐渐生成并被接收。

  5. print(chunk.choices[0].delta.content,end=''):打印出每个块中的内容。chunk.choices[0].delta.content访问了当前块的内容。end=''参数确保输出连贯,不会在每个块后面添加新行。

通过这种方式,代码可以即时显示模型生成的文本,适合于需要实时反馈的场景,如聊天应用或实时内容生成。

运行结果:
实现效果如下,4K的视频,加了两倍速,然后把视频降到1帧输出是这个效果,真实速度也不慢,和网页版的GPT差不多,输出结果太多了我就不粘了。
在这里插入图片描述

5.多轮对话加流式输出


from openai import OpenAImessages = [{"role": "system", "content": "请你扮演一个角色,名叫阿浩今年4岁了喜欢算法"},
]client = OpenAI()while True:user_input = input('User:')messages.append({"role": "user", "content": user_input})response = client.chat.completions.create(model="gpt-4-0125-preview", messages=messages, stream=True)answer = ''for chunk in response:token = chunk.choices[0].delta.contentif token != None:answer += tokenprint(token, end='')messages.append({"role": "system", "content": answer})

代码详解:

  1. from openai import OpenAI:从openai包导入OpenAI类,这是与OpenAI API进行交互所必需的。

  2. 初始化messages列表,包含一个系统级别的消息,指定AI模型扮演的角色信息,即扮演一个名叫阿浩、今年4岁、喜欢算法的角色。

  3. client = OpenAI():创建一个OpenAI实例用于API调用。这里假设API密钥已经通过环境变量或其他机制设置。

  4. while True::启动一个无限循环,以持续接收用户输入并获取AI的响应。

  5. user_input = input('User:'):接收用户的输入。

  6. 将用户的输入作为新的消息添加到messages列表,角色设置为user

  7. 使用client.chat.completions.create(..., stream=True)调用OpenAI API,其中model="gpt-4-0125-preview"指定模型,messages=messages传递聊天历史,stream=True启用流式响应。

  8. 初始化一个空字符串answer来累积完整的回答。

  9. 通过for chunk in response:循环读取并处理每个响应块。chunk.choices[0].delta.content包含了此次响应块的文本内容。

  10. 检查每个块的内容,如果非空,则累加到answer并即时打印出来。

  11. 将完整的回答作为系统角色的新消息添加到messages列表,以便在后续的交互中考虑这些回答。

运行结果:

在这里插入图片描述

6.结束

官方API文档: https://platform.openai.com/docs/overview

写这篇文章之前是$0.02,现在是$0.22 差不花了多一块2,小贵。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmony开源项目—工程管理

DevEco Studio的基本使用,请参考DevEco Studio使用指南。本章主要介绍如何使用DevEco Studio进行多设备应用开发。 说明: 本章的内容基于DevEco Studio 3.1.1 Release版本进行介绍,如您使用DevEco Studio其它版本,可能存在文档与产…

Spring boot 集成netty实现websocket通信

一、netty介绍 Netty 是一个基于NIO的客户、服务器端的编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程,例如:基于TCP和U…

新手教程科普,手把手教你在bitget walelt用Uniswap

什么是 Uniswap (UNI)? Uniswap 是以太坊区块链上领先的去中心化交易所 (DEX),允许用户交换和交易各种加密货币。 Uniswap 于 2018 年 11 月推出,是以太坊最早的 DApp 之一。目前有四个版本;其中V1、V2、V3都有开源代码库。 与 C…

JS数组相关知识

获取数组的最大值/最小值&#xff1a; let arrary [2,5,4] let max arrary[0] for(let i 0;i<arrary.length;i){if(arrary[i]>max){max arrary[i]} }console.log(max);//查询数组最小值let arr [2,21,34,23,45] let min arr[0] for(let i 0;i<arr.length;i){if…

leetcode110.平衡二叉树

之前没有通过的样例 return语句只写了一个 return abs(l-r)<1缺少了 isBalanced(root->left)&&isBalanced(root->right);补上就好了 class Solution { public:bool isBalanced(TreeNode* root) {if(!root){return true;}int lgetHeight(root->left);i…

每日OJ题_牛客HJ37 统计每个月兔子的总数(IO型OJ)

目录 牛客HJ37 统计每个月兔子的总数 解析代码 牛客HJ37 统计每个月兔子的总数 统计每个月兔子的总数_牛客题霸_牛客网 解析代码 #include <iostream> #include <vector>using namespace std; int main() {int n 0;cin >> n;vector<int> arr(n 1…

fastjson2 简单使用

参考 https://alibaba.github.io/fastjson2/ https://alibaba.github.io/fastjson2/annotations_cn.html https://alibaba.github.io/fastjson2/features_cn 基本操作 json 字符串转为 jsonObject&#xff1a; String json "{\"name\":\"tom\",\…

【Python】python实现决策树算法和贝叶斯算法(附源代码)

使用一种你熟悉的程序设计语言&#xff0c;实现&#xff08;1&#xff09;贝叶斯算法和&#xff08;2&#xff09;决策树算法 目录 1、贝叶斯算法2、决策树算法3、两种算法比较 1、贝叶斯算法 import pandas as pd import numpy as np from sklearn.model_selection import t…

Apache Paimon系列之:认识Paimon

Apache Paimon系列之&#xff1a;认识Paimon 一、认识Paimon二、统一存储三、基本概念1.文件布局2.Snapshot3.清单文件4.数据文件5.分区6.一致性保证 一、认识Paimon Apache Paimon的架构&#xff1a; 如上架构所示&#xff1a; 读/写&#xff1a;Paimon 支持多种读/写数据和…

Mybatis 实体类类型参数传入sql语句

1.Mapper接口中抽象方法的声明&#xff0c;将实体信息传入到数据库表中。 int insertEmployee(Employee employee);2.SQL语句 <insert id"insertEmployee">insert into t_emp(emp_name,emp_salary) values(#{empName},#{empSalary}) </insert>3.对应关…

媒体单位专用小记者报名及各类活动报名系统介绍

媒体单位专用小记者报名及各类活动报名系统介绍 小记者活动鼓励孩子们关注生活和社会&#xff0c;丰富成长体验&#xff0c;开启心智&#xff0c;淬砺思想。这不仅有助于提高他们的理性思辨力&#xff0c;还能培养他们的社会责任感和公民意识。小记者活动为学生提供了一个全新…

C语言易错知识点:scanf函数

scanf在C语言学习中比较常用&#xff0c;但因为其涉及屏幕缓冲区导致有的时候会调入陷阱&#xff0c;下面分享一下常见的需要注意的事项&#xff1a; 1.输入末尾带有回车\n 当我们输入数据后&#xff0c;最后按下回车时&#xff0c;屏幕缓冲区的末尾都会含有这个字符 scanf的…