在人工智能领域,特别是在自然语言处理(NLP)任务中,理解和跟踪Token的使用情况是非常重要的。这篇文章将介绍如何使用LlamaIndex库来进行Token计数,并提供一些实用的代码示例,以便你在自己的项目中应用这些技术。
首先,我们需要设置回调和服务上下文。通过全局设置,我们可以在不需要每次查询时都传递这些设置的情况下使用它们。
import os
os.environ["OPENAI_API_KEY"] = "sk-..." # 请替换为您的实际API密钥
import tiktoken
from llama_index.core.callbacks import CallbackManager, TokenCountingHandler
from llama_index.llms.openai import OpenAI
from llama_index.core import Settings
token_counter = TokenCountingHandler(
tokenizer=tiktoken.encoding_for_model("gpt-3.5-turbo").encode
)
Settings.llm = OpenAI(model="gpt-3.5-turbo", temperature=0.2)
Settings.callback_manager = CallbackManager([token_counter])
Token计数器将跟踪嵌入、提示和完成的Token使用情况。Token计数是累积的,只有在你选择重置它们时才会重置。
token_counter.reset_counts()
现在,设置已经完成,让我们跟踪嵌入Token的使用情况。
!mkdir -p 'data/paul_graham/'
!wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/paul_graham/paul_graham_essay.txt' -O 'data/paul_graham/paul_graham_essay.txt'
from llama_index.core import SimpleDirectoryReader
documents = SimpleDirectoryReader("./data/paul_graham").load_data()
from llama_index.core import VectorStoreIndex
index = VectorStoreIndex.from_documents(documents)
print(token_counter.total_embedding_token_count) # 输出总嵌入Token计数
接下来,让我们测试一个查询并查看计数结果。
query_engine = index.as_query_engine(similarity_top_k=4)
response = query_engine.query("作者在成长过程中做了什么?")
print(
"Embedding Tokens: ",
token_counter.total_embedding_token_count,
"\n",
"LLM Prompt Tokens: ",
token_counter.prompt_llm_token_count,
"\n",
"LLM Completion Tokens: ",
token_counter.completion_llm_token_count,
"\n",
"Total LLM Token Count: ",
token_counter.total_llm_token_count,
"\n",
)
Token计数处理程序还可以在流式处理中处理Token计数。这里,Token计数将在流完成后进行。
token_counter.reset_counts()
query_engine = index.as_query_engine(similarity_top_k=4, streaming=True)
response = query_engine.query("Interleaf发生了什么?")
# 完成流处理
for token in response.response_gen:
continue
print(
"Embedding Tokens: ",
token_counter.total_embedding_token_count,
"\n",
"LLM Prompt Tokens: ",
token_counter.prompt_llm_token_count,
"\n",
"LLM Completion Tokens: ",
token_counter.completion_llm_token_count,
"\n",
"Total LLM Token Count: ",
token_counter.total_llm_token_count,
"\n",
)
Token计数器在一个名为TokenCountingEvent
的对象中跟踪每个Token使用事件。这个对象包含以下属性:
prompt
-> 发送到LLM或嵌入模型的提示字符串prompt_token_count
-> LLM提示的Token计数completion
-> 从LLM收到的字符串完成(不用于嵌入)completion_token_count
-> LLM完成的Token计数(不用于嵌入)total_token_count
-> 事件的总提示+完成Token计数event_id
-> 事件的字符串ID,与其他回调处理程序对齐这些事件在Token计数器中以两个列表进行跟踪:
llm_token_counts
embedding_token_counts
让我们快速查看这些事件的示例。
print("Num LLM token count events: ", len(token_counter.llm_token_counts))
print(
"Num Embedding token count events: ",
len(token_counter.embedding_token_counts),
)
print("prompt: ", token_counter.llm_token_counts[0].prompt[:100], "...\n")
print(
"prompt token count: ",
token_counter.llm_token_counts[0].prompt_token_count,
"\n",
)
print(
"completion: ", token_counter.llm_token_counts[0].completion[:100], "...\n"
)
print(
"completion token count: ",
token_counter.llm_token_counts[0].completion_token_count,
"\n",
)
print("total token count", token_counter.llm_token_counts[0].total_token_count)
如果你觉得这篇文章对你有帮助,请点赞,关注我的博客,谢谢!
参考资料: