Tokens
Ahora que están en auge los LLM
s, no paramos de escuchar el número de token
s que admite cada modelo, pero ¿qué son los token
s? Son las unidades mínimas de representación de las palabras
Para explicar qué son los token
s, primero veámoslo con un ejemplo práctico, vamos a usar el tokenizador de OpenAI
, llamado tiktoken.
Así que, primero instalamos el paquete:
pip install tiktoken
Una vez instalado creamos un tokenizador usando el modelo cl100k_base
, que en el notebook de ejemplo How to count tokens with tiktoken explica que es el usado por los modelos gpt-4
, gpt-3.5-turbo
y text-embedding-ada-002
import tiktokenencoder = tiktoken.get_encoding("cl100k_base")
Ahora creamos una palabra de ejemplo tara tokenizarla
import tiktokenencoder = tiktoken.get_encoding("cl100k_base")example_word = "breakdown"
Y la tokenizamos
import tiktokenencoder = tiktoken.get_encoding("cl100k_base")example_word = "breakdown"tokens = encoder.encode(example_word)tokens
[9137, 2996]
Se ha dividido la palabra en 2 token
s, el 9137
y el 2996
. Vamos a ver a qué palabras corresponden
word1 = encoder.decode([tokens[0]])word2 = encoder.decode([tokens[1]])word1, word2
('break', 'down')
El tokenizador de OpenAI
ha dividido la palabra breakdown
en las palabras break
y down
. Es decir, ha dividido la palabra en 2 más sencillas.
Esto es importante, ya que cuando se dice que un LLM
admite x token
s no se refiere a que admite x palabras, sino a que admite x unidades mínimas de representación de las palabras.
Si tienes un texto y quieres ver el número de token
s que tiene para el tokenizador de OpenAI
, puedes verlo en la página Tokenizer, que muestra cada token
en un color diferente
Hemos visto el tokenizador de OpenAI
, pero cada LLM
podrá usar otro
Como hemos dicho, los token
s son las unidades mínimas de representación de las palabras, así que vamos a ver cuántos tokens distintos tiene tiktoken
n_vocab = encoder.n_vocabprint(f"Vocab size: {n_vocab}")
Vocab size: 100277
Vamos a ver cómo tokeniza otro tipo de palabras
def encode_decode(word):tokens = encoder.encode(word)decode_tokens = []for token in tokens:decode_tokens.append(encoder.decode([token]))return tokens, decode_tokens
def encode_decode(word):tokens = encoder.encode(word)decode_tokens = []for token in tokens:decode_tokens.append(encoder.decode([token]))return tokens, decode_tokensword = "dog"tokens, decode_tokens = encode_decode(word)print(f"Word: {word} ==> tokens: {tokens}, decode_tokens: {decode_tokens}")word = "tomorrow..."tokens, decode_tokens = encode_decode(word)print(f"Word: {word} ==> tokens: {tokens}, decode_tokens: {decode_tokens}")word = "artificial intelligence"tokens, decode_tokens = encode_decode(word)print(f"Word: {word} ==> tokens: {tokens}, decode_tokens: {decode_tokens}")word = "Python"tokens, decode_tokens = encode_decode(word)print(f"Word: {word} ==> tokens: {tokens}, decode_tokens: {decode_tokens}")word = "12/25/2023"tokens, decode_tokens = encode_decode(word)print(f"Word: {word} ==> tokens: {tokens}, decode_tokens: {decode_tokens}")word = "😊"tokens, decode_tokens = encode_decode(word)print(f"Word: {word} ==> tokens: {tokens}, decode_tokens: {decode_tokens}")
Word: dog ==> tokens: [18964], decode_tokens: ['dog']Word: tomorrow... ==> tokens: [38501, 7924, 1131], decode_tokens: ['tom', 'orrow', '...']Word: artificial intelligence ==> tokens: [472, 16895, 11478], decode_tokens: ['art', 'ificial', ' intelligence']Word: Python ==> tokens: [31380], decode_tokens: ['Python']Word: 12/25/2023 ==> tokens: [717, 14, 914, 14, 2366, 18], decode_tokens: ['12', '/', '25', '/', '202', '3']Word: 😊 ==> tokens: [76460, 232], decode_tokens: ['�', '�']
Por último vamos a verlo con palabras en otro idioma
word = "perro"tokens, decode_tokens = encode_decode(word)print(f"Word: {word} ==> tokens: {tokens}, decode_tokens: {decode_tokens}")word = "perra"tokens, decode_tokens = encode_decode(word)print(f"Word: {word} ==> tokens: {tokens}, decode_tokens: {decode_tokens}")word = "mañana..."tokens, decode_tokens = encode_decode(word)print(f"Word: {word} ==> tokens: {tokens}, decode_tokens: {decode_tokens}")word = "inteligencia artificial"tokens, decode_tokens = encode_decode(word)print(f"Word: {word} ==> tokens: {tokens}, decode_tokens: {decode_tokens}")word = "Python"tokens, decode_tokens = encode_decode(word)print(f"Word: {word} ==> tokens: {tokens}, decode_tokens: {decode_tokens}")word = "12/25/2023"tokens, decode_tokens = encode_decode(word)print(f"Word: {word} ==> tokens: {tokens}, decode_tokens: {decode_tokens}")word = "😊"tokens, decode_tokens = encode_decode(word)print(f"Word: {word} ==> tokens: {tokens}, decode_tokens: {decode_tokens}")
Word: perro ==> tokens: [716, 299], decode_tokens: ['per', 'ro']Word: perra ==> tokens: [79, 14210], decode_tokens: ['p', 'erra']Word: mañana... ==> tokens: [1764, 88184, 1131], decode_tokens: ['ma', 'ñana', '...']Word: inteligencia artificial ==> tokens: [396, 39567, 8968, 21075], decode_tokens: ['int', 'elig', 'encia', ' artificial']Word: Python ==> tokens: [31380], decode_tokens: ['Python']Word: 12/25/2023 ==> tokens: [717, 14, 914, 14, 2366, 18], decode_tokens: ['12', '/', '25', '/', '202', '3']Word: 😊 ==> tokens: [76460, 232], decode_tokens: ['�', '�']
Pdemos ver para palabras similares, en español se generan más token
s que en inglés, por lo que para un mismo texto, con un número similar de palabras, el número de token
s será mayor en español que en inglés