计算聊天 API 调用的令牌

GPT-3.5-turbo-0301

消息转换为令牌的确切方式可能因模型而异。因此,当未来的模型版本发布时,该函数返回的答案可能只是近似的。 ChatML 文档解释了 OpenAI API 如何将消息转换为令牌,并且对于编写您自己的函数可能很有用。

def num_tokens_from_messages(消息,模型=“gpt-3.5-turbo-0301”):
"""返回消息列表使用的令牌数。"""
尝试:
编码 = tiktoken.encoding_for_model(模型)
除了关键错误:
编码 = tiktoken.get_encoding("cl100k_base")
if model == "gpt-3.5-turbo-0301": # 注意:未来的模型可能会与此有所不同
代币数量 = 0
对于消息中的消息:
num_tokens += 4 # 每条消息都遵循{角色/名称}\n{内容}\n
对于 message.items() 中的键、值:
num_tokens += len(encoding.encode(value))
if key == "name": # 如果有名字,则省略角色
num_tokens += -1 # 角色始终是必需的并且始终是 1 个令牌
num_tokens += 2 # 每个回复都以 assistant 开头
返回 num_tokens
别的:
raise NotImplementedError(f"""num_tokens_from_messages() 目前尚未针对模型 {model} 实现。
有关如何将消息转换为令牌的信息,请参阅 https://github.com/openai/openai-python/blob/main/chatml.md。""")

接下来,创建一条消息并将其传递给上面定义的函数以查看令牌计数,这应该与 API 使用参数返回的值匹配:

消息 = [
{"role": "system", "content": "你是一位乐于助人、遵循模式的助手,可以将公司术语翻译成简单的英语。"},
{"role": "system", "name":"example_user", "content": "新的协同效应将有助于推动营收增长。"},
{"role": "system", "name": "example_assistant", "content": "协同工作会增加收入。"},
{"role": "system", "name":"example_user", "content": "当我们有更多的带宽来接触提高杠杆率的机会时,让我们回过头来。"},
{"role": "system", "name": "example_assistant", "content": "等我们不那么忙的时候再讨论如何做得更好。"},
{"role": "user", "content": "这个迟到的转变意味着我们没有时间为客户交付成果而沸腾。"},
]

型号 =“gpt-3.5-turbo-0301”

print(f"{num_tokens_from_messages(messages, model)} 提示标记已计数。")
# 应显示 ~126 个total_tokens

要确认上面函数生成的数字与 API 返回的数字相同,请创建一个新的聊天完成:

# 来自 OpenAI API 的令牌计数示例
导入openai


响应 = openai.ChatCompletion.create(
型号=型号,
消息=消息,
温度=0,


print(f'{response["usage"]["prompt_tokens"]} 使用提示令牌。')