Skip to content

令牌计数 - 迁移指南#

现有的令牌计数实现已被弃用

我们深知令牌计数对许多用户至关重要,因此本指南旨在帮助您完成(希望是无痛的)过渡。

此前,令牌计数直接记录在 llm_predictorembed_model 对象上,并可选择性地打印到控制台。该实现使用静态分词器(gpt-2)进行计数,且 last_token_usagetotal_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,
)