Skip to content

Latest commit

 

History

History
535 lines (426 loc) · 57.7 KB

README.md

File metadata and controls

535 lines (426 loc) · 57.7 KB

🤖 Curso de IA Generativa y Modelos de Lenguaje Grandes (LLMs) v0.1

🐦 twitter • 💻 web • 📹 youtube • 💻 repo original de @mlabonne


Este curso de IA generativa y LLMs va a estar dividido en 3 partes:

  1. 🧩 Fundamentos de IA cubre conocimientos esenciales sobre matemáticas, Python y redes neuronales.
  2. 🧑‍🔬 Científico/a de LLMs se enfoca en construir los mejores LLMs posibles usando las técnicas más recientes.
  3. 👷 Ingeniero/a de LLMs se concentra en crear aplicaciones basadas en LLM y desplegarlas.

Note

todo este laburo se basa en el repo de @mlabonne, vayan a meterle una ⭐ ya mismo!

📹 Clases en video

... proximamente ...

📹 Videos random

Una lista de algunos videos que hice (@machinelearnear) que tocan varios de estos temas

Y acá otra colección de excelentes videos tocando varios temas de IA generativa y LLMs.

📝 Notebooks

Una lista de notebooks y artículos relacionados con modelos de lenguaje grandes hechos por @mlabonne.

  • 📁 Herramientas

    • 🧐 LLM AutoEval - Evalúa automáticamente tus LLMs usando RunPod. Abrir en Colab
    • 🥱 LazyMergekit - Fusiona modelos fácilmente usando mergekit en un clic. Abrir en Colab
    • AutoGGUF - Cuantiza LLMs en formato GGUF en un click. Abrir en Colab
    • 🌳 Árbol genealógico de modelos - Visualiza el árbol genealógico de modelos fusionados. Abrir en Colab
  • 🎛 Ajuste fino

    • 🧐 Ajuste fino de Llama-2 en Google Colab - Guía paso a paso para afinar tu primer modelo Llama 2. Artículo | Abrir en Colab
    • 🥱 Ajuste fino de LLMs con Axolotl - Guía de principio a fin para la herramienta de vanguardia para afinamiento. Artículo | Abrir en Colab
    • Ajuste fino de Mistral-7b con DPO - Mejora el rendimiento de modelos afinados supervisados con DPO. Artículo | Abrir en Colab
  • 💾 Cuantización

    • 1️⃣ Introducción a la cuantización - Optimización de LLMs usando cuantización de 8 bits. Artículo | Abrir en Colab
    • 2️⃣ Cuantización de 4 bits usando GPTQ - Cuantiza tus propios LLMs de código abierto. Artículo | Abrir en Colab
    • 3️⃣ Cuantización con GGUF y llama.cpp - Llama 2 con llama.cpp y sube versiones GGUF al HF Hub. Artículo | Abrir en Colab
    • 4️⃣ ExLlamaV2 - Cuantiza y corre modelos EXL2 y súbelos al HF Hub. Artículo | Abrir en Colab
  • 📚 Otros

    • 📖 Estrategias de decodificación en LLMs - Una guía para la generación de texto desde la búsqueda por haz hasta el muestreo de núcleo. Artículo | Abrir en Colab
    • 🌐 Visualizar el paisaje de pérdida de GPT-2 - Gráfico 3D del paisaje de pérdida basado en perturbaciones de peso. Tweet | Abrir en Colab
    • 🚀 Mejorar ChatGPT con grafos de conocimiento - Amplía las respuestas de ChatGPT con grafos de conocimiento. Artículo | Abrir en Colab
    • 🛠 Fusionar LLMs usando mergekit - Crea tus propios modelos fácilmente, ¡no se necesita GPU! Artículo | Abrir en Colab

🧩 Roadmap para aprender fundamentos de IA

📁
├── 📚 Matemáticas para el aprendizaje automático
│   ├── 🧮 Álgebra lineal
│   ├── 🔢 Cálculo
│   └── 📊 Probabilidad y estadística
├── 🐍 Python para el aprendizaje automático
│   ├── 💻 Fundamentos de Python
│   └── 📊 Bibliotecas de ciencia de datos
├── 🧠 Redes neuronales
│   ├── 📖 Fundamentos
│   ├── ⚙️ Entrenamiento y optimización
│   └── ⚠️ Sobreajuste
└── 💬 Procesamiento de lenguaje natural
    ├── 📝 Preprocesamiento de texto
    ├── ✨ Técnicas de extracción de características
    ├── 🪄 Representaciones de palabras
    └── 🔄 Redes neuronales recurrentes (RNN)

Matemáticas para aprendizaje automático

Antes de dominar el aprendizaje automático (ML o machine learning), es importante entender los conceptos matemáticos fundamentales que impulsan estos algoritmos.

  • Álgebra lineal: Esto es crucial para entender muchos algoritmos, especialmente aquellos usados en aprendizaje profundo (deep learning). Conceptos clave incluyen vectores, matrices, determinantes, valores y vectores propios, espacios vectoriales y transformaciones lineales.
  • Cálculo: Muchos algoritmos de aprendizaje automático involucran la optimización de funciones continuas, lo que requiere un entendimiento de derivadas, integrales, límites y series. El cálculo multivariable y el concepto de gradientes también son importantes.
  • Probabilidad y estadística: Estos son cruciales para entender cómo los modelos aprenden de datos y hacen predicciones. Conceptos clave incluyen teoría de probabilidad, variables aleatorias, distribuciones de probabilidad, expectativas, varianza, covarianza, correlación, pruebas de hipótesis, intervalos de confianza, estimación de máxima verosimilitud e inferencia Bayesiana.

📚 Referencias:


Python para aprendizaje automático

Python es un lenguaje de programación poderoso y flexible que es particularmente bueno para el aprendizaje automático, gracias a su legibilidad, consistencia y el robusto ecosistema de librerías de ciencia de datos.

  • Fundamentos de Python: Programar en Python requiere un buen entendimiento de la sintaxis básica, tipos de datos, manejo de errores y programación orientada a objetos.
  • Librerías de ciencia de datos: Incluye familiaridad con NumPy para operaciones numéricas, Pandas para manipulación y análisis de datos, Matplotlib y Seaborn para visualización de datos.
  • Pre-procesamiento de datos: Esto involucra escalado y normalización de características (features), manejo de datos faltantes, detección de valores atípicos (outliers), codificación de datos categóricos y división de datos en conjuntos de entrenamiento, validación y prueba.
  • Librerías de aprendizaje automático: Saber usar Scikit-learn, una biblioteca que proporciona una amplia selección de algoritmos de aprendizaje supervisado y no supervisado, es vital. Entender cómo implementar algoritmos como regresión lineal, regresión logística, árboles de decisión, bosques aleatorios, vecinos más cercanos (K-NN) y agrupamiento por K-medias es importante. Técnicas de reducción de dimensionalidad como PCA y t-SNE también son útiles para visualizar datos de alta dimensión.

📚 Referencias:


Redes neuronales

Las redes neuronales son una parte fundamental de muchos modelos de aprendizaje automático, particularmente en el ámbito del aprendizaje profundo. Para utilizarlas efectivamente, es esencial tener un entendimiento comprensivo de su diseño y mecánicas.

  • Fundamentos: Esto incluye entender la estructura de una red neuronal como capas, pesos, sesgos y funciones de activación (sigmoide, tanh, ReLU, etc.)
  • Entrenamiento y optimización: Familiarízate con la retropropagación y diferentes tipos de funciones de pérdida, como Error Cuadrático Medio (MSE) y Entropía Cruzada. Entiende varios algoritmos de optimización como Descenso de Gradiente, Descenso de Gradiente Estocástico, RMSprop y Adam.
  • Sobreajuste (over-fitting): Entender el concepto de sobreajuste (donde un modelo rinde bien en datos de entrenamiento pero pobremente en datos no vistos) y aprender varias técnicas de regularización (abandono, regularización L1/L2, detención temprana, aumento de datos) para prevenirlo.
  • Implementar un perceptrón multicapa (MLP): Construye un MLP, también conocido como una red completamente conectada (fully-connected network), usando PyTorch.

📚 Referencias:


Procesamiento de lenguaje natural (NLP)

NLP es una rama fascinante de la inteligencia artificial que cierra la brecha entre el lenguaje humano y la comprensión de las máquinas. Desde el procesamiento de texto simple hasta la comprensión de matices lingüísticos, NLP juega un papel crucial en muchas aplicaciones como traducción, análisis de sentimientos, chatbots y mucho más.

  • Preprocesamiento de texto: Aprende varios pasos de preprocesamiento de texto como tokenización (dividir texto en palabras o frases), stemming (reducir palabras a su forma raíz), lematización (similar al stemming pero considera el contexto), eliminación de palabras vacías, etc.
  • Técnicas de extracción de características: Familiarízate con técnicas para convertir datos de texto en un formato que pueda ser entendido por algoritmos de aprendizaje automático. Los métodos clave incluyen "bolsa de palabras" (BoW), "frecuencia de término", inversa de frecuencia de documentos (TF-IDF) y n-gramas.
  • Embeddings de palabras: Los embeddings de palabras son un tipo de representación de palabras que permite que palabras con significados similares tengan representaciones similares. Los métodos clave incluyen Word2Vec, GloVe y FastText.
  • Redes neuronales recurrentes (RNNs): Entiende el funcionamiento de RNNs, un tipo de red neuronal diseñada para trabajar con datos secuenciales. Explora LSTMs y GRUs, dos variantes de RNN que son capaces de aprender dependencias a largo plazo.

📚 Referencias:

🧑‍🔬 Roadmap para ser científico/a de LLMs

Esta sección del curso se enfoca en aprender cómo construir los mejores LLMs posibles usando las técnicas más recientes.

📁 
├── 🏗 Arquitectura de LLMs
│   ├── 🌐 Visión general
│   ├── 🔤 Tokenización
│   ├── 🧠 Mecanismos de atención
│   └── ✍️ Generación de texto
├── 🛠 Construcción de un dataset de instrucciones
│   ├── 🦙 Dataset tipo Alpaca
│   ├── 🧪 Técnicas avanzadas
│   ├── 🚿 Filtrado de datos
│   └── 📝 Plantillas de prompts
├── 🔄 Pre-entrenamiento de modelos
│   ├── 📊 Pipeline de datos
│   ├── 📖 Modelado de lenguaje causal
│   ├── 📈 Leyes de escalado
│   └── 💻 Computación de alto rendimiento
├── 🎛 Ajuste fino supervisado
│   ├── 📚 Ajuste fino completo
│   ├── 🧮 LoRA y QLoRA
│   ├── 🐸 Axolotl
│   └── 🚀 DeepSpeed
├── 🤖 RLHF
│   ├── 📏 Métricas tradicionales
│   ├── 🌍 Benchmarks generales
│   ├── 🎯 Benchmarks específicos de tareas
│   └── 👥 Evaluación humana
├── 🔢 Cuantización
│   ├── 🛠 Técnicas base
│   ├── 🦙 GGUF y llama.cpp
│   ├── ⚡ GPTQ y EXL2
│   └── 🏋️‍♂️ AWQ
└── 🌟 Nuevas tendencias
    ├── 📍 Embeddings posicionales
    ├── 🔄 Fusión de modelos
    ├── 🧑‍🔬 Mix de expertos
    └── 🎭 Modelos multimodales

Arquitectura de modelos de lenguaje grandes (LLMs)

Aunque no es necesario un conocimiento profundo sobre la arquitectura Transformer, es importante tener un buen entendimiento de sus entradas (tokens) y salidas (logits). El mecanismo de atención básico es otro componente crucial para dominar, ya que se introducen versiones mejoradas más adelante.

  • Vista de alto nivel: Revisar la arquitectura Transformer de codificador-decodificador, y más específicamente la arquitectura GPT solo de decodificador, que se usa en todos los LLMs modernos.
  • Tokenización: Entender cómo convertir datos de texto crudo en un formato que el modelo pueda entender, lo que involucra dividir el texto en tokens (generalmente palabras o subpalabras).
  • Mecanismos de atención: Comprender la teoría detrás de los mecanismos de atención, incluyendo la autoatención y la atención de producto punto escalado, que permite al modelo enfocarse en diferentes partes de la entrada al producir una salida.
  • Generación de texto: Aprender sobre las diferentes maneras en que el modelo puede generar secuencias de salida. Las estrategias comunes incluyen la decodificación ávida, búsqueda por haz, muestreo top-k y muestreo de núcleo.

📚 Referencias:

  • Transformers ilustrado por Jay Alammar: Una explicación visual e intuitiva del modelo Transformer.
  • GPT-2 ilustrado por Jay Alammar: Más importante que el artículo anterior, se centra en la arquitectura GPT, muy similar a la de Llama.
  • Visualización de LLMs por Brendan Bycroft: Increíble visualización 3D de lo que sucede dentro de un LLM.
  • nanoGPT por Andrej Karpathy: Video de 2 horas en YouTube para reimplementar GPT desde cero (para programadores).
  • ¿Atención? ¡Atención! por Lilian Weng: Introduce la necesidad de atención de una manera más formal.
  • Estrategias de decodificación en LLMs: Proporciona código y una introducción visual a las diferentes estrategias de decodificación para generar texto.

Construyendo un dataset de instrucciones

Aunque es fácil encontrar datos crudos de Wikipedia y otros sitios web, es difícil recolectar pares de instrucciones y respuestas en la naturaleza. Como en el aprendizaje automático tradicional, la calidad del conjunto de datos influirá directamente en la calidad del modelo, lo que significa que podría ser el componente más importante en el proceso de afinamiento.

  • Conjunto de datos tipo Alpaca: Generar datos sintéticos desde cero con la API de OpenAI (GPT). Puedes especificar semillas y prompts del sistema para crear un conjunto de datos diverso.
  • Técnicas avanzadas: Aprender cómo mejorar conjuntos de datos existentes con Evol-Instruct, cómo generar datos sintéticos de alta calidad como en los papeles Orca y phi-1.
  • Filtrado de datos: Técnicas tradicionales que involucran regex, eliminación de duplicados cercanos, enfocándose en respuestas con un alto número de tokens, etc.
  • Plantillas de prompts: No existe una manera estándar verdadera de formatear instrucciones y respuestas, por lo que es importante saber sobre las diferentes plantillas de chat, como ChatML, Alpaca, etc.

📚 Referencias:


Pre-entrenamiento de modelos

El pre-entrenamiento es un proceso muy largo y costoso, por lo que no es el foco de este curso. Es bueno tener algún nivel de entendimiento sobre lo que sucede durante el preentrenamiento, pero la experiencia práctica no es requerida.

  • Pipeline de datos: El preentrenamiento requiere enormes conjuntos de datos (por ejemplo, Llama 2 fue entrenado en 2 billones de tokens) que necesitan ser filtrados, tokenizados y agrupados con un vocabulario predefinido.
  • Modelado de lenguaje causal: Aprender la diferencia entre modelado de lenguaje causal y modelado de lenguaje enmascarado, así como la función de pérdida utilizada en este caso. Para un preentrenamiento eficiente, aprender más sobre Megatron-LM o gpt-neox.
  • Leyes de escalamiento ie. Chinchilla scaling laws: Las leyes de escalamiento describen el rendimiento esperado del modelo basado en el tamaño del modelo, tamaño del conjunto de datos y la cantidad de cómputo usado para el entrenamiento.
  • Computación de alto rendimiento (HPC): Fuera del alcance aquí, pero más conocimiento sobre HPC es fundamental si estás planeando crear tu propio LLM desde cero (hardware, carga de trabajo distribuida, etc.).

📚 Referencias:

  • LLMDataHub por Junhao Zhao: Lista curada de conjuntos de datos para preentrenamiento, afinamiento y RLHF.
  • Entrenando un modelo de lenguaje causal desde cero por Hugging Face: Preentrena un modelo GPT-2 desde cero usando la biblioteca transformers.
  • TinyLlama por Zhang et al.: Consulta este proyecto para obtener un buen entendimiento de cómo se entrena un modelo Llama desde cero.
  • Modelado de lenguaje causal por Hugging Face: Explica la diferencia entre modelado de lenguaje causal y enmascarado y cómo afinar rápidamente un modelo DistilGPT-2.
  • Las zarpadas implicaciones de Chinchilla por nostalgebraist: Discute las leyes de escalamiento y explica lo que significan para los LLMs en general.
  • BLOOM por BigScience: Página de Notion que describe cómo se construyó el modelo BLOOM, con mucha información útil sobre la parte de ingeniería y los problemas que se encontraron.
  • Bitácora de entrenamiento de OPT-175 por Meta: Registros de investigación que muestran lo que salió mal y lo que salió bien. Útil si planeas preentrenar un modelo de lenguaje grande (en este caso, 175B parámetros).
  • LLM 360: Un marco para LLMs de código abierto con código de entrenamiento y preparación de datos, datos, métricas y modelos.

Ajuste fino supervisado

Los modelos pre-entrenados solo están entrenados en una tarea de predicción del siguiente token, por lo que no son asistentes útiles. SFT te permite ajustarlos para responder a instrucciones. Además, te permite afinar tu modelo en cualquier dato (privado, no visto por GPT-4, etc.) y usarlo sin tener que pagar por una API como la de OpenAI.

  • Ajuste fino completo: El ajuste fino (fine-tuning) completo se refiere a entrenar todos los parámetros en el modelo. No es una técnica eficiente, pero produce resultados ligeramente mejores.
  • LoRA: Una técnica de afinamiento eficiente en parámetros (PEFT) basada en adaptadores de rango bajo. En lugar de entrenar todos los parámetros, solo entrenamos estos adaptadores.
  • QLoRA: Otra PEFT basada en LoRA, que también cuantiza los pesos del modelo en 4 bits e introduce optimizadores paginados para manejar picos de memoria. Combínalo con Unsloth para correrlo eficientemente en un cuaderno Colab gratuito.
  • Axolotl: Una herramienta de afinamiento poderosa y fácil de usar que se utiliza en muchos modelos de código abierto de vanguardia.
  • DeepSpeed: Pre-entrenamiento y afinamiento eficientes de LLMs para configuraciones multi-GPU y multi-nodo (implementado en Axolotl).

📚 Referencias:


Aprendizaje por refuerzo a partir de feedback humano (RLHF)

Después del afinamiento supervisado, el RLFH ("Reinforcement learning from human feedback") es un paso usado para alinear las respuestas del LLM con las expectativas humanas. La idea es aprender preferencias a partir de retroalimentación humana (o artificial), que se puede usar para reducir sesgos, censurar modelos, o hacerlos actuar de una manera más útil. Es más complejo que el SFT (supervised fine-tuning) y a menudo se ve como opcional.

  • Conjuntos de datos de preferencia: Estos conjuntos típicamente contienen varias respuestas con algún tipo de clasificación, lo que los hace más difíciles de producir que los conjuntos de instrucciones.
  • Optimización de política proxima: Este algoritmo aprovecha un modelo de recompensa que predice si un texto dado está altamente clasificado por humanos. Esta predicción se usa luego para optimizar el modelo SFT con una penalización basada en divergencia KL.
  • Optimización de preferencia directa: DPO simplifica el proceso al reformularlo como un problema de clasificación. Usa un modelo de referencia en lugar de un modelo de recompensa (no necesita entrenamiento) y solo requiere un hiperparámetro, lo que lo hace más estable y eficiente.

📚 Referencias:


Evaluación de modelos

Evaluar LLMs es una parte subestimada del pipeline, que consume tiempo y es moderadamente confiable. Tu tarea específica debería dictar qué quieres evaluar, pero siempre recuerda la ley de Goodhart: "Cuando una medida se convierte en un objetivo, deja de ser una buena medida."

  • Métricas tradicionales: Métricas como la perplejidad y el puntaje BLEU no son tan populares como lo eran porque están defectuosas en la mayoría de los contextos. Aún es importante entenderlas y cuándo pueden ser aplicadas.
  • Benchmarks generales: Basados en el Language Model Evaluation Harness, el Open LLM Leaderboard es el principal benchmark para LLMs de propósito general (como ChatGPT). Hay otros benchmarks populares como BigBench, MT-Bench, etc.
  • Benchmarks específicos de tareas: Tareas como la summarización, traducción y respuesta a preguntas tienen benchmarks dedicados, métricas e incluso subdominios (médico, financiero, etc.), como PubMedQA para respuesta a preguntas biomédicas.
  • Evaluación humana: La evaluación más confiable es la tasa de aceptación por parte de los usuarios o comparaciones hechas por humanos. Si quieres saber si un modelo rinde bien, la forma más simple pero segura es usarlo tú mismo.

📚 Referencias:


Cuantización

La cuantización es el proceso de convertir los pesos (y activaciones) de un modelo usando una precisión menor. Por ejemplo, los pesos almacenados usando 16 bits pueden ser convertidos en una representación de 4 bits. Esta técnica se ha vuelto cada vez más importante para reducir los costos computacionales y de memoria asociados con los LLMs.

  • Técnicas base: Aprende los diferentes niveles de precisión (FP32, FP16, INT8, etc.) y cómo realizar cuantización naíf con técnicas de absmax y punto cero.
  • GGUF y llama.cpp: Originalmente diseñado para correr en CPUs, llama.cpp y el formato GGUF se han vuelto las herramientas más populares para correr LLMs en hardware de grado consumidor.
  • GPTQ y EXL2: GPTQ y, más específicamente, el formato EXL2 ofrecen una velocidad increíble pero solo pueden correr en GPUs. Los modelos también toman un largo tiempo en ser cuantizados.
  • AWQ: Este nuevo formato es más preciso que GPTQ (menor perplejidad) pero usa mucho más VRAM y no necesariamente es más rápido.

📚 Referencias:


Nuevas tendencias

  • Codificaciones posicionales: Aprende cómo los LLMs codifican posiciones, especialmente esquemas de codificación posicional relativa como RoPE. Implementa YaRN (multiplica la matriz de atención por un factor de temperatura) o ALiBi (penalización de atención basada en la distancia de tokens) para extender la longitud del contexto.
  • Fusión de modelos: Fusionar modelos entrenados se ha vuelto una manera popular de crear modelos performantes sin ningún afinamiento. La popular biblioteca mergekit implementa los métodos de fusión más populares, como SLERP, DARE, y TIES.
  • Mix de expertos: Mixtral repopularizó la arquitectura MoE gracias a su excelente rendimiento. Paralelamente, un tipo de frankenMoE emergió en la comunidad OSS fusionando modelos como Phixtral, que es una opción más económica y performante.
  • Modelos multimodales: Estos modelos (como CLIP, Stable Diffusion, o LLaVA) procesan múltiples tipos de entradas (texto, imágenes, audio, etc.) con un espacio de incrustación unificado, lo que desbloquea aplicaciones poderosas como texto-a-imagen.

📚 Referencias:

👷 Roadmap para ser ingeniero/a de LLMs

Esta sección del curso se enfoca en aprender cómo construir aplicaciones potenciadas por LLM que puedan usarse en producción, con un enfoque en aumentar modelos y desplegarlos a escala.

📁
├── 🚀 Corriendo LLMs
│   ├── 🌐 APIs de LLM
│   ├── 📖 LLMs de código abierto
│   ├── 💡 Ingeniería de prompts
│   └── 📐 Estructuración de salidas
├── 🗂 Creando bases de datos vectoriales
│   ├── 📥 Ingesta de documentos
│   ├── ✂️ División de documentos
│   ├── 🧬 Modelos de embedding
│   └── 🗃 Bases de datos vectoriales
├── 🤖 Retrieval augmented generation (generación aumentada por recuperación)
│   ├── 🎛 Orquestadores
│   ├── 🔍 Retrievers
│   ├── 🧠 Memoria
│   └── 📋 Evaluación
├── ⚙️ RAG avanzado
│   ├── 📝 Construcción de consultas
│   ├── 🛠 Agentes y herramientas
│   └── 🔄 Post-procesamiento
├── 🚄 Optimización de inferencia
│   ├── ⚡ Flash attention
│   ├── 🗝 Caché de key-value
│   └── 🔮 Decodificación especulativa
├── 📡 Desplegando LLMs
│   ├── 🏠 Despliegue local
│   ├── 🎮 Despliegue de un prototipo
│   ├── 🖥 Despliegue en un servidor
│   └── 🌐 Despliegue en edge
└── 🔒 Asegurando LLMs
    ├── 🎣 Hacking de prompts
    ├── 🚧 Barreras de seguridad (guardrails)
    ├── 🚪 Puertas traseras
    └── 🛡 Medidas defensivas

Corriendo LLMs

Ejecutar LLMs puede ser difícil debido a los altos requisitos de hardware. Dependiendo de tu caso de uso, podrías querer simplemente consumir un modelo a través de una API (como GPT-4) o ejecutarlo localmente. En cualquier caso, técnicas adicionales de prompting y alineamiento pueden mejorar y restringir los outputs para tus aplicaciones.

  • APIs de LLM: Las APIs son una manera conveniente de desplegar LLMs. Este espacio está dividido entre LLMs privados o propietarios (OpenAI, Google, Anthropic, Cohere, etc.) y LLMs de código abierto (OpenRouter, Hugging Face, Together AI, etc.).
  • LLMs de código abierto: El Hugging Face Hub es un excelente lugar para encontrar LLMs. Puedes ejecutar algunos de ellos directamente en Hugging Face Spaces, o descargarlos y ejecutarlos localmente en aplicaciones como LM Studio o a través de la CLI con llama.cpp o Ollama.
  • Ingeniería de prompts: Técnicas comunes incluyen prompting de cero disparos, prompting de pocos disparos, cadena de pensamiento y ReAct. Funcionan mejor con modelos más grandes, pero pueden adaptarse a modelos más pequeños.
  • Estructurando outputs (resultados del modelo): Muchas tareas requieren un output estructurado, como una plantilla estricta o un formato JSON. Librerías como LMQL, Outlines, Guidance, etc. pueden usarse para guiar la generación y respetar una estructura dada.

📚 Referencias:


Creando una base de datos vectorial

Crear un almacenamiento de vectores es el primer paso para construir un pipeline de Generación Aumentada por Recuperación ("Retrieval Augmented Generation", RAG). Los documentos se ingestan, se dividen (split) y los fragmentos relevantes se usan para producir representaciones vectoriales (embeddings) que se almacenan para su uso futuro durante la inferencia.

  • Ingesta de documentos: Los cargadores de documentos son wrappers convenientes que pueden manejar muchos formatos: PDF, JSON, HTML, Markdown, etc. También pueden traer datos directamente de algunas bases de datos y APIs (GitHub, Reddit, Google Drive, etc.).
  • División de documentos: Los divisores de texto descomponen los documentos en fragmentos más pequeños, semánticamente significativos. En lugar de dividir el texto después de n caracteres, a menudo es mejor dividir por encabezado o recursivamente, con algunos metadatos adicionales.
  • Modelos de embeddings: Los modelos de embeddings convierten el texto en representaciones vectoriales. Permite una comprensión más profunda y matizada del lenguaje, esencial para realizar búsquedas semánticas.
  • Bases de datos vectoriales: Las bases de datos vectoriales (como Chroma, Pinecone, Milvus, FAISS, Annoy, etc.) están diseñadas para almacenar vectores de embeddings. Nos permiten traer, de forma eficiente, información qué es "más similar" a una consulta hecha al modelo basado en la similitud que tenemos entre vectores.

📚 Referencias:


Generación aumentada por recuperación (RAG)

Con RAG, los LLMs recuperan documentos contextuales de una base de datos para mejorar la precisión de sus respuestas. RAG es una forma popular de aumentar el conocimiento del modelo sin necesidad de afinamiento adicional.

  • Orquestadores: Los orquestadores (como LangChain, LlamaIndex, FastRAG, etc.) son marcos populares para conectar tus LLMs con herramientas, bases de datos, memorias, etc., y aumentar sus habilidades.
  • Recuperadores: Las instrucciones de los usuarios no están optimizadas para la recuperación. Diferentes técnicas (por ejemplo, recuperador de múltiples consultas, HyDE, etc.) pueden aplicarse para reformular/ampliarlas y mejorar el rendimiento.
  • Memoria: Para recordar instrucciones y respuestas anteriores, LLMs y chatbots como ChatGPT agregan este historial a su ventana de contexto. Este búfer puede mejorarse con resúmenes (por ejemplo, usando un LLM más pequeño), una tienda vectorial + RAG, etc.
  • Evaluación: Necesitamos evaluar tanto la recuperación de documentos (precisión y recall del contexto) como las etapas de generación (fidelidad y relevancia de la respuesta). Se puede simplificar con herramientas como Ragas y DeepEval.

📚 Referencias:


RAG Avanzado

Aplicaciones en producción pueden requerir pipelines complejos, incluyendo bases de datos SQL o de grafos, así como la selección automática de herramientas y APIs relevantes. Estas técnicas avanzadas pueden mejorar una solución base y proporcionar características adicionales.

  • Construcción de consultas/queries: Los datos estructurados almacenados en bases de datos tradicionales requieren un lenguaje de consulta específico como SQL, Cypher, metadatos, etc. Podemos traducir directamente la instrucción del usuario en una consulta para acceder a los datos con la construcción de consultas.
  • Agentes y herramientas: Los agentes aumentan los LLMs seleccionando automáticamente las herramientas más relevantes para proporcionar una respuesta. Estas herramientas pueden ser tan simples como usar Google o Wikipedia, o más complejas como un intérprete de Python o Jira.
  • Post-procesamiento: Paso final que procesa las entradas que se alimentan al LLM. Mejora la relevancia y diversidad de los documentos recuperados con reordenamiento, RAG-fusión, y clasificación.

📚 Referencias:


Optimización de la inferencia de un modelo

La generación de texto es un proceso costoso que requiere hardware caro. Además de la cuantización, se han propuesto varias técnicas para maximizar el rendimiento y reducir los costos de inferencia.

  • Flash attention: Optimización del mecanismo de atención para transformar su complejidad de cuadrática a lineal, acelerando tanto el entrenamiento como la inferencia.
  • Caché de key-value: Entiende el caché de key-value y las mejoras introducidas en la atención de múltiples consultas (MQA) y la atención de consultas agrupadas (GQA).
  • Decodificación especulativa: Usa un modelo pequeño para producir borradores que luego son revisados por un modelo más grande para acelerar la generación de texto.

📚 Referencias:

  • Inferencia en GPU por Hugging Face: Explica cómo optimizar la inferencia en GPUs.
  • Inferencia de LLM por Databricks: Mejores prácticas sobre cómo optimizar la inferencia de LLM en producción.
  • Optimizando LLMs para velocidad y memoria por Hugging Face: Explica tres técnicas principales para optimizar velocidad y memoria, a saber, cuantización, Atención Flash e innovaciones arquitectónicas.
  • Generación asistida por Hugging Face: Versión de Hugging Face de la decodificación especulativa, es un post interesante sobre cómo funciona con código para implementarlo.

Desplegando LLMs

Desplegar LLMs a escala es una hazaña de ingeniería que puede requerir múltiples clústeres de GPUs. En otros escenarios, demos y aplicaciones locales pueden lograrse con mucha menor complejidad.

  • Despliegue local: La privacidad es una ventaja importante que los LLMs de código abierto tienen sobre los privados. Servidores LLM locales (LM Studio, Ollama, oobabooga, kobold.cpp, etc.) capitalizan esta ventaja para potenciar aplicaciones locales.
  • Despliegue de un prototipo: Frameworks como Gradio y Streamlit son útiles para prototipar aplicaciones y compartir demos. También puedes alojarlos fácilmente en línea, por ejemplo, usando Hugging Face Spaces.
  • Despliegue en un servidor: Desplegar LLMs a escala requiere infraestructura en la nube (ver también SkyPilot) o local y a menudo aprovecha frameworks de generación de texto optimizados como TGI, vLLM, etc.
  • Despliegue en el edge: En entornos restringidos, frameworks de alto rendimiento como MLC LLM y mnn-llm pueden desplegar LLMs en navegadores web, Android, e iOS.

📚 Referencias:


Haciendo a los LLMs mas seguros

Además de los problemas de seguridad tradicionales asociados con el software, los LLMs tienen debilidades únicas debido a la forma en que son entrenados y consultados.

  • Hackeo de prompts: Diferentes técnicas relacionadas con la ingeniería de prompts, incluyendo inyección de prompts (instrucción adicional para modificar la respuesta del modelo), filtración de datos/prompts (recuperar sus datos/prompts originales), y jailbreaking (crear prompts para eludir características de seguridad).
  • Puertas traseras: Los vectores de ataque pueden apuntar al propio conjunto de datos de entrenamiento, envenenando los datos de entrenamiento (por ejemplo, con información falsa) o creando puertas traseras (disparadores secretos para cambiar el comportamiento del modelo durante la inferencia).
  • Medidas defensivas: La mejor manera de proteger tus aplicaciones LLM es probarlas contra estas vulnerabilidades (por ejemplo, usando equipos rojos y controles como garak) y observarlas en producción (con un marco como langfuse).

📚 Referencias:


Reconocimientos

Este roadmap está inspirado fuertemente (robado) del roadmap que hizo Maxime Labonne (twitter & github)

Disclaimer: No estoy afiliado con ninguna institución mencionada acá.


Star History Chart