令牌计数 - 迁移指南#
现有的令牌计数实现已被弃用。
我们深知令牌计数对许多用户至关重要,因此本指南旨在帮助您完成(希望是无痛的)过渡。
此前,令牌计数直接记录在 llm_predictor 和 embed_model 对象上,并可选择性地打印到控制台。该实现使用静态分词器(gpt-2)进行计数,且 last_token_usage 和 total_token_usage 属性并不总能被正确追踪。
未来,令牌计数功能已迁移至回调机制。通过使用 TokenCountingHandler 回调,您现在可以更灵活地控制计数方式、计数生命周期,甚至能为不同索引创建独立的令牌计数器。
以下是使用 OpenAI 模型配合新版 TokenCountingHandler 的最小示例:
import tiktoken
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.core.callbacks import CallbackManager, TokenCountingHandler
from llama_index.core import Settings
# 可直接设置分词器,或选择沿用此前令牌计数使用的默认分词器
# 注意:分词器应为接收文本并返回令牌列表的函数
token_counter = TokenCountingHandler(
tokenizer=tiktoken.encoding_for_model("gpt-3.5-turbo").encode,
verbose=False, # 设为true可在控制台查看使用情况
)
Settings.callback_manager = CallbackManager([token_counter])
document = SimpleDirectoryReader("./data").load_data()
# 若启用verbose,将打印嵌入令牌用量
index = VectorStoreIndex.from_documents(
documents,
)
# 也可直接访问计数
print(token_counter.total_embedding_token_count)
# 可随时重置计数!
token_counter.reset_counts()
# 除嵌入令牌外,还可追踪提示、补全及LLM总令牌数
response = index.as_query_engine().query("What did the author do growing up?")
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,
)