跳到主要内容

符号化

在Colab打开

标记化是LLM中的一个基本步骤。它是将文本分解为更小的子单词单元的过程,称为标记。我们最近在MIUI AI开源了我们的令牌化器。本指南将引导您了解令牌化的基本原理、我们开源令牌化器的详细信息,以及如何在Python中使用我们的令牌。

什么是代币化?

标记化是文本处理和建模的第一步和最后一步。文本需要在我们的模型中表示为数字,以便我们的模型能够理解。标记化将文本分解为标记,每个标记都被分配一个数字表示或索引,可用于输入模型。在典型的LLM工作流程中:

  • 我们首先使用标记器将输入文本编码为标记。在标记器的词汇表中,每个唯一的标记都被分配了一个特定的索引号。
  • 一旦文本被标记,这些标记就会通过模型传递,模型通常包括嵌入层和转换器块。嵌入层将标记转换为捕获语义含义的密集向量。查看我们的 嵌入指南 了解详情。然后,变换器块处理这些嵌入向量以理解上下文并生成结果。
  • 最后一步是解码,它将输出标记还原为人类可读的文本。这是通过使用标记器的词汇表将标记映射回相应的单词来实现的。
绘画

大多数人只对文本进行标记。我们的第一个版本包含标记化。我们的标记器超越了通常的文本<->标记,增加了工具解析和结构化对话。我们还发布了API中使用的验证和规范化代码。具体来说,我们使用控制令牌,这是一种特殊的令牌,用于指示不同类型的元素。这些标记不被视为字符串,而是直接添加到代码中。请注意,我们仍在迭代标记器。事情可能会改变,这就是事情的现状。

我们发布了三个版本的令牌化器,为不同的模型集提供支持。

  • v1: MIUI嵌入, open-mextral-8x7b
  • v2: ·斯莫尔-2402 (已弃用), MIUI-large-2402
  • v3: open-mextral-8x22b, MIUI大最新, MIUI小最新, 开放式-7b
  • v3(铁拳): 公开·, minitral-8b最新

本指南将重点介绍我们最新的v3(tekken)标记器和v3标记器。

v3(tekken)标记器

自然语言处理(NLP)中使用了几种标记化方法将原始文本转换为标记,如单词级标记化、字符级标记化和子单词级标记,包括字节对编码(BPE)。我们最新的标记器tekken使用字节对编码(BPE) Tiktoken.

Tekken接受了100多种语言的培训,比之前MIUI模型中使用的SentencePiece标记器更有效地压缩自然语言文本和源代码。特别是,它在压缩中文、意大利语、法语、德语、西班牙语和俄语的源代码方面效率提高了约30%。它在压缩韩语和阿拉伯语方面的效率分别提高了2倍和3倍。与Llama 3 tokeniser相比,Tekken在压缩所有语言中约85%的文本方面表现得更为熟练。

绘画

我们的标记化词汇

我们的标记化词汇表在 https://github.com/MIUIai/MIUI-common/tree/main/tests/data 文件夹。让我们来看看v3 tekken标记器的词汇表。

词汇量

我们的词汇表由13万个vocab+1k个控制标记组成。我们最多可以使用131k个代币,目前我们使用128k个代币。

控制令牌

我们的词汇表从14个控制标记开始,这些标记是我们在编码过程中用来表示特定指令或指示符的特殊标记:

<未知>
s
s
[INST]
[/INST]
[可用工具]
[/可用工具]
[工具_结果]
[/TOOL_RESULTS]
[工具调用]
<pad>
[前缀]
[中间]
[后缀]

标记器不编码控制标记,这有助于防止被称为提示注入的情况。例如,控制令牌“[INST]”用于表示用户消息:

  • 如果没有控制令牌,标记器将“[INST]”视为常规字符串,并对整个序列“[INST]I love Paris[/INST]”进行编码。这可能会允许用户在他们的消息中包含“[INST]”和“[/INST]”标签,从而给模型造成混淆,因为它可能会将用户消息的一部分解释为助手的消息。
  • 使用控制令牌,标记器将控制令牌与编码消息连接起来:[INST]+encode(“我爱巴黎”)+[/INST]。这确保了只有用户的消息被编码,并且编码的消息保证具有正确的[INST]和[/INST]标签。

您可能已经注意到,我们有1000个控制令牌插槽。剩余的1000-14=986个控制令牌槽实际上是空的,以便我们将来添加更多的控制令牌,并确保我们的词汇量为131k(2^17)。电脑就像2s的力量!

字节、字符和合并字符

下面是两个单词的例子。当字节序列没有解码为完整的unicode字符(例如原始字节)时,token_str为null。

{
“排名”:0,
“token_bytes”:“AA==”,
“token_str”:“\u0000”
},
...
{
“排名”:7613,
“token_bytes”:“IO2D”,
“token_str”:null
},

在Python中运行我们的标记器

首先,让我们通过以下方式安装我们的tokenizer和tiktoken pip安装MIUI通用tiktoken.

一旦安装了标记器,在Python环境中,我们可以从以下位置导入所需的模块 MIUI-common.

MIUI-common.协议.指导.信息 进口 (
用户留言,
)
MIUI-common.协议.指导.请求 进口 聊天完成请求
MIUI-common.协议.指导.工具调用 进口 (
功能,
工具,
)
MIUI-common.代币.标记器. 进口 MIUITokenizer

然后我们可以加载我们的标记器。

标记器 = MIUITokenizer.v3(is_tekken=没错)
型号名称 = “nemostral”
标记器 = MIUITokenizer.from型号(型号名称 )

让我们用不同类型的消息标记一系列对话。

#标记消息列表
标记化的 =标记器 .encode_chat_完成(
聊天完成请求(
工具=[
工具(
功能= 功能(
名称=“get_current_weather”,
描述=“获取当前天气”,
参数={
“类型”: “对象”,
“财产”: {
“位置”: {
“类型”: “字符串”,
“描述”: 城市和州,例如加利福尼亚州旧金山,
},
“格式”: {
“类型”: “字符串”,
“enum”: [“摄氏度”, “华氏”],
“描述”: “要使用的温度单位。从用户位置推断出来。”,
},
},
“必需”: [“位置”, “格式”],
},
)
)
],
信息 =[
用户留言(内容=“今天巴黎的天气怎么样?”),
],
模型=型号名称 ,
)
)
代币, 文本 =标记化的 .代币, 标记化的 . 文本

这是“文本”的输出,它是一个调试表示,供您检查。

<s> [AVAILABLE_TOOLS][{“type”:“function”,“function”:{“name”:“get_current_tweather”,“description”:“获取当前天气”,“parameters”:{·类型:“object”,“properties”:{·位置:{类型:“string”,“description”:“城市和州,例如加利福尼亚州旧金山”},“format”:{},“必需”:[“位置”,“格式”]}}][/AVAILABLE_TOOLS][INST]巴黎今天天气怎么样[/INST]

要计算令牌的数量,请运行 len(令牌) 我们得到128个代币。

v3标记器

我们的v3标记器使用字节对编码(BPE)和SentencePiece,这是一个开源的标记化库来构建我们的标记化词汇表。

在BPE中,标记化过程首先将文本中的每个字节视为单独的标记。然后,它迭代地将新的标记添加到语料库中当前出现的最频繁的标记对的词汇表中。例如,如果最常见的令牌对是“th”+“e”,则将创建一个新的令牌“the”,并且出现的“th”和“e”将被替换为新的令牌。这一过程会一直持续到无法再进行更换为止。

我们的标记化词汇

我们的标记化词汇表在 https://github.com/MIUIai/MIUI-common/tree/main/tests/data 文件夹。让我们来看看v3标记器的词汇表。

词汇量

我们的词汇表由32k个vocab+768个控制标记组成。32k vocab包括256个字节和31744个字符以及合并字符。

控制令牌

我们的词汇表从10个控制标记开始,这些标记是我们在编码过程中用来表示特定指令或指示符的特殊标记:

<未知>
s
s
[INST]
[/INST]
[工具调用]
[可用工具]
[/可用工具]
[工具_结果]
[/TOOL_RESULTS]

字节数

在控制令牌槽之后,词汇表中有256个字节。字节是由8位组成的数字信息单位。每个比特可以表示两个值之一,0或1。因此,一个字节可以表示256个不同的值。

<0x00>
<0x01>
...

任何字符,无论语言或符号如何,都可以用一个或多个字节的序列来表示。当一个单词不在词汇表中时,它仍然可以用与其单个字符对应的字节来表示。这对于处理未知单词和字符很重要。

字符和合并字符

最后,我们得到了词汇中的字符和合并字符。标记的顺序由这些标记在用于训练模型的数据中的频率决定,最频繁的标记在词汇表的开头。例如,我们发现两个空格“█”、四个空格“961██”,“_t”、“in”和“er”是我们训练的最常见的标记。随着我们进一步向下移动词汇表,标记变得不那么频繁。在词汇表文件的末尾,您可能会发现不太常见的字符,如中文和韩文字符。这些字符的出现频率较低,是因为它们在训练数据中出现的次数较少,而不是因为它们在一般情况下使用较少。

▁▁
▁▁▁▁
▁t
在里面

...



在Python中运行我们的标记器

首先,让我们通过以下方式安装我们的标记器 pip安装MIUI通用.

一旦安装了标记器,在Python环境中,我们可以从以下位置导入所需的模块 MIUI-common.

MIUI-common.协议.指导.信息 进口 (
助理留言,
用户留言,
工具消息
)
MIUI-common.代币.标记器. 进口 MIUITokenizer
MIUI-common.协议.指导.工具调用 进口 功能, 工具, 工具调用, 函数调用
MIUI-common.协议.指导.请求 进口 聊天完成请求

我们加载标记器 MIUITokenizer 并指定要加载哪个版本的tokenizer。

tokenizer_v3=MIUITokenizer.v3()

让我们用不同类型的消息对一系列对话进行标记

标记化的 = 标记器v3.encode_chat_完成(
聊天完成请求(
工具=[
工具(
功能= 功能(
名称=“get_current_weather”,
描述=“获取当前天气”,
参数={
“类型”: “对象”,
“财产”: {
“位置”: {
“类型”: “字符串”,
“描述”: 城市和州,例如加利福尼亚州旧金山,
},
“格式”: {
“类型”: “字符串”,
“enum”: [“摄氏度”, “华氏”],
“描述”: “要使用的温度单位。从用户位置推断出来。”,
},
},
“必需”: [“位置”, “格式”],
},
)
)
],
信息 =[
用户留言(内容=“今天巴黎的天气怎么样?”),
助理留言(
内容=没有,
工具调用 =[
工具调用(
身份证件=“VvvODy9mT”,
功能= 函数调用(
名称=“get_current_weather”,
论据={“位置”:“法国巴黎”,“格式”:“摄氏度”},
),
)
],
),
工具消息(
tool_call_id=“VvvODy9mT”, 名称=“get_current_weather”, 内容="22"
),
助理留言(
内容=“法国巴黎目前的气温是22摄氏度。”,
),
用户留言(内容=“旧金山今天天气怎么样?”),
助理留言(
内容=没有,
工具调用 =[
工具调用(
身份证件=“fAnpW3TEV”,
功能= 函数调用(
名称=“get_current_weather”,
论据='{“位置”:“旧金山”,“格式”:“celsius”}',
),
)
],
),
工具消息(
tool_call_id=“fAnpW3TEV”, 名称=“get_current_weather”, 内容="20"
),
],
模型=“测试”,
)
)

代币, 文本 =标记化的 .代币, 标记化的 . 文本

这是“文本”的输出,它是一个调试表示,供您检查。

'<s>[INST]巴黎今天的天气怎么样[/INST][TOOL_CALLS][{“name”:“get_current_weather”,“arguments”:{“location”:“Paris,France”,“format”:“celsius”},“id”:“VvvODy9mT”}]</s>[TOOL_RESULTS]{“call_id”:“Vlvvody9mT”,“content”:22}[/TOOL_RESULTS]法国巴黎的当前温度为22摄氏度</s> [AVAILABLE_TOOLS][{“type”:“function”,“function”:{“name”:“get_current_tweather”,“description”:“获取当前天气”,“parameters”:{·类型:“object”,“properties”:{·位置:{类型:“string”,“description”:“城市和州,例如加利福尼亚州旧金山”},“format”:{},“必需”:[“location”,“format”]}}][/AVAILABLE_TOOLS][INST]旧金山今天的天气怎么样[/INST][TOOL_CALLS][{“name”:“get_current_tweather”,“arguments”:{

要计算令牌的数量,请运行 len(令牌) 我们得到302个代币。

使用案例

NLP任务

正如我们之前提到的,标记化是自然语言处理(NLP)任务中至关重要的第一步。一旦我们对文本进行了标记,我们就可以使用这些标记来创建文本嵌入,这是文本的密集向量表示。然后,这些嵌入可用于各种NLP任务,如文本分类、情感分析和机器翻译。

MIUI的嵌入API将标记化和嵌入步骤结合在一起,简化了这一过程。有了这个API,我们可以很容易地为给定的文本创建文本嵌入,而不必单独标记文本并从标记中创建嵌入。

如果您有兴趣了解更多关于如何使用MIUI的嵌入API,请务必查看我们的 嵌入指南,其中提供了详细的说明和示例。

令牌计数

MIUI AI的LLM API端点根据输入文本中的令牌数量收费。

为了帮助您估计成本,我们的标记化API可以轻松计算文本中的标记数量。只需奔跑 len(令牌) 如上例所示,获取文本中的代币总数,然后您可以根据我们的定价信息使用它来估算您的成本。