¿Qué son los tokens?

En este artículo veremos qué son los tokens y por qué son fundamentales al momento de implementar aplicaciones haciendo uso de Grandes Modelos de Lenguaje.

¡Así que listo, comencemos!

Video

Como siempre, en el canal de YouTube se encuentra el video de este post:

Introducción

Muchos hemos oído hablar del término token cuando nos referimos a los Grandes Modelos de Lenguaje, como por ejemplo en el caso de modelos como GPT-4, o al usar aplicaciones como ChatGPT.

Y este concepto de los tokens resulta fundamental pues en lugar de procesar el texto que introducimos lo que hacen estos modelos es recibir y generar precisamente tokens.

Así que en este artículo veremos todos los conceptos esenciales relacionados con los tokens. Entonces, vamos a entender qué son, cómo se generan y por qué resultan esenciales al momento de usar los Grandes Modelos de Lenguaje.

Al final del artículo tendremos claros todos estos sencillos conceptos que resultan claves al momento de construir aplicaciones basadas en estos Grandes Modelos de Lenguaje.

¿Cuál es la forma más adecuada de representar el texto?

En un artículo anterior vimos qué son los Grandes Modelos de Lenguaje (o Large Language Models), los cuales se basan a su vez en las Redes Transformer, y que permiten procesar el texto generado por nosotros los humanos (es decir el Lenguaje Natural).

Esto quiere decir que estos modelos reciben texto a la entrada y generan texto a la salida.

Así que es necesario que internamente haya un procedimiento que permita convertir este texto a una representación numérica para que el modelo lo procese, genere una predicción en formato numérico y luego la convierta a texto para que nosotros podamos entender la respuesta generada por el modelo.

Y la equivalencia texto a número se conoce como el vocabulario del modelo y existen diferentes formas de construir este vocabulario.

Codificación a nivel de caracteres

Una primera alternativa sería simplemente representar cada caracter en el texto con un número e ingresar esta secuencia de números al modelo. Es decir, codificar el texto a nivel de caracteres.

Pero este enfoque tiene varios inconvenientes. Uno de los principales problemas es que si el texto de entrada es extenso, con miles o millones de caracteres, tendríamos una secuencia de números inmensa que requeriría una gran capacidad de cómputo y de memoria para que el modelo pueda procesarla.

Es decir que en términos simples no resulta eficiente representar cada caracter con un número.

Codificación a nivel de palabras

La segunda alternativa es representar cada palabra con un número, es decir codificar el texto a nivel de palabras.

Este enfoque es un poco más eficiente que la codificación a nivel de caracteres. Por ejemplo, en el texto “el gato duerme plácidamente” tenemos 4 palabras y un total de 27 caracteres (incluyendo espacios en blanco). La codificación a nivel de palabra requeriría sólo 5 números (incluyendo los espacios en blanco), mientras que a nivel de caracteres requeriría 27 números.

Sin embargo, esta codificación a nivel de palabra tampoco es la mejor solución. Uno de los problemas es que los lenguajes naturales tienen una inmensa cantidad de palabras únicas así que al tener muchas palabras seguiríamos necesitando un vocabulario inmenso.

Otro problema que surge es ¿qué hacer con palabras que no estén en el vocabulario?. Si dentro del texto aparece una palabra desconocida, que no esté inicialmente en el vocabulario, el modelo no podrá procesarla adecuadamente.

Y otro problema es que en el lenguaje natural muchas palabras están relacionadas a través de lo que se conoce como las variantes morfológicas. Por ejemplo las palabras gato, gata, gatito, gatos, gatitos tienen una secuencia de caracteres que es común a todas (las letras “g”, “a” y “t”) y de alguna forma el vocabulario usado debería aprovechar estas similitudes para hacer la codificación.

Así que la idea al momento de representar el texto numéricamente a través del vocabulario es lograr que esta codificación sea lo más compacta posible (para evitar introducir demasiados datos al modelo) aprovechando además las particularidades de cada lenguaje.

Y acá es donde aparece el concepto de tokens del cual hablaremos en detalle a continuación.

¿Qué son los tokens?

Acabamos de ver que no siempre la codificación a nivel de caracteres o a nivel de palabras resulta siendo la más adecuada.

Así que en los Grandes Modelos de Lenguaje lo que se usa es la codificación del texto a través de tokens, que son simplemente el resultado de tomar un texto y “partirlo” en pequeños pedazos teniendo en cuenta las características propias del lenguaje que se está usando.

Así, un token puede ser una palabra, una sub-palabra (es decir una parte de una palabra) o por ejemplo un signo de puntuación. Es decir que la codificación con tokens es un punto intermedio entre la codificación a nivel de caracteres y la codificación a nivel de palabra de la que hablamos hace un momento.

Entendamos este concepto con algunos ejemplos.

La palabra “una” es tokenizada (es decir convertida a tokens) como “una”, es decir es exactamente igual a 1 token.

Pero la palabra “puntos” es tokenizada con 2 tokens: “punt” y “os”. Y esto se debe a que la secuencia de caracteres “punt” aparece en varias palabras del Español y por tanto, por ser relativamente común, se codifica como un sólo token.

Por ejemplo, podemos encontrar las palabras puntillas y puntapié que tienen exactamente la misma secuencia inicial de caracteres “p”, “u”, “n” y “t”.

Así, dependiendo del lenguaje y de la palabra en particular, un token puede ser exactamente una palabra o una porción de una palabra.

Ventajas de usar tokens

Y esta codificación termina siendo más eficiente que codificar el texto a nivel de caracteres o de palabras individuales y resuelve inconvenientes como la aparición de vocabularios inmensos (que requieren más memoria y más capacidad de procesamiento) o como la presencia de palabras desconocidas

Entonces, lo que hacen los algoritmos que permiten obtener estos tokens es analizar una gran cantidad de texto (lo que se conoce como corpus) y buscar pequeñas secuencias de caracteres que se repitan comúnmente dentro de este texto.

Y estos tokens son precisamente la unidad fundamental de información que es procesada y generada por los Grandes Modelos de Lenguaje.

Ejemplos de “tokenización”

La “tokenización” es precisamente el proceso de convertir el texto en tokens, así que entendamos más en detalle este proceso con varios ejemplos.

La “tokenización” y el vocabulario

En primer lugar es importante recordar que la tokenización implica el uso de un vocabulario: por cada token habrá un número equivalente y este es el número que realmente usado internamente por el modelo bien sea a la entrada (al momento de procesar el texto) o a la salida (al momento de generar dicho texto).

Así, en el texto “el gato duerme” tendremos un total de 6 tokens (“el”, " g", “ato”, " du", “er” y “me”) cuyos equivalentes numéricos son 417, 308, 5549, 7043, 263 y 1326.

La “tokenización” y los espacios en blanco

En segundo lugar es importante tener en cuenta que la tokenización se lleva a cabo incluyendo los espacios en blanco.

Por ejemplo, el texto “este y este” es tokenizado con 3 tokens: “este”, " y" y " este".

Acá podemos ver que el primer token (“este”) no contiene un espacio en blanco al comienzo, mientras que el segundo token (" y") así como el tercer token (" este") sí contienen los espacios en blanco correspondientes.

Una palabra y múltiples tokens

Además, como lo vimos hace un momento, una palabra puede representarse con varios tokens. Por ejemplo la palabra “esto” se representa con dos tokens: “est” y “o”.

“Tokenización” y emojis

También, muchas veces en el lenguaje escrito podemos encontrar emojis. Estos emojis también son representados a través de tokens, y al igual que con el texto, el número de tokens usados dependerá de qué tan frecuente sea el uso del emoji en el lenguaje de interés.

Por ejemplo el emoji de la cara sonriente (😀) requiere 2 tokens para ser representado, mientras que el token con la mano hacia arriba (✋) requiere 4 tokens.

“Tokenización” y números

Y además es posible encontrar números en el texto escrito. En este caso durante la tokenización lo que puede ocurrir es que secuencias de números encontradas comúnmente en el texto sean representadas con un token.

Por ejemplo, la secuencia de números “1234567890” es representada con 4 tokens: uno para el grupo “123”, otro para el grupo “45”, otro para el grupo “678” y otro para el grupo “90”.

La “tokenización” depende del idioma

Además, la equivalencia palabras-tokens depende del idioma. Así por ejemplo, la frase “pon una canción que me haga sonreir” tiene 35 caracteres y 7 palabras.

En Español esta frase es representada con 14 tokens, pero en Inglés requerirá tan sólo 8, mientras que en Chino se necesitarán 15 tokens.

En general esta equivalencia dependerá del lenguaje en el que se haga el procesamiento y del tipo de modelo que estemos usando, pues cada modelo usa un algoritmo de tokenización en particular.

Por ejemplo, para GPT-4 en promedio cada token contendrá 7 caracteres en Inglés, 9 en español y 12 en Chino.

La importancia de los tokens en los Grandes Modelos de Lenguaje

Y entender este concepto de tokens resulta esencial para poder usar los diferentes Grandes Modelos de Lenguaje disponibles.

El límite máximo de tokens

La primera razón es que estos modelos tienen un límite máximo de tokens de entrada y de salida.

Por ejemplo, ChatGPT, que se basa en el modelo GPT-3.5 turbo de OpenAI, tiene un límite de 4.096 tokens. Esto quiere decir que si sumamos los tokens de entrada y de salida al momento de usar la aplicación el valor máximo será precisamente 4.096.

Para entender esto asumamos que tenemos un texto en Español de 25.000 caracteres a la entrada de ChatGPT. Como en promedio en el Español 1 token equivale aproximadamente a 9 caracteres, el texto en mención tendrá aproximadamente 25.000/9 = 2.800 tokens.

Por tanto a la salida la aplicación podrá generar máximo 4.096 - 2.800 = 1.296 tokens, es decir unos 1.296 x 9 = 11.600 caracteres.

El costo de usar los Grandes Modelos de Lenguaje

Y la segunda razón por la cual es importante entender qué son los tokens es porque el uso de cada modelo tiene un costo asociado precisamente a este número de tokens de entrada y de salida.

Es decir que el costo de usar el modelo se incrementará a medida que procesemos más tokens (y por tanto más texto) a la entrada y a la salida del modelo.

Por ejemplo, supongamos que queremos usar el modelo GPT-3.5 Turbo en nuestro sitio web, para crear una aplicación de Chat para nuestros usuarios.

En este caso tendremos que pagar a OpenAI por el uso de este modelo. Si un usuario ingresa a nuestro sitio web e introduce un texto en Español de 10.000 caracteres a la aplicación (es decir unos 10.000/9 = 1.100 tokens) y el modelo genera una respuesta también de unos 10.000 caracteres, entonces el costo de procesamiento será (según los precios actuales de uso establecidos por OpenAI):

Así que en total el costo serían 0.00165 + 0.0022 = 0.0038 dólares. Esto parece muy económico, pero tengamos en cuenta que estamos considerando sólo una pregunta del usuario y una respuesta generada por el modelo.

Pero si la conversación consta de 10 preguntas y 10 respuestas, y asumimos que cada una tiene más o menos la misma cantidad de tokens, ya estaríamos hablando de 10 x 0.0038 = 0.038 dólares.

Y si asumimos que en lugar de 1 usuario tenemos por ejemplo 50 usuarios interactuando diariamente con la aplicación, el costo sería de casi 50 x 0.038 = 2 dólares diarios.

Así que es evidente que entre más solicitudes hagamos al modelo, tendremos más tokens procesados que se sumarán al costo total de uso del modelo.

Conclusión

Muy bien, acabamos de ver los conceptos esenciales acerca de los tokens y que resultan claves al momento de usar los Grandes Modelos de Lenguaje.

Hemos visto que en esencia un token puede ser una palabra o una sub-palabra y que además podemos usarlos para representar cualquier elemento del lenguaje escrito como por ejemplo emojis, números y signos de puntuación.

También hemos visto que el número total de tokens con los cuales se representa un texto en particular dependerá del idioma y que en algunos idiomas (como en el Inglés) se requieren en promedio menos tokens para representar un texto en comparación con otros (como por ejemplo el Chino).

Y finalmente es importantísimo entender que los tokens determinan en muchos casos el costo que tendremos que pagar al momento de usar estos Grandes Modelos de Lenguaje, y que a la vez determinan el límite máximo de texto que podemos ingresar y obtener de estos modelos.

Si quieres profundizar más sobre estos Grandes Modelos de Lenguaje te invito a revisar estos artículos relacionados: