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 等均有适配库(如
jtokkit
、TiktokenSharp
)6。
- Python:通过
- RAG 系统:在检索增强生成(RAG)中,用于文本分块后的向量化处理,提升大模型生成结果的准确性34。
- 本地化模型部署:结合离线部署工具(如 Ollama),实现企业内网环境下的私有化智能服务5。
- 自定义编码器:支持基于
cl100k_base
扩展自定义 token 或特殊字符,通过修改tiktoken.Encoding
参数实现7。
- 自定义编码器:支持基于