大模型基础知识:分词与提示工程详解
1. 分词(Tokenization)
回顾语言模型的基础,我们知道语言模型 $p$ 是建立在词元(token)序列上的一个概率分布输出。每个词元来自某个词汇表 $V$,例如以下形式:
["the", "mouse", "ate", "the", "cheese"]
技术提示:词元(Token)在自然语言处理(NLP)中通常指文本序列中的最小单元,可以是单词、标点符号、数字、符号或其他类型的语言元素。对于英文任务,一个 Token 可以是一个单词或标点;对于中文,通常以字或词作为 Token。
然而,自然语言并非天然以词元序列形式存在,而是以字符串形式存在(具体为 Unicode 字符的序列)。例如上述序列的自然语言形式为'the mouse ate the cheese'。
分词器的作用是将任意字符串转换为词元序列:
'the mouse ate the cheese.' ⇒ ['the', 'mouse', 'ate', 'the', 'cheese', '.']
虽然这部分不一定是语言建模中最引人注目的部分,但在确定模型的工作效果方面起着非常重要的作用。我们可以将其理解为自然语言和机器语言的一种隐式的对齐。特别是对于机器学习人员,日常了解的输入需要是数值的才能在模型中被计算,因此理解非数值类型的字符串是如何处理的至关重要。
1.1 基于空格的分词
从字面理解,分词就是把词分开,从而方便对词进行单独的编码。对于英文字母来说,由于其天然主要由'单词 + 空格 + 标点符号'组成,最简单的解决方案是使用 text.split(' ') 方式进行分词。这种分词方式对于英文这种按照空格分隔且每个分词后的单词有语义关系的文本是简单而直接的。
然而,这种方法存在明显局限:
- 中文问题:句子中的单词之间没有空格,例如'我今天去了商店。'无法通过空格切分。
- 复合词问题:德语中存在长复合词(如
Abwasserbehandlungsanlage),英语中有连字符词(如father-in-law)和缩略词(如don't),它们需要被正确拆分。 - 信息丢失:Penn Treebank 将
don't拆分为do和n't,这是基于信息的语言选择,但简单的空格划分可能破坏形态丰富的语言的语义结构。
什么样的分词才是好的?从直觉和工程实践角度考虑:
- 不希望有太多的词元(极端情况:字符或字节),否则序列会变得难以建模。
- 不希望词元过少,否则单词之间就无法共享参数(例如,
mother-in-law和father-in-law应该完全不同吗?),这对于形态丰富的语言(如阿拉伯语、土耳其语等)尤其重要。 - 每个词元应该是一个在语言或统计上有意义的单位。
1.2 Byte Pair Encoding (BPE)
字节对编码(Byte Pair Encoding, BPE)算法最初应用于数据压缩领域,现用于生成最常用的分词器之一。BPE 分词器需要通过模型训练数据进行学习,获得需要分词文本的一些频率特征。
学习分词器的过程,直觉上,我们先将每个字符作为自己的词元,并组合那些经常共同出现的词元。整个过程可以表示为:
- Input(输入):训练语料库(字符序列)。


