模型与参数

分词器:提示词为什么会被截断和读错

又称 tokenizer, embedding ai, token, 词元, 文本编码器

分词器(tokenizer)负责把文本切成模型能处理的离散单元,再把每个单元映射成一个 id、进而查成向量(embedding)。它决定了你的提示词到底有多少内容真被读进去,也决定了生僻词会被切成什么碎片,这就是为什么冷门名字经常生成出毫不相干的东西。

一个界面上看不见的步骤

在你的提示词和模型之间,隔着一张查找表。分词器持有一份固定词表,通常三万到十万条,内容是字符、词片和常见完整词。你的文字被贪心地匹配进去,输出是一串整数。

weathered brass diving helmet 大概会变成五六个 token;Zooop 会被切成类似 zo + op + p 的碎片,因为词表里没有它。每个 id 接着去 embedding 表里取向量,这些向量才被文本编码器加工成引导生成的条件信号。

创作者能感知到的所有「提示词行为怪癖」,根源都在这一步,而这一步在界面上完全不可见。

token 预算,以及它为什么随模型而变

咬人最狠的上限是 77 个 token,继承自 CLIP。它折算成六七十个英文单词,而这 77 个位置里还有两个是保留标记。超限的文字不会被摘要、也不会被压缩,它是被直接丢掉的,且没有任何提示。

这一个事实就能解释一种非常常见的体验:你写了一条一百五十词的详细提示词,模型好像只听开头、不理结尾。它不是不理,它根本没收到。

新架构把天花板抬上去了。用 T5 或大模型文本编码器的模型能吃几百个 token,而且确实会奖励更长、结构更清楚的描述。所以「提示词该写多长」是模型的属性,不是一条通则,为一个模型调好的提示词换一族模型可能表现完全不同。

按重要程度排序的实操结论:

  • 重要的放前面。 主体、动作、景别先写。真要被截断或被降权,就让尾部那些风格形容词去挨。
  • token 花在名词上,别花在填充词上。 冠词、连词、客套话都在吃额度。
  • 非英文提示词更贵。 在词表里占比低的文字会被切得很碎,同样内容要吃两到三倍额度。仅这一条,就让英文提示词在 CLIP 时代的模型上有真实优势。
  • emoji、冷门 unicode、长连字符串很贵,而且几乎传达不了你想要的含义。

生僻词和品牌名为什么会翻车

词表里没有的词会变成碎片,而模型没给这些碎片挂任何概念。它仍然会出图,用碎片沾到的联想拼出来。你指名一个具体产品、一个冷门地名或一个自创角色时,那些「不知从哪来」的结果就是这么产生的。

三条绕开的路:

  1. 描述,而不是指名。 形状、材质、颜色、年代,模型对这些都有很强的概念。
  2. 给参考图。 对必须一模一样的物件,一张图胜过任何指名。
  3. 把这个 token 训出来。 文本嵌入或 LoRA 的作用正是给一个选定的触发词挂上一个真实概念,解决的就是这个问题。

分词带来的另一个副作用

属性串味。写 a red cube and a blue sphere,你会经常拿到一个蓝色的立方体。编码器为整条提示词产出的是一个整体条件向量,颜色 token 和物体 token 之间的绑定,远比你句子的语法看起来那么牢固。

比较可靠的绕法:一条提示词只描述一个主体,其余的后期合成;工具支持的话用分区条件或蒙版;或者把更重要的那一组配对写在前面,因为靠前的 token 权重更高。很多时候只把同样的词换个顺序,就足以决定哪个物体拿到那个颜色。

这个效果的提示词

一条能稳定出效果的起点。主体和场景可以换,技术性的那几句留着。

Weathered brass diving helmet on a workbench, single hard key light from the left, dark background, macro detail on scratches

试一下:分词器

打开生成器,参数已经预填好。

常见问题

分词器具体做了什么?
它按一份固定词表把你的文字转成一串数字 id,遇到词表里没有的就切成更小的碎片。这些 id 随后被查成 embedding 向量,那是模型唯一能读的形式。没有这一步,提示词进不去模型。
77 token 上限是怎么来的?
基于 CLIP 的文本编码器(Stable Diffusion 时代的大多数图像模型都用它)只接受 77 个 token,其中两个还是特殊标记,折算下来大约六七十个英文单词。超出的部分被静默丢弃。改用 T5 或大模型做编码器的新模型能吃几百个 token,所以长提示词在有些模型上有效、在有些模型上无效。
一个 token 等于一个词吗?
不等于。常见词通常是一个 token,较长或较生僻的词会被切成几块,标点和空格也算。粗略估计,100 个英文单词约 130 个 token。非拉丁文字切得更碎,同样内容的中文提示词可能要吃掉两到三倍的额度。
为什么模型总把品牌名和自创名字弄错?
对模型来说,一个没见过的名字不是一个概念,只是几个子词碎片。这些碎片带着它们在别处沾到的含义,于是结果是由一堆不相关的联想拼出来的。改成描述这个东西,或者直接给一张参考图。
怎么知道提示词用了多少 token?
有些界面会实时显示计数,任意 CLIP 或 GPT 的 tokenizer 试算工具也够估个数。实用的捷径是:图像提示词控制在六十词以内,把绝对不能丢的内容放在第一个从句里。
分词器和 embedding 是一回事吗?
不是。分词器负责切分和查 id,embedding 是把每个 id 变成可参与计算的向量的那张表。用 embedding ai 的说法讲,分词是离散的记账,embedding 才是意义开始存在的地方。

相关术语