Pensabot: cómo gestiono mis notas con Telegram e IA

En general me gusta tomar notas en papel para el día a día y Obsidian para la gestión de los proyectos en los que estoy trabajando. El problema es que mantener el orden o capturar una idea me resulta difícil.

Por eso hace un tiempo experimenté con la idea de tener un bot de Telegram que me permita enviar ideas, notas de voz o enlaces y tenga su propia memoria de forma que yo no tenga que preocuparme de gestionar el contenido.

De esta forma hablo con un agente de IA, que decide si guarda datos en su memoria o me responde con información que yo le haya enviado anteriormente.

De una prueba de concepto a algo útil

Este es mi nuevo side-project: Pensabot (repo en GitHub). Como base utilizo el modelo de OpenAI GPT-5.6 Luna, que tiene un rendimiento muy bueno a un coste relativamente bajo. Por ahora no he gastado más que unos cuantos céntimos con el uso que hago del bot.

El reto principal es la recuperación de información. Este proyecto lo empecé hace unos cuantos meses, mientras experimentaba y aprendía a gestionar los agentes de IA y los harnesses no estaban tan desarrollados como ahora. Es un campo que está evolucionando muy rápido.

Pensabot fue casi un “one-shot” de una especificación que fui refinando con la IA. A día de hoy tengo claro que los one-shot sirven para realizar una prueba de concepto rápida, experimentar y obtener conocimiento de algo tangible, pero luego requieren mucho refinamiento si es algo que quieres tener en producción.

Lo bueno es que la generación de código es tan barata que te permite experimentar tanto como necesites a un coste bajo, y en poco tiempo, hasta que tengas algo con lo que estés satisfecho.

Estos días me apetecía retomar este proyecto y replantearlo de cero con todo lo que he aprendido. He empezado por una versión mucho más reducida en la que puedes enviar un mensaje por Telegram y obtener una respuesta.

Una memoria con dos herramientas

El sistema de memoria por ahora consta de una tabla de mensajes, que almacena la conversación con el usuario, y que le permite al agente tener en el contexto la conversación más reciente del usuario, junto con otra tabla de memoria en la que el agente va generando recuerdos del usuario según se desarrolla la conversación.

Para ello el agente cuenta con dos herramientas que puede decidir utilizar:

  • Añadir dato a la memoria. El agente decide qué datos de un mensaje quiere guardar en memoria. Puede almacenar varias ideas por separado.
  • Buscar en la memoria. El agente puede buscar en su memoria datos relacionados con la consulta del usuario.

La idea es que el agente sea completamente autónomo y el decida qué herramienta utilizarla y cómo usarla.

Opción de diagrama: una idea que se guarda y se recupera más tarde.

sequenceDiagram
    actor usuario as Usuario
    participant telegram as Telegram
    participant agente as Agente
    participant memoria as Memoria

    usuario->>telegram: Recuérdame escribir sobre PostgreSQL
    telegram->>agente: Nuevo mensaje
    agente->>memoria: Guarda «Idea: post sobre PostgreSQL»
    memoria-->>agente: Dato guardado
    agente-->>usuario: Me lo guardo

    usuario->>telegram: ¿Sobre qué quería escribir?
    telegram->>agente: Nueva consulta
    agente->>memoria: Busca ideas para posts
    memoria-->>agente: Idea: post sobre PostgreSQL
    agente-->>usuario: Querías escribir sobre PostgreSQL

Búsqueda mediante palabras

Para esta primera versión de búsqueda he preferido empezar por algo simple y que funciona, para luego ir probando otras estrategias más complejas, como podría ser la búsqueda semántica o la búsqueda híbrida.

El agente decide, en base a la conversación, si necesita buscar información en la memoria y entonces, genera una consulta que se pasa a una herramienta. Importante destacar que es el agente el que de forma autónoma establece qué palabras buscar en base a la intención del usuario.

La función divide el texto de la consulta y lo preprocesa (utiliza por debajo la función de PostgreSQL to_tsvector('simple', consulta)), para finalmente producir un ranking de las memorias del usuario según las ocurrencias.

Me sorprende que con lo simple que es, funciona muy bien. Estos días estoy aprovechando para soltar ideas de posts o de cosas que quiero probar, y le pedí que buscase algunas en concreto y me lo ordenase y lo hizo bien. Me surge la duda de cómo funcionará conforme la memoria se llene.

Lo que me está gustando de este side-project es que me está permitiendo entender cómo funciona un agente, la integración de herramientas y lo complicado de gestionar bien la memoria / contexto.

En los próximos posts explicaré en detalle las modificaciones en las que voy trabajando. Puedes clonarte el repositorio y montarlo en tu propio ordenador o homelab.