Skip to content

令牌计数 - 迁移指南#

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

我们知道令牌计数对许多用户来说很重要,因此创建了这个指南,以便(希望是无痛的)过渡。

以前,令牌计数是直接在 llm_predictorembed_model 对象上进行跟踪的,并且可以选择将其打印到控制台。这种实现使用了一个静态分词器进行令牌计数(gpt-2),并且 last_token_usagetotal_token_usage 属性并不总是被正确地跟踪。

从现在开始,令牌计数已经移入了一个回调中。使用 TokenCountingHandler 回调,您现在有更多选项来计算令牌的方式,令牌计数的生命周期,甚至为不同的索引创建单独的令牌计数器。

以下是使用新的 TokenCountingHandler 与 OpenAI 模型的最简示例:

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(
    "嵌入令牌:",
    token_counter.total_embedding_token_count,
    "\n",
    "LLM 提示令牌:",
    token_counter.prompt_llm_token_count,
    "\n",
    "LLM 完成令牌:",
    token_counter.completion_llm_token_count,
    "\n",
    "总的 LLM 令牌计数:",
    token_counter.total_llm_token_count,
)