AIGC: 关于ChatGPT中token和tiktoken工具

什么是token

  • token是GPT处理文本的基本的单位
  • token本身可以是一个字,可以是一个词语,或特定语言中的一个字符
  • token负责将输入的文本数据转换为GPT可以处理的数据格式
  • GPT不同模型的计费就是根据token来的

token 的拆分

  • 这里有一个 tiktoken 工具
    • 是 open ai 开源的一个快速分词的工具
    • 可以将我们输入的文本的字符串去进行拆分, 拆分成token的列表
      • 我们通过对 Prompt 进行拆分,计算出token的数量
      • 不同的模型对于token是有限制的,可以判断 Prompt 是不是比较长, 导致GPT对应的模型没有办法处理
      • 我们也可以通过 token 的数量去进行费用的计算
        • 我们开发了一个自助的聊天工具,向用户进行开放
        • 对用户而言,我们可以通过计算token的数量来计算费用
        • 因为openAI它的API的调用的费用也是通过token去进行计算的
      • 举一个例子
        • 比如我们要做一个聊天机器人,对于聊天机器人,是需要我们的历史的一些聊天的信息
        • 需要去判断历史信息,也就是追加上下文的信息,是不是能够被GPT进行处理
        • 这个时候, 可能就会涉及到对于token的一个计算,我们需要将上下文的信息去计算它的token
        • 看是不是超过了我们想要去设置的阈值,这是token拆分实际的一个使用

如何拆分 token

  • openai 通过不同的编码来指定如何将文本转换成token
  • 不同的模型,使用不同的编码
  • open ai的模型分为三种编码
    • cl100k_base: gpt4, gpt-3.5-turbo
    • p50k_base: text-davinci-003, text-davinci-002
    • r50k_base: gpt-3
    • 这是相关的 token 的编码和模型的一个映射的关系
  • 各个语言的支持情况
    • 对于不同的语言,openai 也提供了相关的一些模块去进行引用
    • Python: tiktoken
    • Java: jtokkit
  • 通过这些包完成文本的token的一个拆分,去计算指定文本tokens的数量

Java 示例程序如下

Model.java

package org.example;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public enum Model {
   
    /**
     * gpt-3.5-turbo
     */
    GPT_3_5_TURBO("gpt-3.5-turbo"),
    GPT_3_5_TURBO_0613("gpt-3.5-turbo-0613"),
    GPT_3_5_TURBO_16K("gpt-3.5-turbo-16k"),
    TEXT_DAVINCI_003("text-davinci-003");
    private String name;
}

Main.java

package org.example;

import com.knuddels.jtokkit.Encodings;
import com.knuddels.jtokkit.api.Encoding;
import com.knuddels.jtokkit.api.EncodingRegistry;
import java.util.*;

public class Main {
   
    private static final EncodingRegistry encodingRegistry = Encodings.newDefaultEncodingRegistry();

    public static int tokens(String modelName, String message) {
   
        // 根据模型名称获取编码
        Optional<Encoding> encodingForModel = encodingRegistry.getEncodingForModel(modelName);
        if(encodingForModel.isPresent()) {
   
            // 利用编码计算 token 的数量
            Encoding encoding = encodingForModel.get();
            int sum = encoding.countTokens(message);
            return sum;
        } else {
   
            throw new RuntimeException("model not support");
        }
    }

    public static void getTokens(String modelName, String message) {
   
        // 根据模型名称获取编码
        Optional<Encoding> encodingForModel = encodingRegistry.getEncodingForModel(modelName);
        if(encodingForModel.isPresent()) {
   
            // 利用编码计算 token 的数量
            Encoding encoding = encodingForModel.get();
            List<Integer> encodeList = encoding.encode(message);
            // 输出
            for(Integer en:encodeList) {
   
                System.out.print(encoding.decode(Arrays.asList(en))); // 这里有可能存在乱码的情况
                System.out.print("  ");
            }
            System.out.println("");
        } else {
   
            throw new RuntimeException("model not support");
        }
    }

    public static void main(String[] args) {
   
        int tokens = tokens(Model.GPT_3_5_TURBO.getName(), "你是一个诗人,请写一首七言绝句");
        getTokens(Model.GPT_3_5_TURBO.getName(), "你是一个诗人,请写一首七言绝句");
        System.out.println("Prompt:你是一个诗人,请写一首七言绝句! Tokens count:"+ tokens);
    }
}
  • 现在运行一下, 可以看到我们的结果已经成功的进行了执行
  • 对于我们本次的 Prompt ,它的tokens的数量是 17

相关推荐

  1. AIGC: 关于ChatGPTtokentiktoken工具

    2023-12-06 06:58:02       108 阅读
  2. AIGC: 关于ChatGPTAPI接口调用相关准备工作

    2023-12-06 06:58:02       61 阅读
  3. AIGC: 关于ChatGPTFunction Call的调用

    2023-12-06 06:58:02       61 阅读
  4. AIGC: 关于ChatGPT的核心API调用示例

    2023-12-06 06:58:02       56 阅读
  5. AIGC: 关于ChatGPT对输出文本进行审核

    2023-12-06 06:58:02       54 阅读
  6. AIGC: 关于ChatGPT进行情感分析的功能

    2023-12-06 06:58:02       49 阅读
  7. AIGC: 关于ChatGPT的API调用模型

    2023-12-06 06:58:02       41 阅读
  8. AIGC: 关于ChatGPT实现一个聊天机器人

    2023-12-06 06:58:02       58 阅读
  9. AIGC: 关于ChatGPT基于API实现一个Client客户端

    2023-12-06 06:58:02       42 阅读
  10. AIGC: 关于ChatGPT基于Whisper模型实现音频转文本

    2023-12-06 06:58:02       57 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-06 06:58:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-06 06:58:02       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-06 06:58:02       82 阅读
  4. Python语言-面向对象

    2023-12-06 06:58:02       91 阅读

热门阅读

  1. Hive的安装配置、初始化元数据、启动

    2023-12-06 06:58:02       49 阅读
  2. net6中使用MongoDB

    2023-12-06 06:58:02       74 阅读
  3. 【云备份】第三方库

    2023-12-06 06:58:02       57 阅读
  4. el-from表单实现lable字体大小改变

    2023-12-06 06:58:02       51 阅读
  5. Unix Network Programming Episode 82

    2023-12-06 06:58:02       57 阅读
  6. Unix Network Programming Episode 83

    2023-12-06 06:58:02       59 阅读
  7. 西南科技大学C++程序设计实验四(类与对象三)

    2023-12-06 06:58:02       59 阅读
  8. 透明度值和注意点

    2023-12-06 06:58:02       45 阅读