1、定义
Token 是一种将文本分割成更小单元的方式。在自然语言处理(NLP)中,Token 通常可以是一个单词、一个标点符号、一个数字,甚至是一个子词(sub-word)。例如,对于句子 “Hello, world!”,它可以被分割成以下 Token
-
单词 Token:
["Hello", ",", "world", "!"]
-
子词 Token:在一些模型(如基于 BERT 的模型)中,单词可能会被进一步分割成更小的子词单元,例如 “playing” 可能被分割成
["play", "##ing"]
。
2、概念
Token 在语言模型中有以下几种重要作用:
-
文本表示:Token 是语言模型处理文本的基础单元。模型通过将文本分割成 Token,然后对每个 Token 进行编码和处理,从而理解语言的结构和语义。
-
计算效率:将文本分割成 Token 可以让模型更高效地处理长文本,因为 Token 的数量通常比字符数量少得多。
-
语义理解:Token 的选择和分割方式会影响模型对语言的理解。例如,子词 Token 化可以更好地处理词缀、词根等语言现象,从而提升模型对词汇变体的识别能力。
3、类型
不同的语言模型可能会使用不同的 Token 化方法:
-
基于字符的 Token:将文本分割成单个字符,例如
"Hello"
被分割成["H", "e", "l", "l", "o"]
。 -
基于单词的 Token:将文本分割成单词,例如
"Hello, world"
被分割成["Hello", "world"]
。 -
基于子词的 Token:将单词分割成更小的子词单元,例如
"unhappy"
被分割成["un", "happy"]
。这种方法在处理词缀和词根时非常有效。 -
混合 Token:一些模型会结合多种 Token 化方法,以更好地处理语言的复杂性。
4、Token 在模型中的处理
在语言模型中,每个 Token 都会被映射到一个唯一的数字(称为 Token ID),然后通过模型的神经网络进行处理。例如:
-
编码阶段:模型将输入文本分割成 Token,然后将每个 Token 转换为 Token ID,形成一个数字序列。
-
解码阶段:模型根据生成的 Token ID 序列,将 Token ID 转换回文本,生成输出。
5、Token 的限制
Token 的数量(Token Length)也会影响模型的性能和能力。例如:
-
上下文长度限制:大多数语言模型都有一个最大上下文长度限制(如 2048 Token)。如果输入文本超过这个限制,模型可能无法完整处理整个文本。
-
计算成本:Token 数量越多,模型的计算成本越高。因此,合理地分割和处理 Token 是优化模型性能的关键。
6、token计算
在大模型的对话中,Token 的计算方式主要取决于模型的分词器(Tokenizer)和具体的语言特性。以下是计算 Token 的关键步骤和注意事项:
输入 Token 的计算
输入 Token 的数量是通过模型的分词器将用户输入的文本分割成 Token 序列后得到的。不同语言和模型的分词规则不同:
-
中文:通常一个汉字或一个标点符号算作一个 Token。
-
英文:一个单词、标点符号或子词(如“unbelievable”会被拆分为“un”、“believ”、“able”)算作一个 Token。
例如:
-
中文输入:“你好,世界!”会被分割为
["你", "好", ",", "世", "界", "!"]
,共 6 个 Token。 -
英文输入:“Hello, world!”会被分割为
["Hello", ",", "world", "!"]
,共 4 个 Token。
输出 Token 的计算
输出 Token 的数量取决于模型的生成策略和设置的最大生成长度(max_tokens
或 max_new_tokens
):
-
简单任务(如问答):输出 Token 数量可能与输入 Token 数量相近。
-
复杂任务(如长文本生成):输出 Token 数量可能远大于输入 Token 数量。
例如:
-
输入:“What is the capital of France?”,输出:“The capital of France is Paris.”,输入和输出各有 7 个 Token,总 Token 数为 14。
-
输入:“Write a story about a hero who saves the world.”,假设最大生成长度为 50 个 Token,则总 Token 数为输入 Token 数(11)加上输出 Token 数(50),共 61。
Token 计算的通用公式
-
输入 Token 数:由分词器将输入文本分割后的 Token 数。
-
输出 Token 数:根据任务复杂性和最大生成长度限制计算。
-
总 Token 数:输入 Token 数 + 输出 Token 数。
计算 token 的步骤
(1)分词
将对话中的文本按模型的分词规则拆分为 token。例如:
-
英文:
"Hello, how are you?"
可能被分词为["Hello", ",", "how", "are", "you", "?"]
,共 6 个 token。 -
中文:
"你好,最近怎么样?"
可能被分词为["你", "好", ",", "最近", "怎么样", "?"]
,共 6 个 token。
(2)统计 token 数量
-
直接使用模型的分词工具(如 OpenAI 的
tiktoken
库)统计 token 数量。 -
示例代码(使用 OpenAI 的
tiktoken
):import tiktoken # 加载编码器 encoding = tiktoken.get_encoding("cl100k_base") # 例如 GPT-4 使用的编码 # 计算 token 数量 text = "你好,最近怎么样?" tokens = encoding.encode(text) token_count = len(tokens) print("Token 数量:", token_count)
(3)累计对话中的 token
-
将用户输入、模型输出、系统提示和对话历史中的所有 token 累加。
-
示例计算
-
系统提示:
"你是一个助手。"
→ 5 个 token -
用户输入:
"你好,能帮我写邮件吗?"
→ 10 个 token -
模型回复:
"当然可以!请告诉我邮件内容。"
→ 12 个 token -
总 token 数:
5 + 10 + 12 = 27
-
多轮对话中的 Token 计算
在多轮对话中,Token 数量不仅包括当前轮次的输入和输出,还包括历史对话的上下文内容(如用户的历史输入、模型的历史回复和系统提示)。上下文越长,Token 数量越多。
多轮对话的组成
多轮对话通常包括以下部分:
-
系统提示(可选):用于引导模型行为的初始指令。
-
对话历史:之前每一轮的对话内容(用户输入和模型输出)。
-
当前用户输入:用户最新发送的消息。
-
当前模型输出:模型针对当前用户输入生成的回复。
多轮对话的 token 计算
(1)基本公式
多轮对话的总 token 数可以通过以下公式计算:
当前轮总 token 数 = 系统提示 token + 对话历史 token + 当前用户输入 token + 当前模型输出 token
(2)具体步骤
第三轮token数计算
(1)系统提示
-
如果有系统提示,计算其 token 数。
-
示例:
"你是一个助手。"
→ 5 个 token。
(2)对话历史
-
将前两轮的 用户输入 和 模型输出 拼接起来,计算其 token 数。
-
示例:
-
第一轮:
-
用户输入:
"你好"
→ 2 个 token -
模型输出:
"你好!有什么可以帮您?"
→ 10 个 token
-
-
第二轮:
-
用户输入:
"能帮我写邮件吗?"
→ 8 个 token -
模型输出:
"当然可以!请告诉我邮件内容。"
→ 12 个 token
-
-
对话历史 token 数:
2 + 10 + 8 + 12 = 32
-
(3)第三轮用户输入
-
计算第三轮用户输入的 token 数。
-
示例:
"我想写一封感谢信。"
→ 9 个 token。
(4)第三轮模型输出
-
计算模型针对第三轮用户输入生成的回复的 token 数。
-
示例:
"好的,请告诉我收件人和主要内容。"
→ 14 个 token。
(5)第三轮总 token 数
-
将以上所有部分相加。
-
示例:
5 (系统提示) + 32 (对话历史) + 9 (第三轮用户输入) + 14 (第三轮模型输出) = 60
总的 token 数计算
总的 token 数是指从对话开始到当前轮次(第三轮)的所有 token 累计。计算方法如下:
-
总 token 数 = 系统提示 token + 所有轮次的用户输入 token + 所有轮次的模型输出 token
-
总的 token 数,示例:
5 (系统提示) + 19 (所有用户输入) + 36 (所有模型输出) = 60
-
注意事项
-
模型的最大 token 限制:
-
大多数模型有最大 token 限制(如 GPT-4 通常是 8,192 或 32,000)。
-
如果总 token 数超过限制,需要截断或省略部分对话历史。
-
-
对话历史的截断:
-
通常优先保留最近的对话历史,因为越近的内容对当前对话的上下文越重要。
-
-
系统提示的影响:
-
系统提示会一直占用 token 数,因此需要尽量简洁。
-
总结
-
第三轮对话的 token 数:包括系统提示、前两轮的对话历史、第三轮的用户输入和模型输出。
-
总的 token 数:从对话开始到当前轮次的所有 token 累计。
DeepSeek Token计算
Token 用量计算 | DeepSeek API Docs
7、注意事项
-
模型限制:每个模型有最大 token 限制(如 GPT-4 通常是 8,192 或 32,000)。如果对话过长,需要截断或省略部分历史。
-
系统提示和上下文:系统提示和对话历史也会占用 token,需计入总数。
-
多轮对话:每轮对话的 token 会累积,需注意总 token 数是否超出限制。
8、优化 token 使用
-
缩短输入:精简用户输入和系统提示。
-
限制对话历史:只保留最近几轮对话作为上下文。
-
调整模型参数:如减少生成的最大 token 数(
max_tokens
)。