token是什么

简单来说,Token(词元)是大语言模型(LLM)理解和处理文本的最基本单位

你可以把它想象成模型“吃”文本时的“口粮”或者“积木块”。模型不能直接理解我们写的文字(比如“你好”或“Hello”),它需要先把文字切成一小块一小块的、它能认识的“token”,然后才能对这些 token 进行计算和处理。


为什么需要 Token?

计算机和模型本质上处理的是数字。为了让模型能“读懂”文本,我们必须把文本转换成数字序列。这个过程就是:

原始文本 -> 分词 (Tokenization) -> Token 序列 -> 转换为 ID (数字) -> 输入模型

Token 就是这个转换过程中的中间产物。


Token 到底是什么?它长什么样?

Token 不一定是我们日常理解的“单词”(Word)。它的具体形式取决于所使用的分词器(Tokenizer)。一个 token 可以是:

  1. 一个完整的单词 (Word)

    • 例如:"cat""running""unhappiness" 可能各自就是一个 token(取决于词汇表)。
  2. 一个子词 (Subword)

    • 这是最常见的情况,尤其是在使用 BPE、WordPiece、Unigram 等算法时。
    • 一个长词或复杂词会被拆分成几个更小的、有意义的单元。
    • 例子 (WordPiece)
      • "playing" -> ["play", "##ing"]
      • "lowest" -> ["low", "##est"]
      • "unhappiness" -> ["un", "##happi", "##ness"]
    • 例子 (BPE)
      • "unhappiness" -> ["un", "happi", "ness"] (没有 ## 标记,但 ness 可能带 </w>)
  3. 一个字符 (Character)

    • 对于非常罕见的词或未登录词,模型可能会将其拆解到字符级别。
    • 例如:一个生僻字 "龘" 可能直接作为一个 token。
  4. 一个标点符号或空格

    • ","".""!"" " (空格) 通常都会被视为独立的 token。
  5. 一个符号或表情符号

    • "😊""#""@" 也都会被编码成 token。
  6. 一个字节 (Byte)

    • 字节级 BPE(如 GPT 系列)中,token 的基本单位是字节(0-255)。任何字符(包括中文、emoji)都会先被转换成 UTF-8 字节序列,然后这些字节或字节组合成为 token。这是处理多语言和罕见符号的终极手段。

举个具体的例子

假设我们有这样一句话:

"I love playing basketball!"

使用一个典型的 BPE 分词器(如 GPT 的),它可能会被分解成以下 token:


python

深色版本

["I", "Ġlove", "Ġplaying", "Ġbasketball", "!"]
  • "I":一个完整的单词。
  • "Ġlove"Ġ (这里用 Ġ 代表一个特殊的空格符号,实际可能是  或其他) 表示前面有一个空格,love 是单词。"Ġlove" 是一个整体 token。
  • "Ġplaying":同理。
  • "Ġbasketball":同理。
  • "!":标点符号。

然后,分词器会查一个“词典”(词汇表),将每个 token 映射成一个唯一的数字 ID:


python

深色版本

[15496, 6375, 2600, 7877, 272]  # 这些数字是示例,实际值由模型词汇表决定

这个数字序列 [15496, 6375, 2600, 7877, 272] 才是模型真正“吃”进去的东西。


Token 的重要性

  1. 模型输入的基础:模型的所有计算都基于 token 的 ID 序列。
  2. 影响上下文长度:模型有“上下文窗口”限制,比如 8K、32K、128K tokens。这指的是它能同时处理的 token 数量,而不是字符或单词数。一个复杂的词可能占多个 token,而一个空格也算一个 token。
  3. 影响成本:使用大模型 API(如调用 GPT-4)时,费用通常是按 输入 tokens 和 输出 tokens 的数量来计算的。文本越长、越复杂(被拆分成更多 token),成本越高。
  4. 影响性能:更高效、更合理的分词方式能让模型更好地理解语义。

如何查看文本被分成了哪些 tokens?

你可以使用 Hugging Face 的 transformers 库来轻松查看:


python

深色版本

from transformers import AutoTokenizer

# 加载一个分词器,例如 GPT-2 的
tokenizer = AutoTokenizer.from_pretrained("gpt2")

text = "I love playing basketball!"
# 将文本分词
tokens = tokenizer.tokenize(text)
print("Tokens:", tokens)  # 输出: ['I', 'Ġlove', 'Ġplaying', 'Ġbasket', 'ball', '!']

# 将 tokens 转换为 IDs
ids = tokenizer.encode(text)
print("Token IDs:", ids)  # 输出: [69, 1050, 2915, 5510, 366, 13]

# 将 IDs 解码回文本
decoded = tokenizer.decode(ids)
print("Decoded:", decoded)  # 输出: "I love playing basketball!"

总结一下:

  • Token 不是单词,它是模型处理文本的基本单元
  • 一个 token 可以是一个单词、一个子词、一个字符、一个标点,甚至是一个字节。
  • 分词器(Tokenizer)负责将原始文本切分成 token 序列。
  • token 的数量直接影响模型的上下文长度限制使用成本
  • 理解 token 的概念,有助于你更好地理解大语言模型是如何“阅读”和“思考”的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值