Blog

  • Hello world!

    Welcome to WordPress. This is your first post. Edit or delete it, then start writing!

  • Agente MCP : Gestiona tus Finanzas Personales con Inteligencia Artificial, Privacidad y Open Source

    Test LLM

    ¿Cansado de hojas de cálculo interminables y apps de finanzas genéricas? Para los que amamos la eficiencia y el control de la terminal, llega MCP Finance Assistant: un asistente financiero personal, modular y de código abierto que vive en tu terminal y se conecta directamente con Notion para darte el control total de tus datos.

    Este proyecto combina la potencia de los Grandes Modelos de Lenguaje (LLM) como OpenAI y Mistral, una interfaz de usuario rápida construida con Textual en Python, y un servidor de herramientas robusto sobre Node.js, todo orquestado para que gestionar tus finanzas sea más sencillo e inteligente.

    Imagen

    ¿Qué hace a MCP Finance Assistant especial?

    Este no es solo otro script para registrar gastos. Es una arquitectura completa pensada para ser modular y extensible.

    • Interfaz Rápida en la Terminal (TUI): Olvídate del mouse. La interfaz, construida con el framework Textual de Python, es increíblemente rápida y te permite interactuar con tus finanzas sin distracciones.
    • Notion como tu Base de Datos Central: Toda tu información financiera (cuentas, transacciones, categorías) se almacena de forma segura en tus propias bases de datos de Notion. El proyecto incluye una plantilla para que empieces en segundos.
    • Agentes Inteligentes con LangGraph: El cerebro del asistente está construido con LangGraph. Un agente clasificador es capaz de procesar extractos bancarios (incluso escaneados, gracias a su función de OCR), extraer cada transacción y registrarla automáticamente. Otro agente se especializa en responder tus preguntas, como «¿Cuánto gasté en comida el mes pasado?».
    • Arquitectura Cliente-Servidor Desacoplada: El proyecto se divide en dos partes principales:
      1. El Cliente (Python): Maneja la interfaz de usuario, la lógica de los agentes y la comunicación con los LLMs.
      2. El Servidor (Node.js/TypeScript): Actúa como un proveedor de herramientas compatible con el Model Context Protocol (MCP). Expone de forma segura las funciones para interactuar con Notion (ej: insert-movement, get-total-by-category).

    Un Vistazo Técnico: ¿Cómo Funciona?

    La magia del proyecto reside en cómo sus componentes colaboran.

    1. Cuando envías un mensaje, el cliente Python lo recibe.
    2. Un nodo enrutador determina si tu petición es una consulta o si has subido un archivo (como un PDF o una imagen de un extracto bancario).
    3. Si es un archivo, el nodo OCR lo procesa usando la API de Mistral para extraer el texto en formato Markdown.
    4. El nodo clasificador recibe este texto, identifica cada transacción, la categoriza y llama a las herramientas del servidor para guardarlas en Notion.
    5. Si es una pregunta, el nodo de Q&A la interpreta y utiliza las herramientas de consulta del servidor para encontrar la respuesta en tus datos de Notion.
    6. Todas las llamadas a Notion pasan por el servidor MCP de Node.js, que gestiona la lógica de la API de Notion y devuelve los resultados de forma estructurada.

    Empieza a Usarlo Hoy

    Configurar MCP Finance Assistant es muy sencillo. El README.md te guía paso a paso, pero básicamente consiste en:

    1. Clonar el repositorio.
    2. Instalar las dependencias de Python con uv y las de Node.js con npm.
    3. Duplicar la plantilla de Notion y configurar tus credenciales en los archivos .env.
    4. ¡Lanzar la aplicación!

    Este proyecto es una herramienta fantástica para desarrolladores, entusiastas de la privacidad y cualquiera que quiera una forma más potente y personalizada de gestionar sus finanzas.

    ¿Listo para tomar el control? Visita elrepositorio en GitHub, pruébalo, y si te animas, ¡contribuye al proyecto!

  • El Futuro de la Productividad: Desarrolla un Asistente Virtual con LangChain para Simplificar tu Rutina

    La gestión del tiempo y las tareas diarias en un mundo digital y acelerado es más desafiante que nunca. Mantenerse al día con los correos electrónicos, programar reuniones y administrar una agenda abarrotada son actividades esenciales, pero que consumen mucho tiempo. Un asistente virtual puede ser la solución perfecta para mejorar tu productividad. En este artículo, te mostraremos cómo crear un asistente virtual con LangChain, una poderosa herramienta para la integración y automatización de procesos lingüísticos complejos. Aprende a gestionar tu agenda, correos electrónicos y reuniones de manera eficiente con este innovador enfoque.


    ¿Qué es LangChain?

    LangChain es una plataforma que facilita la creación de aplicaciones basadas en lenguaje natural, ofreciendo una infraestructura para desarrollar cadenas de lenguaje (Language Chains) que pueden procesar, entender y generar texto de manera avanzada. Gracias a su flexibilidad, LangChain se convierte en una opción ideal para desarrollar asistentes virtuales capaces de realizar tareas automatizadas con un alto grado de personalización.

    Funcionalidades del Asistente Virtual

    Gestión de Agenda

    El asistente virtual desarrollado puede integrarse con calendarios como Google Calendar Este asistente tiene la capacidad de:

    • Programar citas y reuniones automáticamente basándose en tu disponibilidad.
    • Recordarte eventos importantes a lo largo del dia

    Creación de Tareas

    El asistente virtual permite la creación de nuevas tareas de manera sencilla y rápida. Puedes agregar tareas individuales con detalles específicos como la fecha de vencimiento, la prioridad, y notas adicionales. Esta función es ideal para desglosar proyectos grandes en tareas más pequeñas y manejables.

    Automatización de Correos Electrónicos

    Otra funcionalidad clave es la automatización en la gestión de correos electrónicos. El asistente puede:

    • Clasificar y priorizar tus correos electrónicos.
    • Responder a mensajes automáticamente usando plantillas personalizadas.
    • Enviar recordatorios sobre correos pendientes de atención.

    Ventajas de Usar LangChain

    • Personalización: Diseña flujos específicos que se adapten a tus necesidades particulares.
    • Integración: Conecta fácilmente con APIs y servicios de terceros.
    • Escalabilidad: Desarrolla soluciones que pueden crecer a medida que aumentan tus requerimientos.

    En resumen, LangChain es una herramienta innovadora que permite la creación de asistentes virtuales eficientes y personalizables. Al aprovechar sus funcionalidades, podrás transformar la forma en que gestionas tu tiempo y tareas diarias, liberándote de actividades repetitivas y permitiéndote enfocarte en lo que realmente importa.

    Puedes encontrar mas informacion sobre estas herramientas en https://www.langchain.com/langgraph  y tambien en https://www.langchain.com/

    En el siguiente articulo veremos como crear tu propio asistente virtual que pueda realizar estas funciones integradas al ecosistema de google paso a paso

  • Introducción a las Redes Generativas Adversariales (GANs): Fundamentos y Aplicaciones


    Conociendo las GAN’s

    Una GAN, sigla de Generative Adversarial Network, es un tipo de arquitectura de inteligencia artificial diseñada para generar datos nuevos, realistas pero artificiales, a partir de un conjunto de datos de entrenamiento. Esta tecnología se basa en dos redes neuronales que trabajan en conjunto mediante un proceso de competencia:

    Imagen de una arquitectura de una GAN
    1. Generador: Esta red se encarga de crear datos que imiten a los reales. No tiene acceso directo a los datos reales, pero aprende a producir ejemplos convincentes a medida que entrena, intentando engañar al discriminador para que los clasifique como auténticos.
    2. Discriminador: Esta red actúa como un crítico que intenta diferenciar entre los datos generados por el generador y los datos reales del conjunto de entrenamiento. Su trabajo es clasificar los datos que recibe como reales o falsos.

    Las GANs tienen una amplia gama de aplicaciones, incluyendo la generación de imágenes, música, texto, y más. También se utilizan en la mejora de imágenes, modelado 3D, y en la creación de arte, entre otras áreas. Su capacidad para generar datos realistas a partir de un conjunto de entrenamiento limitado las convierte en una herramienta poderosa en el campo de la inteligencia artificial.

    Aplicaciones de las GANs

    Las GANs tienen aplicaciones en una amplia gama de campos, demostrando su versatilidad y potencial:

    • Generación de Imágenes Realistas: Las GANs pueden generar imágenes fotorealistas de personas, objetos y paisajes que no existen en la realidad, útiles en diseño gráfico y entretenimiento.
    • Mejora de Imágenes: Aplicadas en la super-resolución, las GANs pueden aumentar la resolución de imágenes, mejorando la calidad visual de contenido de baja resolución.
    • Síntesis de Voz: En el procesamiento de audio, las GANs se utilizan para generar voz humana realista para asistentes virtuales, videojuegos y herramientas de accesibilidad.
    • Creación de Contenido Artístico: Las GANs han sido utilizadas para crear obras de arte y música, explorando nuevas formas de expresión creativa automatizada.
    • Modelado de Datos para Simulaciones: En la ciencia y la ingeniería, las GANs generan conjuntos de datos para entrenar modelos en situaciones donde los datos reales son escasos o difíciles de obtener.
    • Transferencia de Estilo: Las GANs pueden modificar el estilo de una imagen para que coincida con otra, permitiendo la transformación estilística de fotografías en obras de arte.

    Introducción a las Redes Generativas Adversariales (GANs): Fundamentos y Aplicaciones

    Las Redes Generativas Adversariales (GANs, por sus siglas en inglés) representan una de las innovaciones más fascinantes en el campo de la inteligencia artificial y el aprendizaje profundo. Desde su introducción por Ian Goodfellow y sus colegas en 2014, las GANs han capturado la imaginación de investigadores y practicantes por su capacidad única para generar datos realistas. Este artículo explora los fundamentos de las GANs y discute sus aplicaciones más emocionantes.ntinúa hasta que el generador produce datos tan convincentes que el discriminador ya no puede distinguirlos de los reales, alcanzando un punto de equilibrio.

    Aplicaciones de las GANs

    Las GANs tienen aplicaciones en una amplia gama de campos, demostrando su versatilidad y potencial:

    • Generación de Imágenes Realistas: Las GANs pueden generar imágenes fotorealistas de personas, objetos y paisajes que no existen en la realidad, útiles en diseño gráfico y entretenimiento.
    • Mejora de Imágenes: Aplicadas en la super-resolución, las GANs pueden aumentar la resolución de imágenes, mejorando la calidad visual de contenido de baja resolución.
    • Síntesis de Voz: En el procesamiento de audio, las GANs se utilizan para generar voz humana realista para asistentes virtuales, videojuegos y herramientas de accesibilidad.
    • Creación de Contenido Artístico: Las GANs han sido utilizadas para crear obras de arte y música, explorando nuevas formas de expresión creativa automatizada.
    • Modelado de Datos para Simulaciones: En la ciencia y la ingeniería, las GANs generan conjuntos de datos para entrenar modelos en situaciones donde los datos reales son escasos o difíciles de obtener.
    • Transferencia de Estilo: Las GANs pueden modificar el estilo de una imagen para que coincida con otra, permitiendo la transformación estilística de fotografías en obras de arte.

    Desafíos y Perspectivas Futuras

    A pesar de sus impresionantes capacidades, las GANs enfrentan desafíos, como la dificultad de entrenamiento, la estabilidad y la necesidad de grandes cantidades de datos de entrenamiento. La investigación continúa abordando estos problemas, buscando formas de hacer que las GANs sean más eficientes, estables y accesibles.

    Las GANs representan un emocionante avance en la generación de datos sintéticos, con un potencial aún por explorar completamente. A medida que avanzamos, es probable que veamos aplicaciones aún más innovadoras y mejoras en su tecnología, consolidando su lugar en el futuro de la inteligencia artificial.

    Abordando los Desafíos

    Para mitigar estos riesgos, es fundamental desarrollar e implementar directrices éticas y mecanismos de seguridad robustos en el desarrollo y uso de GANs. Algunas medidas incluyen:

    • Desarrollo de Tecnología de Detección: Mejorar la capacidad para detectar automáticamente contenido generado por IA, ayudando a identificar deepfakes y otras formas de contenido sintético.
    • Normativas y Políticas: Establecer leyes y regulaciones claras que rijan la creación y distribución de contenido generado por IA, protegiendo contra el uso malintencionado mientras se promueve la innovación.
    • Educación y Conciencia: Educar al público sobre la existencia y las capacidades de las GANs y otras tecnologías de IA, aumentando la conciencia sobre los posibles usos y abusos.
    • Colaboración Internacional: Fomentar la cooperación internacional para desarrollar estándares y normas éticas globales que guíen el desarrollo responsable de la tecnología de IA.

    La evolución de las GANs subraya la importancia de equilibrar la innovación con la responsabilidad ética. A medida que exploramos el potencial de estas poderosas herramientas, debemos permanecer vigilantes sobre su impacto en la sociedad y comprometidos con el uso ético de la tecnología.

  • Colas en Python- Ejemplo Queue

    Las colas en nuestros sistemas son fundamentales para manejar procesos y nos ayudan a ordenar los datos de tal forma que sea mas fácil procesarlos y trasmitir información de un lugar a otro.

    Las colas funcionan muy similar a como funcionan las listas, estas se componen de el ya clásico nodo y de dos métodos principales, los cuales son Enqueue que se encarga de encolar información, y el método Dequeue el cual se encarga de sacar la información de la cola y borrarla.

    Nodo

    El nodo donde se almacena la cola esta compuesto de los atributos, data que contiene la información, y next que contiene el puntero del nodo siguiente a continuación puedes observarlo.

    Metodo Enqueue

    La cola tiene solo 1 atributo llamado head de tipo Node

    El método enqueue recibe como parámetro un parámetro data que sirve para crear un nuevo nodo, cuando head esta vació el nuevo nodo queda como head, si no esta vació la lista se recorre hasta el final por medio de una iteración y el nuevo nodo se coloca al final.

    La complejidad del algoritmo de inserción es de O(n)

    Metodo Dequeue

    El método dequeue  consiste en retornar el valor del primer nodo y eliminarlo, esto se consigue colocando el atriburo head de la cola como el nodo siguiente como se puede ver en el ejemplo

    La complejidad del algoritmo dequeue es de O(1)

    Recuerda que puedes colaborar en el repositorio para agregarle funcionalidades nuevas, también puedes descargar el repo y utilizarlas en tu proyecto

    El archivo utilizado en esta entrada lo puedes encontrar aqui.

  • Como Crear Estructura De Datos Stack Python- Ejemplo

    La estructura Stack funciona apilando elementos, la acción principal es  push que sirve para agregar elementos a la pila y la accion pop sirve para sacar los elementos de la pila, las pilas funcionan con el metodo LIFO «Last in Fist Out».

    Nodo

    Como en las estructuras anteriores vistas en este blog, todas las estructuras de datos tienen un nodo el cual sirve para almacenar  la informacion que este contiene.

    Los atributos usados para este nodo son:
    los ya conocidos como data que es la parte donde el nodo almacena los datos, en este caso este atributo es de tipo String, pero esto puede variar dependiendo de las necesidades de uso.
    next Es el puntero que almacena el nodo siguiente

    Medodo push

    El metodo push es el algoritmo que se ocupa de guardar y principalemente ordenar los datos, es la interfaz que nos permite comunicarnos hacia la estuctura de datos, consiste en agregar un nuevo nodo, cuando el  nodo head es nulo el nuevo nodo se guarda en head. en el caso contrario el nodo_nuevo.next = head y el nodo head es igual al nodo nuevo.

    Metodo pop

    El metodo pop es la interfaz que nos permite retornar y sacar el dato de la estructura, una vez el dato es usado este es eliminado de la stack y el resultado es retornado por el metodo

    Ejemplo de un stack en python

    Lo descrito anteriormente representado en codigo python es el siguiente:

    Complejidad

    La complegidad la pila como podemos ver en el caso push es de O(1) y el metodo pop  es O(1)

    Recuerda que puedes colaborar en el repositorio para agregarle funcionalidades nuevas, tambien puedes descargar el repo y utilizarlas en tu proyecto

    El archivo utilizado en esta entrada lo puedes encontrar aqui.

  • Lista circular – Python Ejemplo

    En post anteriores las listas enlazadas permiten almacenar valores de manera dinamica y de una forma ordenada.  

    Los usos de las listas enlazadas son mucho mas generales con respecto a la variante que usaremos hoy, estamos hablando de las listas circulares, estas tienen la peculiaridad de que cuando llegamos a su final al llamar el metodo next podemos volver a encontrar el mismo elemento inicial.

    Lista Circular


    Nodo

    El nodo esta compuesto de 3 atributos, data, next y prev donde data es elemento que guardara el nodo, next es el nodo siguiente y prev es el nodo anterior. Adjuntamos el codigo del nodo

    Metodo append

    El metodo agregar funciona de la siguiente manera:

    Primer paso crear un nuevo nodo y agregar el nodo cabeza a una varibale temporal

    Si el nodo cabeza es nulo, entonces el nuevo nodo se asigna a head y tambien a next y prev.

    Si no es nulo, la lista se recorre de forma de forma contrara conviertiendo el nodo temporal en el prev de temp, y asignando a siguente el nuevo nodo, a prev el nodo temporal y a siguente head

    Complejidad

    La complegidad de esta lista cirular como podemos ver en el caso de la insercion es de O(1).

    Recuerda que puedes colaborar en el repositorio para agregarle funcionalidades nuevas, tambien puedes descargar el repo y utilizarlas en tu proyecto

    El archivo utilizado en esta entrada lo puedes encontrar aqui.

  • Lista Doble Enlazada en Python

    Como crear una lista doblemente enlazada, y usarla para tus aplicaciones en Python

    Photo by Shahadat Rahman / Unsplash

    En nuestro artículo anterior mostramos como realizar una lista enlazada simple y este articulo será bastante similar a ese, te recomendamos pasar por ese artículo si eres nuevo en las estructuras de datos,  manos a la obra.

    Lista doblemente enlazada

    Lista doble enlazada

    Como su nombre lo indica la lista doblemente enlazada permite los nodos tengan referencias, al nodo siguiente y al nodo anterior facilitando algunas operaciones en los distintos marcos de aplicación.

    Nodo de la lista enlazada doble

    Para poder hacer el nodo de la lista tenemos que tener en cuenta distintas cosas una de ellas es que ahora en vez de tener una sola referencia tenemos 2 referencias una es a un nodo siguiente que seria el próximo en la lista y otra al nodo anterior. Para tener en cuenta, el primer nodo solo tendrá referencia al nodo siguiente ya que al ser el primer nodo no existe una referencia a un nodo anterior, al igual que el ultimo nodo este solamente tendrá al anterior.

    Proceso para Insertar en la lista

    Para crear el método append o insert en la lista seguiremos el siguiente algoritmo.

    • Verificar si ya existen nodos en la lista o la lista esta vacía
    • Si la lista esta vacía insertamos el primer nodo
    • Si la lista no está vacía buscamos el ultimo nodo, le asignamos como referencia next el nuevo nodo y al nuevo nodo le asignamos como anterior el que antes era el último nodo
    • Asignamos como último nodo el nuevo nodo.

    Listo así de simple es el proceso de insertar un nuevo nodo pero vamos al código.


    Codigo de ejemplo Nodo y Lista enlazada doble

    Complejidad

    La complegidad de esta lista enlazada doble como podemos ver en el caso de la insercion es de O(1).

    Para el caso de la búsqueda en el peor caso es de O(n)

    Recuerda que puedes colaborar en el repositorio para agregarle funcionalidades nuevas, tambien puedes descargar el repo y utilizarlas en tu proyecto

    El archivo utilizado en esta entrada lo puedes encontrar aqui.

  • Lista enlazada python

    When developing our very first Mayosis theme (for selling digital products through WordPress) I captured some great looking pictures on my iMac. The 50mm Prime lens was best for this particular shot with it's beautiful depth of field rendering. Later, I added some color gradient overlay and adjusted the look and feel in Lightroom and Photoshop.
    Photo by Shahadat Rahman / Unsplash

    Primero para poder organizar los datos en nuestros programas, nos ayudamos de las estructuras de datos en este primer caso usaremos la más simple de todas.  Que es la lista enlazada siempre.

    ¿Cómo hacer una lista enlazada simple en Python?

    Para empezar, tenemos que entender las partes principales de las estructuras de datos, que son el Nodo y la estructura. El Nodo es un objeto el cual manejara la información que se quiere almacenar y la estructura es aquel objeto que contiene las referencias de todos los nodos, que nos servirá para encontrar y almacenar la información.

    Creemos un nodo simple en python

        class nodo():        """docstring for Nodo"""        def __init__(self,dato : str ):            self.dato = dato            self.nodo_siguiente = None

    EL nodo tiene un atributo dato el cual sirve para poder almacenar lo que nosotros queramos, en este caso serán datos de tipo String. Y podemos observar un atributo nodo_siguiente, en el cual se guarda una referencia del nodo que le sigue.

    Como crear una lista enlazada simple

    EL nodo tiene un atributo dato el cual sirve para poder almacenar lo que nosotros queramos, en este caso serán datos de tipo String. Y podemos observar un atributo next, en el cual se guarda una referencia del nodo que le sigue.

    Para crear la lista usaremos una clase llamada linked_list la cual es la que manejara toda la lista, cuando se instancie esta clase podremos usar los métodos, append() y find(), si quieres contribuir con nosotros puedes crear el método delete…

    Implementemos la clase list

    El tiempo de complejidad de esta lista enlazada simple es de O(n) porque estamos recorriendo la lista cada vez que queremos hacer una inserción.  Pronto veremos cómo mejorar este algoritmo para reducir el tiempo con próximas modificaciones.

    Recuerda que puedes contribuir a nuestro proyecto en la siguiente dirección de github, en la sección de proyecto puedes ver que actividades están planeadas por realizar.

    Puedes colaborar en Github