如何统计 Token:算法原理、工具与框架全解析
·
在大模型开发中,Token(词元) 是一个绕不开的核心概念。
无论是 Prompt 限长控制,还是 成本预估,都需要准确统计 Token 数。本文将从 原理 → 算法 → 工具 → 实战 全面介绍如何统计 Token。
一、什么是 Token?为什么要统计 Token?
大语言模型(LLM)并不是按「字」或「词」来理解输入,而是将文本切分成更细的 子词单元 (subword units),即 Token。
例如:
-
句子
ChatGPT is great- GPT-4 的分词器可能切成
[ "Chat", "G", "PT", " is", " great" ]→ 共 5 个 Token。
- GPT-4 的分词器可能切成
为什么要统计 Token?
- 上下文长度限制:避免输入超过模型的最大 Token 窗口。
- 计费:OpenAI 等厂商按 Token 收费。
- 调试优化:统计 Prompt 消耗,找出 Token “大户”。
- 文本切分 (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. 基本流程
- 选择对应模型的 Tokenizer(必须匹配,否则结果不准)。
- 将文本输入 Tokenizer,得到 Token 序列。
- 用
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());
五、应用场景
- Prompt 限长:避免超过 8k / 32k / 200k 的窗口限制。
- 成本预估:精确统计 Token 数,控制调用开销。
- Chunking:按照 Token 长度切分文本,提高向量检索的召回率。
- 监控与调试:配合 LangSmith 或日志系统,定位 Token 消耗热点。
六、总结
- 原理:Token 统计依赖 Tokenizer,不同模型对应不同算法。
- 工具:Python 里有
tiktoken、transformers;Java 里有jtokkit、LangChain4j。 - 实践:预估用 tiktoken,链路内监控用 LangChain/LangSmith。
- 最佳实践:开发期本地统计 + 生产环境自动监控,确保可控、可观测。
📌 一句话总结:
Token 统计是大模型应用的基础能力,开发者需要根据 模型类型 选择合适的 Tokenizer,并结合 工具(tiktoken、LangChain、LangSmith、jtokkit) 在不同阶段实现精确监控和成本控制。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)