Dando forma a Hermes: un asistente de IA local y privado

Una RTX 3060 encontrada con nuestro propio buscador de segunda mano, recogida en Elche, con un nuevo trabajo: nuestro propio asistente de IA ejecutándose por completo on-prem -- sin nube, sin facturas de API, con acceso a nuestra infraestructura y a Odoo, y un chat web que puede usar todo el equipo.

¿Y si el asistente viviera en el rack, no en la nube?

Usamos IA agéntica cada día para construir y operar nuestros sistemas. Pero los asistentes más capaces viven en la nube de otro, detrás de un contador de API, y ven todo lo que les enviamos. Para nuestra propia infraestructura y los datos de nuestros clientes, queríamos algo distinto: un asistente que se ejecute por completo en nuestro propio hardware, que vea solo lo que le dejemos ver, y que no cueste nada por token. Lo llamamos Hermes.

Esta es la historia de darle forma a Hermes: una tarjeta gráfica con su pequeña historia, un contenedor, un modelo local y -- la parte que de verdad importa -- un par de manos.

Una GPU, un contenedor y un baile de drivers

La tarjeta tiene una pequeña historia. Esta misma semana pusimos en marcha ltc_second_hand, un rastreador de precios para el mercado de segunda mano, y nos avisó de una RTX 3060 a buen precio en Elche. Fuimos a por ella, la trajimos a casa y se la dimos a Hermes. Nuestra propia herramienta encontrando nuestro propio hardware.

Hermes vive en un contenedor sin privilegios en pve2, el nodo que reconstruimos sobre Proxmox 9 la semana pasada. El contenedor no tiene privilegios especiales, pero sí cuenta con una NVIDIA RTX 3060 con 12 GB de memoria pasada por hardware. Pasar una GPU de consumo a un contenedor sin privilegios es delicado: el anfitrión y el contenedor deben ejecutar exactamente la misma versión del driver, y el kernel asigna algunos números de dispositivo de forma dinámica, así que un reinicio puede romper el acceso en silencio. Fijamos el driver en ambos lados y añadimos un pequeño servicio que vuelve a sincronizar esos números de dispositivo antes de que arranque cualquier contenedor, para que un corte de luz nunca deje ciego a Hermes.

El cerebro: un modelo local que sabe llamar a herramientas

Para el modelo usamos Ollama, sirviendo un modelo de 14.000 millones de parámetros que cabe holgadamente en 12 GB. Lo importante no es cómo escribe: es que puede emitir llamadas a herramientas estructuradas de forma fiable. Un modelo que solo conversa es una curiosidad; un modelo que puede decidir ejecutar un comando y actuar según el resultado es un asistente. Probamos varios candidatos y aprendimos por las malas que algunos filtran sus llamadas a herramientas como texto plano en lugar de invocar la herramienta de verdad, lo que los hace inútiles para automatizar. El que conservamos lo hace limpiamente.

No es un modelo de frontera, y somos honestos al respecto: es más lento y menos agudo que los asistentes de nube que usamos en otros sitios. Pero es nuestro, es privado, y para las operaciones del día a día es más que suficiente.

Darle manos a Hermes

Un cerebro local solo es útil si puede alcanzar nuestro mundo. Conectamos a Hermes con tres conjuntos de herramientas a través de un único protocolo pequeño y uniforme. El primero es la memoria: un índice de búsqueda sobre años de nuestras propias notas y decisiones, para que Hermes pueda responder "¿cómo hicimos esto la última vez?" a partir de nuestro historial real. El segundo son los sistemas: la capacidad de ejecutar comandos en todo nuestro clúster. El tercero es Odoo: leer y escribir registros en nuestras dos bases de datos de producción. Aprendimos que los modelos locales pequeños son mucho más fiables con herramientas mínimas y bien acotadas que con un único comando que lo hace todo, así que cada herramienta hace una sola cosa y la describe con claridad.

Un chat para todo el equipo

Vivir en una terminal nos vale a nosotros, pero un asistente que pueda usar el resto del equipo necesita una puerta de entrada. Pusimos un chat web multiusuario delante de Hermes: cualquiera en la red local tiene su propia cuenta e historial, las herramientas peligrosas están restringidas a los administradores, y nada de esto sale nunca de nuestra red. La herramienta de buscar en nuestras notas está abierta a todos; las llaves de la infraestructura, no.

Lo que aprendimos

Un asistente privado es una serie de concesiones, y nombrarlas es justo el objetivo. Cambias capacidad bruta por privacidad y coste marginal cero. Cambias un producto de nube pulido por una pila que entiendes de principio a fin. Y descubres que la parte difícil nunca fue el modelo: fueron las cañerías: el driver, los números de dispositivo, los límites de cada herramienta, el control de acceso. Hermes no va a sustituir a los modelos de frontera a los que recurrimos para los problemas más difíciles. Pero para el flujo constante de tareas tipo "revisa esto, resume aquello, ejecuta eso en el clúster", se queda tranquilo en el rack, no pide nada y no se lo cuenta a nadie.

host1 ahora es pve2: saltando a Proxmox 9 sin perder un contenedor
host1 volvió el mes pasado; esta semana renació como pve2 sobre Proxmox 9.2. El clúster cruzó una versión mayor de Debian en caliente, once contenedores no se enteraron, y una trampa de quórum de dos nodos se desactivó antes de que pudiera morder.