code/01-llm-basics/tokens.py
45 lines · 1.6 KBCode and program output are shown exactly as they ran, so comments and printed output are in Chinese.
"""看看同一段文字在两个分词器眼里分别是什么样子。
准备工作(只需做一次):
1. 下载 DeepSeek 官方分词器并解压到当前目录:
https://cdn.deepseek.com/api-docs/deepseek_v4_tokenizer.zip
解压后会得到 deepseek_v4_tokenizer/tokenizer.json
2. 安装依赖:uv add tokenizers tiktoken
"""
import tiktoken
from tokenizers import Tokenizer
deepseek = Tokenizer.from_file("deepseek_v4_tokenizer/tokenizer.json")
openai_enc = tiktoken.get_encoding("o200k_base") # GPT-4o 等 OpenAI 模型用的分词器
samples = [
"人工智能正在改变软件开发的方式,越来越多的程序员开始用大模型写代码。",
"Artificial intelligence is changing how software is built, and more programmers now write code with large language models.",
"学而时习之,不亦说乎?有朋自远方来,不亦乐乎?",
"def add(a, b):\n return a + b\n",
"3.1415926535897932384626",
"😀",
]
def deepseek_pieces(text):
ids = deepseek.encode(text, add_special_tokens=False).ids
return [deepseek.decode([i]) for i in ids]
def openai_pieces(text):
pieces = []
for i in openai_enc.encode(text):
raw = openai_enc.decode_single_token_bytes(i)
# 一个汉字或表情可能被拆成几个字节,单独拿出来不是合法的 UTF-8
pieces.append(raw.decode("utf-8", errors="replace"))
return pieces
for text in samples:
ds, oa = deepseek_pieces(text), openai_pieces(text)
print(f"原文({len(text)} 个字符):{text!r}")
print(f" DeepSeek {len(ds):3d} 个词元:{ds}")
print(f" OpenAI {len(oa):3d} 个词元:{oa}")
print()