GPT Tokenizer 使用指南
gpt-tokenizer
是一个用于计算文本 token 数量的 JavaScript 库,支持 GPT-3、GPT-4 和 ChatGPT 使用的 token 编码方式(基于 CL100k 基础)。
安装
npm install gpt-tokenizer
# 或
yarn add gpt-tokenizer
基本使用
1. 计算文本的 token 数量
import GPTTokenizer from 'gpt-tokenizer';
const tokenizer = GPTTokenizer.getTokenizer('gpt-4'); // 也支持 'gpt-3.5-turbo'
const text = "这是一个测试句子。";
const tokenCount = tokenizer.countTokens(text);
console.log(`Token 数量: ${tokenCount}`);
2. 编码文本为 token
const encoded = tokenizer.encode(text);
console.log(encoded); // 输出 token ID 数组
3. 解码 token 为文本
const decoded = tokenizer.decode(encoded);
console.log(decoded); // 输出原始文本
高级功能
1. 统计聊天对话的 token 数量
const conversation = [
{ role: 'system', content: '你是一个有帮助的助手。' },
{ role: 'user', content: '今天的天气怎么样?' }
];
const totalTokens = tokenizer.countChatTokens(conversation);
console.log(`对话 token 总数: ${totalTokens}`);
2. 检查 token 限制
const MAX_TOKENS = 4096; // GPT-4 的限制
const isWithinLimit = tokenizer.isWithinTokenLimit(text, MAX_TOKENS);
if (isWithinLimit) {
console.log('文本在 token 限制范围内');
} else {
console.log('文本超过了 token 限制');
}
3. 截断文本以符合 token 限制
const truncatedText = tokenizer.truncate(text, MAX_TOKENS);
console.log(truncatedText);
不同模型的 tokenizer
// 支持以下模型类型:
// - 'gpt-4', 'gpt-3.5-turbo' (默认使用 CL100k 基础)
// - 'text-davinci-003', 'code-davinci-002' (使用 p50k_base)
// - 'text-embedding-ada-002' (使用 cl100k_base)
const davinciTokenizer = GPTTokenizer.getTokenizer('text-davinci-003');
const embeddingTokenizer = GPTTokenizer.getTokenizer('text-embedding-ada-002');
注意事项
- 不同模型的 tokenizer 不同:确保为你的模型选择正确的 tokenizer 类型
- 非英语文本:中文等非英语文本通常会产生更多 token
- 精确性:这个库是 OpenAI 官方 tokenizer 的近似实现,可能有微小差异
- 性能:对于大量文本处理,考虑分批处理
实际应用示例
监控 API 调用的 token 使用
async function callChatGPT(messages) {
const tokenCount = tokenizer.countChatTokens(messages);
console.log(`发送请求,token 使用量: ${tokenCount}`);
if (tokenCount > 4000) {
console.warn('警告:接近 token 限制');
}
// 实际 API 调用代码...
}
构建聊天应用时限制历史记录
function trimConversation(conversation, maxTokens = 4000) {
let totalTokens = 0;
const trimmedConversation = [];
// 从最新消息开始反向遍历
for (let i = conversation.length - 1; i >= 0; i--) {
const msgTokens = tokenizer.countChatTokens([conversation[i]]);
if (totalTokens + msgTokens > maxTokens) {
break;
}
trimmedConversation.unshift(conversation[i]);
totalTokens += msgTokens;
}
return trimmedConversation;
}
这个库对于优化 GPT API 使用成本、避免超出 token 限制错误非常有用,特别是在处理长文本或复杂聊天场景时。