一、带逐行详细注释的完整代码

# 注释:该代码核心演示OpenAI官方分词器tiktoken的核心用法:
# 1. 按模型名匹配对应分词器 2. 文本→token整数序列(分词) 3. token序列→文本/单个token词条(还原)
# 官方参考文档:openai.com/api/

# 导入tiktoken库(OpenAI开源的官方分词器,用于精准计算token数、拆分/还原token,无网络依赖)
import tiktoken

# 根据OpenAI模型名称(gpt-3.5-turbo)自动匹配对应的分词器编码规则
# 原理:不同OpenAI模型绑定固定的分词编码,gpt-3.5-turbo/gpt-4均绑定cl100k_base
tokenizer = tiktoken.encoding_for_model('gpt-3.5-turbo')
# 优化print:增加说明文字,直接告知输出含义(预期输出cl100k_base)
print('当前模型(gpt-3.5-turbo)对应的分词器编码名称:', tokenizer.name)

# 注释:也可直接通过编码名称获取分词器(与上行效果一致,适合明确编码类型时使用)
# tokenizer2 = tiktoken.get_encoding('cl100k_base')

# ===================== 核心操作1:文本分词(转为token整数序列) =====================
# 对英文短句"China is great!"分词,输出每个token对应的整数编码(模型可识别的“数字语言”)
res1 = tokenizer.encode('China is great!')
# 对英文短句"tiktoken is great!"分词,输出token整数序列
res2 = tokenizer.encode('tiktoken is great!')
# 对中文长句分词(tiktoken对中文的分词规则:单个汉字/标点≈1个token)
res3 = tokenizer.encode('这种模型通常用于自动摘要、文章创作、代码生成等任务,其中用户提供部分内容,而模型则帮助完成剩余的文本。')

# 优化print:补充说明文字,小白可直接理解输出含义
print('"China is great!"的token整数序列:', res1)
print('"China is great!"的token总数:', len(res1))  # 统计token数量(计费/模型输入限制的核心依据)
print('"tiktoken is great!"的token整数序列:', res2)
print('"tiktoken is great!"的token总数:', len(res2))
print('中文长句的token整数序列:', res3)
print('中文长句的token总数:', len(res3))

# ===================== 核心操作2:token序列还原为完整文本 =====================
# 将中文长句的token整数序列还原为原始文本(验证分词的可逆性,确保无信息丢失)
print('还原后的中文长句:', tokenizer.decode(res3))

# ===================== 核心操作3:拆分单个token整数对应的词条 =====================
# 遍历res1的每个token整数,还原为字节形式的单个token词条(查看分词最小粒度)
# decode_single_token_bytes:单个token整数→字节(英文直接显式,中文为UTF-8字节)
words1 = [tokenizer.decode_single_token_bytes(token) for token in res1 ]
print('"China is great!"的单个token词条(字节形式):', words1)
# 同理,还原res2的每个token词条
words2 = [tokenizer.decode_single_token_bytes(token) for token in res2 ]
print('"tiktoken is great!"的单个token词条(字节形式):', words2)
# 同理,还原res3的每个token词条(中文显示为UTF-8字节,如b'\xe8\xbf\x99'对应“这”)
words3 = [tokenizer.decode_single_token_bytes(token) for token in res3 ]
print('中文长句的单个token词条(字节形式):', words3)

二、无任何注释的代码版本

import tiktoken

tokenizer = tiktoken.encoding_for_model('gpt-3.5-turbo')
print('当前模型(gpt-3.5-turbo)对应的分词器编码名称:', tokenizer.name)

res1 = tokenizer.encode('China is great!')
res2 = tokenizer.encode('tiktoken is great!')
res3 = tokenizer.encode('这种模型通常用于自动摘要、文章创作、代码生成等任务,其中用户提供部分内容,而模型则帮助完成剩余的文本。')

print('"China is great!"的token整数序列:', res1)
print('"China is great!"的token总数:', len(res1))
print('"tiktoken is great!"的token整数序列:', res2)
print('"tiktoken is great!"的token总数:', len(res2))
print('中文长句的token整数序列:', res3)
print('中文长句的token总数:', len(res3))

print('还原后的中文长句:', tokenizer.decode(res3))

words1 = [tokenizer.decode_single_token_bytes(token) for token in res1 ]
print('"China is great!"的单个token词条(字节形式):', words1)
words2 = [tokenizer.decode_single_token_bytes(token) for token in res2 ]
print('"tiktoken is great!"的单个token词条(字节形式):', words2)
words3 = [tokenizer.decode_single_token_bytes(token) for token in res3 ]
print('中文长句的单个token词条(字节形式):', words3)

三、核心知识点详解

1. 核心概念梳理
概念 通俗解释 关键说明
Token(令牌) 大模型处理文本的“最小单位”(不是单纯的字/词) 1. 计费核心:OpenAI API按token数收费(输入+输出都算)
2. 长度换算:1token≈0.75个英文单词 / ≈1.5个中文字
3. 拆分规则:
- 英文:按词根/标点拆分(如"great!“拆为"great”+“!”)
- 中文:单个汉字/标点≈1个token(如“这”=1token,“,”=1token)
tiktoken OpenAI官方开源的分词器库 1. 核心优势:与OpenAI模型(gpt-3.5-turbo/gpt-4)分词逻辑100%一致,本地计算token数无需联网
2. 核心价值:提前计算token数,避免模型输入超限(如gpt-3.5-turbo单轮最大4096token)
分词编码(Encoding) tiktoken的“分词规则包”(不同模型对应不同规则)
cl100k_base gpt-3.5-turbo / gpt-4 / text-embedding-ada-002
p50k_base GPT-3系列(davinci/curie)
r50k_base GPT-2 本文中gpt-3.5-turbo对应cl100k_base,是目前最常用的编码
encode(分词) 文本→token整数序列(模型能理解的数字格式) 不可逆?否!可通过decode还原为原文,无信息丢失
decode(还原文本) token整数序列→完整文本 仅能还原整体文本,无法拆分单个token的含义
decode_single_token_bytes 单个token整数→字节形式的词条 核心作用:查看分词粒度(如知道每个整数对应哪个具体字/词)
中文返回UTF-8字节(如b’\xe8\xbf\x99’),可通过decode('utf-8')转为汉字
2. tiktoken库核心用法(表格梳理)
函数/方法 功能描述 示例代码 输出示例
tiktoken.encoding_for_model(model_name) 按模型名自动匹配分词器 tokenizer = tiktoken.encoding_for_model('gpt-3.5-turbo') 返回cl100k_base编码的分词器实例
tiktoken.get_encoding(encoding_name) 直接按编码名获取分词器 tokenizer = tiktoken.get_encoding('cl100k_base') 与上行效果完全一致(更灵活)
tokenizer.encode(text) 文本转token整数序列 tokenizer.encode('China is great!') [220, 4513, 374, 1049, 0](值以实际运行为准)
tokenizer.decode(token_list) token整数序列转完整文本 tokenizer.decode([220, 4513, 374, 1049, 0]) China is great!
tokenizer.decode_single_token_bytes(token) 单个token整数转字节词条 tokenizer.decode_single_token_bytes(220) b'China'(英文)/ b'\xe8\xbf\x99'(中文“这”)
tokenizer.name 获取分词器编码名称 tokenizer.name cl100k_base
3. 优化后print函数说明(含输出示例)
代码行 输出示例 核心作用
print('当前模型(gpt-3.5-turbo)对应的分词器编码名称:', tokenizer.name) 当前模型(gpt-3.5-turbo)对应的分词器编码名称: cl100k_base 验证模型与编码的绑定关系,确认分词规则正确
print('"China is great!"的token整数序列:', res1) "China is great!"的token整数序列: [220, 4513, 374, 1049, 0] 展示文本的“模型视角”(数字形式)
print('"China is great!"的token总数:', len(res1)) "China is great!"的token总数: 5 统计token数,是API计费/输入限制的核心依据
print('还原后的中文长句:', tokenizer.decode(res3)) 还原后的中文长句: 这种模型通常用于自动摘要、文章创作、代码生成等任务,其中用户提供部分内容,而模型则帮助完成剩余的文本。 验证分词-还原的可逆性,确保无信息丢失
print('"China is great!"的单个token词条(字节形式):', words1) "China is great!"的单个token词条(字节形式): [b'China', b' is', b' great', b'!'] 拆解分词粒度,看清“great!”被拆为“great”和“!”两个token
print('中文长句的单个token词条(字节形式):', words3) 中文长句的单个token词条(字节形式): [b'\xe8\xbf\x99', b'\xe7\xa7\x8d', b'\xe6\xa8\xa1\xe5\x9e\x8b', ...] 展示中文分词粒度(单字=1token),字节可转汉字
4. 实用拓展:中文token字节转可读汉字

如果想把words3中的UTF-8字节转为可读汉字,可添加以下代码:

# 中文token字节→可读汉字(补充代码,非原代码)
words3_cn = [token.decode('utf-8') for token in words3]
print('中文长句的单个token词条(汉字形式):', words3_cn)

输出示例:
中文长句的单个token词条(汉字形式): ['这', '种', '模', '型', '通', '常', '用', '于', '自', '动', '摘', '要', '、', '文', '章', '创', '作', '、', '代', '码', '生', '成', '等', '任', '务', ',', '其', '中', '用', '户', '提', '供', '部', '分', '内', '容', ',', '而', '模', '型', '则', '帮', '助', '完', '成', '剩', '余', '的', '文', '本', '。']

四、总结

  1. 核心目标:掌握OpenAI官方分词器tiktoken的基础用法,理解“文本→token整数→文本”的完整流程,能精准计算文本的token数;
  2. 关键知识点
    • tiktoken是计算OpenAI模型token数的“金标准”,gpt-3.5-turbo/gpt-4默认使用cl100k_base编码;
    • Token是模型的最小处理/计费单位,英文按词根拆分、中文按单字拆分;
    • encode/decode实现文本与token序列的互转,decode_single_token_bytes可查看分词粒度;
  3. 实用价值
    • 提前计算token数,避免模型输入超限(如gpt-3.5-turbo单轮最大4096token);
    • 精准预估API调用成本(如gpt-3.5-turbo输入0.5美元/1000token,输出1.5美元/1000token)。

运行结果

当前模型(gpt-3.5-turbo)对应的分词器编码名称: cl100k_base
"China is great!"的token整数序列: [23078, 374, 2294, 0]
"China is great!"的token总数: 4
"tiktoken is great!"的token整数序列: [83, 1609, 5963, 374, 2294, 0]
"tiktoken is great!"的token总数: 6
中文长句的token整数序列: [44388, 87502, 54872, 25287, 33035, 40053, 11883, 35304, 37026, 28833, 99046, 246, 31634, 5486, 83125, 6701, 249, 19967, 5486, 47200, 45059, 50667, 89902, 3922, 92019, 20600, 29172, 84844, 34048, 17620, 44915, 3922, 69636, 54872, 25287, 47548, 13821, 106, 8239, 102, 61648, 21403, 102, 89783, 9554, 17161, 22656, 1811]
中文长句的token总数: 48
还原后的中文长句: 这种模型通常用于自动摘要、文章创作、代码生成等任务,其中用户提供部分内容,而模型则帮助完成剩余的文本。
"China is great!"的单个token词条(字节形式): [b'China', b' is', b' great', b'!']
"tiktoken is great!"的单个token词条(字节形式): [b't', b'ik', b'token', b' is', b' great', b'!']
中文长句的单个token词条(字节形式): [b'\xe8\xbf\x99', b'\xe7\xa7\x8d', b'\xe6\xa8\xa1', b'\xe5\x9e\x8b', b'\xe9\x80\x9a', b'\xe5\xb8\xb8', b'\xe7\x94\xa8', b'\xe4\xba\x8e', b'\xe8\x87\xaa', b'\xe5\x8a\xa8', b'\xe6\x91', b'\x98', b'\xe8\xa6\x81', b'\xe3\x80\x81', b'\xe6\x96\x87\xe7\xab\xa0', b'\xe5\x88', b'\x9b', b'\xe4\xbd\x9c', b'\xe3\x80\x81', b'\xe4\xbb\xa3\xe7\xa0\x81', b'\xe7\x94\x9f\xe6\x88\x90', b'\xe7\xad\x89', b'\xe4\xbb\xbb\xe5\x8a\xa1', b'\xef\xbc\x8c', b'\xe5\x85\xb6\xe4\xb8\xad', b'\xe7\x94\xa8\xe6\x88\xb7', b'\xe6\x8f\x90', b'\xe4\xbe\x9b', b'\xe9\x83\xa8', b'\xe5\x88\x86', b'\xe5\x86\x85\xe5\xae\xb9', b'\xef\xbc\x8c', b'\xe8\x80\x8c', b'\xe6\xa8\xa1', b'\xe5\x9e\x8b', b'\xe5\x88\x99', b'\xe5\xb8', b'\xae', b'\xe5\x8a', b'\xa9', b'\xe5\xae\x8c\xe6\x88\x90', b'\xe5\x89', b'\xa9', b'\xe4\xbd\x99', b'\xe7\x9a\x84', b'\xe6\x96\x87', b'\xe6\x9c\xac', b'\xe3\x80\x82']

进程已结束,退出代码为 0
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐