什么是Token? 大模型的钱都花在哪了?

更新日期: 2026-03-11

这段时间天天调大模型接口,发现账单长得吓人。仔细看了看,所有收费都绕不开一个词——Token。api 按 Token 收钱,模型能记多少东西看 Token,一次能输出多长也看 Token。

把 Token 这事搞清楚,顺便写个脚本自己算。


Token 到底是什么

Token 是大模型读文字的最小单位。

它不是字,也不是词,而是介于两者之间的东西。模型训练和回答问题的时候,看的不是原始文字,而是一串被切好的 Token。

举个例子就明白了:

"Hello, world!" → ['Hello', ',', ' world', '!']  # 4 个 Token
"大语言模型"     → ['大', '语言', '模型']          # 3 个 Token

你看,英文里空格和标点都算单独的 Token,中文里词可能被切开。这个过程叫分词(tokenization),干这活的工具叫分词器(tokenizer)。


Token 怎么切出来的

现在主流模型基本都用 BPE(字节对编码)算法来切词。这算法的思路其实不复杂:从单个字符开始,慢慢把经常一起出现的拼成一个新 Token。

拿英文举个例子,过程是这样的:

一开始词表里只有单个字母(a-z、0-9、标点)
看训练数据里哪些两个字母老挨着出现
把出现最多的那对合并成一个新 Token
重复这个过程,直到词表大小够了(GPT-4 大概有 10 万个 Token)

比如 "low lower newest" 这句话,"lo" 出现了 2 次,"ow" 出现了 2 次,这些高频组合慢慢就变成了独立的 Token。

不同模型用不同的分词器:

  • GPT 系列、DeepSeek:用 tiktoken,编码方案是 cl100k_base(GPT-4)或 o200k_base(GPT-4o)

  • Llama、Qwen 这类开源模型:用 SentencePiece 或 HuggingFace 的分词器

同一段话,不同模型的分词器切出来不一样,Token 数量也有差别。


为什么中文比英文费 Token

很多人觉得中文一个字一个 Token,英文一个词一个 Token,所以中文贵。这话对了一半。

实际上 BPE 算法不看语言,只看频率——训练数据里出现越多的组合,越容易被合成一个 Token。差别出在训练数据上:

  • 英文数据历来最多,大量英文词和词组都被合成一个 Token。平均下来,1 个 Token 大概对应 0.75 个英文词

  • 早期模型中文数据少,很多字合并不了,只能单独成 Token。现在数据多了,词表也大了(GPT-4o 有 20 万词表),像「大语言模型」、「人工智能」这类常见词也能合成 1-2 个 Token

  • 生僻字不管中英文,出现太少,都会被拆成多个字节

  • 数字串(比如 12345)一般会被切开

  • 代码里的缩进空格也算 Token

所以写代码的时候总觉得 Token 烧得快,不是错觉。


Token 和钱的关系

各大模型 API 收费方式差不多:读进去的 Token 多少钱,吐出来的 Token 多少钱。输出通常比输入贵。

拿 DeepSeek 来说:

  • 输入:1 块钱 1 百万 Token

  • 输出:2 块钱 1 百万 Token

除了算钱,Token 还决定了一件事:模型能记住多少东西。比如某个模型支持 128K 上下文,意思是一次对话(历史消息 + 你发的 + 模型回的)加起来不能超过 128K Token。超了,前面的内容就忘了。

所以提前算算 Token,对省钱和防止忘事都有用。


写个脚本自己算

OpenAI 开源了一个叫 tiktoken 的工具,本地跑,不用联网,装好就能用。

先安装:

pip install tiktoken

写个简单的脚本试试:

import tiktoken

# 选模型用的分词器
enc = tiktoken.encoding_for_model("gpt-4o")

# 要算的文字
texts = [
    "Hello, world!", 
    "你好,世界!", 
    "Large Language Model", 
    "大语言模型"
]

for text in texts:
    tokens = enc.encode(text)
    print(f"'{text}' => {len(tokens)} 个 Token")

跑出来大概是:

'Hello, world!' => 4 个 Token
'你好,世界!' => 7 个 Token
'Large Language Model' => 5 个 Token
'大语言模型' => 3 个 Token

想看清楚每个 Token 是怎么切的也行:

import tiktoken

enc = tiktoken.encoding_for_model("gpt-4o")

def kan_token(text):
    tokens = enc.encode(text)
    duankai = [enc.decode([t]) for t in tokens]
    print(f"'{text}' => {len(tokens)} 个 Token")
    print("切成了:", " | ".join(repr(t) for t in duankai))
    print()

kan_token("Hello, 你好!")
kan_token("ChatGPT 大语言模型")

结果:

'Hello, 你好!' => 8 个 Token
切成了: 'Hello' | ',' | ' 你' | '好' | '!'

'ChatGPT 大语言模型' => 7 个 Token
切成了: 'Chat' | 'GPT' | ' 大' | '语言' | '模型'

注意:tiktoken 用的是 GPT 系列的切法,估算够了。真要精确算账,看模型接口返回的 usage 字段最准。


总结

Token 就是大模型读文字的最小单位,靠 BPE 算法从训练数据里学出来的。搞懂 Token 对实际干活有帮助:

  • 同样意思,中文比英文费 Token,用中文成本高

  • API 按读进去和吐出来的分开算,提前估一下好控制预算

  • 上下文窗口说白了就是 Token 数量上限,超了前面的就丢了

本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!

链接: https://fly63.com/course/38_2291

目录选择