code/01-llm-basics/tokens.py

45 lines · 1.6 KB

Code 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()