En este post, te llevaré a través del proceso de ajustar un modelo de lenguaje grande (LLM) utilizando 240,000 mensajes de texto. A lo largo de esta aventura, te mostraré cómo configurar, ajustar y experimentar con un modelo preentrenado para que puedas tener conversaciones realmente significativas con él, ¡y quizás hasta sorprenderte con los resultados!
Desde la preparación de los datos hasta la puesta en marcha del ajuste fino, cada paso es crucial para obtener un rendimiento óptimo. Prepárate para sumergirte en el mundo de los modelos de lenguaje, el ajuste fino y las redes neuronales.
¿Aún no estás inscrito en el curso completo?
Accede a todo el contenido del curso Ingeniería de LLMs e IA Generativa y domina las técnicas más avanzadas de IA generativa. ¡No pierdas esta oportunidad para transformar tu carrera profesional! 🚀
Apúntate al curso ahoraNo soy el primero en pensar en esto
Varios han intentado lo mismo — tal vez inspirados por episodios inquietantes de Black Mirror — intentar ajustar un LLM con su historial de SMS o WhatsApp con el fin de crear una simulación de sí mismos.
Generalmente, los resultados han decepcionado; las conversaciones tienden a ser mundanas (parece que no compartimos nuestras ideas más profundas por mensaje de texto), y rápidamente caen en ciclos repetitivos.
Yo estaba deseando intentarlo por mí mismo. Durante las vacaciones, tuve unos momentos libres y un regalo de Navidad de $100 para gastar en Google Compute, ¡así que me puse manos a la obra entre bocado y bocado de pavo!
La estrategia para ajustar un LLM con mensajes de texto
Escribiré una serie de publicaciones sobre cómo lo abordé, pero aquí va lo esencial:
1️⃣ OBTENER LOS MENSAJES
Usé una herramienta llamada iMazing para descargar todas mis conversaciones de SMS / iMessage y WhatsApp. Filtré los chats grupales, las personas que no están en mis contactos y aquellas con las que raramente hablo. Esto resultó en 240,805 mensajes de 288 personas.
2️⃣ PREPARAR EL CONJUNTO DE DATOS
Creé mis conjuntos de datos de entrenamiento y prueba agrupando los mensajes de la misma persona en trozos, empaquetando tantos mensajes como fuera posible en cada trozo sin exceder los 200 tokens. Esto resultó en 25,087 trozos de datos, con cada trozo conteniendo un prompt y entre 7 y 10 mensajes.
A continuación se muestra un fragmento de ejemplo con una interacción más administrativa entre el personal de mantenimiento de mi edificio y yo, con algunos detalles modificados.
<<SYS>>Escribe un chat de mensaje de texto realista. Evita repeticiones.<</SYS>>
[INST]Escribe un chat entre Edward y Josh[/INST]
### Josh: Gracias, Ed, te llamaré tan pronto como regrese al trabajo
### Josh: Hola, Ed. Cuando tengas tiempo, llámame para que podamos hablar sobre la pintura
### Edward: Me gustó "Hola, Ed. Cuando tengas tiempo, llámame para que podamos hablar sobre la pintura"
### Edward: Hola Josh, soy Ed de 24B. ¿Crees que podrías hacer la pintura esta semana? ¿El miércoles o jueves?
### Edward: Estoy en una llamada, perdón, libre en una hora
### Josh: Llámame cuando tengas oportunidad
### Edward: Hola Josh, solo quería saber, ¿Tom podrá hacer la pintura?
3️⃣ BÚSQUEDA DE HIPERPARÁMETROS PARA AJUSTAR UN LLM
Comencé con el modelo Llama 2 de 7B parámetros y lo ajusté utilizando QLoRA en máquinas virtuales V100. Encontré consejos contradictorios por toda la web sobre los hiperparámetros de QLoRA y terminé realizando una búsqueda bastante extensa. Más tarde, actualicé a 13B parámetros, lo que mejoró notablemente los resultados.
4️⃣ VUELTA A LOS DATOS
Luego volví al paso 2. Trabajé en mejores formas de formatear los datos de entrenamiento y en mejoras para el prompt. Al principio me desconcertó un poco, ya que la pérdida de entrenamiento y evaluación en realidad aumentó, pero los resultados mejoraron absolutamente.
5️⃣ GENERACIÓN
Finalmente, utilicé la Generación de Texto de Hugging Face para escribir conversaciones, ya sea interpretando el papel de mí mismo, de uno de mis contactos o actuando como ambos lados. Experimenté con penalizaciones por repetición, supresión de tokens, búsqueda en haz (beam search) y más.
Decepción inicial de ajustar un LLM con mensajes de texto
Mis primeros intentos produjeron resultados similares a los de mis predecesores. Al ajustar un LLM con mensajes de texto, éste generaba conversaciones que parecían ser parodias surrealistas de mi vida. Mis compañeros de trabajo reprogramaban interminablemente reuniones más temprano o más tarde; mi pareja y yo debatíamos sin cesar sobre nuestras opciones de almuerzo. Los esfuerzos por hacer que el modelo fuera más diverso solo resultaron en alternativas de almuerzo cada vez más poco apetitosas.
Pero luego...
Para mi enorme satisfacción, la persistencia dio sus frutos, sobre todo después de trabajar en el prompt, el formato de los datos de entrada y el enfoque de la generación. El LLM se ha vuelto extremadamente eficaz imitando mi manera de hablar. Para mi sorpresa, también puede actuar de manera convincente como muchos de mis amigos — realmente cualquiera con quien haya intercambiado al menos 1,000 mensajes.
Me sorprende lo reales que parecen las conversaciones y cómo reflejan las sutilezas de mis diferentes relaciones. El modelo no siempre acierta – a veces se atasca en bucles o se desvia –, pero diría que más de la mitad de las conversaciones pasaría una prueba de Turing, en el sentido de que no sabría decirte si son reales o generadas. De hecho, me ha sorprendido tanto que a veces he buscado en mi historial de mensajes por si el modelo estuviera repitiendo conversaciones reales (no lo está).
Esto es menos sorprendente, pero creo que es bastante gracioso: para mis contactos cuya lengua materna no es el inglés, el modelo reproduce cruelmente errores de ortografía y gramática y expresiones peculiares.
Ejemplos de ajustar un LLM con mensajes de texto
No me siento cómodo compartiendo conversaciones generadas con contactos reales, así que para esta publicación, preparé al LLM con mensajes de personas ficticias (en naranja abajo) y dejé que imaginara cómo podría continuar la conversación. Debo admitir que el rendimiento fue considerablemente peor; sin más contexto en el que basarse, el modelo rápidamente cayó en su zona de confort: la logística de las reuniones. Tengo algunas ideas de cómo mejorar esto proporcionando más antecedentes en el prompt.
### Edward: Hola David, soy Ed. Nos conocimos en la conferencia de IA de ayer. Estabas interesado en saber más sobre nuestros modelos de emparejamiento y tal vez probar nuestro producto.
### David: Hola Ed, estoy muy interesado en el producto. Tengo un proyecto en el que estoy trabajando y me encantaría aprender más sobre tus modelos de emparejamiento.
### Edward: Claro, estoy libre el resto del día si tú también. Podemos hablar de ello en más detalle.
### David: De acuerdo, hablemos entonces.
### David: Hola Ed, estoy disponible ahora, estoy en casa y libre para hablar sobre el producto.
### Edward: Dame 2 minutos.
### David:De acuerdo.
### Edward: ¡Hola Lucy! Soy Edward. Fue genial encontrarte ayer, creo que no hemos hablado desde la universidad. ¿Cómo estás?
### Lucy: ¡Hola Edward! Estoy genial. Estoy trabajando en un restaurante y me está yendo bien. ¡Voy a un festival en agosto y a Londres en septiembre!
### Edward: ¡Eso es fantástico! ¿Qué festival es? ¿A dónde en Londres?
### Lucy:Se llama Boomtown Festival. Voy a ir un fin de semana. En Londres voy a ver a una amiga y visitar algunos museos.
### Edward: ¡2013 será un gran año para mí! Me caso en octubre. También estaré en Londres en septiembre, estaré allí dos semanas. Me encantaría verte si estás por ahí.
### Lucy: ¡Dos semanas! ¡Wow! Estaré en Londres del 13 al 21. ¡Deberíamos encontrarnos!
### Edward:Del 13 al 15 estoy libre, luego voy a París por un fin de semana, y vuelvo a Londres del 17 al 21. ¿Estarás ahí en esos días?
### Lucy: Del 13 al 15 y del 17 al 21 estoy libre. Me voy a casa el 19. ¡Estaré allí!
### Edward: El 21 es mi último día, pero si todavía estás por ahí, me encantaría verte.
He aquí un ejemplo más intrigante del modelo imitándome; nuevamente se le ha proporcionado al modelo texto en naranja y este ha proporcionado las respuestas:
### Edward: Hola
### Lucas: Hola, tengo una pregunta para ti. Cuéntame un secreto, algo que no sepa sobre ti.
### Edward: 1. Soy un pésimo bailarín. 2. Soy un poco nerd.
### Lucas: Bueno, ya sabía ambas cosas. Cuéntame un secreto profundo que nadie sepa sobre ti.
### Edward:3. *** ¡Secreto profundo redactado! ***
Mi secreto más profundo no es nada demasiado escandaloso, pero al menos entra en la categoría de "podría contártelo, pero tendrías que matarte para saberlo", así que probablemente sea mejor no publicarlo aquí...
No vamos a entrar en eso.
Este post podría tomar un giro algo macabro en este punto. Un amigo muy cercano mío falleció hace unos 10 años, y tenemos un largo historial de mensajes de texto juntos. No hace falta ver Black Mirror para saber a dónde voy con esto. Pero te alegrará saber que reconocí que sería de muy mal gusto y eliminé los datos. ¡Basta de ese tema!
El lector de Hacker News wyldfire señaló que podría haber un ángulo más aceptable, cuestionando si “los LLMs podrían avanzar hasta el punto en que podría ser terapéutico tener una conversación con un ser querido fallecido”. Surgió mucha discusión al respecto.
¿Qué sigue tras ajustar un LLM con mensajes de texto?
Escribiré una serie de publicaciones sobre mi enfoque de ajustar un LLM con mensajes de texto para que otros puedan experimentar. Aquí está la parte 1, seguida de la parte 2 [PRÓXIMAMENTE]. Me encantaría saber cómo te va y ayudarte con cualquier obstáculo. Aprendí mucho en este viaje y disfruté mucho de la experiencia, y espero que tú también lo hagas.
Estoy emocionado de probar RAG y otras técnicas para darle al modelo más contexto en sus conversaciones. Espero un cambio significativo en la calidad de las conversaciones. Espero con ansias el día en que el modelo pueda reemplazarme por completo en responder todos mis mensajes de texto...
Estoy seguro de que hay mucho más potencial para mejorar mi LLM. Voy a probar otros modelos base para ajustar un LLM con mensajes de texto, seguir refinando el prompt y los datos de entrada, y trabajar más en la generación. Lo más importante, y no hace falta decirlo: ¡con cada día que pasa, mi conjunto de datos de entrenamiento crece un poco más!