20

Tokens: el alfabeto del modelo

¿Qué lee realmente un modelo de lenguaje, y por qué importa?

11 minRuta ejecutiva

Tokens: el alfabeto del modelo

Con voz. Puedes pausar y saltar a cualquier paso.

Lección completa

Subtítulos

En la lección anterior dijimos que el modelo predice la siguiente palabra. Era una simplificación. Veamos qué recibe de verdad cuando le escribes esta frase.

Voz

Sin voz: la lección avanza sola con subtítulos.

La voz de esta lección está en preparación: por ahora avanza sola con subtítulos.

0:00 / 0:00

Qué lograrás

  • Explicar qué recibe de verdad un modelo de lenguaje: tokens, piezas de texto de un vocabulario fijo, convertidas en números.
  • Describir cómo BPE arma el vocabulario contando las parejas de piezas vecinas y fusionando la más frecuente, una y otra vez.
  • Estimar el costo de un texto en tokens y anticipar cuándo cuesta más: palabras raras, otros idiomas, otro tokenizador.

Ideas clave

  1. Un modelo de lenguaje no lee letras ni palabras: un tokenizador corta el texto en tokens, piezas de un vocabulario fijo, y al modelo solo le llega el número de cada pieza.
  2. BPE arma el vocabulario contando las parejas de piezas vecinas en mucho texto y fusionando la más frecuente, una y otra vez. Lo frecuente acaba en una sola pieza; lo raro se arma con trozos.
  3. Más piezas acortan los textos pero agrandan el modelo: los vocabularios reales tienen de unas treinta y dos mil a unas doscientas mil piezas. En inglés, cien tokens son unas setenta y cinco palabras.
  4. Se cobra, y se limita, por token. El mismo contenido en español necesita más tokens que en inglés: en mil doce frases medidas, un tercio más con el tokenizador de GPT-4o y casi el doble con el de GPT-2.
  5. Como el modelo ve tokens y no letras, contar letras o hacer cuentas con cifras largas le resulta torpe. Deletrear o usar una herramienta suele ayudar.

Lo que mucha gente cree

Creencia común Un token es una palabra, y el modelo lee el texto como nosotros: palabra por palabra o letra por letra.

Lo correcto Un token es una pieza de tamaño variable: una palabra común puede ser uno, una rara se parte en varios, y a veces es una sola letra o un código básico. Al modelo no le llega el texto, solo los números de las piezas.

Compruébalo

Cuatro preguntas. Sin nota ni cuenta: sirven para ver si la idea quedó.

Concepto¿Qué es un token?
Concepto¿Qué hace BPE en cada paso al construir el vocabulario?
CálculoUn informe en inglés tiene 3 000 palabras. Con la regla de un token por cada tres cuartas partes de palabra y un precio supuesto de 2 dólares por millón de tokens, ¿cuánto cuesta procesar 1 000 informes?
AplicaciónTu empresa presupuestó un asistente para clientes en español usando pruebas de costo hechas en inglés. ¿Qué conviene hacer?

Por dentroPara quien quiere las fórmulas y el código. No hace falta para seguir el curso.

BPE paso a paso

Sea un corpus de palabras con frecuencias f(w)f(w) y un alfabeto inicial V0V_0. En cada vuelta se cuenta cuántas veces aparece cada pareja de piezas vecinas (a,b)(a,b), pesando por la frecuencia de la palabra:

cuenta⁡(a,b)=∑wf(w)⋅#{apariciones de (a,b) en w}\operatorname{cuenta}(a,b)=\sum_{w} f(w)\cdot \#\{\text{apariciones de }(a,b)\text{ en }w\}

Se elige (a∗,b∗)=arg⁡max⁡(a,b)cuenta⁡(a,b)(a^*,b^*)=\arg\max_{(a,b)}\operatorname{cuenta}(a,b), se sustituye esa pareja por una pieza nueva en todo el corpus y se añade al vocabulario: Vt+1=Vt∪{a∗b∗}V_{t+1}=V_t\cup\{a^*b^*\}. Tras MM fusiones, ∣V∣=∣V0∣+M|V|=|V_0|+M. Para tokenizar un texto nuevo se aplican las fusiones en el orden en que se aprendieron. La idea viene de un algoritmo de compresión (Gage, 1994) que reemplazaba la pareja de bytes más frecuente por un byte sin usar; Sennrich, Haddow y Birch (2016) la adaptaron para partir las palabras raras en traducción automática, fusionando letras en lugar de bytes. No es el único método para armar un vocabulario, pero es el que usan GPT-2, Llama 2 y los tokenizadores de OpenAI (tiktoken es un tokenizador BPE).

En el ejemplo pequeño de la escena (gato ×5, gatos ×3, pato ×4, patos ×2, gatita ×1), la pareja «a t» suma 5+3+4+2+1=155+3+4+2+1=15 y gana; después «at o» suma 1414; luego nacen gato (8), pato (6), gatos (3) y patos (2). «Gatita» se queda en g · at · i · t · a porque ninguna de sus parejas llega a aparecer dos veces.

Bytes: por qué nada queda fuera

Los tokenizadores de GPT-2 en adelante parten de los 256256 valores posibles de un byte. En la codificación UTF-8, una letra sin acento ocupa un byte, una letra con acento como «ó» o «ñ» ocupa dos y muchos emojis ocupan cuatro, así que cualquier texto se puede escribir con esas 256256 piezas: lo que el vocabulario no cubre baja a bytes sueltos. Por eso, en la escena, la «ó» de Quetzalcóatl aparece al principio como dos piezas (los bytes 195 y 179) unidas por un borde punteado. Antes de fusionar, GPT-2 corta el texto en trozos (una palabra con su espacio inicial, un número, unos signos) y las fusiones nunca cruzan de un trozo a otro, para no llenar el vocabulario de variantes como «dog.», «dog!» y «dog?». Por eso muchas piezas llevan pegado el espacio de delante: « gato» y «gato» son tokens distintos. En la escena omitimos ese espacio al dibujar los cortes de GPT-4o, para que se lean mejor.

El tokenizador de juguete de la lección es un BPE a nivel de bytes con esa misma pretokenización, entrenado con unas mil setecientas palabras escritas para el curso (casi todas en inglés): ∣V0∣=256|V_0|=256 y M=400M=400, así que ∣V∣=656|V|=656. GPT-2 usa 256256 bytes, 50 00050\,000 fusiones y un símbolo especial de fin de texto: 256+50 000+1=50 257256+50\,000+1=50\,257, la cifra que da su artículo.

Tamaño del vocabulario

Cada pieza necesita una fila en la tabla de embeddings E∈R∣V∣×dE\in\mathbb{R}^{|V|\times d}, es decir, ∣V∣⋅d|V|\cdot d parámetros, y la capa final del modelo produce una puntuación por pieza. Con ∣V∣=50 257|V|=50\,257 y d=768d=768 (el GPT-2 más pequeño), la tabla tiene 50 257×768≈38.650\,257\times 768\approx 38.6 millones de parámetros. A cambio, un vocabulario mayor comprime más: el informe de Llama 3 dice que su vocabulario de 128 mil piezas (frente a las 32 mil de Llama 2) sube de 3.17 a 3.94 los caracteres por token en una muestra de inglés.

Costo

Con precios por millón de tokens distintos para entrada (pentp_{\text{ent}}) y salida (psalp_{\text{sal}}):

costo=nent pent+nsal psal106\text{costo}=\frac{n_{\text{ent}}\,p_{\text{ent}}+n_{\text{sal}}\,p_{\text{sal}}}{10^{6}}

Para inglés, n≈palabras/0.75n\approx \text{palabras}/0.75. Ejemplo con un precio supuesto de 2 dólares por millón: un informe de 3 000 palabras son unos 4 000 tokens; mil informes, 4 millones de tokens y 8 dólares. En la lista de precios de Anthropic (consultada en octubre de 2026), los tokens de salida cuestan cinco veces los de entrada en todos los modelos de la tabla.

El idioma, medido

Con las 1 012 frases paralelas en inglés y español del conjunto FLORES-200 (devtest), contadas con tiktoken 0.14.0:

tokenizador inglés español razón
GPT-2 (gpt2) 27 044 53 578 1.98
GPT-4 (cl100k_base) 27 182 41 974 1.54
GPT-4o (o200k_base) 26 873 35 415 1.32

Parte de la diferencia es que la traducción al español usa más palabras (26 081 frente a 21 901); el resto, que cada palabra en español se parte en más piezas. En inglés salen 0.81 palabras por token, cerca de la regla práctica de ¾. Petrov et al. (2023) midieron diferencias de hasta quince veces entre idiomas para un mismo texto traducido. Las cuatro frases del «tu turno» las escribimos nosotros: sirven para ilustrar, no para presupuestar.

Por qué fallan las letras y las cifras

El modelo recibe identificadores, no caracteres: tiene que haber aprendido de los datos cómo se escribe cada pieza. Con el tokenizador de GPT-4o, « carretera» y « strawberry» (con su espacio inicial, como aparecen dentro de una pregunta) son un solo token cada uno. Edman, Schmid y Fraser (2024) encontraron que la mayoría de los modelos parecen conocer la ortografía de sus tokens, pero no la usan bien para manipular texto. Con los números, GPT-3.5 y GPT-4 tienen tokens para cada número de una, dos y tres cifras y cortan de izquierda a derecha; Singh y Strouse (2024) encontraron que forzar el corte de derecha a izquierda (separando los miles con comas) mejora mucho la aritmética. Llama 2, en cambio, parte todos los números en cifras sueltas.

En código

Un BPE completo en veinte líneas de Python, sobre el corpus de la animación:

from collections import Counter

def entrenar_bpe(palabras, max_fusiones):
    """palabras: {palabra: frecuencia}. Devuelve las fusiones (a, b, cuenta) y cómo queda cada palabra."""
    piezas = {w: list(w) for w in palabras}
    fusiones = []
    for _ in range(max_fusiones):
        cuentas = Counter()
        for w, p in piezas.items():
            for a, b in zip(p, p[1:]):
                cuentas[(a, b)] += palabras[w]          # pesa por la frecuencia de la palabra
        if not cuentas or max(cuentas.values()) < 2:
            break
        a, b = min(cuentas, key=lambda par: (-cuentas[par], par))   # la más frecuente; empate: orden alfabético
        fusiones.append((a, b, cuentas[(a, b)]))
        for p in piezas.values():
            i = 0
            while i < len(p) - 1:
                if p[i] == a and p[i + 1] == b:
                    p[i:i + 2] = [a + b]
                else:
                    i += 1
    return fusiones, piezas

corpus = {"gato": 5, "gatos": 3, "pato": 4, "patos": 2, "gatita": 1}
fusiones, piezas = entrenar_bpe(corpus, 10)
for a, b, n in fusiones:
    print(f"{a} + {b} -> {a + b}  ({n} veces)")
print(piezas["gatos"], piezas["gatita"])
# a + t -> at  (15 veces)
# at + o -> ato  (14 veces)
# g + ato -> gato  (8 veces)
# p + ato -> pato  (6 veces)
# gato + s -> gatos  (3 veces)
# pato + s -> patos  (2 veces)
# ['gatos'] ['g', 'at', 'i', 't', 'a']

Y con un tokenizador real (pip install tiktoken; salida medida con la versión 0.14.0):

import tiktoken

enc = tiktoken.get_encoding("o200k_base")          # el tokenizador de GPT-4o
for texto in ["Mi gato se llama Quetzalcóatl.", "¿Cuántas erres tiene carretera?", "1234567"]:
    ids = enc.encode(texto)
    print(len(ids), ids, [enc.decode([i]) for i in ids])
print(enc.n_vocab)
# 10 [28716, 99767, 458, 69693, 3106, 21156, 27187, 531, 69282, 13] ['Mi', ' gato', ' se', ' llama', ' Qu', 'etz', 'alc', 'ó', 'atl', '.']
# 8 [102091, 41826, 288, 1111, 430, 10647, 96244, 30] ['¿Cu', 'ánt', 'as', ' er', 'res', ' tiene', ' carretera', '?']
# 3 [7633, 19354, 22] ['123', '456', '7']
# 200019

Lo que viene

Cada número de token selecciona una fila de la tabla de embeddings (lección 14); a partir de ahí el modelo solo ve vectores. En la lección 21 veremos cómo cada token decide a cuáles otros mirar (atención). El costo de generar token por token vuelve en la lección 26 (inferencia), y el tamaño del contexto, también medido en tokens, en la lección 30.

Lente de decisión

Qué significa esta idea si tu trabajo es decidir, no programar.

  • El costo y los límites se miden en tokens, no en palabras ni en páginas. Antes de presupuestar, cuenta los tokens de tus propios documentos con el tokenizador del proveedor, y calcula entrada y salida por separado: la salida suele costar varias veces más por token.
  • Tu idioma importa. En mil doce frases traducidas, el español necesitó un tercio más de tokens que el inglés con el tokenizador de GPT-4o, y casi el doble con el de GPT-2. Mide con mensajes reales en tu idioma, no con ejemplos en inglés.
  • El tokenizador cambia entre modelos y versiones, y con él la factura. Anthropic documenta que el tokenizador de sus modelos Claude 4.7 y posteriores produce alrededor de un treinta por ciento más tokens para el mismo texto.
  • Señales de alerta: precios «por palabra» o «por página» sin decir cómo se convierten a tokens, y confiar en el modelo para contar letras, comparar cifras largas o hacer cuentas sin verificar. Pide que deletree o que use una herramienta de cálculo.

Términos de la lección

Transcripción completa
ComentariosConversación pública de esta lección: dudas, datos por revisar, ideas.

Los comentarios viven en GitHub Discussions, en el repositorio público del curso; para escribir se necesita una cuenta de GitHub. Se cargan desde giscus.app al abrir esta sección. Las personas que revisan el curso los leen, y si un cambio se acepta, se aplica en los dos idiomas. Abrir el hilo en GitHub

Fuentes