Tokens
Agora que os LLLMs
estão na moda, continuamos ouvindo sobre o número de tokens
suportados por cada modelo, mas o que são tokens
? São as unidades mínimas de representação de palavras.
Este caderno foi traduzido automaticamente para torná-lo acessível a mais pessoas, por favor me avise se você vir algum erro de digitação..
Para explicar o que são tokens
, vamos primeiro dar uma olhada em um exemplo prático: vamos usar o tokenizador da OpenAI, chamado [tiktoken] (https://github.com/openai/tiktoken).
Então, primeiro instalamos o pacote:
pip install tiktoken
```
Depois de instalado, criamos um tokenizador usando o modelo cl100k_base
, que o notebook de exemplo [How to count tokens with tiktoken] (https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb) explica que é usado pelos modelos gpt-4
, gpt-3.5-turbo
e text-embedding-ada-002
.
import tiktokenencoder = tiktoken.get_encoding("cl100k_base")
Agora, criamos uma palavra de amostra tara e a tokenizamos
import tiktokenencoder = tiktoken.get_encoding("cl100k_base")example_word = "breakdown"
E nós o simbolizamos
import tiktokenencoder = tiktoken.get_encoding("cl100k_base")example_word = "breakdown"tokens = encoder.encode(example_word)tokens
[9137, 2996]
A palavra foi dividida em 2 tokens, o 9137
e o 2996
. Vamos ver a quais palavras elas correspondem
word1 = encoder.decode([tokens[0]])word2 = encoder.decode([tokens[1]])word1, word2
('break', 'down')
O tokenizador OpenAI
dividiu a palavra breakdown
nas palavras break
e down
. Ou seja, ele dividiu a palavra em duas palavras mais simples.
Isso é importante porque, quando se diz que um LLM
suporta x token
s`, não significa que ele suporta x palavras, mas que suporta x unidades mínimas de representação de palavras.
Se você tiver um texto e quiser ver o número de token
s que ele tem para o tokenizador OpenAI
, poderá visualizá-lo na página Tokenizer, que mostra cada token
em uma cor diferente.
Vimos o tokenizador OpenAI
, mas cada LLM
poderá usar outro.
Como dissemos, os tokens
são as unidades mínimas de representação de palavras, portanto, vamos ver quantos tokens diferentes o tiktoken
tem.
n_vocab = encoder.n_vocabprint(f"Vocab size: {n_vocab}")
Vocab size: 100277
Vamos ver como ele tokeniza outros tipos de palavras.
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 fim, vamos dar uma olhada em palavras em outro 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: ['�', '�']
Podemos ver que, para palavras semelhantes, mais tokens são gerados em espanhol do que em inglês, portanto, para o mesmo texto, com um número semelhante de palavras, o número de tokens será maior em espanhol do que em inglês.