网上一大堆教程,好多讲的很墨迹,你需要折腾半天才能调试通,up 这里给大家直接上源码干货。
详细教程后面补充,着急使用的可以直接拿走调试
说明
- 到 openai 里面替换你自己的app_key
- https://platform.openai.com/ 登录账号
- 登录之后,点击右上角“Personal”,展开菜单,找到“View API keys”
chat_gpt_key = '你的api_key'
- 然后创建一个 key
- 我目前使用的是免费版的最新模型
MODEL = "gpt-3.5-turbo-0301"
,不建议使用老模型,因为 gpt4 都出了,其余那些模型即将淘汰 - gpt4 模型后续补充,可以关注一下,第一时间拿到代码
- 网络
源码
直接放入你的 python 工程,引入包,然后运行即可
# 引入 openai 依赖
pip install openai
# 引入 token 计数依赖,如果不想计数,也可以不引用,注释掉num_tokens_from_messages()的代码即可
pip install tiktoken
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-turbomodel=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 = 0for message in infoMsg:num_tokens += 4for 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_tokenselse: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 totalCountif len(messages) == 0:if msg == "":# system 默认角色msg = "你是一个聊天助手与我聊天,回答我,你是什么角色?"else:msg = "假设你是" + msgmessages.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 += countprint(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 = Falseprint("完整对话记录如下:" + str(messages))breakelse:print(f"[AI|:]{completion(dealMsg(ROLE_USER, inputText, '1'))}")