跳至主要内容

基础原理

AI 词元是什么?

词元是语言模型真正读取和写出的最小单位,不是我们平时说的单词,也不是单个字符。这篇文章说明分词是如何进行的,输入词元和输出词元为什么要分开计数,以及为什么只有模型自己的分词器才能给出精确的词元数字。

全部文章 · 最近核实:

词元既不是单词,也不是字符

分词器把文本切分成片段,这些片段取自训练时学到的一份固定词表。常见的短词往往正好是一个词元;较长或较生僻的词可能被拆成两三个;单个不常见的符号本身也可能占用不止一个词元。标点、空格和换行同样是词元,并不是免费的。

这就是为什么词元数、单词数和字符数会各自独立变化。字数相同的两句话可能用掉不同数量的词元,把一句话改写成更短、更常见的词,也可能在不缩短文字长度的情况下减少词元数。

分词因语言和模型而不同

每个模型都自带一套分词器和一份固定词表,这份词表由训练所用的文本构建而成。在那份训练文本中常见的表达往往会被压缩成数量更少、更长的词元;罕见的表达则往往会被拆成数量更多、更短的片段。

由此直接得出两点。第一,同一句话用不同语言书写,可能耗费明显不同数量的词元,因为没有哪份词表能同样出色地表示两种语言。第二,同一句话在两个不同模型上也可能耗费不同数量的词元,因为每个模型都有自己的词表——用一个模型分词器数出来的结果,对另一个模型来说并不是可靠的估计。

一次请求会消耗输入词元和输出词元

每次请求都有两个分别计数、通常也分别计费的词元池。输入词元是发送给模型的一切:指令、可见的对话、任何附加文档以及工具结果。输出词元是模型作为回应生成的一切。

在多轮对话中,输入词元并不是一次性的开销。因为每个新请求都会把到目前为止的对话重新发送一遍,之前的消息和任何附加材料会在每一轮都被重新计为输入,而不只是在它们第一次被加入的那一轮。

词元是衡量上下文窗口的单位

上下文窗口是以词元表示的预算,由一次请求的输入和输出共用。《什么是上下文窗口?》解释了这份预算在实际中如何运作;这里重要的只是单位——窗口不是按单词、字符或消息数衡量的,而是按词元衡量的,输入和输出从同一个总量中支出。

在没有固定数字的情况下估算成本

基于词元的成本是一个乘法:用掉的词元数乘以每个模型各自设定的单价。供应商按自己的节奏设定和调整这些单价,能力更强的模型通常每词元定价高于较小的模型,输出词元通常也比输入词元定价更高。这些都不足以让在这里公布一个具体数字变得有意义——印在这个页面上的单价几个月内就会过时。

不管当前的价目表如何变化,成本的形态始终不变:更短、更聚焦的提示词和更短、更聚焦的回答会用掉更少的词元,而在一段长对话的每一轮里反复重发大附件,是词元用量在无人刻意决定的情况下悄悄增长的常见方式之一。

精确数字需要模型自己的分词器

关于每词平均对应多少词元的经验法则,只是针对某一种语言、由某一个分词器处理得出的近似值,无法套用到另一种语言、另一种文字或另一个模型上。格式同样会改变数字:代码、JSON 以及标点密集的文本,通常比用普通文字表达同样信息时分词效率更低。

如果精确数字很重要——因为请求接近上下文上限,或者因为需要精确预测成本——唯一可靠的方法是在发送前,把实际文本交给那个特定模型自己的分词器或计数接口处理。基于单词数或字符数的估算,只是披着数字外衣的猜测。

常见问题

词元和单词是一回事吗?
不是。常见的短词往往就是一个词元,但较长或较生僻的词可能被拆成好几个,标点、空格和换行本身也会被算作词元。词元数和单词数至多只是大致对应。
为什么同一句话在不同工具里给出的词元数不一样?
每个工具通常报告的是某个特定模型分词器的计数结果,而每个模型都有自己的词表,由它自己的训练文本构建而成。对一个模型分词器来说精确的计数,对另一个模型来说只是估计值。
像代码或 JSON 这样的格式会比纯文本用掉更多词元吗?
通常会。缩进、标点和重复出现的符号本身就是词元,所以结构很密集的格式,可能比用简单句子表达的同样信息明显多用词元。
发送请求之前,怎样才能知道它精确的词元数?
把确切的文本交给那个特定模型自己的分词器,或者它提供的计数接口。任何基于单词数或字符数的估算都只是近似值,而且语言、文字和格式的差异越大,误差就越大。

与其阅读,不如亲自试试

ClawAI 会在生成回答之后,统计一次请求实际用掉的输入和输出词元,并显示这条回答产生的成本和消耗的额度,而不是事先给出的估算。