37 · Tokenización de subpalabras (subword)
Los vocabularios a nivel de palabra explotan y fallan con palabras desconocidas; el nivel de carácter hace las secuencias demasiado largas. La tokenización de subpalabras (BPE) es el punto medio que impulsa a GPT y BERT.
La tokenización de subpalabras (BPE) parte de los caracteres y fusiona iterativamente el par adyacente más frecuente, dando un vocabulario fijo y manejable SIN fallos por palabras fuera de vocabulario y secuencias mucho más cortas que a nivel de carácter.
Sin esto:
Todo LLM que usas primero convierte el texto en IDs de tokens de subpalabra. Sin entender la tokenización no puedes razonar sobre los límites de contexto, los precios ni por qué los modelos tropiezan con tareas de ortografía.
Antes de que un transformer pueda hacer nada, el texto crudo debe convertirse en una secuencia de IDs enteros. Cómo dividimos el texto en esas unidades — la tokenización — es una decisión de diseño con consecuencias profundas, y las opciones obvias fallan ambas.
La tokenización a nivel de palabra asigna un ID por palabra. El inglés tiene cientos de miles de formas de palabras, así que el vocabulario (y la tabla de embeddings) explota. Peor aún, cualquier palabra que NO esté en el vocabulario — un error de tipeo, un nombre de producto nuevo, un término técnico raro — se convierte en un único token <UNK> "fuera de vocabulario" (out-of-vocabulary, OOV), y todo su significado se pierde. Nunca puedes enumerar cada palabra que un modelo encontrará.
La tokenización a nivel de carácter va al extremo opuesto: el vocabulario es diminuto (~100 símbolos) y no hay problema de OOV, ya que cualquier palabra es solo una secuencia de caracteres. Pero ahora una oración de 10 palabras se vuelve más de 50 tokens. Las secuencias se hacen muy largas, el costo de la atención crece de forma cuadrática con la longitud, y el modelo debe esforzarse más para ensamblar el significado a partir de letras individuales.
La tokenización de subpalabras (subword) es el punto medio que impulsa a GPT, BERT y esencialmente a todo LLM moderno. Las palabras comunes quedan enteras ("the", "running"), mientras que las raras se dividen en piezas con sentido ("tokenization" → "token" + "ization"). El vocabulario es fijo y manejable (típicamente 30k–100k), NO hay fallos por palabras fuera de vocabulario (en el peor caso, una palabra cae de vuelta a caracteres), y las secuencias quedan mucho más cortas que a nivel de carácter.
El algoritmo clásico es el Byte-Pair Encoding (BPE). Empieza dividiendo cada palabra en caracteres individuales más un marcador de fin de palabra </w> (para que el tokenizador sepa dónde terminan las palabras). Luego encuentra repetidamente el par adyacente más frecuente de símbolos en el corpus y los fusiona en un símbolo nuevo, registrando la fusión. Tras un número fijo de fusiones, la lista de fusiones aprendida ES el tokenizador. Las secuencias de caracteres frecuentes se fusionan naturalmente en subpalabras completas; las raras quedan divididas.
Python (in browser)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Familias de tokenizadores de subpalabra: WordPiece (verosimilitud + prefijo ##), SentencePiece (agnóstico al idioma, bytes crudos), tiktoken (BPE a nivel de byte) y tokens especiales.
¿Por qué los LLM usan tokenización de subpalabras en lugar de nivel de palabra o nivel de carácter?
- La tokenización a nivel de palabra hace explotar el vocabulario y falla con palabras fuera de vocabulario; el nivel de carácter evita el OOV pero hace las secuencias demasiado largas.
- BPE parte de caracteres + un marcador de fin de palabra </w> y fusiona repetidamente el par adyacente más frecuente; la lista ordenada de fusiones ES el tokenizador.
- Las variantes difieren en el criterio de fusión o el alfabeto: WordPiece (verosimilitud, prefijo ##), SentencePiece (bytes crudos, agnóstico al idioma), tiktoken (BPE a nivel de byte — cero OOV).
Cada prompt que envías a GPT, Claude o BERT primero pasa por un tokenizador de subpalabras. El conteo de tokens determina los precios de la API, los límites de la ventana de contexto y explica los fallos de ortografía/conteo.
Si lo quitas: Tratarías al tokenizador como una caja negra, sin poder explicar por qué las palabras raras cuestan más tokens, por qué los límites de contexto están en tokens, o por qué fallan las tareas de 'contar las letras'.