Tokens: El átomo digital de cada interacción con un LLM
Normalmente empieza con una pregunta sencilla: ¿qué es exactamente un token? Unas cuantas pestañas del navegador, vídeos, páginas de precios y documentación de modelos después, te das cuenta de que los tokens están detrás de casi todas las decisiones prácticas que tomas con IA.
Si trabajas con OpenAI, Anthropic, Gemini o cualquier otra plataforma de LLM, ves tokens por todas partes: precios de API, límites de contexto, límites de velocidad, mensajes de error y paneles de uso.
Sin embargo, el término suele explicarse mal.
Un token no es exactamente una palabra. Tampoco es exactamente un carácter. Es una unidad de texto aprendida: el pequeño bloque digital que un LLM utiliza para recibir, procesar y generar lenguaje.
El modelo sencillo
Piensa en un token como un fragmento significativo de texto.
Por ejemplo, esta frase:
I love tokenization
podría dividirse en piezas como estas:
["I", " love", " token", "ization"]
Son cuatro tokens, no tres palabras.
La palabra tokenization se divide porque el tokenizador ha aprendido que token e ization son fragmentos lingüísticos útiles para representar y reutilizar por separado.
Esta es la idea central: un LLM no recibe tu prompt como palabras. Recibe una secuencia de IDs de tokens.
Qué es realmente un token
Un token es la unidad básica de entrada y salida de un modelo de lenguaje.
Tu mensaje, las instrucciones del sistema, el contenido recuperado mediante RAG, las salidas de herramientas, el historial de conversación y la respuesta del modelo consumen tokens.
| Tipo de token | Ejemplo | Por qué existe |
|---|---|---|
| Palabra completa | "the", "and", "because" |
Las palabras muy comunes suelen representarse con un único token. |
| Subpalabra | "token" + "ization" |
Las palabras largas o menos comunes pueden dividirse en componentes reutilizables. |
| Puntuación o símbolos | ".", "(", "_" |
El código y el contenido estructurado dependen en gran medida de estos tokens. |
| Fragmentos a nivel de byte | Partes de un emoji o carácter poco común | Algunos textos no pueden representarse eficazmente como fragmentos lingüísticos normales. |
Regla práctica: En inglés, un token suele equivaler aproximadamente a cuatro caracteres o a tres cuartos de una palabra. Sirve para estimaciones, no para cálculos de facturación.
El número de tokens varía según el modelo, el idioma, la puntuación, el formato, el código y el tokenizador utilizado. Para planificar costes o capacidad con precisión, cuenta siempre los tokens con las herramientas del proveedor.
Cómo aprenden los tokenizadores dónde dividir el texto
Los tokenizadores no utilizan gramática como lo hacemos los humanos. Aprenden patrones estadísticos a partir de enormes volúmenes de texto de entrenamiento.
Muchos tokenizadores modernos utilizan una variante de Byte Pair Encoding (BPE) u otro método relacionado de tokenización por subpalabras.
flowchart TD
A["Texto de entrenamiento<br/>miles de millones de ejemplos"] --> B["Empieza con unidades pequeñas<br/>caracteres o bytes"]
B --> C["Cuenta pares adyacentes frecuentes"]
C --> D["Fusiona pares frecuentes<br/>en candidatos a token"]
D --> E{"¿Se alcanzó el tamaño<br/>objetivo del vocabulario?"}
E -- No --> C
E -- Sí --> F["Congela el vocabulario"]
F --> G["Lo utiliza para codificar<br/>y descodificar texto"]
El principio es sencillo:
- Los patrones frecuentes se convierten en tokens compactos.
- Los patrones poco frecuentes se representan mediante piezas más pequeñas.
- Un tokenizador equilibra tamaño de vocabulario, velocidad, cobertura y eficiencia de compresión.
Por ejemplo, si lower aparece con frecuencia suficiente en el corpus de entrenamiento, puede convertirse en un único token. Si no, podría dividirse en fragmentos como low + er.
Del prompt al modelo: el flujo de tokens
Tu texto se transforma varias veces antes de que el LLM pueda procesarlo.
flowchart LR
A["Prompt<br/>'My name is Arjun'"] --> B["Tokenizador"]
B --> C["Fragmentos de texto<br/>['My', ' name', ' is', ' Ar', 'jun']"]
C --> D["IDs de tokens<br/>[3421, 1438, 318, 1274, 18150]"]
D --> E["Embeddings<br/>Los IDs se convierten en vectores"]
E --> F["Capas Transformer<br/>inferencia del modelo"]
F --> G["IDs de tokens de salida"]
G --> H["El tokenizador descodifica<br/>los IDs de nuevo a texto"]
La transición importante es la de los IDs de tokens a los embeddings.
Un ID de token es únicamente un índice dentro de un vocabulario. Por sí mismo no tiene significado semántico inherente. La capa de embeddings convierte ese ID en un vector numérico de alta dimensionalidad, permitiendo al modelo representar relaciones, contexto y patrones de forma matemática.
El modelo no ve palabras. Tampoco ve IDs de tokens en el sentido humano. Opera sobre vectores.
Por qué el número de tokens cambia entre modelos
GPT, Claude, Gemini, Llama y Mistral no necesariamente tokenizan el mismo texto de la misma manera.
Cada familia de modelos puede emplear un tokenizador, vocabulario, estrategia de codificación y corpus de entrenamiento diferentes. Como resultado:
- El mismo prompt puede usar un número distinto de tokens según el modelo.
- La misma palabra puede asignarse a IDs de token completamente diferentes.
- Una estimación de coste de tokens de un proveedor puede ser incorrecta para otro.
- Diseños de prompt eficientes para un modelo pueden ser menos eficientes para otro.
flowchart TD
A["Texto de entrada<br/>'Tokenization is fascinating'"]
A --> B["Tokenizador del modelo A<br/>división diferente"]
A --> C["Tokenizador del modelo B<br/>división diferente"]
A --> D["Tokenizador del modelo C<br/>división diferente"]
B --> E["Número de tokens diferente<br/>IDs diferentes<br/>coste y límites diferentes"]
C --> E
D --> E
La regla operativa es directa:
Mide los tokens con el modelo y la API exactos que vayas a utilizar.
Esto es especialmente importante en sistemas en producción, donde el uso de tokens afecta al coste, la latencia, el rendimiento y la capacidad de la ventana de contexto.
Cuatro detalles de la tokenización que importan en la práctica
1. Los números pueden consumir más tokens de lo esperado
"1234567" → ["123", "456", "7"]
Los números son muy variables. A diferencia de las palabras comunes, no siempre se benefician del mismo nivel de compresión.
Esto importa en prompts con gran volumen de datos que incluyen identificadores, importes financieros, fechas, logs, coordenadas o tablas extensas.
2. Los emojis y los caracteres Unicode inusuales pueden ser ineficientes
"🔥" → varios fragmentos de tokens a nivel de byte
Un emoji visualmente simple puede requerir varios tokens, según el tokenizador.
Normalmente tiene un impacto limitado en una conversación convencional, pero se vuelve relevante en cargas de trabajo de alto volumen en redes sociales, atención al cliente o aplicaciones multilingües.
3. El código se tokeniza de forma distinta al texto normal
def calculate_total_price(items):
Un tokenizador podría dividirlo en componentes similares a:
["def", " calculate", "_total", "_price", "(", "items", "):"]
El código utiliza puntuación, indentación, símbolos, identificadores y convenciones de nombres que se comportan de forma diferente al lenguaje natural.
Por eso los prompts con mucho código pueden consumir contexto más rápido de lo que aparentan.
4. La eficiencia por idioma depende del tokenizador
El inglés suele ser relativamente eficiente en tokens porque está muy representado en muchos corpus de entrenamiento y diseños de vocabulario.
Sin embargo, el factor real no es únicamente el idioma. Es la combinación de:
- Idioma y sistema de escritura
- Diseño del tokenizador
- Distribución de los datos de entrenamiento
- Formato y puntuación
- Modelo específico utilizado
En productos multilingües, el uso de tokens debe medirse en los idiomas reales de los usuarios, no estimarse a partir de referencias en inglés.
Cómo contar tokens correctamente
No calcules manualmente el uso de tokens en producción.
OpenAI
pip install tiktoken
import tiktoken
encoding = tiktoken.encoding_for_model("gpt-4")
token_ids = encoding.encode("My name is Arjun")
print(len(token_ids))
Anthropic
Anthropic ofrece una API de conteo de tokens que permite medir la estructura de entrada que realmente enviarás al modelo, incluidos mensajes y bloques de contenido.
import anthropic
client = anthropic.Anthropic()
response = client.messages.count_tokens(
model="claude-opus-4-5",
messages=[
{
"role": "user",
"content": "My name is Arjun",
}
],
)
print(response.input_tokens)
Para otros proveedores, utiliza sus herramientas oficiales de API o su biblioteca de tokenización. El resultado relevante es el que produce el endpoint del modelo que vas a utilizar.
Por qué los tokens importan más allá del precio
Los tokens son la unidad que está detrás de casi todas las decisiones de arquitectura en LLM.
| Área | Por qué importan los tokens |
|---|---|
| Coste | Los proveedores cobran por tokens de entrada, salida, caché y, en algunos casos, razonamiento. |
| Ventana de contexto | Las instrucciones del sistema, mensajes, documentos recuperados, respuestas de herramientas y salida comparten el presupuesto disponible. |
| Latencia | Las entradas mayores suelen tardar más en procesarse; las salidas largas tardan más en generarse. |
| Diseño RAG | El tamaño de los fragmentos, solapamiento, metadatos, cantidad recuperada y reranking afectan al consumo de tokens. |
| Diseño de agentes | Los resultados de herramientas, memoria, planificación y reintentos pueden expandir el contexto rápidamente. |
| Ingeniería de prompts | Las instrucciones claras y compactas dejan más capacidad de contexto para evidencia y salida útiles. |
| Calidad | El contexto relevante ayuda; el irrelevante compite por la atención del modelo y puede reducir la calidad de la respuesta. |
Los tokens no son simplemente una unidad de facturación. Son una restricción práctica sobre cómo se diseñan productos de IA.
El modelo mental que debes conservar
Un LLM no lee texto como lo hacemos los humanos. Procesa una secuencia de fragmentos de texto aprendidos, representados como IDs enteros y después como vectores numéricos. El coste, la velocidad, el uso de contexto y el comportamiento de tu prompt están condicionados por cómo se tokeniza ese texto.
Cuando envías un prompt, no estás introduciendo una frase directamente en el modelo.
Estás enviando una representación numérica y estructurada del lenguaje. Todo lo que el modelo hace después se construye sobre esa representación.