token 数量的计算

public class ChatGPTApi{
    private static final String AUTHORIZATION_STR = "Authorization";
    private static Encoding enc;
    static {
        enc = Encodings.newDefaultEncodingRegistry().getEncoding(EncodingType.CL100K_BASE);
    }

    /**
     * 估计一轮上下文对话占多少个token
     * @param message
     * @return
     */
    public static int getMessageTokenNum(String message){
        return enc.encode("role: {user}, message: {" + message + "}").size();
    }


    private ChatGPTApi(){}

}

通过使用一个编码器(Encoding)来计算输入消息的 token 数量。具体来说,它是基于某种分词算法(tokenization algorithm),将输入的字符串分解为一系列的 token,然后统计这些 token 的数量。
 

1. 什么是 Token?

Token 是自然语言处理(NLP)中的基本单位。它可以是一个单词、子词(subword)、字符,甚至是标点符号。不同的模型和编码方案对 token 的定义可能不同。

例如:

编码器的核心功能是实现 分词(tokenization)解码(detokenization)

(3) 统计 token 数量

CL100K_BASE 很可能是基于 BPE 或 WordPiece 的变体,专门优化用于 GPT 模型。

 

  • 输入 "hello world" 可能被分解为两个 token:["hello", "world"]
  • 输入 "chatting" 可能被分解为两个子词 token:["chat", "ing"]
     

    编码器的作用

    在代码中,enc 是一个 Encoding 对象,它负责将输入文本转换为 token 序列。具体来说:

  • Encodings.newDefaultEncodingRegistry().getEncoding(EncodingType.CL100K_BASE) 创建了一个特定类型的编码器。
  • CL100K_BASE 是一种具体的编码规则,通常与某个预训练语言模型(如 GPT 系列)相关联。
  • 分词:将字符串拆分为 token 序列。
  • 解码:将 token 序列还原为原始字符串。

     
    编码字符串
  • 调用 enc.encode() 方法将构造好的字符串转换为 token 序列。
  • encode() 方法会根据 CL100K_BASE 编码规则,将字符串分解为 token。
  • 使用 .size() 获取 token 序列的长度,即 token 的数量。

     

    分词算法的原理

    分词算法的具体实现取决于所使用的编码器类型(如 CL100K_BASE)。常见的分词算法包括:

  • 字节对编码(Byte Pair Encoding, BPE)
    • 将高频的字符组合逐步合并为更大的单元。
    • 例如,"low""lower""lowest" 可能被分解为 ["low", "er", "est"]
  • WordPiece
    • 类似于 BPE,但更倾向于基于概率选择最优的分割方式。
  • 字符级编码
    • 将每个字符作为一个 token。

CL100K_BASE 是 OpenAI 开发的一种 BPE(Byte Pair Encoding)分词器编码方案,主要用于 GPT-4、GPT-3.5-Turbo 等模型的文本分词处理6。以下是其关键信息总结:

1. ‌核心功能与用途

分词处理‌:将文本切分为模型可识别的 token 序列,便于计算输入文本的 token 数量,避免超出模型处理能力16。 ‌适用模型‌:支持 GPT-4、GPT-3.5-Turbo 以及 text-embedding-ada-002 等模型67。

2. ‌离线环境部署问题

在离线环境中使用 CL100K_BASE 时,常因无法自动下载 cl100k_base.tiktoken 文件导致报错。解决方法包括:

3. ‌相关工具与扩展

4. ‌应用场景示例

如需进一步验证或调整编码器,可参考 tiktoken 的官方文档或社区开源项目

这段代码通过调用 Encoding 对象的 encode 方法,将输入字符串按照 CL100K_BASE 编码规则分解为 token 序列,并统计其数量。这是基于分词算法(如 BPE 或 WordPiece)实现的,目的是准确估计输入文本的 token 数量,以便更好地与语言模型交互。

  • 手动下载文件‌:从 OpenAI 公共存储库获取文件(如 openaipublic.blob.core.windows.net),并重命名为哈希值(如 cab1ac2de16cad507ac799535b7bc69471851e24),放置于本地缓存目录12。
  • 修改代码路径‌:调整 tiktoken 库的加载逻辑,使其直接读取本地文件而非远程请求28。
  • 环境变量配置‌:通过设置 TIKTOKEN_CACHE_DIR 等环境变量指定本地缓存路径8。
  • 开源库支持‌:
    • Python‌:通过 tiktoken 库直接调用 tiktoken.get_encoding("cl100k_base")17。
    • 其他语言‌:JavaScript、Java、.NET 等均有适配库(如 jtokkitTiktokenSharp)6。
  • RAG 系统‌:在检索增强生成(RAG)中,用于文本分块后的向量化处理,提升大模型生成结果的准确性34。
  • 本地化模型部署‌:结合离线部署工具(如 Ollama),实现企业内网环境下的私有化智能服务5。
    • 自定义编码器‌:支持基于 cl100k_base 扩展自定义 token 或特殊字符,通过修改 tiktoken.Encoding 参数实现7。

你可能感兴趣的:(java,前端,javascript)