根据openAI的文档https://platform.openai.com/docs/guides/chat/chat-vs-completions,您应该从响应中获取令牌使用情况。然而,我目前正在使用流设置进行API调用。响应似乎不包含使用属性?那么在这种情况下,我该如何获取令牌使用情况呢?
你可以使用tiktoken
pip安装tiktoken
import tiktoken
def num_tokens_from_messages(messages, model="gpt-3.5-turbo-0301"):
"""Returns the number of tokens used by a list of messages."""
try:
encoding = tiktoken.encoding_for_model(model)
except KeyError:
print("Warning: model not found. Using cl100k_base encoding.")
encoding = tiktoken.get_encoding("cl100k_base")
if model == "gpt-3.5-turbo":
print("Warning: gpt-3.5-turbo may change over time. Returning num tokens assuming gpt-3.5-turbo-0301.")
return num_tokens_from_messages(messages, model="gpt-3.5-turbo-0301")
elif model == "gpt-4":
print("Warning: gpt-4 may change over time. Returning num tokens assuming gpt-4-0314.")
return num_tokens_from_messages(messages, model="gpt-4-0314")
elif model == "gpt-3.5-turbo-0301":
tokens_per_message = 4 # every message follows <|start|>{role/name}\n{content}<|end|>\n
tokens_per_name = -1 # if there's a name, the role is omitted
elif model == "gpt-4-0314":
tokens_per_message = 3
tokens_per_name = 1
else:
raise NotImplementedError(f"""num_tokens_from_messages() is not implemented for model {model}. See https://github.com/openai/openai-python/blob/main/chatml.md for information on how messages are converted to tokens.""")
num_tokens = 0
if type(messages) == "list":
for message in messages:
num_tokens += tokens_per_message
for key, value in message.items():
num_tokens += len(encoding.encode(value))
if key == "name":
num_tokens += tokens_per_name
num_tokens += 3 # every reply is primed with <|start|>assistant<|message|>
elif type(messages) == "str":
num_tokens += len(encoding.encode(messages))
return num_tokens
import openai
result = []
for chunk in openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Who won the world series in 2020?"},
{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
{"role": "user", "content": "Where was it played?"}
], # this is prompt_tokens ex) prompt_tokens=num_tokens_from_messages(messages)
stream=True
):
content = chunk["choices"][0].get("delta", {}).get("content")
if content:
result.append(content)
# Usage of completion_tokens
completion_tokens = num_tokens_from_messages("".join(result))
如果你使用Lagchain,你也可以使用get_openai_callback()
from langchain.callbacks import get_openai_callback
with get_openai_callback() as cb:
response = qa({"question": prompt, "chat_history": chat_history})
print(f"Prompt Tokens: {cb.prompt_tokens}")
print(f"Completion Tokens: {cb.completion_tokens}")
print(f"Total Cost (USD): ${cb.total_cost}")