Hay muchas barreras para entender los modelos de IA, algunas de ellas bastante grandes, y pueden obstaculizar la implementación de procesos de IA. Pero la primera que muchas personas encuentran es entender a qué nos referimos cuando hablamos de tokens.

Uno de los parámetros prácticos más importantes al elegir un modelo de lenguaje de IA es el tamaño de su ventana de contexto — el tamaño máximo del texto de entrada — que se da en tokens, no en palabras o caracteres ni ninguna otra unidad automáticamente reconocible.
Además, los servicios de embeddings típicamente se calculan "por token", lo que significa que los tokens son importantes para entender tu factura.
Esto puede ser muy confuso si no tienes claro qué es un token.

Pero de todos los aspectos confusos de la IA moderna, los tokens son probablemente los menos complicados. Este artículo intentará aclarar qué es la tokenización, qué hace y por qué lo hacemos de esta manera.
tagtl;dr
Para aquellos que quieren o necesitan una respuesta rápida para calcular cuántos tokens comprar de Jina Embeddings o una estimación de cuántos necesitarán comprar, las siguientes estadísticas son lo que están buscando.
tagTokens por Palabra en Inglés
Durante pruebas empíricas, descritas más adelante en este artículo, una variedad de textos en inglés se convirtieron en tokens a una tasa de aproximadamente 10% más tokens que palabras, usando los modelos solo en inglés de Jina Embeddings. Este resultado fue bastante robusto.
Los modelos Jina Embeddings v2 tienen una ventana de contexto de 8192 tokens. Esto significa que si pasas a un modelo Jina un texto en inglés más largo que 7,400 palabras, hay una buena probabilidad de que sea truncado.
tagTokens por Carácter Chino
Para el chino, los resultados son más variables. Dependiendo del tipo de texto, las proporciones variaron de 0.6 a 0.75 tokens por carácter chino (汉字). Los textos en inglés dados a Jina Embeddings v2 para chino producen aproximadamente el mismo número de tokens que Jina Embeddings v2 para inglés: aproximadamente 10% más que el número de palabras.
tagTokens por Palabra en Alemán
Las proporciones de palabra a token en alemán son más variables que en inglés pero menos que en chino. Dependiendo del género del texto, obtuve en promedio entre 20% y 30% más tokens que palabras. Dar textos en inglés a Jina Embeddings v2 para alemán e inglés usa algunos tokens más que los modelos solo en inglés y chino/inglés: 12% a 15% más tokens que palabras.
tag¡Precaución!
Estos son cálculos simples, pero deberían ser aproximadamente correctos para la mayoría de los textos en lenguaje natural y la mayoría de los usuarios. En última instancia, solo podemos prometer que el número de tokens siempre será no más que el número de caracteres en tu texto, más dos. Prácticamente siempre será mucho menos que eso, pero no podemos prometer ningún conteo específico por adelantado.
Estas son estimaciones basadas en cálculos estadísticamente ingenuos. No garantizamos cuántos tokens requerirá una solicitud particular.
Si todo lo que necesitas es consejo sobre cuántos tokens comprar para Jina Embeddings, puedes detenerte aquí. Otros modelos de embeddings, de compañías diferentes a Jina AI, pueden no tener las mismas proporciones de token a palabra y token a carácter chino que tienen los modelos Jina, pero generalmente no serán muy diferentes en general.
Si quieres entender por qué, el resto de este artículo es una inmersión más profunda en la tokenización para modelos de lenguaje.
tagPalabras, Tokens, Números
La tokenización ha sido parte del procesamiento del lenguaje natural durante más tiempo que la existencia de los modelos modernos de IA.
Es un poco cliché decir que todo en una computadora es solo un número, pero también es mayormente cierto. El lenguaje, sin embargo, no es naturalmente solo un montón de números. Puede ser habla, hecha de ondas sonoras, o escritura, hecha de marcas en papel, o incluso una imagen de un texto impreso o un video de alguien usando lenguaje de señas. Pero la mayoría de las veces, cuando hablamos de usar computadoras para procesar lenguaje natural, nos referimos a textos compuestos de secuencias de caracteres: letras (a, b, c, etc.), números (0, 1, 2…), puntuación y espacios, en diferentes idiomas y codificaciones textuales.
Los ingenieros de computación los llaman "strings".
Los modelos de lenguaje de IA toman secuencias de números como entrada. Así que, podrías escribir la oración:
What is today's weather in Berlin?
Pero, después de la tokenización, el modelo de IA recibe como entrada:
[101, 2054, 2003, 2651, 1005, 1055, 4633, 1999, 4068, 1029, 102]
La tokenización es el proceso de convertir una cadena de entrada en una secuencia específica de números que tu modelo de IA puede entender.
Cuando usas un modelo de IA a través de una API web que cobra a los usuarios por token, cada solicitud se convierte en una secuencia de números como la anterior. El número de tokens en la solicitud es la longitud de esa secuencia de números. Así, pedir a Jina Embeddings v2 para inglés que te dé un embedding para "What is today's weather in Berlin?" te costará 11 tokens porque convirtió esa oración en una secuencia de 11 números antes de pasarla al modelo de IA.
Los modelos de IA basados en la arquitectura Transformer tienen una ventana de contexto de tamaño fijo cuyo tamaño se mide en tokens. A veces esto se llama "ventana de entrada", "tamaño de contexto" o "longitud de secuencia" (especialmente en el leaderboard MTEB de Hugging Face). Significa el tamaño máximo de texto que el modelo puede ver a la vez.
Así que, si quieres usar un modelo de embeddings, este es el tamaño máximo de entrada permitido.
Los modelos Jina Embeddings v2 tienen todos una ventana de contexto de 8,192 tokens. Otros modelos tendrán diferentes (típicamente más pequeñas) ventanas de contexto. Esto significa que sin importar cuánto texto le introduzcas, el tokenizador asociado con ese modelo Jina Embeddings debe convertirlo en no más de 8,192 tokens.
tagMapeando Lenguaje a Números
La forma más simple de explicar la lógica de los tokens es esta:
Para modelos de lenguaje natural, la parte de una cadena que un token representa es una palabra, una parte de una palabra, o una pieza de puntuación. Los espacios generalmente no reciben ninguna representación explícita en la salida del tokenizador.
La tokenización es parte de un grupo de técnicas en procesamiento de lenguaje natural llamadas segmentación de texto, y el módulo que realiza la tokenización se llama, muy lógicamente, un tokenizador.
Para mostrar cómo funciona la tokenización, vamos a tokenizar algunas oraciones usando el modelo más pequeño de Jina Embeddings v2 para inglés: jina-embeddings-v2-small-en
. El otro modelo solo en inglés de Jina Embeddings — jina-embeddings-v2-base-en — usa el mismo tokenizador, así que no tiene sentido descargar megabytes extra de modelo de IA que no usaremos en este artículo.
Primero, instala el módulo transformers
en tu entorno Python o notebook. Usa elLa bandera -U
para asegurarse de actualizar a la última versión ya que este modelo no funcionará con algunas versiones anteriores:
pip install -U transformers
Luego, descarga jina-embeddings-v2-small-en
usando AutoModel.from_pretrained
:
from transformers import AutoModel
model = AutoModel.from_pretrained('jinaai/jina-embeddings-v2-small-en', trust_remote_code=True)
Para tokenizar una cadena, usa el método encode
del objeto miembro tokenizer
del modelo:
model.tokenizer.encode("What is today's weather in Berlin?")
El resultado es una lista de números:
[101, 2054, 2003, 2651, 1005, 1055, 4633, 1999, 4068, 1029, 102]
Para convertir estos números de vuelta a forma de cadenas, usa el método convert_ids_to_tokens
del objeto tokenizer
:
model.tokenizer.convert_ids_to_tokens([101, 2054, 2003, 2651, 1005, 1055, 4633, 1999, 4068, 1029, 102])
El resultado es una lista de cadenas:
['[CLS]', 'what', 'is', 'today', "'", 's', 'weather', 'in',
'berlin', '?', '[SEP]']
Ten en cuenta que el tokenizador del modelo ha:
- Agregado
[CLS]
al inicio y[SEP]
al final. Esto es necesario por razones técnicas y significa que cada solicitud de embedding costará dos tokens extra, además de los tokens que requiera el texto. - Separado la puntuación de las palabras, convirtiendo "Berlin?" en:
berlin
y?
, y "today's" entoday
,'
, ys
. - Puesto todo en minúsculas. No todos los modelos hacen esto, pero puede ayudar con el entrenamiento cuando se usa inglés. Puede ser menos útil en idiomas donde la capitalización tiene un significado diferente.
Diferentes algoritmos de conteo de palabras en diferentes programas pueden contar las palabras en esta oración de manera diferente. OpenOffice la cuenta como seis palabras. El algoritmo de segmentación de texto Unicode (Unicode Standard Annex #29) cuenta siete palabras. Otro software puede llegar a otros números, dependiendo de cómo manejen la puntuación y los clíticos como "'s".
El tokenizador para este modelo produce nueve tokens para esas seis o siete palabras, más los dos tokens extra necesarios con cada solicitud.
Ahora, probemos con un nombre de lugar menos común que Berlín:
token_ids = model.tokenizer.encode("I live in Kinshasa.")
tokens = model.tokenizer.convert_ids_to_tokens(token_ids)
print(tokens)
El resultado:
['[CLS]', 'i', 'live', 'in', 'kin', '##sha', '##sa', '.', '[SEP]']
El nombre "Kinshasa" se divide en tres tokens: kin
, ##sha
, y ##sa
. El ##
indica que este token no es el comienzo de una palabra.
Si le damos al tokenizador algo completamente extraño, el número de tokens sobre el número de palabras aumenta aún más:
token_ids = model.tokenizer.encode("Klaatu barada nikto")
tokens = model.tokenizer.convert_ids_to_tokens(token_ids)
print(tokens)
['[CLS]', 'k', '##la', '##at', '##u', 'bar', '##ada', 'nik', '##to', '[SEP]']
Tres palabras se convierten en ocho tokens, más los tokens [CLS]
y [SEP]
.
La tokenización en alemán es similar. Con el modelo Jina Embeddings v2 para alemán, podemos tokenizar una traducción de "What is today's weather in Berlin?" de la misma manera que con el modelo en inglés.
german_model = AutoModel.from_pretrained('jinaai/jina-embeddings-v2-base-de', trust_remote_code=True)
token_ids = german_model.tokenizer.encode("Wie wird das Wetter heute in Berlin?")
tokens = german_model.tokenizer.convert_ids_to_tokens(token_ids)
print(tokens)
El resultado:
['<s>', 'Wie', 'wird', 'das', 'Wetter', 'heute', 'in', 'Berlin', '?', '</s>']
Este tokenizador es un poco diferente del inglés en que <s>
y </s>
reemplazan a [CLS]
y [SEP]
pero cumplen la misma función. Además, el texto no está normalizado en cuanto a mayúsculas y minúsculas — las mayúsculas y minúsculas permanecen como están escritas — porque la capitalización es significativa en alemán de manera diferente al inglés.
(Para simplificar esta presentación, he eliminado un carácter especial que indica el comienzo de una palabra.)
Ahora, probemos con una oración más compleja de un texto periodístico:
Ein Großteil der milliardenschweren Bauern-Subventionen bleibt liegen – zu genervt sind die Landwirte von bürokratischen Gängelungen und Regelwahn.
sentence = """
Ein Großteil der milliardenschweren Bauern-Subventionen
bleibt liegen – zu genervt sind die Landwirte von
bürokratischen Gängelungen und Regelwahn.
"""
token_ids = german_model.tokenizer.encode(sentence)
tokens = german_model.tokenizer.convert_ids_to_tokens(token_ids)
print(tokens)
El resultado tokenizado:
['<s>', 'Ein', 'Großteil', 'der', 'mill', 'iarden', 'schwer',
'en', 'Bauern', '-', 'Sub', 'ventionen', 'bleibt', 'liegen',
'–', 'zu', 'gen', 'ervt', 'sind', 'die', 'Landwirte', 'von',
'büro', 'krat', 'ischen', 'Gän', 'gel', 'ungen', 'und', 'Regel',
'wahn', '.', '</s>']
Aquí, puedes ver que muchas palabras alemanas fueron divididas en piezas más pequeñas y no necesariamente siguiendo las reglas gramaticales alemanas. El resultado es que una palabra larga en alemán que contaría como una sola palabra para un contador de palabras podría ser cualquier número de tokens para el modelo de IA de Jina.
Hagamos lo mismo en chino, traduciendo "What is today's weather in Berlin?" como:
柏林今天的天气怎么样?
chinese_model = AutoModel.from_pretrained('jinaai/jina-embeddings-v2-base-zh', trust_remote_code=True)
token_ids = chinese_model.tokenizer.encode("柏林今天的天气怎么样?")
tokens = chinese_model.tokenizer.convert_ids_to_tokens(token_ids)
print(tokens)
El resultado tokenizado:
['<s>', '柏林', '今天的', '天气', '怎么样', '?', '</s>']
En chino, normalmente no hay separaciones de palabras en el texto escrito, pero el tokenizador de Jina Embeddings frecuentemente une múltiples caracteres chinos:
Token string | Pinyin | Meaning |
---|---|---|
柏林 | Bólín | Berlin |
今天的 | jīntiān de | today's |
天气 | tiānqì | weather |
怎么样 | zěnmeyàng | how |
Usemos una oración más compleja de un periódico de Hong Kong:
sentence = """
新規定執行首日,記者在下班高峰前的下午5時來到廣州地鐵3號線,
從繁忙的珠江新城站啟程,向機場北方向出發。
"""
token_ids = chinese_model.tokenizer.encode(sentence)
tokens = chinese_model.tokenizer.convert_ids_to_tokens(token_ids)
print(tokens)
(Traducción: "El primer día que las nuevas regulaciones entraron en vigor, este reportero llegó a la Línea 3 del Metro de Guangzhou a las 5 p.m., durante la hora pico, habiendo partido de la Estación Zhujiang New Town en dirección norte hacia el aeropuerto.")
El resultado:
['<s>', '新', '規定', '執行', '首', '日', ',', '記者', '在下', '班',
'高峰', '前的', '下午', '5', '時', '來到', '廣州', '地', '鐵', '3',
'號', '線', ',', '從', '繁忙', '的', '珠江', '新城', '站', '啟',
'程', ',', '向', '機場', '北', '方向', '出發', '。', '</s>']
Estos tokens no se corresponden con ningún diccionario específico de palabras chinas (词典). Por ejemplo, "啟程" - qǐchéng (partir, emprender) normalmente se categorizaría como una sola palabra pero aquí está dividida en sus dos caracteres constituyentes. De manera similar, "在下班" usualmente sería reconocido como dos palabras, con la división entre "在" - zài (en, durante) y "下班" - xiàbān (final de la jornada laboral, hora pico), no entre "在下" y "班" como lo ha hecho el tokenizador aquí.
En los tres idiomas, los lugares donde el tokenizador divide el texto no están directamente relacionados con los lugares lógicos donde un lector humano los dividiría.
Esto no es una característica específica de los modelos Jina Embeddings. Este enfoque de tokenización es casi universal en el desarrollo de modelos de IA. Aunque dos modelos de IA diferentes pueden no tener tokenizadores idénticos, en el estado actual de desarrollo, prácticamente todos usarán tokenizadores con este tipo de comportamiento.
La siguiente sección discutirá el algoritmo específico usado en la tokenización y la lógica detrás de él.
tag¿Por qué Tokenizamos? ¿Y Por qué de Esta Manera?
Los modelos de lenguaje de IA toman como entrada secuencias de números que representan secuencias de texto, pero ocurren más cosas antes de ejecutar la red neuronal subyacente y crear un embedding. Cuando se presenta una lista de números que representan pequeñas secuencias de texto, el modelo busca cada número en un diccionario interno que almacena un vector único para cada número. Luego los combina, y eso se convierte en la entrada de la red neuronal.
Esto significa que el tokenizador debe poder convertir cualquier texto de entrada que le demos en tokens que aparezcan en el diccionario de vectores de tokens del modelo. Si tomáramos nuestros tokens de un diccionario convencional, la primera vez que encontráramos un error ortográfico o un nombre propio raro o una palabra extranjera, todo el modelo se detendría. No podría procesar esa entrada.
En el procesamiento del lenguaje natural, esto se llama el problema del vocabulario fuera de vocabulario (OOV), y está presente en todos los tipos de texto y todos los idiomas. Hay algunas estrategias para abordar el problema OOV:
- Ignorarlo. Reemplazar todo lo que no está en el diccionario con un token "desconocido".
- Evitarlo. En lugar de usar un diccionario que mapee secuencias de texto a vectores, usar uno que mapee caracteres individuales a vectores. El inglés solo usa 26 letras la mayoría del tiempo, por lo que esto debe ser más pequeño y más robusto contra problemas OOV que cualquier diccionario.
- Encontrar subsecuencias frecuentes en el texto, ponerlas en el diccionario y usar caracteres (tokens de una sola letra) para lo que quede.
La primera estrategia significa que se pierde mucha información importante. El modelo ni siquiera puede aprender sobre los datos que ha visto si toman la forma de algo que no está en el diccionario. Muchas cosas en el texto ordinario simplemente no están presentes ni siquiera en los diccionarios más grandes.
La segunda estrategia es posible, y los investigadores la han estudiado. Sin embargo, significa que el modelo tiene que aceptar muchas más entradas y tiene que aprender mucho más. Esto significa un modelo mucho más grande y muchos más datos de entrenamiento para un resultado que nunca ha demostrado ser mejor que la tercera estrategia.
Los modelos de lenguaje de IA prácticamente todos implementan la tercera estrategia de alguna forma. La mayoría usa alguna variante del algoritmo Wordpiece [Schuster y Nakajima 2012] o una técnica similar llamada Codificación por Pares de Bytes (BPE). [Gage 1994, Senrich et al. 2016] Estos algoritmos son agnósticos al lenguaje. Eso significa que funcionan igual para todos los lenguajes escritos sin ningún conocimiento más allá de una lista exhaustiva de posibles caracteres. Fueron diseñados para modelos multilingües como BERT de Google que toman cualquier entrada del raspado de Internet — cientos de idiomas y textos que no son lenguaje humano como programas de computadora — para que pudieran ser entrenados sin hacer lingüística complicada.
Algunas investigaciones muestran mejoras significativas usando tokenizadores más específicos y conscientes del lenguaje. [Rust et al. 2021] Pero construir tokenizadores de esa manera requiere tiempo, dinero y experiencia. Implementar una estrategia universal como BPE o Wordpiece es mucho más barato y fácil.
Sin embargo, como consecuencia, no hay manera de saber cuántos tokens representa un texto específico más que ejecutarlo a través de un tokenizador y luego contar el número de tokens que salen de él. Debido a que la subsecuencia más pequeña posible de un texto es una letra, puedes estar seguro de que el número de tokens no será mayor que el número de caracteres (menos espacios) más dos.
Para obtener una buena estimación, necesitamos enviar mucho texto a nuestro tokenizador y calcular empíricamente cuántos tokens obtenemos en promedio, en comparación con cuántas palabras o caracteres ingresamos. En la siguiente sección, haremos algunas mediciones empíricas no muy sistemáticas para todos los modelos Jina Embeddings v2 actualmente disponibles.
tagEstimaciones Empíricas de los Tamaños de Salida de Tokens
Para inglés y alemán, usé el algoritmo de segmentación de texto Unicode (Unicode Standard Annex #29) para obtener el conteo de palabras de los textos. Este algoritmo es ampliamente utilizado para seleccionar fragmentos de texto cuando haces doble clic en algo. Es lo más cercano disponible a un contador de palabras objetivo universal.
Instalé la biblioteca polyglot en Python, que implementa este segmentador de texto:
pip install -U polyglot
Para obtener el conteo de palabras de un texto, puedes usar código como este fragmento:
from polyglot.text import Text
txt = "What is today's weather in Berlin?"
print(len(Text(txt).words))
El resultado debería ser 7
.
Para obtener un conteo de tokens, se pasaron segmentos del texto a los tokenizadores de varios modelos Jina Embeddings, como se describe a continuación, y cada vez, resté dos del número de tokens devueltos.
tagInglés
(jina-embeddings-v2-small-en
y jina-embeddings-v2-base-en)
Para calcular promedios, descargué dos corpus de texto en inglés de Wortschatz Leipzig, una colección de corpus descargables gratuitamente en varios idiomas y configuraciones alojada por la Universidad de Leipzig:
- Un corpus de un millón de oraciones de datos de noticias en inglés de 2020 (
eng_news_2020_1M
) - Un corpus de un millón de oraciones de datos de Wikipedia en inglés de 2016 (
eng_wikipedia_2016_1M
)
Ambos se pueden encontrar en su página de descargas en inglés.
Para diversidad, también descargué la traducción de Hapgood de Los Miserables de Victor Hugo del Proyecto Gutenberg, y una copia de la Versión King James de la Biblia, traducida al inglés en 1611.
Para los cuatro textos, conté las palabras usando el segmentador Unicode implementado en polyglot
, luego conté los tokens generados por jina-embeddings-v2-small-en
, restando dos tokens por cada solicitud de tokenización. Los resultados son los siguientes:
Texto | Conteo de palabras (Segmentador Unicode) | Conteo de tokens (Jina Embeddings v2 para inglés) | Proporción de tokens a palabras (a 3 decimales) |
---|---|---|---|
eng_news_2020_1M | 22.825.712 | 25.270.581 | 1,107 |
eng_wikipedia_2016_1M | 24.243.607 | 26.813.877 | 1,106 |
les_miserables_en | 688.911 | 764.121 | 1,109 |
kjv_bible | 1.007.651 | 1.099.335 | 1,091 |
El uso de números precisos no significa que este sea un resultado exacto. El hecho de que documentos de géneros tan diferentes tengan entre 9% y 11% más tokens que palabras indica que probablemente puedes esperar alrededor de 10% más tokens que palabras, según medido por el segmentador Unicode. Los procesadores de texto a menudo no cuentan la puntuación, mientras que el segmentador Unicode sí lo hace, por lo que no puedes esperar que los conteos de palabras del software de oficina coincidan necesariamente con esto.
tagAlemán
(jina-embeddings-v2-base-de)
Para el alemán, descargué tres corpus de la página alemana de Wortschatz Leipzig:
deu_mixed-typical_2011_1M
— Un millón de oraciones de una mezcla equilibrada de textos en diferentes géneros, de 2011.deu_newscrawl-public_2019_1M
— Un millón de oraciones de texto periodístico de 2019.deu_wikipedia_2021_1M
— Un millón de oraciones extraídas de la Wikipedia alemana en 2021.
Y para diversidad, también descargué los tres volúmenes de El Capital de Karl Marx del Deutsches Textarchiv.
Luego seguí el mismo procedimiento que para el inglés:
Texto | Conteo de palabras (Segmentador Unicode) | Conteo de tokens (Jina Embeddings v2 para alemán e inglés) | Ratio de tokens a palabras (a 3 decimales) |
---|---|---|---|
deu_mixed-typical_2011_1M | 7.924.024 | 9.772.652 | 1,234 |
deu_newscrawl-public_2019_1M | 17.949.120 | 21.711.555 | 1,210 |
deu_wikipedia_2021_1M | 17.999.482 | 22.654.901 | 1,259 |
marx_kapital | 784.336 | 1.011.377 | 1,289 |
Estos resultados tienen una dispersión mayor que el modelo solo en inglés, pero aun así sugieren que el texto en alemán producirá, en promedio, entre 20% y 30% más tokens que palabras.
Los textos en inglés producen más tokens con el tokenizador alemán-inglés que con el de solo inglés:
Texto | Conteo de palabras (Segmentador Unicode) | Conteo de tokens (Jina Embeddings v2 para alemán e inglés) | Ratio de tokens a palabras (a 3 decimales) |
---|---|---|---|
eng_news_2020_1M | 24243607 | 27758535 | 1,145 |
eng_wikipedia_2016_1M | 22825712 | 25566921 | 1,120 |
Deberías esperar necesitar entre 12% y 15% más tokens que palabras para embeber textos en inglés con el modelo bilingüe alemán/inglés que con el de solo inglés.
tagChino
(jina-embeddings-v2-base-zh)
El chino típicamente se escribe sin espacios y no tenía una noción tradicional de "palabras" antes del siglo XX. En consecuencia, el tamaño de un texto en chino se mide típicamente en caracteres (字数). Así que, en lugar de usar el segmentador Unicode, medí la longitud de los textos en chino eliminando todos los espacios y luego simplemente obteniendo la longitud de caracteres.
Descargué tres corpus de la página de corpus chino de Wortschatz Leipzig:
zho_wikipedia_2018_1M
— Un millón de oraciones de la Wikipedia en chino, extraídas en 2018.zho_news_2007-2009_1M
— Un millón de oraciones de fuentes periodísticas chinas, recopiladas entre 2007 y 2009.zho-trad_newscrawl_2011_1M
— Un millón de oraciones de fuentes periodísticas que usan exclusivamente caracteres chinos tradicionales (繁體字).
Además, para mayor diversidad, también usé La verdadera historia de A Q (阿Q正傳), una novela corta de Lu Xun (魯迅) escrita a principios de la década de 1920. Descargué la versión en caracteres tradicionales de Project Gutenberg.
Texto | Conteo de caracteres (字数) | Conteo de tokens (Jina Embeddings v2 para chino e inglés) | Ratio de tokens a caracteres (a 3 decimales) |
---|---|---|---|
zho_wikipedia_2018_1M | 45.116.182 | 29.193.028 | 0,647 |
zho_news_2007-2009_1M | 44.295.314 | 28.108.090 | 0,635 |
zho-trad_newscrawl_2011_1M | 54,585,819 | 40,290,982 | 0.738 |
Ah_Q | 41,268 | 25,346 | 0.614 |
Esta dispersión en las proporciones de tokens a caracteres es inesperada, y especialmente el valor atípico para el corpus de caracteres tradicionales merece más investigación. No obstante, podemos concluir que para el chino, debes esperar necesitar menos tokens que caracteres hay en tu texto. Dependiendo de tu contenido, puedes esperar necesitar entre un 25% y un 40% menos.
Los textos en inglés en Jina Embeddings v2 para chino e inglés produjeron aproximadamente el mismo número de tokens que en el modelo solo para inglés:
Text | Word count (Unicode Segmenter) | Token count (Jina Embeddings v2 for Chinese and English) | Ratio of tokens to words (to 3 decimal places) |
---|---|---|---|
eng_news_2020_1M | 24,243,607 | 26,890,176 | 1.109 |
eng_wikipedia_2016_1M | 22,825,712 | 25,060,352 | 1.097 |
tagTomando los Tokens en Serio
Los tokens son un andamiaje importante para los modelos de lenguaje de IA, y la investigación en esta área continúa.
Uno de los aspectos donde los modelos de IA han demostrado ser revolucionarios es el descubrimiento de que son muy robustos frente a datos ruidosos. Incluso si un modelo particular no utiliza la estrategia de tokenización óptima, si la red es lo suficientemente grande, tiene suficientes datos y está adecuadamente entrenada, puede aprender a hacer lo correcto a partir de una entrada imperfecta.
En consecuencia, se dedica mucho menos esfuerzo a mejorar la tokenización que en otras áreas, pero esto podría cambiar.
Como usuario de embeddings, que los compras a través de una API como Jina Embeddings, no puedes saber exactamente cuántos tokens necesitarás para una tarea específica y es posible que tengas que hacer algunas pruebas propias para obtener números sólidos. Pero las estimaciones proporcionadas aquí — aproximadamente 110% del recuento de palabras para inglés, aproximadamente 125% del recuento de palabras para alemán, y aproximadamente 70% del recuento de caracteres para chino — deberían ser suficientes para un presupuesto básico.