Los Modelos de Lenguaje Grandes (LLMs) tienen - gracias a transformers (opens new window) y a los enormes datos de entrenamiento - funcionalidades versátiles con un rendimiento notable. Por lo general, los LLMs son de propósito general y no se entrenan con un propósito único en mente. Por ejemplo, GPT-4 (opens new window) puede permitir la traducción de lenguaje, la generación de texto, la respuesta a preguntas y muchas otras características.
Para aplicaciones específicas, como tener un chatbot para atención médica o la traducción de lenguaje para un idioma poco representado, necesitamos tener un modelo especializado. Afortunadamente, una de las características poderosas de los LLMs (y otros modelos basados en transformers) es su capacidad de adaptación. Por lo tanto, en lugar de entrenar el modelo desde cero, podemos tomar el modelo LLM existente y ajustarlo finamente en los datos de entrenamiento.
El ajuste fino es crucial en el dominio de los Modelos de Lenguaje Grandes (LLMs), y existen muchos métodos para ello. Como resultado, dedicaremos un par de blogs para adentrarnos en el tema del ajuste fino y también compararlo con otros métodos, como la ingeniería de indicaciones y RAG. En nuestro blog inicial, exploraremos el proceso de ajuste fino utilizando la biblioteca transformers
de Hugging Face, mientras que el siguiente se centrará en el uso de OpenAI para ajustar finamente un modelo de propósito general.
# Ajuste fino de LLMs
El ajuste fino puede ser completo o parcial. Debido al gran tamaño de los LLMs, es inviable ajustarlos completamente, por lo que la técnica de Ajuste Fino Eficiente en Rendimiento (comúnmente conocida como PEFT (opens new window)) es una técnica común para ajustar finamente los LLMs. Dado que PEFT tiene un buen soporte en Hugging Face, utilizaremos el modelo de Hugging Face (opens new window) para este propósito.
# Cargar el modelo preentrenado
Hugging Face tiene todo un ecosistema de bibliotecas, por lo que hay algunas bibliotecas/módulos útiles, como:
- Ajuste Fino Supervisado (SFT (opens new window))
- Ajuste Fino Eficiente en Rendimiento (PEFT)
- AutoTokenizer
Para el modelo preentrenado, podemos utilizar cualquier modelo de código abierto. Y aquí, utilizaremos Falcon-7b (opens new window) por su tamaño más pequeño y su rendimiento increíble.
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
from peft import LoraConfig
modelID = "tiiuae/falcon-7b"
# Preparar el conjunto de datos
SFT (que utilizaremos en breve para el entrenamiento) permite utilizar directamente los conjuntos de datos del repositorio de Hugging Face. Podemos aprovechar los numerosos conjuntos de datos disponibles allí. Por ejemplo, utilizaremos el conjunto de datos de Asistencia Abierta (opens new window) para la generación de indicaciones.
Nota:
En caso de que el conjunto de datos que desees utilizar para el ajuste fino no esté disponible en el repositorio de Hugging Face, puedes cargarlo utilizando tu cuenta.
dataset = load_dataset("timdettmers/openassistant-guanaco", split="train")
# Modificar el modelo según los requisitos
Además del ajuste fino parcial, también podemos utilizar la cuantización para reducir aún más el tamaño de los pesos:
quantizationConfig = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_quant_type="nf4"
)
model = AutoModelForCausalLM.from_pretrained(modelID, quantization_config=quantizationConfig)
También cargaremos el tokenizador:
tokenizer = AutoTokenizer.from_pretrained(modelID)
tokenizer.add_special_tokens({'pad_token': '<PAD>'})
Nota:
Los Modelos de Lenguaje Grandes (LLMs) requieren una gran potencia computacional para cargar y ajustar finamente. He utilizado Google Colab Pro con una GPU A100 para este modelo.
# Ajustar finamente el modelo
Ahora, estamos listos para inicializar nuestro entrenador. El constructor de SFT toma algunos argumentos, como:
model
: modelo preentrenadotrain_dataset
: conjunto de datos de ajuste finodataset_text_field
: campo de texto, texto - por lo general, es "text
" de forma predeterminadamax_seq_length
: longitud máxima de secuenciatokenizer
: tokenizador para el texto
trainer = SFTTrainer(
model=model,
train_dataset=dataset,
dataset_text_field="text",
max_seq_length=512,
tokenizer=tokenizer,
packing=True,
)
Y ahora podemos entrenarlo:
trainer.train()
Ahora, una vez entrenado, podemos probarlo con algunas inferencias. Pero primero necesitamos llamar al pipeline respectivo:
from transformers import pipeline
pipeline = pipeline(
"text-generation",
model=model,
tokenizer=AutoTokenizer.from_pretrained(model),
device_map="auto",
)
Por ejemplo, lo inferimos utilizando esta indicación:
sequences = pipeline(
"Sin lugar a dudas, la fruta más deliciosa de este planeta es el anacardo (en su forma cruda). Se encuentra en Brasil y otras regiones tropicales, su sabor es incomparable. ¿Qué opinas, Sam? \\n Sam:",
max_length=200,
do_sample=True,
top_k=10,
num_return_sequences=1
)
for seq in sequences:
print(f"Resultado: {seq['generated_text']}")
Y obtuvimos una salida como esta (puede variar en tu caso debido a la naturaleza estocástica de los modelos de lenguaje):
Resultado: Sin lugar a dudas, la fruta más deliciosa de este planeta es el anacardo (en su forma cruda). Se encuentra en Brasil y otras regiones tropicales, su sabor es incomparable. ¿Qué opinas, Sam?
Sam: Diría que es delicioso. Tiene un sabor ligeramente dulce y a nuez, pero con un sabor muy agradable y mantecoso y una textura cremosa y suave. Es una de mis frutas favoritas y puedo comerla a puñados.
¿Cuál es el mejor lugar en el que has estado?*
Sam: Oh, esta es una pregunta difícil. Es una respuesta muy difícil.
¿Es una respuesta difícil?
Sam: He estado en varios países, pero mi lugar favorito es probablemente las Galápagos. Pasé unas semanas allí y me encantó el paisaje.
¿Cuál es el peor lugar en el que has estado?
Sam: Creo que probablemente el lugar más horrible que he visto es Berlín.
# Aplicaciones del mundo real del ajuste fino de LLMs
El ajuste fino está cambiando la forma en que las industrias utilizan la IA, haciéndola más asequible y fácil de usar. A diferencia de utilizar la Generación con Recuperación Mejorada (RAG), que requiere un costo continuo, el ajuste fino te permite personalizar un modelo de código abierto una vez sin gastos adicionales. Esto te brinda un control completo y elimina la necesidad de infraestructura adicional. Ejemplos como PaLM y FinGPT muestran cómo los modelos ajustados finamente pueden ser potentes y flexibles:
Automatización del servicio al cliente: Al ajustar finamente los modelos para empresas de servicio al cliente específicas, los desarrolladores pueden crear chatbots que no solo imiten una conversación general, sino que comprendan y respondan a consultas en el contexto de su negocio. Este enfoque evita el uso de recursos externos y proporciona soporte al cliente las 24 horas del día, los 7 días de la semana, que realmente comprende los términos y las preguntas de los clientes, mejorando la experiencia y la satisfacción del cliente en general.
Servicios de traducción de idiomas: Mediante el ajuste fino, los desarrolladores pueden mejorar los modelos de lenguaje para especializarse en tareas de traducción de idiomas, evitando el enfoque genérico de talla única. Esto ayuda a superar las barreras del idioma de manera más efectiva en los negocios internacionales y los viajes, sin necesidad de costosos API externos.
Educación personalizada: El ajuste fino hace posible crear plataformas impulsadas por IA que ajustan los materiales de aprendizaje para adaptarse a la velocidad y el estilo de aprendizaje de cada estudiante. Al ser dueños del modelo, las instituciones educativas pueden evolucionar y adaptar continuamente el material de aprendizaje sin costos adicionales, lo que hace que la educación sea más personalizada e impactante.
Estos ejemplos muestran que el ajuste fino de los LLMs se puede aplicar para resolver problemas del mundo real y mejorar la vida cotidiana. La adaptabilidad y eficiencia de los modelos ajustados finamente prometen aplicaciones aún más innovadoras en el futuro.
# Conclusión
Las capacidades de los LLMs se pueden aprovechar ajustándolos finamente para una tarea específica utilizando un conjunto de datos especializado. Se ha facilitado con bibliotecas como Hugging Face y técnicas de PEFT como el ajuste fino parcial y la cuantización. Debido al gran número de LLMs de código abierto como Llama, Vicuana, Falcon, Aya y muchos otros, el ajuste fino de LLMs se está volviendo más fácil y asequible.
Hoy en día, muchas organizaciones están desarrollando aplicaciones de IA utilizando las API de los Modelos de Lenguaje Grandes (LLMs), donde las bases de datos vectoriales desempeñan un papel importante al ofrecer un almacenamiento y recuperación eficientes de las incrustaciones contextuales. MyScale (opens new window) es una base de datos vectorial diseñada específicamente para aplicaciones de IA, teniendo en cuenta factores como el costo, la precisión y la velocidad. Es muy fácil de usar para los desarrolladores, ya que solo requiere SQL para interactuar.
El ajuste fino desempeña un papel fundamental en la optimización de los Modelos de Lenguaje Grandes (LLMs), ofreciendo diversas metodologías para este esfuerzo. Estén atentos a nuestro próximo blog, donde exploraremos el ajuste fino de un modelo de propósito general con OpenAI.
Artículo relacionado: Superando las bases de datos vectoriales especializadas con MyScale (opens new window)
Si tienes algún comentario o sugerencia, por favor contáctanos en el Discord (opens new window) de MyScale.