首页 > 编程语言 >用 Python 实现ChatGPT OpenAI(直接上源码)

用 Python 实现ChatGPT OpenAI(直接上源码)

时间:2024-01-31 17:58:01浏览次数:38  
标签:num Python messages tokens 源码 OpenAI key openai role

网上一大堆教程,好多讲的很墨迹,你需要折腾半天才能调试通,up 这里给大家直接上源码干货。
详细教程后面补充,着急使用的可以直接拿走调试

说明

  1. 到 openai 里面替换你自己的app_key
    • https://platform.openai.com/ 登录账号
    • 登录之后,点击右上角“Personal”,展开菜单,找到“View API keys”
      chat_gpt_key = '你的api_key'
      在这里插入图片描述
  • 然后创建一个 key在这里插入图片描述
  1. 我目前使用的是免费版的最新模型 MODEL = "gpt-3.5-turbo-0301",不建议使用老模型,因为 gpt4 都出了,其余那些模型即将淘汰
  2. gpt4 模型后续补充,可以关注一下,第一时间拿到代码
  3. 网络

源码

直接放入你的 python 工程,引入包,然后运行即可

# 引入 openai 依赖
pip install openai
# 引入 token 计数依赖,如果不想计数,也可以不引用,注释掉num_tokens_from_messages()的代码即可
pip install tiktoken
 
  • 1
  • 2
  • 3
  • 4
import openai
import tiktoken

# 你的 api_key
chat_gpt_key = '你的api_key'
# 将 Key 传入 openai
openai.api_key = chat_gpt_key
# 模型
MODEL = "gpt-3.5-turbo-0301"

ROLE_USER = "user"
ROLE_SYSTEM = "system"
ROLE_ASSISTANT = "assistant"
"""
聊天信息(要记录历史信息,因为 AI 需要根据角色【user、system、assistant】上下文理解并做出合理反馈)
对话内容示例
messages = [
    {"role": "system", "content": "你是一个翻译家"},
    {"role": "user", "content": "将我发你的英文句子翻译成中文,你不需要理解内容的含义作出回答。"},
    {"role": "assistant", "content": "Draft an email or other piece of writing."}
]
"""
messages = []


# 调用 chatgpt 接口
def completion(prompt):
    """
        API:https://api.openai.com/v1/chat/completions
        官方文档:https://platform.openai.com/docs/api-reference/chat
        :param prompt: 入参文本框
        :return: 助手回答结果
    """
    response = openai.ChatCompletion.create(
        # 模型,如 gpt-3.5-turbo
        model=MODEL,
        messages=prompt
    )
    message = response.choices[0].message.content
    # print(response.choices)
    dealMsg(ROLE_ASSISTANT, message, '2')
    return message


"""
    计算文本字符串中有多少个 token. 
    非常长的对话更有可能收到不完整的回复。
    例如,一个长度为 4090 个 token 的 gpt-3.5-turbo 对话将在只回复了 6 个 token 后被截断。
"""
def num_tokens_from_messages(infoMsg, model):
    """Returns the number of tokens used by a list of messages."""
    try:
        encoding = tiktoken.encoding_for_model(model)
    except KeyError:
        encoding = tiktoken.get_encoding("cl100k_base")
    if model.startswith("gpt-3.5-turbo"):  # 注意: 未来的模型可能会偏离这个规则
        num_tokens = 0
        for message in infoMsg:
            num_tokens += 4
            for key, value in message.items():
                num_tokens += len(encoding.encode(value))
                if key == "name":  # 如果有名字,角色将被省略
                    num_tokens += -1  # Role总是必需的,并且总是1个令牌
        num_tokens += 2  # 每个回复都用assistant启动
        return num_tokens
    else:
        raise NotImplementedError(f"""num_tokens_from_messages() is not presently implemented for model {model}.
See https://github.com/openai/openai-python/blob/main/chatml.md for information on how messages are converted to tokens.""")


"""
:param role: 角色【system,user,assistant】
:param msg: 聊天信息
:param type: 统计 token 环节【1-用户信息,2-助手信息】
"""
totalCount = 0
def dealMsg(role, msg, types):
    global totalCount
    if len(messages) == 0:
        if msg == "":
            # system 默认角色
            msg = "你是一个聊天助手与我聊天,回答我,你是什么角色?"
        else:
            msg = "假设你是" + msg
    messages.append({"role": role, "content": msg})
    # message = [{"role": role, "content": msg}]
    # message = [{"role": ROLE_SYSTEM, "content": "你是一个陪我聊天的助手"}]
    # 转换输入的信息为数组格式并打印 token 数
    if types == "1":
        typeMsg = "input"
    else:
        typeMsg = "output"

    # 计费:计算耗费的 token 数
    count = num_tokens_from_messages(messages, MODEL)
    totalCount += count
    print(f"{count}{typeMsg} prompt tokens counted. all tokens cost {totalCount}")
    # 历史消息
    # messageHisList.insert(0, messages)
    return messages


# 运行业务代码
print("[AI|:]" + completion(dealMsg(ROLE_SYSTEM, input("请先设定 AI 的角色(如:一名音乐家)|: "), '1')))
print("[AI|:]" + completion(dealMsg(ROLE_USER, input("[You|:]"), "1")))
goOn = True
while goOn:
    inputText = input("[You|:]")
    if inputText.replace('\n', '').replace('\r', '') == "stop":
        goOn = False
        print("完整对话记录如下:" + str(messages))
        break
    else:
        print(f"[AI|:]{completion(dealMsg(ROLE_USER, inputText, '1'))}")
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
   

标签:num,Python,messages,tokens,源码,OpenAI,key,openai,role
From: https://www.cnblogs.com/oopo/p/17999796

相关文章

  • ChatGPT API调用python和脚本实现
    ChatGPT由于其独特、近乎准确且类似人类的响应,如今在互联网上引起了过多的讨论。本文讨论如何通过Python代码连接到ChatGPTAPI。 第1步:获取OpenAIAPI的API密钥要获取OpenAIAPI的API密钥,您需要在OpenAI网站上注册一个OpenAI帐户。拥有帐户后,您可以按......
  • 基于Python开发ChatGPT应用
    ChatGPT是目前非常热门的一种人工智能模型,它是基于深度学习技术的一种针对自然语言处理的算法。ChatGPT的应用非常广泛,可以应用于聊天机器人、文本生成、翻译、自动化等多个领域。本文将介绍如何使用Python开发一个基于ChatGPT模型的聊天机器人应用。 1.ChatGPT简介......
  • 记录: OpenAI中转代理API接口服务的使用
    由于OpenAI提供服务的地区列表里没有China,因此想要方便使用OpenAIAPI的话就需要用到中转服务。本文介绍的iDataRiver平台便提供这样的API,且比官方OpenAI还要便宜,其文档地址入口为https://docs.idatariver.com/zh支持模型如何统计消费的token量token是大语言模型处理信息......
  • Corretto-11源码-Java命令入口
    背景由于工作中需要开发编译器,开始阅读JavaC和JDK源码了解相关过程,并做出相关整理参考本文参考ChatGPT相关解释(很多内容都是杜撰,不可信),进行自我理解后整理发出项目https://github.com/corretto/corretto-11入口(src/java.base/share/native/libjli/java.c)入口文件为java.c......
  • python网络编程笔记(一)Socket 编程入门
    一:Socket简介套接字起源于20世纪70年代加利福尼亚大学伯克利分校版本的Unix,即人们所说的BSDUnix。因此,有时人们也把套接字称为“伯克利套接字"或"BSD套接字”。一开始,套接字被设计用在同-台主机上多个应用程序之间的通讯BSDSocket接口是TCP/IP网络的API在Linux,Unix和W......
  • python网络编程(二)模拟ssh远程执行命令
    1、项目需求:要实现一个像ssh远程连接工具一样,在终端输入命令,返回对应的结果。比如window的dos命令:dir:查看目录下的文件ipconfig:查看网卡信息tasklist:查看进程列表linux的命令:ls:查看目录下的文件ifconfig:查看网卡信息ps-aux:查看进程列表2、项目分析:这......
  • python网络编程(三)实现文件下载功能
    一:目标:要实现一个客户端从服务端下载文件的功能,这个在模拟ssh远程执行命令的基础上再做修改就可以了二:分析:1、要规定客户端获取文件的格式:下载文件用get文件名,比如要下载服务端的a.txt,就写成geta.txt2、因为我目前是客户端和服务端都是在一台服务器上,我模拟的时候就把......
  • python网络编程(四)用面向对象方式实现文件上传下载
    一:背景在之前已经实现了文件的下载,现在再来完善上传功能,并且使用面向对象来封装,让代码看起来更加清楚明了。二:使用规则和运行结果下载文件,下载格式get文件名get空格后面直接接文件名称,在服务端存放的文件名上传文件,上传格式put文件路径+文件名因为是上传,上传的时......
  • 基于springboot开发的工作流系统,bpmn.js,vue源码及功能分析(activiti)
    前言activiti工作流引擎项目,企业erp、oa、hr、crm等企事业办公系统轻松落地,一套完整并且实际运用在多套项目中的案例,满足日常业务流程审批需求。一、项目形式springboot+vue+activiti集成了activiti在线编辑器,流行的前后端分离部署开发模式,快速开发平台,可插拔工作流服务。工作......
  • Semaphore源码阅读
    目录简介代码分析成员变量方法SyncNonFairSyncFairSync本人的源码阅读主要聚焦于类的使用场景,一般只在java层面进行分析,没有深入到一些native方法的实现。并且由于知识储备不完整,很可能出现疏漏甚至是谬误,欢迎指出共同学习本文基于corretto-17.0.9源码,参考本文时请打开相应的源......