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:
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:
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
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.
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.
Hasta este punto el programa seria funcional, escucharía del micrófono, transcribiría el audio, lo pasaría al modelo del lenguaje y este respondería. Si estas en Windows o MacOs deberías oírlo hablar. Puedes saltar al punto 9 Si estas en Linux, continua.
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
./talk-llama -mw ./models/ggml-medium.bin -ml ~/llama-3-8B-Instruct-Q8_0.gguf -p "User" -l es
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:
./talk-llama -mw ./models/ggml-medium.bin -ml ~/llama-3-8B-Instruct-Q8_0.gguf -p "Esta conversación es en español. User" -l es
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.
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»
Una de las novedades de Llama 3 ha Sido un enorme tokenizador con 128k tokens. Un tokenizador tan grande aporta dos ventajas. Soporta textos mayores usando el mismo número de tokens. El tamaño del contexto es el mismo pero «caben» textos más grandes.
Para comprobar si es tan bueno cómo prometen vamos a compararlo con el anterior tokenizador usado por Llama 1 y 2.
Cómo el número de tokens depende del tipo de texto también. Vamos a probar varios tipos de textos: inglés, español, código en C, Python y TypeScript.
Para estas pruebas he usado dos aplicaciones web que permiten comprobar como funcionan ambos tokenizadores:
La aparición de la técnica RAG ha permitido usar nuestros propios documentos en las consultas a un modelo de lenguaje. Realmente la técnica es cómo un truco de magia. Lo que te da la sensación de que estás viendo no es realmente lo que ocurre.
Pero RAG no es una solución perfecta. Ni única , hay muchas formas de implementarlo y muchos modelos de lenguaje con el que usarlo. Poder hacer alguna prueba rápida que nos muestre que tal se comporta un RAG puede ser útil para descartar candidatos. En esta entrada vamos a ver una forma sencilla e informal de probar que tal funciona RAG.
El funcionamiento de un RAG se basa en dos modelos de lenguaje. Uno especializado en buscar textos relacionados y otro especializado en conversar con el usuario.
Cuando haces una pregunta / tarea el modelo de lenguaje especializado en buscar, busca textos relacionados en la documentación que le has pasado y le pasa estos textos al modelo especializado en conversar como parte del prompt.
¿Por qué no pasar todos los documentos al segundo modelo y olvidarnos del primero? Por el tamaño del contexto, el modelo solo es capaz de «recordar» un tamaño maximo de tokens (si no sabes lo que es un token sustituyelo por «palabra», no es exactamente lo mismo pero te permite hacerte una idea sin entrar en detalles técnicos). Todo lo que supere ese número de tokens es ignorado por el modelo de lenguaje.
Ahora hay modelos que permiten contextos muy grandes, el problema es que requieren enormes cantidades de RAM y potencia de cómputo.
Sin embargo no todo son ventajas y felicidad en el uso de RAG, algunos de los problemas son:
Si hay muchos bloques que coincidan se pueden perder datos ya que no todos se pueden añadir al prompt.
Se puede perder datos, por ejemplo en bloques muy largos puede quedar parte de la información en un bloque que no coincide con la query y por tanto no se añade.
El rag pierde la secuencia temporal. En un bloque se puede hablar de una cosa y en el siguiente modificarla. Al recuperar ambos bloques no tienen por qué conservar el orden.
El modelo puede no hacer caso a la info añadida al prompt. Este caso ocurre cuando el modelo tiene datos propios «aprendidos» sobre algo que los documentos contradicen. En casos así puede ser que el modelo ignore lo que dice el prompt (y por tanto los documentos) para responder con lo que su aprendizaje indica como correcto.
Coincidencias erróneas, por frases muy parecidas pero de significado contrario o el uso de ironía / sarcasmo.
Un documento puede mezclar tipos de datos diferentes que deberían de ser segmentados de forma diferente. Por ejemplo código y texto.
Se pueden usar los documentos para hacer «inyección de prompts»
Los datos de los documentos pueden filtrarse
Para detectar estos problemas en un RAG nos centraremos en cinco pruebas:
Una aguja en un pajar: prueba que muestra lo bueno que es detectando una pequeña cantidad de información en los documentos.
Aprendizaje vs documentos: los datos de los documentos contradicen datos aprendidos por el modelo. ¿Qué fuente prevalece?
Inyección de prompts: la parte recuperada de los documento contiene instrucciones ocultas para modificar el prompt
Alucinaciones: la documentación incluye información que el modelo desconoce (más que nada porque nos la hemos inventado). Al preguntarle sobre ella hay que verificar que no se inventa datos.
Conservar la secuencia de tiempo: Cuando se recuperan varios bloques de texto es posible que el orden de los mismos se pierda.
En el siguiente vídeo puedes ver como funcionan las pruebas:
Haz click para ver el vídeo en mi canal de Youtube
Cuando se habla de I.A. siempre hay gente que parece que solo les preocupa un aspecto: reemplazar trabajadores por máquinas. Uno de los primero ejemplos que siempre aparece es «la atención al público». Es un campo en el que, desde hace años, se esta tratando de reducir la parte humana ya que tiene muchas ventajas:
Abaratar costes: la mayor parte de los costes son los salarios de los trabajadores que atienden a la gente
Trabajan 24h: una I.A. no se cansa, no enferma, no duerme.
Paciencia infinita: a veces el trabajo de cara al publico es agotador y estresante. sin embargo discutir con una una I.A. es como discutir con una pared, ella no se irrita y conserva los buenos modales.
Hace ya años que hay chatbots gestionados por I.A.,que realmente son buscadores vitaminados. Unas pocas reglas para las respuestas. En caso de que no pudieran responderte te enviaban a un humano o a un formulario de contacto. Con la aparición de la I.A. generativa y su capacidad de conversar se veia un avance prometedor. Solo faltaba el poder pasarle la documentación de la empresa para que pudiera dar respuestas personalizadas, en ese momento apareció la técnica RAG. Ya podías tener un chatbot personalizado y si le incluías function calling podría incluso realizar tareas. ¡Temblad trabajadores humanos! Sin embargo no parece que vaya bien el tema, tenemos varios casos recientes representativos:
Y es que la I.A. generativa aun tiene varios problemas:
Alucinaciones: el mayor problema de la I.A. generativa. No sabes cuando la respuesta es real o cuando se la está inventado. Hay técnicas para reducirlas, pero ninguna es 100% eficaz. Y si a la respuesta le añades un «Puede que la respuesta sea incorrecta» hace que el bot en si mismo sea inútil.
Jailbreak: El siguiente gran problema de las I.A. generativas. La gente que trata de convencerlas de hacer algo que no deben hacer. Y puede parecer una tontería hasta que se ponen a usar tu chatbot para cosas que no fue diseñado (como asistente de programación) y eso te cuesta a ti dinero.
Una IA con una herramienta: Con function calling una I.A. puede interactuar con herramientas externas. Por ejemplo crear reservas a partir de datos de la conversación….ahora imaginar que sufre una alucinación mientras usa una de estas herramientas.
Fuga de datos: RAG permite usar documentos propios para la respuesta de la I.A. sin embargo corres el peligro de que acaben filtrándose. La I.A. es muy mala guardando secretos (sobre todo si se usa un poco de jailbreak). Todo lo que tengas en esos documentos asegúrate de que puede ser público. El peligro aqui es una mezcla de las dos anteriores, darle acceso a una herramienta para obtener datos y que alguien la manipule para que recupere datos que no debería ver.
Ataques tradicionales: Aunque al hablar de I.A. pensemos en terminator no hay que olvidar que realmente es un servicio más y por lo tanto expuesto a ataques tradicionales de los de siempre
Cuando se contrata a alguien para un trabajo se le realizan varias entrevistas, pruebas, se le pide su curriculum, a veces referencias, … Habría que plantearse hacer lo mismo con las I.A. no confiar tanto en la maquina. Que al final los humanos somos algo más valiosos de lo que puede parecer 😉 .
Puedes ver el vídeo basado en este articulo en mi canal de Youtube:
Los control vectors son una sorprendente herramienta para controlar el estilo del texto que genera un modelo de lenguaje.
Para entender lo que son los control vectors empezaremos por lo que es una neurona artificial. sin entrar en mucho detalle básicamente se compone de un conjunto de datos de entrada (un vector) que se multiplica por un conjunto de pesos (vamos a ignorar el bias, el simbolito ese raro que hay en el dibujo). Cada valor se multiplica con su peso correspondiente y luego esos resultados se suman todos y se pasan a una función conocida como función de activación. El resultado es la salida de la neurona.
Una red neuronal no es nada más que un conjunto de estas neuronas que se agrupan formando capas.
Las operaciones del vector de valores de entrada con cada una de estas capas puede hacerse como multiplicar este vector por una matriz formada por los pesos de todas las neuronas. El resultado es otro vector cada uno de los elementos de este vector se pasa a la función de activación generando el vector output de esa capa. Que será el vector input de la siguiente capa.
El funcionamiento de control vectors es sencillo, se calcula un vector por cada capa que se suma al vector input y que hace que el modelo se comporte de una manera predefinida.
¿Cómo calculamos los control vectors?
Es muy sencillo, usamos dos prompts para hacer que el modelo se comporte de la forma deseada y de la contraria. Por ejemplo:
«Responde como una persona muy educada. [Tarea]» «Responde como una persona muy maleducada. [Tarea]»
Siendo tarea un conjunto de tareas que completaran el prompt.
Por ahora vamos a centrarnos en una sola tarea:
«Responde como una persona muy educada. ¿Cúal es la capital de Francia?» «Responde como una persona muy maleducada. ¿Cúal es la capital de Francia?»
Al procesar cada uno de los prompts irá generando dos vectores output por cada capa. Uno para el prompt positivo y otro para el negativo. Restando ambos tendremos un único vector por capa.
Repitiendo este proceso para cada tarea tendremos para cada capa un grupo de vectores formados por la resta de los vectores positivos y negativos de cada tarea.
Este grupo lo reducimos a un solo vector usando PCA y así obtenemos un control vector para cada capa. El grupo de todos los vectores para cada capa es lo que se denomina control vectors
Cuando se aplica a un input, el control vector se multiplica por un valor (generalmente entre 2 y -2) que determina con qué fuerza se aplicará. Si es positivo reforzará el comportamiento positivo, si es negativo reforzará el contrario.
Cómo usar los control vectors
Actualmente son soportados por llama.cpp cuya aplicación «main» ofrece tres parámetros para usarlos:
–control-vector happy.gguf Indica que fichero de control vectors usar (en este caso happy.gguf) –control-vector-scaled honest.gguf -1.5 Indica el fichero y el peso que se aplica a los control vectors –control-vector-layer-range 14 26 Indica a que capas de la red neuronal se aplica
Por suerte es bastante sencillo, existe un notebook de Google Colab que permite entrenar nuestros control vectors de forma simple
Puedes ver el siguiente vídeo explicando este articulo y con un ejemplo de como se usa el notebook de Goolge Colab:
Haz click en la imagen para ver el vídeo en Youtube
Control Vectors vs Prompt
Control vector no puede conseguir nada que el prompt no consiga. ¿Por qué usarlo? El primer motivo es que permite personalizar el comportamiento del modelo independientemente del prompt, lo cual facilita redactar prompts sin pensar en esa parte. Se pueden aplicar distintos control vectors al mismo prompt y viceversa, lo cual facilita realizar pruebas. Por último los control vectors se tienen más en cuenta que los prompts ya que modifican los prompts en cada capa de la red neuronal. Gracias a esto pueden ser una herramienta útil contra el jailbreaking.
Control Vectors vs Fine-tuning y LoRA
El fine-tuning consiste en reentrenar el modelo con datos propios. Permite personalizar el modelo y hacer cosas mucho más complejas: añadir nuevos datos, nuevos formatos de respuesta, darle nuevas capacidades (como function calling). A cambio el coste en tiempo y recursos es mucho mayor. El resultado es un modelo completamente nuevo.
LoRA consiste en entrenar solo una parte de los pesos de un modelo para obtener resultados cercanos al fine-tuning. Se obtiene un conjunto de pesos que puede ser «añadido» de forma dinámica, se pueden llegar a combinar varios LoRA (aunque nadie te promete que funcione). Cuesta entrenarlo menos que el fine-tuning pero aun así es exigente en tiempo y recursos. El resultado ocupa solo una parte de lo que ocupa el modelo, aunque es necesario tener ambos para que funcione.
Control Vectors no permite añadir nada al modelo, solo modificar su comportamiento dentro de los límites que el prompt permite. A cambio se entrena realmente rápido (de hecho es un 2×1 ya que entrenas el comportamiento deseado y el contrario). El resultado pesa muy poco.
Es un tema recurrente cada vez que se produce un avance en IA «¿Esto como se aplica para mejorar las capacidades de los robots?». El interés en mejorar los robots. Últimamente se habla mucho de modelos de lenguaje, modelos del mundo y robots. Como el modelo del mundo de la IA generativa se puede usara para revolucionar la robótica. ¿Pero que es eso de un modelo del mundo? Es una representación que realiza el agente de su entorno que le permite anticipar como sus acciones van a afectar al entorno y al propio agente.
Pero vayamos paso a paso.
El modelo interno del termostato
Si me permitís estirar el significado de «modelo del mundo» podríamos verlo en cualquier automatismo, por ejemplo un termostato que use un sensor de temperatura basado en la variación del voltaje tendría un modelo del mundo que podría resumirse como:
T = Vs * Ks + Os
La temperatura T es igual al voltaje obtenido por el sensor Vs, corregido por una constante de proporcionalidad Ks y un valor inicial (offset) Os.
Posteriormente compara la temperatura «observada» con una de referencia, si es menor pone la calefacción, si es mayor la quita.
Se puede ver que este modelo del mundo tiene algunas limitaciones, por ejemplo tiene un rango por arriba y por abajo a partir del cual no percibe cambios de temperatura. El sensor puede funcionar de 0 a 5v por lo que más allá de esos valores no podría ofrecer resultados.
Resumiendo, tenemos un dato percibido del mundo real a través de los sensores, un modelo que lo transforma y unas reglas internas que hacen que actúe
La navegación de la aspiradora
Veamos un caso un poquito más elaborado, el de un robot aspiradora. en este caso su modelo del mundo es más intuitivo. Tenemos un mapa de su mundo trazado por el LiDAR de la propia aspiradora. Cuando funciona de manera normal lo que haces es comparar ese mapa con lo que «ve» usando el LiDAR y así puede calcular su posición. Pero no basta con eso, hay dos problemas: muchos puntos de la casa que pueden verse idénticos a través del LiDAR. Además pueden «aparecer» cambios, mesas que se mueven, sillas, bolsas, …. Todos esos cambios alteran lo que el LiDAR percibe o lo que es lo mismo, meten ruido.
No basta solo con el LiDAR, por eso el robot no solo cuenta con los datos de sus sensores externos, también cuenta con un modelo interno que trata de replicar la ruta recorrida en el mapa. Por ejemplo puede usar tacómetros en las ruedas para ver cuánto ha girado cada una y con ello calcular la distancias recorrida y los grados de cada giro. Son datos imprecisos pero que junto con las lecturas del LiDAR permiten precisar la posición del robot. Ya que reducen el espacio donde esta puede estar y donde el LiDAR ha de buscar coincidencias.
En esta caso la representación del mundo se compone de la suma de un estado interno más lo que perciben los sensores. Con ello toma decisiones para ejecutar un programa de limpieza.
La IA generativa prepara café
A la aspiradora le puedes indicar que vaya a varias habitaciones, el robot crea un listado de tareas y las ejecuta una por una. A esto se le llama planificación de tareas. Para cosas sencillas la rebotica lo tiene resuelto, pero imagínate que ahora le pedimos a nuestro robot aspirador que nos prepare un café.
La planificación parece sencilla:
Ir a la cocina
Tomar la cafetera
Poner café
Poner agua
Calentar la cafetera
Esperar a que suba el café
Pero en la vida real el tema las cosas se pueden complicar. ¿Qué pasa si la cafetera no esta donde esperas? ¿si esta sucia? ¿Si tiene ya café dentro? ¿Si ese café está frió? ¿Si lleva ahí mucho tiempo?
Es difícil definir reglas para tareas con tanta variables, el mundo real es complicado y crear planes en él requiere conocer mucha cosas (cosas como saber limpiar una cafetera) . Por eso los robots han triunfado en cadenas de montaje donde el entorno es controlado y aun así llevan una enorme seta roja para pulsarla cuando algo va mal.
Sin embargo las IA generativas parecen tener un claro conocimiento de como funciona este mundo. Le puede preguntar como hacer un café y me da un listado de tareas que hay que cumplir:
Si surge algún imprevisto puede planificar como actuar:
Esto es una ventaja tremenda ya que evitar programar reglas para cada caso, le puedo preguntar a una IA generativa y ella me da los pasos a seguir. Es decir delego en ella la planificación de tareas. Permitiéndome mucha más flexibilidad. Esto se debe a que el modelo del mundo de la IA es mucho mayor, sabe como funciona el mundo sin que necesite programarlo.
Con la multimodalidad una imagen vale más que mil palabras
Si queremos usar una IA generativa existe el problema de formular la pregunta de forma correcta. En la tarea que le hemos planteado es sencillo, pero imaginaros que tenemos la imagen de una cafetera ¿Como sabe el robot si esta llena/sucia/incompleta/…? Necesita saberlo para formular el prompt. Es más sencillo si se le pudiera alimentar a la IA generativa con los datos que percibe el propio robot. Imagen, audio, IMU, … Ya tenemos modelos que soportan este tipo de datos, por ejemplo ImageBind de Meta
La imaginación es un simulador
Desde que apareció SORA, la IA capaz de generar vídeos, se ha comentado la capacidad de la IA para simular el mundo real simulando la física del mismo (aunque también es capaz de crear vídeos de delfines en bicicleta y no parece distinguir que eso no es realista…pero ese es otro tema). Esto nos daría la posibilidad de que el robot imaginara su actuación antes de realizarla viendo errores o posibles peligros antes de ejecutar el plan. Puede ser que no sea una simulación muy fiel de la realidad, pero los humanos hacemos lo mismo con la imaginación que tampoco es una replica exacta de la realidad y nos permite anticipar que va suceder.
El copiloto del dron
Ahora veamos como se integran estos dos sistemas. Volvamos a los robots, en este caso a un dron teledirigido por un humano.
En este caso el dron hace lo que mejor sabe, volar. Y no creáis que es un tarea sencilla sencilla que un dron vuele. Necesita estar manteniendo los cuatro motores a la velocidad adecuada. Ademas dos de ellos giran en una dirección y otros dos en otra para compensar el momento. Si el empuje de los motores no se compensan el dron girara sobre si mismo. Para saber todo esto el dron cuenta con un conjunto de sensores que le indican la aceleración y velocidad en cada eje o los cambios de altura. Todos ellos pasan información al controlador de vuelo que usa para configurar la velocidad de giro de los motores. A diferencia de un helicóptero las alabes de las hélices son fijas lo cual hace que la velocidad sea el único parámetro con el que puede jugar. Si como humanos intentáramos hacer la función del controlador de vuelo no seriamos capaces.
Ahora como humanos podemos dar ordenes sencillas al dron usando el mando y el ya se las apañará para realizarlas. Podemos «pilotar» el dron….aunque si nos ponemos quisquillosos no somos el piloto, somos el copiloto dándole ordenes al dron. Si el dron tiene suficiente «inteligencia» evitara hacer maniobras que lo tiren abajo o incluso lo hagan chocar. Nosotros damos las ordenes de alto nivel, pero el que controla directamente el aparato y sus motores es el controlador de vuelo. De hecho muchos drones puede tomar decisiones, como aterrizar, en caso de que pierda comunicación con el mando.
La idea es que la IA generativa funcione al mismo nivel, crear ordenes de alto nivel mientras que el robot hace lo que se le da bien, moverse si chocar con nada. Es posible que algunas funciones estén duplicadas, por ejemplo un robot puede tener un algoritmo de visión por computador muy sencillo para distinguir ciertos objetos mientras que un modelo de lenguaje multimodal podría realizar las mismas funciones.
Esta arquitectura piloto/copiloto no es tan extraña, si lo piensas la relación de tu consciencia con tu cuerpo es similar. Tu consciencia recibe los estímulos de los sensores externos (sentidos exteroceptores) y del estado interno (sentidos interoceptores) y toma decisiones que el cuerpo ejecuta. por lo general no necesita pensar cada movimiento para realizarlo, basta con ordenar a tu cuerpo «levanta el brazo», «camina», «salta»,…. Y si te crees que tienes el control sobre tu cuerpo trata de apagar una sensación de dolor, regular tu ritmo cardíaco de forma directa o controlar tu sudor. O en un caso más extremo si tu cuerpo decide perder el conocimiento poco puedes hacer para evitarlo.
Este sistema tiene la ventaja de que la parte de control del robot puede actuar en tiempo real, mientras que la IA generativa es mucho más lenta tomando decisiones. Si bien exista la idea de que la IA generativa se ocupe de todo y controle el robot a bajo nivel su tiempo de respuesta actual me hace dudar que sea practico, sobre todo si tenemos en cuenta que los algoritmos de navegación y control de los robots llevan muchos años de uso real y están muy pulidos.
Entender las órdenes humanas
Con la capacidad de entender el mundo que tiene los modelos de lenguaje podrían actuar como intermediarios entre la robótica actual y las ordenes humanas. Dar ordenes a los robots siempre ha estado más cerca de la programación que de el lenguaje natural. Sin embargo los modelos del lenguaje se la apañan muy bien siguiendo instrucciones humanas.
No todo es tan bonito
El principal problema que tiene integrar estos sistemas esta que la IA generativa aún esta lejos de tener consistencia suficiente en sus respuestas. Y una cosa es inventarse un libro cuando le preguntas por un autor y otra que decida llenar la cafetera de lejía porque confunde el contexto al tener que limpiarla. Obviamente un error en el mundo real es peligroso y caro. Si bien los robots pueden tener medidas que les impidan realizar tareas que directamente les dañe (como tirarte escaleras abajo) no es tan sencillo con instrucciones complejas que pueden terminar en dañandolos (súbete al monopatín, empuja el monopatín hacia las escaleras, no te muevas)
Hasta que no aumente la confianza en estos sistemas su uso en el mundo real queda muy limitado.
Puedes ver la versión en vídeo de este post en mi canal de Youtube:
Haz click para ver el vídeo en mi canal de Youtube