您可能还记得曾经有一段时间,大多数LLM无法告诉您"strawberry"这个单词里有几个字母r。但这是为什么呢?这个答案揭示了语言模型擅长什么、觉得什么困难,以及它们如何使用数学来生成文本的许多令人惊讶的事情。它还解释了您的用量是如何计算的,这会影响您多快触及速率限制,或者您的API账单可能是什么样子。
让我们从一次角色互换开始。
这是一道热身题,尽管大胆猜测即可。
如果您输入"Hello Claude"并按下发送,您认为模型会收到什么?
表示文本的三种方式
想一想这个三字符字符串:"Hi!"。现在想一想我们可以用三种不同的方式把这些信息传递给语言模型。
- 您所看到的确切方式。 一个字符串:
"Hi!"。 - 作为一个字符列表。
['H', 'i', '!']。方括号[]表示列表;这个特定的列表里有三个项目。 - 每个字符对应一个数字。 每个字符都可以对应一个标准数字:
'H'是72,'i'是105,'!'是33。
string: "Hi!"
characters: [ 'H', 'i', '!' ]
numbers: [ 72, 105, 33 ]虽然这三种方法在代码中各有用途,但语言模型会做第四件更具策略性的事:传入的仍然是一个数字列表,但不是根据固定表格为每个字符分配一个数字,而是为文本的每个块分配一个数字,这个数字来自模型学习到的词表。
一个带有数字ID的文本块被称为一个令牌(token)。
令牌
下面的小部件包含几段您可以分词(tokenize)的文本。点击浏览示例,对每一段进行分词,亲自看看:令牌和单词有什么不同?
多了还是少了?
既然您已经知道令牌是什么样子了,看看您能否预测对以下字符串进行分词会产生多少个令牌。
为什么是子词?
您可能会想:为什么不是每个字符一个令牌,或者每个单词一个令牌?
分词器能够产生的一组唯一令牌ID被称为它的词表(vocabulary)。确定恰到好处的令牌大小和词表大小目前仍需要一些探索和研究,但大多数公开的分词器都力求达到一个"恰到好处"的区间。来看看句子"The tokenizer rocks."被三种不同的分词器以三种不同方式切分的情况。
使用微小令牌(每个字符一个)时,这句话需要花费20个令牌。这处理起来会既慢又贵!
[T] [h] [e] [ ] [t] [o] [k] [e] [n] [i] [z] [e] [r] [ ] [r] [o] [c] [k] [s] [.]使用大型令牌(每个单词一个)时,这句话只需要花费4个令牌,但模型将不得不学习一个庞大的词表,才能认识"tokenizer"这样的小众词汇:
[The] [ tokenizer???] [ rocks] [.]采用折中方案(每个单词或子词一个令牌)时,这句话需要花费5个令牌,而词表也不必包含那么多专业词汇:
[The] [ token] [izer] [ rocks] [.]分词器的词表是固化在模型中的,一旦训练完成便无法更改。任何特定模型都被称为"锁定于某个分词器",因为它从始至终只学到了令牌4062的含义,而不是"quick"的含义。
解码输出
所以现在您知道,您发送给模型的文本在被处理之前会变成一个令牌ID列表。模型的输出同样是一个令牌ID列表。试着解码这条回复。
从令牌到含义
分词为每个文本块赋予一个数字,但像9906和9907这样ID相近的令牌并不相关——它们只是列表中相邻的项。模型需要一种方法来知道cat和kitten在含义上是接近的,即使它们在词表中的ID相距甚远。模型通过为每个令牌分配一个多维分数来实现这一点。
让我们从一个二维评分系统开始。
嵌入(Embeddings)
LLM嵌入的工作方式与您刚才所做的评分相同。每个单词(或者更准确地说,每个令牌)都会变成一个点,相似的单词(令牌)会落在彼此附近。真实的嵌入在两个方面更为复杂:
- LLM嵌入有成千上万个维度,而不仅仅是两个。您可以想象我们还可以加入一个表示"危险"的坐标轴,这可能有助于我们把老虎和小猫区分开来。
- 单个维度所捕捉到的含义没有标签,它实际表示的东西甚至可能没有很好的人类词汇与之对应。"可爱程度"确实存在于某处,但并没有一个明确命名为"可爱"的坐标轴——模型是在训练过程中发明或发现这些维度的,而解读这些维度含义的过程正是可解释性(interpretability)研究的一个重点。
在2维、3维和成千上万维中考察"cat"
2 dimensions "cat" = [ 8.0, 3.5 ] cute, big
3 dimensions "cat" = [ 8.0, 3.5, 1.0 ] cute, big, dangerous
4,096 dimensions "cat" = [ 0.031, -0.184, 0.772, …, -0.094 ] (no labels)
The exact number of dimensions varies by model. 4,096 is a common size in open-weight models.想进一步探索嵌入?让Claude为您构建一个可视化:
我正在学习嵌入。我理解一个令牌会变成多维空间中的一个点,相似的令牌会落在彼此附近,并且这些维度没有用人类词汇标注。帮我建立直觉:制作一个交互式可视化,把几十个日常单词放进一个小型嵌入空间里,让我选择任意一个单词并查看它的最近邻,再让我添加一个自己的单词,看看它落在哪里,以及为什么。
回顾
所以现在您知道,您发送给LLM的文本会变成一系列令牌,而令牌又会变成嵌入。
text: "Hi"
token: [ 13347 ]
embedding: [ 0.12, -0.48, 0.91, …, 0.07 ]恭喜!这是理解语言模型如何工作的重要一步。
您可能已经凭直觉意识到,嵌入中所捕捉的信息(事物有多可爱、多大,以及一切其他方面)在语言模型理解输入并选择正确输出的过程中起着巨大的作用。如果是这样,您的直觉是正确的!
如果以下四句话对您来说都成立,那么您已经掌握了本课想要教授的内容。
- 您能够解释为什么一个100字符的URL比一个100字符的句子消耗更多的令牌。
- 您能够大致预测一段文本会产生多少个令牌。
- 您知道为什么模型会锁定于其分词器,以及为什么较罕见的单词会被切分成多个片段。
- 您能够使用"分数"、"维度"和"邻近"这几个词来解释什么是嵌入,以及它为什么重要。
下一步:上下文如何影响Claude的性能和成本(在新标签页中打开) · 选择合适的Claude模型(在新标签页中打开) · 在Claude中选择努力程度(在新标签页中打开) · 在Claude Code中(在新标签页中打开)