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

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)
# 你好!有什么可以帮到你的吗?

代码详解:

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

代码详解:

  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 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()
    

代码详解:

  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,小贵。
在这里插入图片描述

调用OpenAI接口实现多轮对话,您需要遵循以下步骤: 1. 注册OpenAI账户并获取API密钥。 2. 使用适当的编程语言(如Python)编写代码,以调用OpenAI API并处理响应。 3. 设计一个对话流程,以便处理多轮对话。这可能包括跟踪上下文,确定下一步应该做什么,以及生成响应。 4. 在每个轮次中,向OpenAI API发送用户输入,并解析返回的响应。 5. 使用生成的响应来回答用户,并在必要时跟踪上下文。 6. 在对话完成后,关闭API连接并保存任何需要保存的数据。 以下是一个使用Python实现多轮对话的示例代码: ```python import openai import time # 设置API密钥 openai.api_key = "YOUR_API_KEY" # 设计对话流程 def get_response(prompt, model, temperature=0.5): response = openai.Completion.create( engine=model, prompt=prompt, temperature=temperature, max_tokens=1024, n=1, stop=None, timeout=60, ) return response.choices[0].text.strip() # 处理对话 def run_dialogue(model): context = "" while True: user_input = input("You: ") if user_input.lower() == "exit": break prompt = f"{context}User: {user_input}\nAI:" response = get_response(prompt, model) print("AI: " + response) context += f"User: {user_input}\nAI: {response}\n" # 主函数 def main(): # 选择模型 model = "davinci" print(f"Using {model} model") # 运行对话 run_dialogue(model) if __name__ == "__main__": main() ``` 该代码使用OpenAI API来生成对话响应。它使用一个简单的上下文变量来跟踪对话历史记录,并要求用户输入来开始每个新轮次。您可以根据需要修改该代码以适应您的需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浩浩的科研笔记

这我为您答疑发送资源的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值