在大模型开发中,Token(词元) 是一个绕不开的核心概念。
无论是 Prompt 限长控制,还是 成本预估,都需要准确统计 Token 数。本文将从 原理 → 算法 → 工具 → 实战 全面介绍如何统计 Token。


一、什么是 Token?为什么要统计 Token?

大语言模型(LLM)并不是按「字」或「词」来理解输入,而是将文本切分成更细的 子词单元 (subword units),即 Token

例如:

  • 句子 ChatGPT is great

    • GPT-4 的分词器可能切成 [ "Chat", "G", "PT", " is", " great" ] → 共 5 个 Token。

为什么要统计 Token?

  1. 上下文长度限制:避免输入超过模型的最大 Token 窗口。
  2. 计费:OpenAI 等厂商按 Token 收费。
  3. 调试优化:统计 Prompt 消耗,找出 Token “大户”。
  4. 文本切分 (Chunking):分块通常基于 Token,而非字符。

二、常见的 Token 算法

不同模型采用不同的分词算法:

算法 常用模型 特点
BPE (Byte Pair Encoding) GPT 系列、LLaMA 系列 基于字节对合并规则,常见于 OpenAI
SentencePiece (Unigram / BPE) T5、mT5、Flan 系列 Google 开发,支持多语言
WordPiece BERT 系列 词表小,子词拆分更细
tiktoken (OpenAI 专用) GPT-2/3/4 系列 官方高效实现,C + Rust 加速

三、如何统计 Token

1. 基本流程

  1. 选择对应模型的 Tokenizer(必须匹配,否则结果不准)。
  2. 将文本输入 Tokenizer,得到 Token 序列。
  3. len(tokens) 计算 Token 数量。

2. Python 示例:tiktoken(OpenAI 官方库)

import tiktoken

# 选择 GPT-4o-mini 的编码器
enc = tiktoken.encoding_for_model("gpt-4o-mini")

text = "ChatGPT is great!"
tokens = enc.encode(text)

print("Tokens:", tokens)
print("Token 数:", len(tokens))

输出:

Tokens: [1234, 567, 890, ...]
Token 数: 5

3. LangChain 封装

LangChain 提供了更方便的调用方式:

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o-mini")
print(llm.get_num_tokens("你好,世界!"))

它会自动调用 tiktoken,并根据模型名选对分词器。


四、常用工具与框架

(1)tiktoken(Python)

  • OpenAI 官方库。
  • 专为 GPT 系列优化。
  • LangChain 内部默认调用它。

(2)Hugging Face Transformers

  • AutoTokenizer 支持几乎所有模型。
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")
tokens = tokenizer.encode("ChatGPT is great!", add_special_tokens=False)
print(len(tokens))

(3)SentencePiece

  • Google 开发,支持训练自定义分词器。
  • mT5、BERT multilingual 等模型使用。

(4)LangSmith

  • 集成在 LangChain 的可观测性平台里。
  • 自动统计 输入 Token / 输出 Token / 总 Token,并展示在调用链路中。

(5)Java 生态

  • jtokkit:Java 移植版 tiktoken,支持 GPT 系列。
  • Hugging Face Tokenizers (Rust + JNI):支持 BPE/WordPiece/SentencePiece。
  • LangChain4j:提供 OpenAI Tokenizer 封装,便于直接统计。

示例(jtokkit):

import com.knuddels.jtokkit.Encodings;
import com.knuddels.jtokkit.api.*;

EncodingRegistry registry = Encodings.newDefaultEncodingRegistry();
Encoding enc = registry.getEncodingForModel("gpt-4o-mini").get();

String text = "你好,世界!";
System.out.println("Token 数: " + enc.encode(text).size());

五、应用场景

  1. Prompt 限长:避免超过 8k / 32k / 200k 的窗口限制。
  2. 成本预估:精确统计 Token 数,控制调用开销。
  3. Chunking:按照 Token 长度切分文本,提高向量检索的召回率。
  4. 监控与调试:配合 LangSmith 或日志系统,定位 Token 消耗热点。

六、总结

  • 原理:Token 统计依赖 Tokenizer,不同模型对应不同算法。
  • 工具:Python 里有 tiktokentransformers;Java 里有 jtokkit、LangChain4j。
  • 实践:预估用 tiktoken,链路内监控用 LangChain/LangSmith。
  • 最佳实践开发期本地统计 + 生产环境自动监控,确保可控、可观测。

📌 一句话总结

Token 统计是大模型应用的基础能力,开发者需要根据 模型类型 选择合适的 Tokenizer,并结合 工具(tiktoken、LangChain、LangSmith、jtokkit) 在不同阶段实现精确监控和成本控制。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐