Noticias
Modelos
Productos
keyboard_arrow_down
Búsqueda profunda
Busca, lee y razona hasta encontrar la mejor respuesta.
Lector
Lea las URL y busque en la web para obtener una base más sólida para su LLM.
Incrustaciones
Integraciones multilingües y multimodales de clase mundial.
reclasificador
Recuperador neuronal de clase mundial para maximizar la relevancia de la búsqueda.
Más
keyboard_arrow_down
Clasificador
Clasificación de cero disparos y pocos disparos para imágenes y texto.
Segmentador
Corta el texto largo en fragmentos y haz tokenización.

Documentación de la API
Generación automática de código para su IDE o LLM de Copilot
open_in_new


Compañía
keyboard_arrow_down
Sobre nosotros
Contactar con ventas
Programa de prácticas
Únete a nosotros
open_in_new
Descargar logotipo
open_in_new
Términos y condiciones


Acceso
login
tl;dr
Palabras, Tokens, Números
Mapeando Lenguaje a Números
¿Por qué Tokenizamos? ¿Y Por qué de Esta Manera?
Estimaciones Empíricas de los Tamaños de Salida de Tokens
Tomando los Tokens en Serio
Blog de tecnología
enero 31, 2024

Un análisis profundo de la tokenización

La tokenización, en los LLMs, significa dividir los textos de entrada en partes más pequeñas para su procesamiento. Entonces, ¿por qué los embeddings se cobran por token?
Colorful speckled grid pattern with a mix of small multicolored dots on a black background, creating a mosaic effect.
Scott Martens
Scott Martens • 16 minutos de lectura

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.

Tokenizer API
Free API to tokenize texts, count and get first/last-N 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.

Tabla de precios actual de Jina Embeddings (a febrero de 2024).
Tabla de precios actual de Jina Embeddings (a febrero de 2024). Nótese que los precios se indican por "1M tokens".

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

💡
Una llamada a la API de Jina Embeddings v2 para modelos en inglés usará aproximadamente 10% más tokens que el número de palabras en tu texto, más dos tokens por embedding.

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.

💡
El tamaño máximo de entrada para Jina Embeddings v2 para inglés es aproximadamente 7,400 palabras.

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.

💡
El tamaño máximo de entrada en chino para Jina Embeddings v2 para chino e inglés es aproximadamente 10,500 caracteres (字数), o 0.6 a 0.75 tokens por carácter chino, más dos por embedding.

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.

💡
Jina Embeddings v2 para alemán e inglés contará 20% a 30% más tokens que palabras, más dos por embedding. El tamaño máximo del contexto de entrada es aproximadamente 6,300 palabras en alemán.

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.

⚠️
¡Los Resultados Pueden Variar!

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:

💡
Un token es un número que representa una parte de una cadena.

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:

  1. 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.
  2. Separado la puntuación de las palabras, convirtiendo "Berlin?" en: berlin y ?, y "today's" en today, ', y s.
  3. 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.

💡
El algoritmo tokenizador no usa un diccionario convencional consciente del lenguaje, por lo que su comportamiento no coincide con la forma en que los humanos cuentan las palabras.

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:

  1. Ignorarlo. Reemplazar todo lo que no está en el diccionario con un token "desconocido".
  2. 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.
  3. 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.

⚠️
Los conteos de tokens listados aquí no incluyen los dos tokens extra al principio y al final de cada texto tokenizado.

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:

TextoConteo 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_1M22.825.71225.270.5811,107
eng_wikipedia_2016_1M24.243.60726.813.8771,106
les_miserables_en688.911764.1211,109
kjv_bible1.007.6511.099.3351,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:

TextoConteo 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_1M7.924.0249.772.6521,234
deu_newscrawl-public_2019_1M17.949.12021.711.5551,210
deu_wikipedia_2021_1M17.999.48222.654.9011,259
marx_kapital784.3361.011.3771,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:

TextoConteo 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_1M24243607277585351,145
eng_wikipedia_2016_1M22825712255669211,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.

TextoConteo de caracteres
(字数)
Conteo de tokens
(Jina Embeddings v2
para chino e inglés)
Ratio de tokens a caracteres
(a 3 decimales)
zho_wikipedia_2018_1M45.116.18229.193.0280,647
zho_news_2007-2009_1M44.295.31428.108.0900,635
zho-trad_newscrawl_2011_1M54,585,81940,290,9820.738
Ah_Q41,26825,3460.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:

TextWord count
(Unicode Segmenter)
Token count
(Jina Embeddings v2 for Chinese and English)
Ratio of tokens to words
(to 3 decimal places)
eng_news_2020_1M24,243,60726,890,1761.109
eng_wikipedia_2016_1M22,825,71225,060,3521.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.

Categorías:
Blog de tecnología
rss_feed
Oficinas
location_on
Sunnyvale, California
710 Lakeway Dr, Ste 200, Sunnyvale, CA 94085, EE. UU.
location_on
Berlín, Alemania (sede central)
Prinzessinnenstraße 19-20, 10969 Berlín, Alemania
location_on
Beijing, China
Piso 5, Edificio 6, No.48 Haidian West St. Pekín, China
location_on
Shenzhen, China
Piso 402, Edificio de Tecnología Fu'an, Shenzhen, China
Fundación de búsqueda
Búsqueda profunda
Lector
Incrustaciones
reclasificador
Clasificador
Segmentador
Documentación API
Obtener la clave API de Jina
Límite de velocidad
Estado de la API
Compañía
Sobre nosotros
Contactar con ventas
Sala de prensa
Programa de prácticas
Únete a nosotros
open_in_new
Descargar logotipo
open_in_new
Términos
Seguridad
Términos y condiciones
Privacidad
Administrar cookies
email
Jina AI © 2020-2025.