Desatando el Tokenizador ChatGPT
Tokenización ChatGPT
¡Práctica! ¿Cómo maneja ChatGPT los tokens?

¿Alguna vez te has preguntado cuáles son los componentes clave detrás de ChatGPT?
A todos nos han dicho lo mismo: ChatGPT predice la siguiente palabra. Pero en realidad, hay una pequeña mentira en esta afirmación. No predice la siguiente palabra, ChatGPT predice el siguiente token.
¿Token? Sí, un token es la unidad de texto para los Modelos de Lenguaje Grandes (LLMs).
De hecho, uno de los primeros pasos que ChatGPT realiza al procesar cualquier indicación es dividir la entrada del usuario en tokens. Y ese es el trabajo del llamado tokenizer.
En este artículo, descubriremos cómo funciona el tokenizer de ChatGPT con práctica práctica con la biblioteca original utilizada por OpenAI, la biblioteca tiktoken
.
- RAPIDS Utiliza GPU para acelerar modelos de ML fácilmente.
- Aprendiendo los conceptos básicos para tu próximo proyecto de LangC...
- Más allá de Numpy y Pandas Desbloqueando el Potencial de Biblioteca...
TikTok-en… Bastante divertido 🙂
Adentrémonos y comprendamos los pasos reales realizados por el tokenizer y cómo su comportamiento realmente afecta la calidad de la salida de ChatGPT.
Cómo funciona el Tokenizer
En el artículo Dominando ChatGPT: Resumen efectivo con LLMs ya vimos algunos de los misterios detrás del tokenizer de ChatGPT, pero empecemos desde cero.
El tokenizer aparece en el primer paso del proceso de generación de texto. Es responsable de descomponer el trozo de texto que ingresamos a ChatGPT en elementos individuales, los tokens, que luego son procesados por el modelo de lenguaje para generar nuevo texto.
Cuando el tokenizer descompone un trozo de texto en tokens, lo hace en base a un conjunto de reglas diseñadas para identificar las unidades significativas del lenguaje objetivo.
Por ejemplo, cuando las palabras que aparecen en una determinada oración son palabras bastante comunes, es probable que cada token corresponda a una palabra. Pero si usamos una indicación con palabras menos frecuentemente utilizadas, como en la oración “Prompting as powerful developer tool”, es posible que no obtengamos una correspondencia uno a uno. En este caso, la palabra “prompting” aún no es tan común en el idioma inglés, por lo que en realidad se divide en tres tokens: “’prom”, “pt” e “ing” porque esas tres secuencias de letras ocurren comúnmente.
¡Veamos otro ejemplo!
Considera la siguiente oración: “Quiero comer un sándwich de mantequilla de maní”. Si el tokenizer está configurado para dividir los tokens en base a espacios y puntuación, puede descomponer esta oración en los siguientes tokens con un recuento total de palabras de 8, igual al recuento de tokens.

Sin embargo, si el tokenizer trata “mantequilla de maní” como una palabra compuesta debido a que los componentes aparecen juntos con bastante frecuencia, puede dividir la oración en los siguientes tokens, con un recuento total de palabras de 8, pero un recuento de tokens de 7.

En el contexto de ChatGPT y la gestión de tokens, los términos codificación y decodificación se refieren a los procesos de convertir el texto en tokens que el modelo puede entender (codificación) y convertir la finalización del modelo de nuevo en texto legible por humanos (decodificación).
Biblioteca Tiktoken
Conocer la teoría detrás del tokenizer de ChatGPT es necesario, pero en este artículo me gustaría enfocarme en algunas revelaciones prácticas también.
La implementación de ChatGPT utiliza la biblioteca tiktoken
para gestionar los tokens. Podemos ponerla en marcha como cualquier otra biblioteca de Python:
pip install --upgrade tiktoken
Una vez instalado, es muy sencillo obtener el mismo modelo de codificación que utiliza ChatGPT, ya que existe un método encoding_for_model()
. Como su nombre indica, este método carga automáticamente la codificación correcta para un determinado nombre de modelo.
La primera vez que se ejecuta para un modelo dado, requiere una conexión a internet para descargar el modelo de codificación. Las ejecuciones posteriores no necesitarán internet, ya que la codificación ya está pre-caché.
Para el modelo ampliamente utilizado gpt-3.5-turbo
, simplemente podemos ejecutar:
import tiktokenencoding = tiktoken.encoding_for_model("gpt-3.5-turbo")
La salida encoding
es un objeto de tokenizador que podemos usar para visualizar cómo ChatGPT ve realmente nuestra indicación.
Más específicamente, la función tiktoken.encoding_for_model
inicializa un pipeline de tokenización específicamente para el modelo gpt-3.5-turbo
. Este pipeline maneja la tokenización y codificación del texto, preparándolo para el consumo del modelo.
Un aspecto importante a considerar es que los tokens son representaciones numéricas. En nuestro ejemplo “Indicación como herramienta de desarrollo potente”, los tokens asociados a la palabra “indicación” eran “’prom”, “pt” e “ing”, pero lo que el modelo realmente recibe es la representación numérica de esas secuencias.
¡No te preocupes! Veremos cómo se ve esto en la sección práctica.
Tipos de codificación
La biblioteca tiktoken
admite múltiples tipos de codificación. De hecho, diferentes modelos gpt
utilizan diferentes codificaciones. Aquí tienes una tabla con las más comunes:
Codificación: ¡Manos a la obra!
Avancemos y tratemos de codificar nuestra primera indicación. Dada la indicación “¡tiktoken es genial!” y la codificación ya cargada encoding
, podemos usar el método encoding.encode
para dividir la indicación en tokens y visualizar su representación numérica:
prompt = "¡tiktoken es genial!"encoded_prompt = encoding.encode(prompt)print(encoded_prompt)# Salida: [83, 1609, 5963, 374, 2294, 0]
Sí, eso es cierto. La salida [83, 1609, 5963, 374, 2294, 0]
no parece muy significativa. Pero en realidad, hay algo que se puede adivinar a primera vista.
¿Lo captas?
¡La longitud! Podemos ver rápidamente que nuestra indicación “¡tiktoken es genial!” se divide en 6 tokens. En este caso, ChatGPT no divide esta indicación de ejemplo en función de los espacios en blanco, sino en las secuencias de letras más frecuentes.
En nuestro ejemplo, cada coordenada en la lista de salida corresponde a un token específico en la secuencia tokenizada, los llamados IDs de token. Los IDs de token son enteros que identifican de manera única cada token según el vocabulario utilizado por el modelo. Los IDs suelen asignarse a palabras o unidades de subpalabras en el vocabulario.
Simplemente decodifiquemos la lista de coordenadas para verificar que corresponde a nuestra indicación original:
encoding.decode(encoded_prompt)# Salida: '¡tiktoken es genial!'
El método .decode()
convierte una lista de enteros de tokens en una cadena. Aunque el método .decode()
se puede aplicar a tokens individuales, ten en cuenta que puede haber pérdida de información para tokens que no están en los límites de utf-8
.
Y ahora te preguntarás, ¿hay alguna forma de ver los tokens individuales?
¡Vamos a por ello!
Para tokens individuales, el método .decode_single_token_bytes()
convierte de manera segura un solo token entero en los bytes que representa. Para nuestra indicación de ejemplo:
[encoding.decode_single_token_bytes(token) for token in encoded_prompt]# Salida: [b't', b'ik', b'token', b' es', b' genial', b'!']
Ten en cuenta que la etiqueta b
delante de las cadenas indica que las cadenas son cadenas de bytes. Para el idioma inglés, aproximadamente un token, en promedio, corresponde a alrededor de cuatro caracteres o aproximadamente tres cuartos de una palabra.
Saber cómo se dividen las palabras en tokens es útil porque los modelos GPT ven el texto en forma de tokens. Saber cuántos tokens hay en una cadena de texto puede brindarte información útil, como si la cadena es demasiado larga para que un modelo de texto la procese, o cuánto costará una llamada a la API de OpenAI, ya que el uso se tarifica por token, entre otras cosas.
Comparando Modelos de Codificación

Como hemos visto, los diferentes modelos utilizan diferentes tipos de codificación. A veces, puede haber una gran diferencia en la gestión de tokens entre los modelos.
Las codificaciones diferentes varían en cómo dividen las palabras, agrupan los espacios y manejan los caracteres que no son del inglés. Usando los métodos anteriores, podemos comparar diferentes codificaciones para los diferentes modelos gpt
disponibles en algunas cadenas de ejemplo.
Comparemos las codificaciones de la tabla anterior (gpt2
, p50k_base
y cl100k_base
). Para hacerlo, podemos usar la siguiente función que contiene todos los elementos que hemos visto hasta ahora:
La función compare_encodings
toma una example_string
como entrada y compara las codificaciones de esa cadena usando tres esquemas de codificación diferentes: gpt2
, p50k_base
y cl100k_base
. Por último, imprime varias informaciones sobre las codificaciones, incluyendo el número de tokens, los enteros de los tokens y los bytes de los tokens.
¡Veamos algunos ejemplos!
En este primer ejemplo, aunque los modelos gpt2
y p50k_base
están de acuerdo en la codificación al fusionar los símbolos matemáticos con los espacios en blanco, la codificación de cl100k_base
los considera entidades separadas.
En este ejemplo, la forma de tokenizar la palabra “Prompting” también depende de la codificación seleccionada.
Limitaciones del Tokenizador

Esta forma de tokenizar las entradas a veces es la causa de algunos errores en las completaciones de ChatGPT. Por ejemplo, si le pedimos a ChatGPT que escriba la palabra “lollipop” al revés, lo hace mal.

Lo que está sucediendo aquí es que el tokenizador realmente divide la palabra dada en tres tokens: “l”, “oll” e “ipop”. Por lo tanto, ChatGPT no ve las letras individuales, en su lugar ve estos tres tokens, lo que dificulta imprimir las letras individuales en orden inverso correctamente.
Conocer las limitaciones te permite encontrar soluciones para evitarlas. En este caso, si agregamos guiones entre las letras individuales de la palabra, podemos obligar al tokenizador a dividir el texto en base a esos símbolos. Al modificar ligeramente la entrada, en realidad lo hace mucho mejor:

Usando guiones, es más fácil para el modelo ver las letras individuales e imprimirlas en orden inverso. Así que tenlo en cuenta: si alguna vez quieres usar ChatGPT para jugar un juego de palabras, como Word o Scrabble, o construir una aplicación basada en esos principios, este truco ingenioso ayuda a que el modelo vea mejor las letras individuales de las palabras.
Este es solo un ejemplo sencillo donde el tokenizador de ChatGPT hace que el modelo falle en una tarea muy simple. ¿Has encontrado otros casos similares?
Resumen
En este artículo, hemos explorado cómo ChatGPT ve las indicaciones del usuario y las procesa para generar una salida de completado basada en patrones estadísticos aprendidos a partir de grandes cantidades de datos de lenguaje durante su entrenamiento.
Usando la biblioteca tiktoken
, ahora podemos evaluar cualquier indicación antes de ingresarla en ChatGPT. Esto puede ayudarnos a depurar errores de ChatGPT, ya que puede suceder que al modificar ligeramente nuestra indicación, podemos hacer que ChatGPT complete mejor la tarea.
También hay un mensaje adicional: Algunas decisiones de diseño pueden convertirse en deudas técnicas en el futuro. Como hemos visto en el ejemplo simple del chupetín, si bien el modelo tiene éxito en tareas sorprendentes, no puede completar ejercicios simples. ¡Y la razón detrás de esto no está en las capacidades del modelo, sino en el primer paso de tokenización!
¡Eso es todo! ¡Muchas gracias por leer!
¡Espero que este artículo te ayude al construir aplicaciones de ChatGPT!
También puedes suscribirte a mi Boletín para estar al tanto de nuevo contenido. Especialmente, si te interesan los artículos sobre ChatGPT:
Dominando ChatGPT: Resumen efectivo con LLMs
Cómo indicar a ChatGPT para obtener resúmenes de alta calidad
towardsdatascience.com
Curso de Ingeniería de Indicaciones por OpenAI – Inferir, Transformar y Expandir con ChatGPT
Maximiza el potencial de ChatGPT en tu aplicación personalizada
VoAGI.com
Desbloqueando una Nueva Dimensión de ChatGPT: Integración de Texto a Voz
Mejorando la experiencia del usuario en las interacciones con ChatGPT
towardsdatascience.com
No dudes en enviar cualquier pregunta que puedas tener a [email protected] 🙂