openai api

发布时间 2023-12-23 16:21:09作者: zxinlog

0. 介绍

chatgpt 是一个人工智能模型,该公司提供了可调用的 api 接口进行使用。

1. openai库

python 下载安装 openai 库,即可使用官方提供的库文件进行api使用。

pip install openai

据目前所了解资料,openai 认证方式是通过密钥进行验证,密钥生成之后就不会显示第二次,所以需要进行及时保存。

以下是官方示例:

from openai import OpenAI

client = OpenAI(
  organization='org-QJDpr7acI5F99Zo3RVHGYzAD',
)

通过OpenAI 创建对象的时候,需要填写密钥进行验证。openai 可使用任何类型语言,只要能够进行http通信,都可以模拟出类似的报文进行发送。

2. chatgpt的api

chatgpt 是通过 网络的http报文进行发送和接收的。官网可使用流的方式进行使用。官方提供了openai的接口。可以创建OpenAI对象进行对话。

client = OpenAI()
client.chat.completions.create(
	model 模型
    messages 发送的消息,如果联系上下文,可以使用一个列表将问题添加进去。
    问题使用字典形式{"role":"user", "content":content}表示用户输入的对话。
    gpt模型的回答形式{"role":"assistant", "content":content},
    其中的role表示角色,content表示内容。
    联系上下文的话,是通过这样一种形式:
    [
		{"role":"user", "content":content},
        {"role":"assistant", "content":content}
    ]
    就能够表示之前和gpt模型之间的问题交互了。
    stream = True 如果使用流模式进行交互的话,则需要开启 stream这个功能,之后,就可以流动式获取gpt模型的回答。另外,可以设置max_token对token进行限制。防止消耗token过多。
)

response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=conversation_history,
    max_tokens=50,  # 控制生成的文本长度
    temperature=0.7,  # 控制生成文本的多样性
    stop=["\n", "Why"],  # 设置停止条件,当生成文本中包含指定的条件时停止
    frequency_penalty=0.2,  # 用于调整特定单词的频率
    presence_penalty=0.0,   # 用于调整特定单词的频率
    best_of=1,  # 选择最佳回复的数量
    stream=False  # 设置为 True 以启用生成器方式逐步获取生成的文本
)
model_reply = response.choices[0].message["content"] # 获取回复

# 如果使用流模式:

for chunk in stream:
                if chunk.choices[0].delta.content is not None:
                    print(chunk.choices[0].delta.content, end="")
def test03():
    try:
        client = OpenAI(api_key="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")
        conversation_history = []
        max_history_length = 3
        # 用户输入新的问题

        while True:
            user_input = input("用户: ")
            # 将用户输入添加到对话历史
            conversation_history.append({"role": "user", "content": user_input})

            stream = client.chat.completions.create(
                model="gpt-3.5-turbo",
                messages=conversation_history,
                stream=True,
                # max_tokens=50
            )
            model_reply = ''
            for chunk in stream:
                if chunk.choices[0].delta.content is not None:
                    model_reply += chunk.choices[0].delta.content
                    print(chunk.choices[0].delta.content, end="")
            time.sleep(20)
            conversation_history.append({"role": "assistant", "content": model_reply})

            if "exit" in user_input:
                print("问答结束.")
                break
    except:
        for conversation in conversation_history:
            print(conversation)

至此,可以完成对 chatgpt 的 api 的调用,并能够完成连续对话,且记忆上下文,但值得注意的是,上下文是通过每次对话发送请求的时候,将全部所需上下文的token都进行发送,询问问题并回答是消耗大量token的。