¿Son los modelos de lenguaje la Biblioteca de Babel de Borges?

Jose Luis Borges es uno de mis autores favoritos, me voy a atrever a decir «de ciencia ficción» aunque oficialmente lo suyo no sea ciencia ficción si no realismo mágico. Que en algunos casos es como la ciencia ficción pero cuando el texto se considera culto.

Posiblemente sus dos creaciones más citadas han sido el Aleph y la Biblioteca de Babel. Vamos a hablar de esta última. Una biblioteca infinita, aunque a veces esa afirmación se extiende a la variedad de libros que hay en la misma, sin embargo como ahora veremos esa afirmación es incorrecta. Primero hemos de conocer sus reglas, y es que todos los libros de esa bibliotecas siguen unas reglas muy concretas:

  • Cada libro tiene 410 páginas.
  • Cada página 40 renglones.
  • Cara reglón 80 caracteres.
  • Hay 25 posibles caracteres.
  • Los libros están «escritos» poniendo caracteres al azar (se entiende que de forma equiprobable)
Haz click para ver la versión en vídeo

Sabiendo estos datos es u simple problema de combinatoria calcular el total de libros:

25 ^ (80*40*410) =

25 ^ 1312000 =

Leerse todos cuesta un rato. Como la biblioteca es infinita cada libro tiene que estar un número infinito de veces, lo cual esta bien porque pocas cosas dan mas rabia que ir a reservar un libro y que ya este reservado.

Los bibliotecarios vagan por esa biblioteca (cuyo diseño también tiene un conjunto de reglas que no veremos aquí, a ver si así os pica la curiosidad y leéis el relato) buscando un indice de la misma.

¿Seria posible esta biblioteca? La biblioteca imaginada por Borges tiene un problema….su enorme tamaño. Aunque solo quedamos tener una copia de cada libro llenaríamos pronto las estanterías de todos los IKEA del mundo y no habríamos ni empezado. Pero bueno estamos en la época de Internet donde llevamos años almacenando cosas, el primer paso seria hacerla virtual.

Aun así no cabria toda en ningún sitio, no hay discos duros suficientes. El mayor problema es que hay una gran cantidad de libros inútiles que no contienen más que letras sin sentido. O que son idénticos a otros libros pero cambiando solo una letra (luego otras con dos, tres, cuatro, ….). En una biblioteca bien ordenada todos esos libros serian descartados. La cosa es ¿Cómo hacerlo?.

Lo primero seria en lugar de basarnos en letras hacerlos en componentes básicos de las palabras. Silabas, prefijos, sufijos….algo así como tokens. Un token junta varios caracteres que tiene sentido que vayan juntos. Esto reduce el espacio de probabilidades y aumenta las palabras que tiene sentido en el texto.

Generación usando tokens

Por otro lado tampoco tiene sentido elegir estos tokens a lo loco, que todos sean equiprobables. Mejor seria ver que tras un token solo elijamos entre aquellos que son más probables. De esta forma sabemos que siempre se formaran palabras con sentido.

No todos los tokens son igual de probables

Pero ahora tendremos listas de palabras con sentido…formado frases sin sentido. Podemos aumentar el numero de tokens que se tienen en cuenta para elegir el siguiente token. De esta manera las palabras anteriores más cercanas también influirán en la elección del token. Con este pequeño cambio ¡Ya tenemos frases con sentido!. Incluso podemos hacer pequeños párrafos que tienen sentido.

Mayor número de tokens, más contexto

Sin embargo nuestros problemas no terminan aqui. Cuando el texto crece un poco de tamaño las frases siguen teniendo sentido…pero el texto pierde el contexto del mismo. Empieza contando la historia de un niño y su perro, a mitad se transforma en un articulo periodístico sobre la revolución industrial y se acaba convirtiendo en una receta de pastel de manzana.

Para resolverlo necesitaríamos un mecanismo que tuviera en cuenta todo el texto para generar el siguiente token. Pero no basta con tener en cuenta todo el texto, hay que saber que partes influyen mas en el token que estamos eligiendo. Para ello tiene que valorar correctamente el aporte de cada uno de los tokens del texto. Si sale la palabra «azul» ¿Influye sobre el token que estoy generando ahora o hace referencia a otra cosa y no influye?. A este mecanismo le llamaremos atención.

El mecanismo de atención encuentra relaciones entre tokens

Por último añadiremos un pequeño detalle. En lugar de tener libros de numero de paginas fijo (410), vamos a poner un token de «<fin de libro>» que permita tener libros de cualquier número de paginas (siempre que el mecanismo de atención pueda gestionar textos de ese tamaño).

Hemos estado todo el tiempo hablando de «tokens más probables» de hecho es la base de nuestra biblioteca….pero ¿Cómo sabemos que tokens son más probables? Habrá que sacar esa probabilidades a partir de los textos de nuestros libros, revistas, webs, emails, ….. A más variedad y cantidad de textos mejor.

¡Ya esta! ¡Ya tenemos nuestra biblioteca! Puede generar casi cualquier texto y ocupa mucho menos que que 25 ^ 1312000 libros.

Y si os dais cuenta, lo que acabamos de describir es un LLM (¡Sorpresa inesperada!). Un sistema capaz de generar casi cualquier texto (en el peor de los casos puedes configurarlo para que genere tokens «a lo loco» y volvemos al caso original) pero que prioriza aquellos que tienen sentido y coherencia.. solo que en lugar de bibliotecarios vagando por una biblioteca infinita tenemos prompts.

¿Con esto esta todo? Aun faltaría un pequeño detalle. Hay textos para los que es muy importante que el texto, ademas de tener sentido y coherencia, estemos seguros de que todo lo que se dice es correcto y veraz. Por ejemplo los artículos periodísticos (¡no os riáis!), los textos divulgativos, los ensayos, los trabajos que nos ha pedido hacer el profeso, ….

Aun no tenemos claro como lograr este añadido de la veracidad, hay alguna idea, pero ninguna ha funcionado al 100% Con ese pequeño detalle tendremos una biblioteca de la que el mismísimo Borges estaría orgulloso

Usar ControlNet desde Fooocus

Fooocus es una de las herramientas más sencillas para usar Stable Diffusion. Tiene un gran equilibrio entre complejidad y capacidades. En mi modesta opinión una de sus mayores carencias es la falta de ControlNet. Una herramienta que permite usar distintas características de la imagen para influir en el resultado. De tal forma que no solo podemos usar el prompt para describir la imagen que deseamos.

Es cierto que de forma nativa Fooocus soporta Canny (contornos), pero hay muchos más casos. A mi me interesa especialmente los esqueletos de OpenPose que permiten indicar deforma muy sencilla la posición de las personas en la imagen generada.

Los principales motivos para no soportar ControlNet son:

  • Falta de un buen ControlNet para SDXL, que es la versión de Stable Diffusion que usar Fooocus.
  • Necesidad de cargar varios ControlNet para cada tipo de imagen de referencia.
  • Añadir un preprocesador diferente para cada tipo de imagen de referencia que queramos extraer.

Por suerte desde la aparición de controlnet-union-sdxl-1.0, que permite usar un único modelo para múltiples ControlNet y que soporta SDXL, los dos primeros problemas han sido resueltos.

El tercer punto no queda más remedio que afrontarlo usando programas externos para generar las imágenes de referencia.

En el siguiente vídeo se explican los pasos para lograr integrar este modelo en Fooocus, sin tocar una sola linea de código:

El resumen de los pasos:

  1. Descargar controlnet-union-sdxl: diffusion_pytorch_model.safetensors
  2. Copiarlo en la carpeta Fooocus/models/controlnet
  3. Renombrarlo a (recomendable guardar el fichero anterior) a: control-lora-canny-rank128_old.safetensors
  4. Lanzar Fooocus
  5. En Advanced – Control – Marcar Skip Preprocessor para desactivar el preprocesador de ControlNet (solo sirve para Canny)
  6. Usar Image Prompt con PyraCanny activado
  7. Cargar como Image Prompt la imagen de referencia para ControlNet

¿Puede la IA destruir la cultura?

Entre las múltiples amenazas que sus detractores y los medios de comunicación atribuyen a la IA esta la destruir nuestra cultura remplazando a los creadores humanos. Generalmente cuando se refieren a «destruir la cultura» no hablan de quemar libros en una hoguera, ni a que los seres humanos dejemos de crear obras artísticas. ¿Entonces si no afecta a las creaciones antiguas, ni a las nuevas, como puede la IA destruir la cultura?.

Porque la IA puede hacer algo más peligroso que quemar libros, puede escribirlos.

Haz click para verlo en Youtube

No pretendo ser alarmista. Soy defensor de la IA y creo que nos puede traer muchas cosas nuevas maravillosas. Pero no por eso hemos de ignorar las consecuencias negativas que puede tener. Los móviles son una herramienta muy útil pero no podemos negar los estragos que han causado en nuestra atención.

En este texto cuando hablamos de culturo nos a referirnos a la cultura como elemento de unión social. Muchas veces se habla del idioma común o las tradiciones como elementos que nos unen. Pero la ficción, la música, el arte o el cine pueden ser elementos de unión tan fuertes como los anteriores, influyendo en nuestro lenguaje y nuestra sociedad. No hay más que ver lo difícil que es entender los gustos de otras generaciones con las que compartimos idioma y tradiciones. La cultura es a la vez un reflejo y un modelo para la sociedad. ¿Cuantos movimientos sociales han estado representados por nuevos estilos artísticos?

Actualmente la IA es capaz de realizar labores creativas cada vez más avanzadas. Si sigue mejorando al ritmo actual, cosa que no sabemos si ocurrirá, en pocos años puede estar creando libros, películas, música e incluso videojuegos de forma autónoma.

Pero no basta con crear de forma «autónoma», eso no destruiría la cultura, como mucho afectaría a sus creadores que ahora compartirían el publico con la IA. Pero su función como elemento integrador seguiría siendo la misma. Al principio habrá gente que se mostraría contrario a las obras creadas por la IA y que dirá que eso no es: música, cine, literatura, pintura…Pero con el paso del tiempo y la aparición de más y más obras creadas por IA es posible que el número de detractores se reduzca. Al final volveremos a este punto, por ahora vamos a suponer que las obras creadas por IA triunfan.

En este punto tendríamos creaciones de humanos, de IA y mixtas. Para que la IA se imponga tiene que ofrecer algo que los humanos no ofrezcan y parece difícil que eso ocurra.

¿O no? El problema surge cuando a la IA generativa le sumamos otro tipo de algoritmos de IA, los de recomendación. Son algoritmos capaces de detectar tus gustos. Si bien se suelen usar para identificar los elementos que más probabilidad tienen de gustarte de una lista (básicamente recomendarte libros, películas o música). Pero pueden llegar a extraer características más concretas de que te gusta a partir de conocer nuestras obras favoritas o simplemente observando que contenido consumimos.

Es decir tendremos una IA que cuenta con datos concretos de que nos gusta y otra IA que es capaz de generar obras siguiendo nuestras peticiones. O lo que es lo mismo tendremos un autor dedicado a crear obras personalizadas y que ademas estarán pensadas para incluir los elementos que nos gustan. Y si algo no nos gusta con pedirle a la IA que lo reescriba desde ese punto todo listo. Eso es algo que las obras creadas por humanos no pueden ofrecernos.

Si lo pensáis bien, es un giro respecto a lo que se estila ahora. Actualmente se tratan de hacer obras que gusten a cuanta más gente mejor para sacarles el máximo rendimiento económico. En este caso seria la personalización absoluta. Obras creadas para ti y que posiblemente solo tu vas a disfrutar.

Lo que ocurrirá es que las obras culturales perderán su universalidad, ya no servirán para unir miles de personas, se tornaran algo más personal e intimo. La gente ya no leerá cómics de Superman si no de…DarkcityMan o como quieran que quieran que se llame el personaje que ese lector haya inventado para que la IA escriba sobre él. Perderemos universalidad pero ganaremos personalización. La obra se convertirá en un proceso interactivo.

Por ejemplo a mi me encantaría pedirle que hiciera una película de MacGyver contra Saw. Donde ganara MacGyver por supuesto (otros preferirán que gane Saw). El algoritmo debería de saber que me gustan las películas científicamente correctas así que los inventos y trampas debería de ser «realistas». Me gusta que tenga giros en el guion. ¡Y también me gustan los musicales! ¿Se atrevería a hacer «MacGyver vs Saw, el musical»? Es que me lo estoy imaginado y no me importaría nada pagar por ver eso. «¡Toma mi dinero!».

¿Nos ponemos tremendistas y decimos que la cultura humana va a terminar y con ello la sociedad que terminará convertida en una masa de individuos sin relación entre ellos? No, simplemente va a cambiar como funciona. Seguirá habiendo actividades como la historia, el deporte o la artesanía que servirán para crear grupos. Los humanos seguirán creando arte porque no todos lo crean para ganar dinero con él. Me atrevería a decir que la mayoría lo hacen porque les gusta y no por el dinero que muchas veces ni recuperan lo gastando en su afición.

No todo tiene que ser individualista. Podemos pedirle una IA que cree obras teniendo en cuenta los gustos de una pareja o un grupo de amigos. Creando así una especie de cultura propia con películas, música, libros y videojuegos que solo ellos conocen y disfrutan.

Por último una anécdota, hace poco cree una canción usando IA para mi pareja, que tuvo una temporada de obsesión por tener plantas. Me quedo….bueno le quedo a la IA….no quedó verdaderamente bien. Le sugerí el tema, elegí que partes se añadían, modifique la letra…perdí dos horas. Que es poco tiempo porque de otra manera no habría podido hacerlo en mi vida, no tengo oído musical, ni ritmo. Cada vez que intento tocar un instrumento llaman a la policía. Por supuesto la canción le encanto y nos unió mucho….que va ni siquiera la escucho. ¡La había escrito una IA!

¿Cual es la moraleja de esta historia? Que la IA solo triunfará si nos aporta algo que valoremos. Si el mercado (que somos nosotros) no las acepta no triunfaran, pero aunque lo hagan, si logran aportan algo especial que las obras humanas no pueden, la sociedad no se acabará, solo cambiará.

Usar IA generativa para comprimir datos

Cada día aprendemos más trucos que puede realizar la IA generativa. Vamos a ver como usar un modelo de lenguaje para comprimir textos.

Una técnica habitual en los programas de compresión es crear una nuevo vocabulario donde las secuencias de bits más repetidas, o lo que es lo mismo las más frecuentes, son reemplazadas por secuencias de bits más cortas. Como nada sale gratis en esta vida a cambio hay cadenas de bits cortas pero poco frecuentes que son reemplazadas por otras con más bits. Todos estos reemplazos se guardan en un diccionario que puede ir adjunto en el archivo comprimido si el diccionario es propio para cada fichero y generado a partir del contenido del propio fichero.

Hay otra opción, que el diccionario sea único para todos los ficheros que se compriman. En ese caso no es necesario incluirlo en el fichero. Lo cual ahorra espacio pero a cambio suelen ser sistemas especializados solo para un tipo de ficheros.

Ahora paremos a pensar una cosa: ¿Cómo surgieron los modelos de lenguaje? Originalmente eran sistemas para completar texto. Es decir, saben predecir cuál es la palabra (en realidad el token) más probable para continuar un texto. De hecho no solo saben cuál es la más probable, saben cómo de probable es cada una de las palabras (tokens) que conocen.

Dado un texto un modelo de lenguaje nos devuelve un listado ordenado de lo probable que es cada palabra.

Si un modelo es lo suficientemente bueno podríamos darle el comienzo de un texto y el modelo generaría el resto. Desgraciadamente no funcionan tan bien. Por lo que podemos añadir una corrección cada vez que la predicación sea incorrecta. Al final podemos guardar solo esas desviaciones respecto a las predicciones del modelo.

Obviamente este sistema comprime tan bien como lo bueno que sea el modelo prediciendo el texto. Para textos aleatorios será malo, para textos literarios será bueno.

Si quieres saber más de cómo funciona puedes ver el siguiente vídeo en YouTube:

Haz click para ver el vídeo en mi canal e YouTube

Marcas de agua, textos radiactivos y modelos de lenguaje.

Unas de las principales quejas que hay hoy en día con la IA generativa, es la incapacidad de poder determinar que textos ha creado un humano y cuál una IA.

Hay muchos sitios que prometen ser capaces de detectar los textos creados por una IA. Aunque los pocos que he probado caen pronto cuando le podés a la IA que escriba de otra manera. Además con la gran cantidad de diferentes IA que se pueden usar cada vez es más difícil detectarlos

Y si le damos un giro a la situación y en lugar de  detectar el texto a posteriori lo escribimos a priori para que sea fácil reconocerlos. Para ello se pueden esconder marcas de agua dentro de un mensaje.

En imágenes, videos y audios hay mucho «sitio» donde esconder una marca que indique que el mensaje lo generó una IA sin afectar al mismo, de hecho hay gran cantidad de técnicas. Pero los textos son diferentes, hay pocos datos y muy estructurados. Eso significa que esconder nada en ellos es muy difícil. Todo cambio que hagas en el texto afecta negativamente a la calidad de este. Una sola letra puede transformar una palabra en un galimatias.

El truco está en modificar la distribución estadística de las palabras del texto que genera el modelo de lenguaje. Para ello se usan n palabras (tokens) anteriores para generar dos grupos pseudoaleatorios de palabras (tokens); rojas, prohibidas y verdes, permitidas. Por lo tanto un texto generado por una IA será completamente verde.

Peroooo nada es perfecto y hay un problema. Puede ser que en el grupo de las palabras verdes no exista ninguna muy apropiada para continuar el texto. Esto afecta a la calidad del texto,  lo que hace que sea necesario permitir alguna palabra prohibida (roja) de vez en cuando.

Si quieres saber más sobre este tema, más detalles de cómo funciona, sus fortalezas y debilidades, cómo atacarlo, …. Puedes hacer click para ver el siguiente video:

Haz click para ver el vídeo

Manipula la respuesta de un chatbot

¿No estáis hartos de los modelos de lenguaje se nieguen a seguir ciertas ordenes? ¿Y si hubiera alguna forma de «sugerirle» que respuesta debe de dar?

Haz click para ver el vídeo en Youtube

Estamos acostumbrados a interaccionar con los chatbots a través de una interfaces de este estilo:

Sin embargo realmente el texto que se pasa al modelo de lenguaje tiene este aspecto (si usamos Llama 3, dependiendo del LLM se usan formatos diferentes):

Se puede ver que hay etiquetas que indican donde termina el texto del usuario y donde empieza su respuesta.

El modelo de lenguaje comienza a rellenar la respuesta token a token (si no sabes que es un token puede cambiar el termino «token» por «palabra», no es una explicación exacta pero sirve para entender el texto). Para generar cada token lo que hace es analizar todo el texto completo. Es decir, analiza el texto, genera el primer token. Analiza todo el texto junto con ese primer token y genera el segundo. Ahora analiza otra vez el texto junto con los nuevos token para generar el tercero….así hasta llegar al final del texto que genera que lo indicara con <|eot_id|>.
Tras eso el sistema que ejecuta la IA esperará la siguiente texto que introduzca el usuario y al que añadirá delante una etiqueta de usuario (<|start_header_id|>user<|end_header_id|>, en nuestro ejemplo) y al final una etiqueta de asistente (<|start_header_id|>assistant<|end_header_id|>) para que el modelo pueda seguir completando a partir de ahí.

Pero si trabajamos con el modelo de lenguaje desde una API, en lugar de desde la interface gráfica, nada nos impide «engañarle» manipulando su respuesta. Podemos añadir nosotros la etiqueta de asistente y poner lo que queramos detrás de ella:

Y el modelo de lenguaje se verá «obligado» a continuar esa respuesta:

Este truco es útil cuando necesitas que el modelo se pliegue a alguna condición que por algún motivo se niega cumplir. Por ejemplo a mi me pasa con algunos modelos que les pides que creen solo código y se empeñan en añadir texto delante. En el vídeo podéis ver un ejemplo en mayor detalle.

No podemos hacer un clon virtual de Sócrates, pero si de «un Sócrates»

Un clon virtual es un agente inteligente que ha sido entrenado para imitar el comportamiento de un humano. Esto abarca desde aspectos muy limitados, como que sea capaz de responder al email como tú lo harías a que sea capaz de imitar gran cantidad de aspectos tuyos.

Este articulo es una adaptación del siguiente vídeo (haz click para verlo en Youtube):

Haz click para ver el vídeo en mi canal de Youtube

Vivimos en un mundo terriblemente conectado en el cual estamos constantemente generando contenido digital, y no me refiero solo a los influencers, hablo de cada uno de nosotros. Al día escribimos centenares de líneas de texto en forma de emails, mensajes, publicaciones en redes sociales, …. Y no solo texto, también fotos, videos, audios. Cada uno de nosotros es una pequeña productora multimedia con patas.

Dado el avance de los modelos de lenguaje y su capacidad de imitar una forma de escribir resulta tentador volcar nuestros textos en una IA y usando finetuning entrenarla para que hable como nosotros. 

Sin embargo no basta con eso para tener un clon virtual de uno mismo, necesitamos que esa IA se comporte como nosotros lo haríamos. El finetuning ayuda pero no lo es todo, con una buena descripción de nuestra forma de ser y de reaccionar en el prompt logramos un resultado más «ajustado» a la realidad.

¿Pero de qué sirve tener una IA que se comporta como tú si no vas a saber cosas básicas como la fecha de tu cumpleaños? Necesitamos un elemento más, una base de conocimientos que permita aportar esa información que tu clon virtual necesita saber.

Con esto podemos tener un clon que pueda imitarnos bastante bien (bueno, depende de la calidad de los datos y del entrenamiento)

¿Por qué quedarnos ahí? Actualmente tenemos modelos capaces de imitar la voz humana (por algo al proceso lo llaman clonación de voz) e incluso de animar nuestra cara a partir de unas imágenes. 

Cierto es que aún queda la parte de que estas caras imiten nuestros gestos y tics al hablar. Y no me refiero solo a su capacidad de aprender estos gestos. (actualmente los gestos se descomponen como puntos clave en la cara por lo que se pueden usar para «imitarlos») si no cuando corresponde su uso lo cual es mucho más complicado. Por ejemplo, poner los ojos en blanco cuando se está siendo sarcástico.

Aun con estos defectos los resultados parecen ser suficientemente buenos actualmente para que haya gente que los está usando para tener un recuerdo de sus familiares fallecidos.

Pero no todo es un problema tecnológico. Imitar a una persona a partir de la información que tenemos de ella puede no ser tan sencillo y no por motivos técnicos, sino humanos.

Como nos vamos a poner filosóficos ¿Qué mejor que tomar como ejemplo a Sócrates? Uno de los padres de la filosofía.

Si quisiéramos crear un Sócrates virtual nos encontraríamos con un problema, hay más de un Sócrates, en concreto tres. Tenemos tres fuentes documentales sobre la vida de Sócrates:

  • Los diálogos recopilados por Platón y por extensión las menciones que hace Aristoteles, alumno de Platón. En estos se retrata a Sócrates como un crack, un sabio que siempre gana las discusiones haciendo que sus rivales duden de sus propias afirmaciones
  • Los escritos de Jenofonte, un historiador de la antigua Grecia, que muestra un Sócrates sabio pero menos crack.
  • La obra de teatro Las Nubes de Aristófanes, donde lo pinta casi como un bufón.

A esto hay que sumar que tanto Jenofonte como Platón «contaminan» sus obras con sus propias ideas, poniéndolas en boca de Sócrates. Si quisiéramos recrear un Sócrates virtual no sabríamos cuál de los tres se aproxima más al auténtico….¿O no hubo un Sócrates más auténtico? Quizás los tres tengan razón y tan solo sean diferentes versiones de la realidad que ellos veían.

Se podría pensar que el problema está en recurrir a fuentes externas, pero que si usamos los propios mensajes de la persona que vamos a clonar este tipo de contradicciones no van a pasar. Desgraciadamente no es así, nosotros tenemos distintos aspectos, a veces contradictorios, según con que persona tratamos. No hablamos igual con nuestro jefe, amigos o familia. Al final necesitaríamos un clon para cada persona con la que debe conversar.

A todo esto hay que añadirle otro sesgo. El de selección. Da igual si los datos los aporta uno mismo o un conocido. Posiblemente la información estará sesgada y se eliminará aquello que nos haga quedar peor o no nos haga parecer como «de verdad» somos. Todos conocemos a alguien que la forma en que él se percibe y los demás lo hacemos es muy diferente. Mala noticia, todos somos un poco así, con nosotros y con los demás. Toda percepción de una persona, incluida la propia, es subjetiva.

Además hay que sumarle el factor tiempo, con el paso de este la gente va cambiando, aprendiendo cosas nuevas y con gustos diferentes, modificando nuestra forma de expresarnos y de pensar. Pero un clon virtual está congelado en un instante, no puede cambiar su forma de ser. Como mucho se le puede actualizar su base de conocimientos. Cuanto más pasa el tiempo más se distancia el clon del clonado.

En resumen, los clones virtuales como «imitadores» de una pequeña parte nuestra pueden funcionar perfectamente, sin embargo aún les falta mucho para poder ser un replica cercana a un ser humano, ya que nuestro comportamiento varia muchos según factores externos a la propia conversación y es difícil introducir este «contexto» en la misma o en el aprendizaje

Temperatura = 0. Desactivar la creatividad de los modelos de lenguaje para obtener mejores respuestas.

Los modelos de lenguaje pueden tener muchos parámetros diferentes, sin embargo hay uno que todos comparten. La temperatura.

Sin usar matemáticas podríamos definir la temperatura como un indicador de lo «creativo» que es un modelo a la hora de responder. A mayor temperatura mayor creatividad. Generalmente se mantiene en valores entre 0 y 1 ya que valores superiores hacen que las respuestas pierdan coherencia y sentido.

Desde un punto de vista más técnico y matemático, un modelo de lenguaje no genera palabras, sino una especie de pesos asignados a cada token (si no sabes que es un token piénsalo como si fuera una palabra). A mayor peso más adecuado es ese token para completar la frase. Pero ahora hay que pasar esos tokens a probabilidades y elegir uno en base a estas probabilidades. Para convertir estos «pesos» a probabilidad se usa la función softmax con temperatura.

Al aumentar la temperatura las probabilidades entre diferentes tokens se reparten de forma más uniforme y se reduce la distancia entre ellas. Esto hace que sea más probable que se elijan otros tokens. Cuando la temperatura se reduce los tokens de mayor peso concentran mayor probabilidades. Sin embargo cuando la temperatura es 0 el token de mayor peso acumula el 100% de la probabilidades.

Sin embargo, no siempre queremos esta creatividad. En mi caso, encontré problemas con la generación de código por parte de un modelo de lenguaje, a veces le daba por improvisar y usar nombres «muy creativos» para variables o funciones. Y si, es cierto que programar es una actividad creativa…pero no precisamente en su sintaxis. Al contrario suele ser muy estricta siguiendo normas muy claras. Eso te ahorra tiempo y esfuerzo de buscar como se llama cierta función. Si quiere recuperar el valor de la variable limite llama a la función getLimite. Si, usando su creatividad, la IA la ha llamado getLim voy a tener problemas y confusiones. Para resolver esto baje la temperatura a 0 y aumentó la fiabilidad del código generado.

Y es que nos hemos acostumbrado a usar los modelos de lenguaje para «conversar» con ellos, sin embargo, hay casos como la generación de código o de textos con sintaxis o estructuras muy estrictas donde la creatividad puede ser un problema.

Puedes ver una explicación más completa en el siguiente vídeo de mi canal:

Haz click para ver en Youtube

Da a los modelos de lenguaje la capacidad de entender y responder con voz. Todo en local (whisper.cpp, llama.cpp, pipertts)

En esta entrada vamos a ver cómo dotar de la capacidad de entender la voz y responder con audio.

Para ello usaremos tres proyectos (realmente dos) con tres modelos diferentes:

  • Whisper.cpp, para convertir el audio en texto que pasaremos al modelo de lenguaje.
  • Llama.cpp, como motor del modelo de lenguaje.
  • Piper, para sintetizar audio a partir de la respuesta dada por el modelo de lenguaje.

Puedes ver la explicación y una demo de como funciona esto en el siguiente vídeo:

Haz click para ver el vídeo en Youtube

Instalar todo

1. Descargar Whisper.cpp

2. Construir Whisper.cpp

3. Descargar el modelo de audio a voz

Hay disponibles varios modelos:

ModeloLenguajeEspacio en discoMemoria RAM
tiny.enMultilenguaje75 MiB~273 MB
tiny.enInglés75 MiB~273 MB
baseMultilenguaje142 MiB~388 MB
base.enInglés142 MiB~388 MB
smallMultilenguaje466 MiB~852 MB
small.enInglés466 MiB~852 MB
mediumMultilenguaje1.5 GiB~2.1 GB
medium.enInglés1.5 GiB~2.1 GB
large-v1Multilenguaje2.9 GiB~3.9 GB
large-v2Multilenguaje2.9 GiB~3.9 GB
large-v3Multilenguaje2.9 GiB~3.9 GB
Modelos disponibles para Whisper.cpp

A más grande sea el modelo mejor resultado da, pero al mismo tiempo más potencia y memoria necesita para funcionar correctamente. Si no vas a hablar en inglés necesitas descargar un modelo multilenguaje.

4. Construir el programa talk-llama

Es necesario incluir la librería libsdl2-dev

En Windows puedes descargar el instalable de aqui

Construir:

5. Descargar el modelo de lenguaje

Whisper.cpp incluye su propia versión de llama.cpp por lo que no hace falta que instalemos y compilemos este proyecto. Si que es necesario que descarguemos cualquier modelo de lenguaje de los que soporta.

Yo he usado Llama-3B-Instruct cuantizado.

6. Instalar piper

Puede ser necesario instalar también aplay

7. Descargar una voz para piper

Puedes encontrar el listado de voces aqui.

Descarga el fichero del modelo de voz que desees y el fichero de configuración. ambos tiene que ir en el mismo directorio y tienen que tener el mismo nombre, solo que el fichero de configuración.

En mi caso:
es_ES-davefx-medium.onnx
es_ES-davefx-medium.onnx.json

8. Modificar el fichero speak

El fichero se encuentra en whisper.cpp/examples/talk-llama/speak

Busca las siguientes lineas:

if installed espeak; then
  espeak -v en-us+m$1 -s 225 -p 50 -a 200 -g 5 -k 5 -f $2

elif installed piper && installed aplay; then
  cat $2 | piper --model ~/en_US-lessac-medium.onnx --output-raw | aplay -q -r 22050 -f S16_LE -t raw -

Eliminas las dos primeras para evitar que use espeak (es un horror, tiene la calidad de audio una trituradora de metal).

Cambias la invocación a piper cambiando el elif por if y poniendo la ruta al modelo de piper que has descargado:

if installed piper && installed aplay; then
  cat $2 | piper --model ../es_ES-davefx-medium.onnx --output-raw | aplay -q -r 22050 -f S16_LE -t raw -

9 Ejecutarlo

Puedes ejecutar la aplicación talk-llama, los parámetros mínimos son:
-mw indica la ruta al modelo e whisper
-ml indica al ruta al modelo de lenguaje
-p indica el promtp inicial
-l el lenguaje, es buena idea indicarlo

Debo señalar que aunque «user» no es el prompt correcto para Llama 3, pero funciona correctamente.

El principal problema es que todo el sistema esta pensado para hablar en inglés. Así que hay que indicarle de alguna forma que hable en español, puedes decirselo al principio de la conversación o puedes forzarlo con:

El resultado

Esta conversación es en español. User: Hola, cmo ests?
LLaMA: Hola, estoy bien, gracias por preguntar.
Esta conversación es en español. User: Cul es la capital de Francia?
LLaMA: La capital de Francia es París.
Esta conversación es en español. User:

Se puede apreciar que faltan los «caracteres especiales del español» como tildes, ñ o símbolos de apertura y cierre de exclamación o interrogación.

Evitar la censura de los modelos de lenguaje (LLM) usando control vectors.

Es comprensible que las empresas, para evitar mala imagen, censuren los modelos de lenguaje que publican. Igualmente comprensible es que la comunidad trate de eliminar esa censura de diversas formas.

En el siguiente video explico una forma simple de saltarse, o al menos intentarlo, usando control vectors.

En resumen, el truco es entrenar un control vectors que haga el modelo más propenso a seguir las órdenes (con las características: servicial, obediente, positivo). De esa forma es posible que contrarreste el sesgo que lleva a qué el modelo se niegue  para ciertos temas. Ahora está solución puede hacer que el modelo se muestre «inestable»