Maker, using software to bring great ideas to life. Manager, empowering and developing people to achieve meaningful goals. Father, devoted to family. Lifelong learner, with a passion for generative AI.
Un asistente personal IA es un chatbot pensado para aliviarte de las tareas cotidianas. Las capacidades que puede tener un asistente personal determinarán la calidad percibida del asistente: aprender de tí y tus gustos, llevarte la agenda, recordarte eventos importante, proponerte acciones de manera proactiva, ejecutar acciones rutinarias en tu nombre, etc.
En este artículo voy a explorar la creación de un asistente IA con algunas características básicas: aprendizaje, curiosidad, y gestión de agenda/recordatorios. Hablaremos también de las implicaciones éticas y de seguridad de este tipo de asistentes, que pronto serán ubicuos.
El artículo está pensado para perfiles con conocimientos técnicos básicos en IA Generativa. También puede servir de intro a perfiles técnicos en Python que nunca hayan trabajado con IA generativa, ya que muestra un caso práctico aplicado y no trivial de la IAG, pero les recomendaría hacer primero algún curso introductorio.
Creando mi propio Jarvis
Siri, Alexa, o el Google Assistant prometían ser el asistente personal perfecto. No lo eran. Su interacción dejaba mucho que desear, así como sus capacidades.
Cuando ChatGPT apareció a finales de 2022, la interacción en lenguaje natural mejoró de forma drástica. Las conversaciones eran fluidas y de gran calidad, y sus conocimientos bastos. Sin embargo, el producto inicial (ni el actual, a fecha de fines de agosto 2024) no estaba planteado como un asistente personal.
Recientemente han incorporado “memoria” a ChatGPT -para usuarios fuera de la EU-, de forma que aprende de ti y personaliza respuestas futuras con ese conocimiento. Es un gran paso, pero como asistente personal echo de menos muchas cosas. Algunas de ellas:
La primera es que quiero que aprenda de la interacción conmigo. Si le digo que tengo un hermano programador soywiz, pues quiero que lo recuerde a futuro.
Además quiero que se interese por mí y por mis cosas. No hay nada mejor para conocer a alguien que interesarse por ella a través de preguntas genuinas.
También que me recuerde eventos o cosas para que no se me olviden. En general, que lleve un seguimiento de todo lo que tengo entre manos, para poder recomendarme qué cosas abordar a corto, medio, y largo plazo, etc.
Que tenga capacidad de actuar por su cuenta: que sepa crear un plan de trabajo, ejecutar, evaluar resultados, ajustar el plan, y repetir hasta terminar.
Que reflexione sobre lo aprendido o realizado durante el día, y genere de nuevas ideas (que incluye pensar sobre lo aprendido y cuestionarlo) para debatirlas conmigo luego
En este artículo voy a describir cómo abordar los tres primeros puntos -al menos de forma básica-, con el que ya tendremos nuestro propio
Jarvis con capacidades mínimas.
Como indicaba en la introducción, no es un tutorial “paso a paso” de cómo programarlo en Pyhton (aunque SÍ tienes el código completo para poder probarlo), si no una explicación de lo que realmente importa en el paradigma IA generativa: la estrategia de prompting.
Estrategia de prompting
Podemos modelar a nuestro Jarvis como un asistente IA con tools (aka function calling) para registrar nuevos conocimientos y recordatorios, con acceso en el propio contexto (in-context) a la BBDD de hechos y recordatorios. Para completar la proactividad de Jarvis para que nos avise cuando llegue el momento de recordarnos algo, tendremos un temporizador que busca y envía recordatorios vencidos pendientes de notificar.
Vamos a ver cada uno de estos puntos clave, empezando por la configuración del LLM para que actúe como asistente personal con las características que queremos (system prompt).
SYSTEM PROMPT
En el prompt de sistema vamos a darle un rol (asistente IA personal), unas capacidades (aprender nuevos conocimientos), rasgos generales de comportamiento (curiosidad, modo “preguntón”), e instrucciones (“registra todo”, “incluye detalles”, etc.)
Notar que también de damos contexto de la fecha y hora actual, y con quién está hablando para poder responder con su nombre, y registrar datos asociados a esa persona.
TOOL “add_fact”: aprender y registrar para notificar a futuro
La tool que vamos a dar al chatbot es add_fact(date, remember, fact, details), que le permite registrar entradas en la base de conocimiento. Alguns consideraciones:
Sería bueno crear funciones para actualizar y eliminar recuerdos, pero se omiten por simplicidad.
Notar que la fecha tiene un formato específico (pero muy estándar), ya que así podremos parsearla para manipularla por código
El campo “remember” es un marcador para indicar que el hecho (un recordatorio) debe comunicarse al usuario.
La Base de Conocimiento
La base de conocimiento es simplemente una tabla markdown con los datos recogidos por la tool add_fact() que se incluye al final del SYSTEM prompt.
Notar que el fact 2 es un recordatorio a futuro, y está marcado con remember=true, por lo que es un recordatorio que el asistente debe hacer en la fecha y hora indicadas.
Conexión con Telegram
Un asistente personal debe estar siempre a mano, y debe ser capaz de comunicarse contigo. Telegram ofrece un API sencilla para crear bots, y conectarlo con nuestro asistente es muy sencillo: solo necesitamos obtener un TOKEN de acceso, que puedes obtener con los siguientes pasos:
Crea una cuenta en Telegram: Si no tienes una cuenta, regístrate en Telegram y descarga la aplicación en tu dispositivo.
Busca al BotFather: Este es el bot oficial de Telegram para crear y gestionar bots. En la barra de búsqueda de Telegram, escribe @BotFather y selecciona el bot verificado.
Inicia una conversación con BotFather:
Escribe /start para ver los comandos disponibles.
Para crear un nuevo bot, escribe /newbot.
Sigue las instrucciones de BotFather:
Te pedirá que elijas un nombre para tu bot. Este es el nombre que verán los usuarios.
Luego, te pedirá que elijas un nombre de usuario para el bot. Este debe ser único y terminar en “bot” (por ejemplo, MiPrimerBot o MiBotDePruebas_bot).
Obtén el token:
Una vez que hayas creado el bot, BotFather te proporcionará un token de API. Este token es una cadena de caracteres que necesitas para interactuar con la API de Telegram y controlar tu bot.
Este es el token a meter en TELEGRAM_API_KEY en el código completo.
Consideraciones éticas y de seguridad
No hay duda de que un asistente personal como el que hemos presentado aquí es una gran herramienta. No obstante, hay consideraciones importantes relativas a la ética y la seguridad si quisiéramos pasar de un juguete a un producto de consumo.
Riesgos asociados a la recopilación y uso de datos privados
Un asistente de este tipo está recogiendo mucha información personal del usuario, potencialmente muy sensible, como condiciones médicas, o inclinaciones religiosas o políticas.
Imaginad que tenos la knowledge base de miles de usuarios. Seríamos capaces de venderles productos, servicios, o incluso ideas, de la forma más persuasiva para cada uno. Bastaría con inyectar “recordatorios” orientados a la venta personalizada, atacando a sus intereses y objetivos personales o de familiares cercanos.
Productos de consumo centralizados
No me resulta fácil concebir un producto de consumo que no tenga como principal interés “explotar” los datos privados, ya sea como plataforma de publicidad directa como para venderlos a clientes interesados. Supongo que podrían ofrecerse planes de pago con “garantías” (te tienes que fiar) de que tus datos se mantienen privados y no serán usados para venta. En cualquier caso, un sistema centralizado tiene malas propiedades para mitigar el riesgo de mal uso de la información recopilada.
Productos de consumo on-device
La alternativa más clara para productos tipo Siri o Google Asistant es ofrecer alojamiento y manipulación de tus datos en local, y acceso a capacidades extendidas con modelos remotos. Esto es, tu interacción es con un LLM local que:
Realiza inferencia/inteligencia local en el dispositivo, evidentemente menos “poderosa” que un LLM en la nube
Dispone de tools para pedir ayuda a modelos más potentes en la nube cuando lo que tenga que responder exceda sus capacidades. Aquí es justamente donde está la clave la mitigación: se le puede pedir que resuelva la petición sin filtrar ninguna información personal en la base de conocimiento (“es para un amigo”)
Productos Open Source
Un producto de código abierto que se ejecute y almacene la información en un dispositivo local (ordenador, móvil, tablet) tiene, sin dudas, las mejores propiedades de seguridad. El desarrollo de ejemplo del ANEXO A tiene estas características, aunque no es un producto acabado ni mucho menos.
Conclusión
Hemos visto que crear un asistente pesonal de juguete no es difícil con las herramientas IAG actuales.
Es muy probable que a finales de 2024 o principios de 2025 veamos a los principales players liberar versiones de sus asistentes de consumo (Siri, Alexa, Google Asistant) con capacidades más cercanas a lo que hemos visto aquí, pero con aproximaciones on-device similares a las presentadas anteriormente. Conocer cómo funcionarán y sus riesgos de antemano nos pone en una posición provilegiada para tomar decisiones informadas.
ANEXO A: El código completo
Asegúrate de tener las dependencias instaladas:
Luego crea un fichero main.py con el siguiente contenido (NOTA: recuerda introducir tu clave de acceso al API de OpenAI OPENAI_API_KEY y la key de tu bot en Telegram TELEGRAM_API_KEY (sigue los pasos más arriba), que en el código aparecen vacías):