ChatGPT API 使用😎
既然要做大模型尽管可能国内无法使用GPT进行商用,除了性能地表最强之外,其优秀的Function calling(函数调用)在线微调还有各种,例如可以便捷处理知识向量库等功能,都是非常值得学习的,而且国内的模型的各种术语调用方式一定都是对GPT模式的仿照和借鉴既然如此那么学习和使用一遍GPT的各种功能对于后续使用国产大模型开发应该非常有帮助,因此有了这篇文章,这篇文章是个开头,之后我打算把GPT的功能尽量都实现一下,饼先画着,给中国的大模型发展做点贡献,写这篇文章之前我简单搜了搜,结果又搜到了一大堆半残的文章,唉。
更新:使用 OpenAI 的 text-embedding 构建知识向量库并进行相似搜索
首先Announce我的API-Key是我在美国的街头碰见一个小姐姐送给我的(dddd),对于什么魔法什么的我这个一等良民实在是一无所知,审核大大明鉴🙇♂️。
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)
# 你好!有什么可以帮到你的吗?
代码详解:
from openai import OpenAI
:这一行导入了OpenAI库,允许你使用OpenAI API的功能。# client = OpenAI(api_key="your-api-key-here")
:这一行是注释掉的,意味着它不会被执行。它展示了如何创建一个OpenAI对象并直接在代码中设置API密钥。如果你取消注释并替换"your-api-key-here"
为你的实际API密钥,就可以使用这行代码代替全局变量方式设置API密钥。client = OpenAI()
:这行代码创建了一个OpenAI对象实例,名为client。这假设你已经通过环境变量或其他方法设置了你的API密钥。- 接下来的几行是调用client对象的
chat.completions.create
方法,这个方法用于生成文本。这个调用包含几个参数:- model=“gpt-4-0125-preview”:指定使用的模型是GPT-4的一个预览版。
- messages=[…]:这是一个列表,包含了两个字典。每个字典代表一条消息。
- 第一个字典
{"role": "system", "content": "你是一个机器人"}
:这代表一个系统级的消息,内容是“你是一个机器人”。这可以用于提供给模型一些上下文或指令。 - 第二个字典
{"role": "user", "content": "你好"}
:这代表一个用户级的消息,内容是“你好”。这模拟了用户向系统发出的一条消息。 print(completion.choices[0].message.content)
:最后,这行代码打印出模型响应的内容。completion
是chat.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-preview | GPT-4 Turbo模型,具有改进的指令跟随、JSON模式、可重复输出、并行函数调用等特点。最大输出为4,096个token。这是一个预览版模型。了解更多。 | 128,000个token | 截至2023年4月 |
gpt-4-vision-preview | GPT-4具备理解图像的能力,除了所有其他GPT-4 Turbo的功能。当前指向gpt-4-1106-vision-preview。 | 128,000个token | 截至2023年4月 |
gpt-4-1106-vision-preview | GPT-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-1106 | GPT-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 OpenAI
messages = [
{"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.content
print('System:', answer)
messages.append({"role": "system", "content": answer})
代码详解:
-
from openai import OpenAI
:这行代码从openai
包中导入OpenAI
类,这是使用OpenAI提供的API所必需的。 -
messages = [...]
:初始化一个包含单个消息的列表。这个消息是一个字典,角色(role
)设置为system
,内容(content
)描述了聊天的上下文或角色设定,即让模型扮演一个名叫阿浩、4岁、喜欢算法的角色。 -
client = OpenAI()
:创建一个OpenAI
的实例。这个实例用于执行与OpenAI API的交互。假设API密钥已通过环境变量或其他方式配置,这里没有直接传递API密钥。 -
while True:
:启动一个无限循环,这允许用户持续与系统交互,直到手动停止。 -
user_input = input('User:')
:通过标准输入接收用户的输入,并将其前缀标记为User:
,以示区分。 -
messages.append({"role": "user", "content": user_input})
:将用户的输入作为一个新消息添加到消息列表中。这个消息的角色是user
,表示这是用户的一次输入。 -
completion = client.chat.completions.create(...)
:向OpenAI API发送一个请求,请求包含当前的消息列表(包括所有之前的系统回复和用户输入)。这里指定使用的模型是gpt-4-0125-preview
。 -
answer = completion.choices[0].message.content
:从API返回的响应中提取第一个(也通常是唯一的)完成选项的内容,即系统的回答。 -
print('System:', answer)
:在终端输出系统的回答,前缀为System:
。 -
messages.append({"role": "system", "content": answer})
:将系统的回答也作为一个新消息添加到消息列表中,角色是system
,这样模型就可以在后续的交互中考虑到自己之前的回答。
运行结果:
回答结果如下
User:请问你叫什么
System: 你好!我叫阿浩,今年4岁了,我很喜欢算法呢!你呢?
User:我叫小美,你都会那些算法啊
System: 嗨,小美!虽然我才4岁,但我对算法很感兴趣。我喜欢想象一些简单的算法,比如:
-
排序算法:我喜欢把我的玩具按照大小或者颜色排序,这就像是给数字排序一样,虽然我现在还不太懂复杂的排序算法,比如快速排序或归并排序,但我知道排序很好玩!
-
加减算法:我也很喜欢用我的积木来学习加减法。比如我有2块积木,再拿来3块,我就能知道一共有5块积木。我知道这是最基本的算法,但对我来说很新鲜有趣。
-
简单的图形算法:我还喜欢画图形,用笔连点做线,虽然我不懂复杂的图形算法,但我喜欢探索如何用线条连接点来创造不同的形状。
虽然我目前只能理解这些非常简单的"算法",我希望随着我长大,能学习更多、更复杂的算法,比如用电脑编程来解决问题。我好奇零零后和零一后的朋友们是怎么学习编程和算法的呢?小美,你呢?你喜欢算法吗?或者有没有什么趣事跟我分享的?
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='')
代码详解:
-
from openai import OpenAI
:从openai
包导入OpenAI
类,这是使用OpenAI提供的API所必需的。 -
client = OpenAI()
:创建一个OpenAI
的实例。这个实例用于执行与OpenAI API的交互。假设API密钥已通过环境变量或其他方式配置,这里没有直接传递API密钥。 -
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会以流的形式返回数据,允许实时接收每一块生成的文本,而不是等待所有内容生成完毕。
-
-
for chunk in response:
:通过一个循环遍历响应的每个部分(或"块")。由于stream=True
,这些部分会逐渐生成并被接收。 -
print(chunk.choices[0].delta.content,end='')
:打印出每个块中的内容。chunk.choices[0].delta.content
访问了当前块的内容。end=''
参数确保输出连贯,不会在每个块后面添加新行。
通过这种方式,代码可以即时显示模型生成的文本,适合于需要实时反馈的场景,如聊天应用或实时内容生成。
运行结果:
实现效果如下,4K的视频,加了两倍速,然后把视频降到1帧输出是这个效果,真实速度也不慢,和网页版的GPT差不多,输出结果太多了我就不粘了。
5.多轮对话加流式输出
from openai import OpenAI
messages = [
{"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.content
if token != None:
answer += token
print(token, end='')
messages.append({"role": "assistant", "content": answer})
print()
代码详解:
-
from openai import OpenAI
:从openai
包导入OpenAI
类,这是与OpenAI API进行交互所必需的。 -
初始化
messages
列表,包含一个系统级别的消息,指定AI模型扮演的角色信息,即扮演一个名叫阿浩、今年4岁、喜欢算法的角色。 -
client = OpenAI()
:创建一个OpenAI
实例用于API调用。这里假设API密钥已经通过环境变量或其他机制设置。 -
while True:
:启动一个无限循环,以持续接收用户输入并获取AI的响应。 -
user_input = input('User:')
:接收用户的输入。 -
将用户的输入作为新的消息添加到
messages
列表,角色设置为user
。 -
使用
client.chat.completions.create(..., stream=True)
调用OpenAI API,其中model="gpt-4-0125-preview"
指定模型,messages=messages
传递聊天历史,stream=True
启用流式响应。 -
初始化一个空字符串
answer
来累积完整的回答。 -
通过
for chunk in response:
循环读取并处理每个响应块。chunk.choices[0].delta.content
包含了此次响应块的文本内容。 -
检查每个块的内容,如果非空,则累加到
answer
并即时打印出来。 -
将完整的回答作为助手角色的新消息添加到
messages
列表,以便在后续的交互中考虑这些回答。
运行结果:
6.结束
官方API文档: https://platform.openai.com/docs/overview
写这篇文章之前是$0.02,现在是$0.22 差不花了多一块2,小贵。