Guía para profesionales de LLM: Llama-2
En julio de 2023, Meta lanzó Llama-2, un conjunto de grandes modelos de lenguaje de acceso abierto que rápidamente se convirtió en el favorito de quienes se preocupan por la seguridad de los datos y están interesados en crear sus propios modelos personalizados. A diferencia de depender de modelos genéricos de terceros, Llama-2 permite un diseño personalizado y ha sido una opción líder para mejoras y usos especializados, superando a menudo los puntos de referencia estándar.
Disponible a través de Hugging Face, Llama-2 se ofrece en tres tamaños: 7B, 13B y 70B parámetros. Puede utilizarlo como modelo base o como modelo conversacional para diálogo y preguntas-respuestas. Meta también presentó Code Llama, una variante de Llama-2 entrenada específicamente para tareas de programación.
Si está involucrado en IA y necesita un modelo de lenguaje grande (LLM) personalizado, es probable que Llama-2 esté en su radar como un posible punto de partida. Hemos estado profundamente involucrados en la personalización, el ajuste y la implementación de Llama-2. A través de esta serie de publicaciones, nuestro objetivo es compartir nuestros conocimientos sobre lo que Llama-2 puede y no puede hacer, junto con instrucciones detalladas y mejores prácticas para realizar ajustes.
Guía para profesionales de LLM:
- ¿Qué tan multilingüe es realmente Llama-2?
- Estructura de prompts de Llama-2 (próximamente)
En la publicación de hoy, exploraremos la limitación más importante de Llama-2: su soporte de idiomas restringido. A pesar de sus capacidades, extender Llama-2 a idiomas más allá de algunos de los europeos más hablados es una tarea desafiante. Veamos por qué.
Los caminos que no recorrerá: comprender las limitaciones del idioma de Llama-2

En el centro de las limitaciones de Llama-2 está su tokenizador, un componente crucial en la forma en que procesa el lenguaje.
Los modelos de lenguaje grande (LLM) como Llama-2 funcionan utilizando números. Para comprender el texto, estos modelos primero lo convierten a un formato numérico. El desafío importante en el procesamiento del lenguaje natural es descubrir la forma más efectiva de representar los idiomas numéricamente.
Un método básico es asignar a cada letra o símbolo un número único, por ejemplo, "a" se convierte en 1, "b" se convierte en 2, y así sucesivamente. Luego, el modelo predice el siguiente número de una secuencia. Sin embargo, este método convierte incluso una frase corta en una secuencia larga de 61 números. Cualquier error al predecir una letra afecta a todas las siguientes, lo que hace que este enfoque sea complejo y propenso a errores.
Otro método consiste en representar cada palabra con un número. En este sistema, la frase se convierte en una serie de 11 números, significativamente más corta que la secuencia letra por letra. Esto es más fácil para el modelo pero aún presenta un problema. Teniendo en cuenta la gran cantidad de palabras (más de 200.000 sólo en inglés), esto significa que, para varios idiomas, el modelo podría necesitar elegir entre millones de números, lo que aumenta la probabilidad de errores.
Para abordar estos problemas, los investigadores desarrollaron un compromiso llamado tokenización. La tokenización divide las palabras en partes más pequeñas, llamadas tokens, que son comunes a varias palabras. Por ejemplo, "predicción" podría dividirse en "Cpred", "Cict", "Cing". Esto significa que, en lugar de adivinar cada letra o palabra completa, el modelo predice secuencias más pequeñas y manejables. Estos tokens reducen drásticamente la cantidad de opciones que el modelo debe considerar, desde el diccionario completo a alrededor de 2000 tokens para el idioma inglés, lo que hace que el proceso sea más eficiente y preciso.
Profundicemos en el tokenizador Llama-2.
Primero, lo importamos desde la biblioteca de Huggingface Transformers:
> from transformers import AutoTokenizer
> tokenizer = AutoTokenizer.from_pretrained('meta-llama/Llama-2-7b-hf', use_fast=True)El tokenizador Llama-2 admite una impresionante variedad de 32.000 tokens:
> print(tokenizer.vocab_size)
32000Ahora, observémoslo en acción. Considere esta oración:
> print(tokenizer.tokenize('Call me Ishmael. Some years ago...'))
['▁Call', '▁me', '▁I', 'sh', 'ma', 'el', '.', '▁Some', '▁years', '▁ago', ...]El resultado demuestra una tokenización eficiente, dividiendo palabras comunes en tokens únicos y palabras complejas en partes comprensibles. Por ejemplo, “acuoso” está claramente descompuesto, mientras que “Ismael” se representa silábicamente, lo que indica un enfoque matizado de la tokenización.
Ahora, probémoslo con una frase en alemán. Incluso si no habla alemán ni ningún otro idioma mencionado, comprenda que la tokenización efectiva divide el texto en una cantidad menor de tokens más largos, mientras que una tokenización más débil da como resultado una mayor cantidad de tokens más cortos.
> print(tokenizer.tokenize('Da steh ich nun, ich armer Tor! Und bin so klug als wie zuvor.'))
['▁Da', '▁ste', 'h', '▁ich', '▁nun', ',', '▁ich', '▁ar', 'mer', '▁Tor', '!', ...]El tokenizador funciona admirablemente, reflejando las complejidades del idioma, especialmente teniendo en cuenta que el alemán es más complejo computacionalmente que el inglés.
Veamos cómo se ocupa Llama-2 del francés.
> print(tokenizer.tokenize("On ne voit bien qu'avec le cœur..."))
['▁On', '▁ne', '▁voit', '▁bien', '▁qu', "'", 'ave', 'c', '▁le', '▁c', 'œur', ...]Nuevamente, vemos una muy buena representación del lenguaje.
Si seguimos con las lenguas romances y germánicas, veremos que Llama-2 se desenvuelve bastante bien con ellas. Entonces, sin más, pasemos a los eslavos y comencemos con el polaco.
> print(tokenizer.tokenize('Litwo, ojczyzno moja! Ty jesteś jak zdrowie...'))
['▁Lit', 'wo', ',', '▁o', 'j', 'czy', 'z', 'no', '▁mo', 'ja', '!', ...]El polaco es un lenguaje notoriamente complejo desde el punto de vista computacional, y se puede detectar inmediatamente la disminución en la calidad de la tokenización: los tokens se vuelven mucho más pequeños y su número aumenta.
Ahora, echemos un vistazo al ucraniano.
> print(tokenizer.tokenize('Як умру, то поховайте мене на могилі...'))
['▁Я', 'к', '▁у', 'м', 'ру', ',', '▁то', '▁по', 'х', 'ова', 'й', 'те', ...]Aquí vemos un caso similar: incluso si no lees ucraniano, notarás muchas fichas cortas. No es bueno.
Sin embargo, sigue siendo algo. Ahora, echemos un vistazo al griego.
> print(tokenizer.tokenize('ἄνδρα μοι ἔννεπε, Μοῦσα, πολύτροπον...'))
['▁', 'ἄ', 'ν', 'δ', 'ρ', 'α', '▁', 'μ', 'ο', 'ι', '▁', 'ἔ', 'ν', 'ν', 'ε', 'π', 'ε', ...]Aquí, vemos el peor de los casos: el tokenizador se retira al primer caso ingenuo que representa el lenguaje en términos de caracteres.
Ahora, ¿cómo se lee en hebreo?
> print(tokenizer.tokenize('בְּרֵאשִׁית בָּרָא אֱלֹהִים...'))
['▁', 'ב', 'ְ', 'ּ', 'ר', 'ֵ', 'א', 'ש', 'ִ', 'ׁ', 'י', 'ת', ...]Una vez más, se trata de personajes.
¿Qué tal los chinos?
> print(tokenizer.tokenize("道可道,非常道。名可名,非常名。"))
['▁', '道', '可', '道', ',', '非', '常', '道', '。', '名', '可', '名', ',', '非', '常', '名', '。']La misma representación de personajes aquí.
Si seguimos haciendo eso con otros idiomas, veremos el mismo patrón: el tokenizador Llama-2 funciona bien con las lenguas romances y germánicas, mientras que se degrada rápidamente a una representación de caracteres para el resto.
Es cierto que Meta ha indicado que Llama-2 se entrenó principalmente en un corpus de texto que es 90% inglés, lo que sugiere que el modelo podría no ser tan efectivo con otros idiomas. Esta advertencia es crucial pero puede resultar engañosa. No solo se capacitó: se diseñó principalmente pensando en el inglés.
Al leer la descripción del modelo, algunos pueden creer que entrenar Llama-2 con datos que no están en inglés podría mejorar significativamente su rendimiento con otros idiomas. Sin embargo, si bien el ajuste puede ayudar hasta cierto punto, no aborda las limitaciones inherentes del diseño del tokenizador. En consecuencia, Llama-2 naturalmente funciona mejor con algunos idiomas, como inglés, alemán, español o francés, en comparación con otros, como polaco o ucraniano. Intentar ampliar sus capacidades al griego, hebreo, chino y muchos otros idiomas es una tarea aún más desafiante. Y dado que el tokenizador está estrechamente acoplado al modelo y no se puede reemplazar, no hay forma de solucionar este problema.
Según nuestra experiencia, intentamos ajustar Llama-2 a tareas multilingües con un enorme conjunto de datos supervisados cuidadosamente seleccionados de más de mil millones de tokens solo para cambiar a otro modelo a mitad del proyecto.
Para aquellos que necesitan perfeccionar un modelo de lenguaje en cualquiera de estos lenguajes más desafiantes, Llama-2 puede no ser la opción óptima. En cambio, seleccionar un modelo más pequeño con un tokenizador más adecuado podría generar mejores resultados. Nuestra experiencia en el desarrollo de modelos multilingües sugiere que optar por modelos más pequeños y antiguos con mejores tokenizadores y personalizarlos para tareas e idiomas específicos podría ser mucho más efectivo que usar Llama-2.
Crear su LLM personalizado podría mejorar la seguridad y el cumplimiento de los datos y permitir una ventaja competitiva de IA para su producto. Puede consultar nuestras otras publicaciones para obtener una explicación detallada de ¿Cuál es el efecto de red? y cómo la IA lo permite, Cómo construir una ventaja competitiva de IA para su empresa, ¿Qué cultura le ayuda a crear los productos de IA adecuados?, Qué evitar en su estrategia y ejecución de IAy más.
¿Necesita un modelo de lenguaje verdaderamente multilingüe?
La elección del modelo correcto depende de los idiomas de destino y del caso de uso. Encontremos el enfoque óptimo para su producto de IA multilingüe.