大模型中的token

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_tokensmax_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)。

### Token定义及其在计算机视觉中的应用 在视觉大模型中,Token是指图像被分割后的离散表示单元。这些单元可以是基于像素、补丁(patch)或是更复杂的特征表达形式。通过将输入图片转换成一系列Tokens,使得神经网络能够更好地处理理解空间结构化数据[^1]。 对于大规模预训练模型而言,采用Transformer架构时通常会先对原始RGB图象执行切片操作,即将整张照片按照固定大小划分成多个不重叠的小方块(Patch),每一个这样的区域就构成了一个单独的Token。之后再把这些Patches线性映射到高维向量空间作为后续编码器层的输入[^2]。 此外,在某些特定应用场景下还可以利用边界框或者实例掩码来生成更加语义化的Tokens,比如物体检测任务里常用的目标包围盒以及分割领域内的轮廓遮罩等都属于此类特殊类型的标记[^3]。 ```python import torch from transformers import ViTFeatureExtractor, ViTForImageClassification model_name = "google/vit-base-patch16-224" feature_extractor = ViTFeatureExtractor.from_pretrained(model_name) model = ViTForImageClassification.from_pretrained(model_name) def preprocess_image(image_path): image = Image.open(image_path).convert('RGB') inputs = feature_extractor(images=image, return_tensors="pt") tokens = model.vision_model.patch_embedding(inputs['pixel_values']).flatten(2).transpose(1, 2) return tokens tokens_example = preprocess_image("example.jpg") print(tokens_example.shape) # 输出形状应类似于 (batch_size, num_patches, hidden_dim) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值