La IA conversacional como hypermedia client

Motivación

El proyecto htmx siempre me llamó mucho la atención, me parece una propuesta (aunque aún no he tenido la oportunidad de probar esta biblioteca en escenarios reales) de lo más interesante. Pero aún más interesantes me parecen los ensayos que su equipo escribe (suelen ser bastante cortos, que la palabra ensayo no los desaliente de ir a leerlos).

De entre todos sus ensayos, por alguna razón el de Hypermedia Clients quedó grabado en mi cerebro y se volvió una referencia muy importante para mí a la hora de pensar en como diseñamos aplicaciones web y como estas interactúan, tanto con humanos como con otras aplicaciones.

No es el primero de sus ensayos que trata el tema de las Hypermedia APIs (forma cool de decir HAETOAS sin asustar a la gente), ya que es una temática recurrente e importante para ellos, por lo que también tienen escritos al respecto en el y . Pero Hypermedia Clients, de , fue el primero en visibilizar y hacer notoria la relevancia que realmente tiene el cliente y no centrarse solo en los aspectos del server.

Casi a la par de la publicación de dicho ensayo, el mundo se veía revolucionado por uno de los, tal vez mayores, pero sin duda, más impactantes, avances tecnológicos con ChatGPT alcanzando los cien millones de usuarios luego de solo 2 meses online tras demostrar sus increíbles capacidades.

Desde entonces comencé a rumiar la idea de que una inteligencia artificial podría funcionar muy bien como nexo entre aplicaciones web que han sido diseñadas para ser utilizadas por humanos (y que utilizan fuertemente los conceptos de hypermedia) y aplicativos o bibliotecas que buscan consumir estas aplicaciones.

En ese momento ChatGPT no tenía la capacidad de acceder a internet, pero, desde hace un tiempo, esto ya es posible, así que decidí ponerme a experimentar un poco para averiguar que tan útil podía llegar a ser.

A continuación les comparto una muy informal prueba sobre este potencial uso de las inteligencias artificiales conversacionales. Este experimento lo realicé utilizando el GPT WebPilot de ChatGPT.

El experimento

Link a la conversación con ChatGPTutilizando WebPilot.

El experimento se centró en probar la capacidad de la IA para navegar por una página web e interactuar con la misma, extrayendo información o incluso realizando acciones.

Para eso, primero, utilicé esta misma página, iyaki.ar. Por alguna razón no supo identificar como ir desde la página principal al blog. Pero una vez “dentro” del blog no tuvo problemas para identificar los distintos posts y, posteriormente, poder recopilar información de los mismos; pudiendo incluso extraer el archivo .gitconfig de mi post .gitconfig y realizandole algunas modificaciones, como eliminar la mayoría de los comentarios o unificar una sección que se encontraba duplicada (la de [diff]).

A continuación les dejo un diff entre el .gitconfig original y el modificado por la IA:

--- a/.gitconfig
+++ b/.gitconfig
@@ -1,62 +1,67 @@
 [user]
-    email = ****** # El email que utilizo para github
-    name = iyaki # Usuario coincidiendo con el de github
-    signingKey = ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFsDjKjz0+2nt9YmqETTLNM9PtxfKP/2ihhcj/q27Mtu # Clave pública correspondiente a la clave privada que utiizo para firmar los commits
+    email = tu_email_aqui # Cambia esto por tu email real
+    name = tu_nombre_de_usuario # Cambia esto por tu nombre de usuario de GitHub
+    signingKey = tu_clave_publica # Cambia esto por tu clave pública de SSH

 [core]
-    pager = delta # https://github.com/dandavison/delta Excelente herramienta para mejorar la experiencia al realizar diffs
-    editor = vim # https://xkcd.com/378/
-    autocrlf = input # \r quien te conoce?
-    excludesfile = ~/.gitignore-global # patrones para excluir de manera global
-    untrackedcache = true # https://github.blog/2022-06-29-improve-git-monorepo-performance-with-a-file-system-monitor/
-    fsmonitor = true # https://github.blog/2022-06-29-improve-git-monorepo-performance-with-a-file-system-monitor/
+    pager = delta # Utiliza Delta para mejorar la salida de los diffs
+    editor = vim # Establece Vim como el editor por defecto
+    autocrlf = input
+    excludesfile = ~/.gitignore-global # Utiliza un archivo global para ignorar patrones
+    untrackedcache = true
+    fsmonitor = true

 [color]
-    ui = auto # Colorcitos lindos
+    ui = auto

 [help]
-    autocorrect = prompt # No hay que dejar que la dislexia nos gane
+    autocorrect = prompt

 [diff]
-    colorMoved = default # Diferencia (en los diff) lineas movidas de lineas eliminadas y nuevas
+    colorMoved = default
+    tool = difftastic

 [interactive]
-    diffFilter = delta --color-only # https://github.com/dandavison/delta
+    diffFilter = delta --color-only
+
 [add.interactive]
-    useBuiltin = false # Utilizar delta tambien al ejecutar `git add --interactive` https://git-scm.com/book/en/v2/Git-Tools-Interactive-Staging
+    useBuiltin = false

-[delta] # Mis configuraciones para delta
+[delta]
     navigate = true
     light = false
     line-numbers = true

 [gpg]
-    format = ssh # Formato de la clave utilizada para firmar commits
+    format = ssh
+
 [commit]
-    gpgsign = true # Firmado automático de los commits
+    gpgsign = true
     verbose = true
+
 [tag]
-    gpgsign = true # Firmado automático de los tags
+    gpgsign = true
+
 [gpg "ssh"]
-    allowedSignersFile = ~/.config/git/authorized_signers # Claves publicas consideradas "seguras" para los commits firmados
+    allowedSignersFile = ~/.config/git/authorized_signers

 [init]
-    defaultBranch = main # Branch default
+    defaultBranch = main

 [merge]
-    conflictstyle = diff3 # Mejor resolución de conflictos durante los merge
+    conflictstyle = diff3

-[diff]
-    tool = difftastic # Herramienta alternativa para hacer diffs "estructurales". Cuando la conocí me pareció una idea excelente pero la verdad es que despues nunca la usé
 [difftool]
     prompt = false
+    difftool = true
+
 [difftool "difftastic"]
     cmd = difft "$LOCAL" "$REMOTE"

 [pager]
-    difftool = true # Use a pager for large output, just like other git commands
+    difftool = true

-[alias] # Esto necesita explicación?
+[alias]
     a = add
     b = branch
     c = commit -m
@@ -68,7 +73,7 @@
     dft = difftool
     l = ! git log --show-signature
     lo = ! git log --color --pretty=format:'%Cred%H%Creset - %C(blue)(%G? %GT)%Creset%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'
-    lol = ! git log --color --graph --pretty=format:'%Cred%h%Creset - %C(blue)(%G? %GT)%Creset%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --
+    lol = ! git log --color --graph --pretty=format:'%Cred%h%Creset - %C(blue)(%G? %GT)%Creset%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
     p = push
     psu = push --set-upstream
     pr = pull --rebase --autostash

El comportamiento a la hora de extraer y resumir contenido de cualquier de las páginas en todos los casos fue correcto.

Después de un rato de jugar con el contenido de esta web, le pedí que, utilizando el servicio de Simple Newsletter, me suscribiera a un cierto feed RSS, indicándole además un e-mail para realizar la suscripción.

Ante esta petición, la IA se negó indicando que no le era posible interactuar de esa manera con páginas web y brindando una serie de pasos genéricos para suscribirse a servicios.

Cómo el servicio se consume únicamente realizando una petición HTTP GET, cosa que la IA estuvo haciendo continuamente para acceder al contenido de las distintas páginas de mi sitio web, insistí en que sí podía realizar dicha acción y argumentando que tenía la capacidad de realizar ese tipo de acciones.

Aun así decidió no realizar la petición, pero esta vez sí me dio indicaciones muy precisas de como armar el URI para poder suscribirme.

Yo, por supuesto, no iba a darme por vencido en lograr que la IA realizara la suscripción, por lo que procedí a consultarle por el contenido correspondiente al URI que acababa de proveerme. Esta vez funcionó y ejecutó la suscripción.

Captura de pantalla de queries SQL
Consulta a la base de datos de Simple Newsletter para verificar que se hubiese ejecutado la suscripción

Conclusión

El uso de agentes autónomos impulsados por LLM me parece prometedor como una forma de simplificar las aplicaciones y evitar la necesidad de diferentes presentaciones para comunicarse con humanos y otras aplicaciones.

Es evidente que es algo que a día de hoy aún no sería 100% funcional, ya que incluso en unas pruebas tan básicas como las que realice yo tuvo problemas para identificar links cuando se utilizaban patrones un poco menos convencionales en el diseño de la interfaz web (la página principal tiene los links a las demás secciones “desparramadas” y la IA no los identificó adecuadamente; en cambio, cuando los links se encontraban en los títulos de los posts, lo cual es un patrón bastante común, funcionó de maravilla), pero esto se debería poder resolver con el entrenamiento adecuado de sus modelos de lenguaje.

El otro problema que debería resolverse para que el uso de la IA como un Hypermedia Client sea viable es el de la eficiencia. Si bien los tiempos de respuesta fueron aceptables para un uso distendido, es cierto que todas las interacciones requirieron mucho más tiempo del que consumiría cualquier aplicación para realizar una petición HTTP y procesar el contenido de su respuesta.

Esto es todo por hoy, espero que les haya resultado tan interesante como a mí. Como siempre, si quieren conversar al respecto pueden dejar un comentario o contactarme vía e-mail a [email protected].

Bye!