面试官:请详细介绍下AI中的token,越详细越好!

0 阅读8分钟

hello同学们!好久不见

总结

还是先上总结

  • Token 是 AI 模型处理文本的最小单位,也是计费和数量单位,可以是单词、字符、标点符号或子词。
  • 1 个 Token 的计算方式取决于语言和分词算法:英文中 1 个 Token 大约为 3-4 个字母,中文中 1 个 Token 大约为 1个汉字。 具体看该模型算法,这只是估算。
  • 模型的输入输出token越多则越贵。
  • 目前主流的token计算方法有BPE、WordPiece、SentencePiece。GPT系列用的就是BPE算法,gemini系列用的是SentencePiece方法
  • 大模型不直接接收字符,它只接收 字符映射的id数组,比如:杭州天气怎么样 => [杭州,天气,怎么样] => [ 75232, 10452, 184901 ]
  • openai 模型的计费参考网址:developers.openai.com/api/docs/pr…

详解

在人工智能(AI)领域,特别是在自然语言处理(NLP)和大语言模型(如GPT、BERT等)中,Token 是文本处理的最小单位。它可以是一个单词、一个字符、一个标点符号,甚至是一个子词(subword)。 Token 的具体定义和计算方式取决于所使用的分词算法和模型规则

Token 的基本定义

Token 是什么?

Token 是文本经过 Tokenizer(如 BPE、WordPiece、SentencePiece)编码后得到的基本处理单位,也是大模型计算和计费的基础单位。

Token 不一定等同于单词,它可能是完整单词、子词、字符或标点。例如,英文句子 "Hello, world!" 可能被拆分为:

"Hello, world!" --> Tokenization--> ["Hello", ",", "world", "!"]-->[2343,3534,1443,9876]

这其中的 [2343,3534,1443,9876] 每一项代表一个token,数字则代表该字符的映射id

Token 的作用

  1. 标准化处理:将文本分解为 Tokens 后,便于模型进行统一处理和分析。
  2. 降低计算复杂度:直接处理原始文本会导致计算复杂度过高,而 Token 化后的文本更容易存储和处理。
  3. 提高模型性能:Token 化有助于模型更好地理解和学习文本中的模式和结构。

Token的单位

token计费中的K和M是数量单位,而非存储大小单位。

gpt-4o模型计费单位中的 输入 1m/2.5美元的意思是,每输入 1百万个token,收费2.5美元,不是每输入1MB token收费2.5美元。

128k,32k,1M这些单位代表允许context window为128000token,32000token和1000000token。

1k === 1000

1M === 1百万

context window 简单介绍:就是当次输入给大模型以及当次大模型输出token的总和

Token的计算方法

(1)按“词”划分(Word-level Tokenization)

  • 原理:把句子拆成完整单词或词组
  • 英文常用,用空格或标点切分
  • 中文不适用(没有空格分词)
  • 优点:简单、直观
  • 缺点:无法处理未登录词(OOV)、生成能力受限

已知是按词划分,首先程序得知道有这个“词”的存在。所以会有一个模型词表

OOV 解释,“OOV” 是 Out-Of-Vocabulary 的缩写,也就是 “未登录词” ,意思是 模型词表里没有出现过的词或符号

例子

I love AI! → ["I", "love", "AI", "!"][23,4322,1244,34453]

这个方法基本上也已经被淘汰了。毕竟不论什么词库,都不能100%匹配。和我们国家的生僻字差不多。有些生僻字,打字都打不出来。就是不在词库里的原因。

(2)按“字符”划分(Character-level Tokenization)

  • 原理:每个字符一个 Token
  • 中文天然适用,英文每个字母也是一个 token
  • 优点:没有未登录词问题,灵活
  • 缺点:Token 数量大计算量高,

例子

hello → ["h", "e", "l", "l", "o"][12,34,654,34,54]

这个方法目前主流的模型已经淘汰他了,计算成本高、显存占用大。完了最后以token数量计费的时候还死贵死贵。

(3)按“子词/字节对”划分(Subword Tokenization)

  • 核心方法:BPE、WordPiece、SentencePiece

  • 原理:

    1. 从字符开始
    2. 迭代合并高频邻接字符或子词组合
    3. 构建固定大小词表
  • 优点

    • 兼顾 未登录词处理Token 数量控制
    • 英文和中文都适用
  • 缺点

    • 拆分规则依赖训练语料
    • Token 数量不固定

GPT系列用的就是BPE算法,Gemini系列用的是SentencePiece方法

例子

unbelievable → ["un", "believ", "able"]  (WordPiece)
机器学习 → ["机器学习"]["机器", "学习"]  (BPE)

BPE、WordPiece、SentencePiece 这三玩意都是把句子分词的一种算法

(4)混合方法

  • 主要是 Google 提出的,支持:

    • 纯字符模式
    • BPE 模式
    • Unigram 模式
  • 特别适合中文、日文、韩文等无空格语言

Token 的应用

Token 的计费方式

许多大模型服务商(如 OpenAI、DeepSeek 等)按 Tokens 数量计费。例如,输入和输出的 Tokens 总数会被计算为总消耗量。假设输入消耗 100 Tokens,输出消耗 200 Tokens,则总消耗为 300 Tokens。

而每个模型的计费标准不一样,同一个模型的输出输出计费也不一样,如下

  • GPT‑4o模型为例,它的计费标准是输入 token 每 1M 约 2.5美元,输出token 每1M约10美元
  • 而以GPT‑5模型为例它的计费标准是输入token每1M约1.25美元输出token每1M约10美元

gemini系列计费网址 ai.google.dev/gemini-api/…

openai 计费网址(gpt系列):developers.openai.com/api/docs/pr…

token在模型中最大可输入输出限制

token在模型中最大可输入输出限制叫做 context window,context window 的大小 决定了模型一次性能够处理的最大 Tokens 数量(包括输入和输出)。例如:

  • context window 为 8k Token 的模型可以处理约 8,000 个汉字的上下文,比如 GPT‑4 标准版
  • context window 为 32k Token 的模型可以处理约 32,000 个汉字的上下文,比如 GPT‑4-32k 模型
  • context window 为 128k Token 的模型可以处理约 128,000 个汉字的上下文,比如 GPT‑4o 模型

实际可处理的汉字数取决于文本中是否包含英文、标点或高频词组,因为这些会影响 Token 划分。

这里的大小限制(上下文)是指:我们最后发给大模型的token数 + 大模型预计可能吐出来的token数

模型context window最大限制不是唯一的,不同的模型可能不一样

从文本到模型输入

上一个小节解释的是,一个句子怎么进行分词。但是这个分词最后还不是输入给大模型的内容。

大模型不直接接收字符,它只接收 字符映射的id数组

我们以“杭州天气怎么样”这句话和gpt-4o作为案例

  1. 第一步:他会先被分词为 [杭州,天气,怎么样]
  2. 第二步:分词找到该词的词库id 为 [ 75232, 10452, 184901 ]
  3. 第三步:把 [ 75232, 10452, 184901 ] 传入到 大模型等待回复

image.png

杭州天气怎么样 => [杭州,天气,怎么样] => [ 75232, 10452, 184901 ],这个数组里三个项,这就是3个token

用代码尝试一下

以下使用 BPE 方法进行分词计算token,和GPT系列是同一种算法

按如下流程走就好:api-docs.deepseek.com/zh-cn/quick…

js计算token的方法

const tiktoken = require('tiktoken');

// 选择编码器(例如,GPT-4 使用 cl100k_base)
const encoding = tiktoken.get_encoding('cl100k_base');

// 输入文本
const text = "Hello, world! 你好,世界!";

// 计算 Token 数
const tokens = encoding.encode(text);
const tokenCount = tokens.length;

console.log(`Token 数: ${tokenCount}`);

java的计算方法

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.9.3</version>
</dependency>
import okhttp3.*;

public class OpenAITokenCounter {
    private static final String API_KEY = "your_openai_api_key";
    private static final String API_URL = "https://api.openai.com/v1/completions";

    public static int countTokens(String text) throws IOException {
        OkHttpClient client = new OkHttpClient();

        // 构建请求体
        String json = String.format("{\"model\": \"gpt-3.5-turbo\", \"prompt\": \"%s\", \"max_tokens\": 1}", text);
        RequestBody body = RequestBody.create(json, MediaType.parse("application/json"));

        // 构建请求
        Request request = new Request.Builder()
                .url(API_URL)
                .post(body)
                .addHeader("Authorization", "Bearer " + API_KEY)
                .addHeader("Content-Type", "application/json")
                .build();

        // 发送请求并获取响应
        Response response = client.newCall(request).execute();
        String responseBody = response.body().string();

        // 解析响应中的 Token 数
        // 注意:实际 API 响应可能需要更复杂的解析
        return responseBody.split("\"total_tokens\":")[1].split(",")[0].trim();
    }

    public static void main(String[] args) {
        try {
            String text = "Hello, world! 你好,世界!";
            int tokenCount = countTokens(text);
            System.out.println("Token 数: " + tokenCount);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

python的计算方法

from transformers import GPT2Tokenizer

# 加载分词器
tokenizer = GPT2Tokenizer.from_pretrained("gpt2")

# 输入文本
text = "Hello, world! 你好,世界!"

# 计算 Token 数
tokens = tokenizer.encode(text)
token_count = len(tokens)

print(f"Token 数: {token_count}")

我们用python举个例子如下

image.png

注意:再次强调,这是使用 BPE的算法算出来的token,不是所有模型都是这个算法,gpt系列用的是该算法。

最后

hello,我最近有点失业。如果有工作内推的小伙伴可以加我一下,我的大致情况如下

我的情况是:

工作经验4年+ 干过小公司的前端技术leader。

taro的vant组件库有开源贡献

近两年都是全栈,侧重前端+node(electron main侧)

有过C端Ai产品开发经验

我的缺陷是:专科

v:18758683311

我的诉求是:杭州宁波,南京苏州,深圳广州厦门,稳定的远程也行。除泰国缅甸柬埔寨外的外派驻场也行。

我期望的薪资是:足额公积金18-20,非足额公积金20-22

此内容还在,工作就还在找,求有缘人内推。