返回资讯中心
外部精选
软件工程
#开发者实时流

开发者用字体实现无需分词器的 token 可视化

来源标题:Tokenizer Mono

开发者制作了一款特殊字体,在浏览器中打字时无需调用分词器即可实时高亮 token。每个高亮都由字体本身绘制,JavaScript 仅用于切换字体。该字体于 2026 年 11 月 4 日发布,代码已公开。

Hacker News 最新georgemandis2026/11/4 · 5 天前30 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

2026年11月4日 • 约6,000词 • 阅读约30分钟

市面上有很多工具可以帮你把token可视化,让你更好地理解大语言模型的分词机制。OpenAI有一个相当不错的工具,另外还有五六个也很好用。

它们的工作原理大同小异:把文本送进真正的tokenizer,取出token边界,然后在浏览器里高亮显示。这种方案快速、准确,也完全合理。

于是我做了件稍微不太合理的事:用现代字体的“黑魔法”做了一个字体,让你在打字时就能看到token的可视化效果,而无需真正进行分词。代码在:

你可以在下面把玩它。每一处高亮都是字体画出来的。没有脚本!这里唯一的JavaScript只负责切换加载哪个字面。

token是语言模型的基本货币单位。它是模型实际读取和产出的东西。

一个token通常是一段文本:一个字符、一个词、一个词的一部分,偶尔是更长的序列。许多现代LLM tokenizer都有一个固定的词表,通常包含大约50,000到250,000个条目。

这个词表不一定只由常规单词组成。常见的字符组合、标点、空白,甚至跨多个词的序列,都可以拥有自己的条目。

词表从哪来?没人手工编写它。本文涉及的几乎所有tokenizer都使用某种形式的字节对编码(BPE),通过计数来构建词表。在简化版的BPE中,先把每个字符(在字节级tokenizer中是每个字节)都当作独立token。然后在一大堆训练文本中找出出现频率最高的相邻token对,比如“t”后面跟着“h”,把它合并成新token“th”。再看一遍:也许“th”后面跟着“e”是最常见的组合,于是“the”成为一个token。

如此反复成千上万次。每次合并都会向词表添加一个条目,合并列表按学习顺序与词表一起保存。对新文本分词时,tokenizer先把它拆成字符,再按同样的顺序重放这些合并,于是常见词坍缩为单个token,生僻词则保持碎片状态。一个词的具体切分方式取决于哪些合并排名更高,这一点后面会用到。

如果时间线足够长,整本《爱丽丝梦游仙境》会不会变成一个token?《圣经》的每一个出版版本呢?这是个有趣的思维实验。

虽然目前还没有人把整本小说或宗教典籍当作token纳入词表(而且我怀疑在我们把规模推到那种程度之前,早就有更好的技术登场了),但这些词表确实在变大!GPT-2有50,257个token;GPT-4的tokenizer有100,277个;GPT-4o的有200,019个。

这种增长部分反映了日益雄心勃勃的多语言支持:OpenAI的GPT-4o公告显示,同一句古吉拉特语在新tokenizer下从145个token降到33个,而英语几乎没有变化。

旁注:Rest of World有一篇不错的文章讲AI对非英语语言的开销,涉及多语言支持、token以及这在视觉上如何体现。我觉得完全没讨论中文——中文有时比拉丁字母语言更省token!——算是个遗漏。

所以当Meta的Muse之类的产品夸口免费给你10亿token时,说的就是这个:处理了10亿个文本单位,而不是10亿个词(经验法则似乎稳定在每token约0.75个词,所以如果有帮助,你可以把任何token数乘以这个系数当作词数来读)。而取决于由哪个tokenizer来计数,同样的文本可能消耗惊人地不同数量的token!

写到这里,我想在日常生活中开始按token(也就是词)收费了。嗯。

关于token的延伸阅读:BPE论文,Sennrich et al. 2016;SentencePiece,Google的方案,被Llama 2、Gemma和T5使用;以及Hugging Face的tokenizers库,它能读取大多数开放tokenizer。

Tokenizer Mono是一个字体家族,不同的字面映射到不同的tokenizer。这让你在打字时就能看到token,而无需额外的计算和重组步骤。

这是一个大的字体家族——“Tokenizer Mono”,基于IBM Plex——每个tokenizer模型对应一种样式。macOS的字体册应该会把它们注册为一个家族,共28种样式。

下面是同一个句子在所有这些不同tokenizer中的可视化效果。

差别很细微,但你能发现一些有趣的差异。Llama 2把“fox”和“tokenize”拆开了,而OpenAI(以及其他一些)没有。BERT完全不对空白分词(唉,它永远不擅长Python)。说到空白和Python:cl100k把return前的四个空格缩进中的前三个空格作为一个token,然后把第四个空格并入“ return”,而Gemma把四个空格都保留为单个token。

关于厂商和模型的说明:据我所知,Anthropic的tokenizer不公开,所以没有Claude字面。Gemini的也不公开,不过如果它是Gemma的某种演进版本,我也不会感到震惊?OpenAI通过tiktoken发布其编码,其模型表把直到GPT-5的所有模型都映射到o200k_base,所以o200k字面覆盖了这些。我不确定像Astra(GPT-6)这样的最新模型。

整个项目就是一次尝试,看看我能把OpenType字形替换推到多远——我知道它存在,概念上也理解,但从未真正玩过。

在我看来,微软的OpenType规范页面把这一点解释得很优雅。

(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →