Saltar al contenido principal

Arquibot

Asistente inteligente con Langgraph y RAG para gestion de obras

Arquibot

En el sector de la construcción y la arquitectura, la gestión de la información es crítica. Desde consultar precios actualizados de materiales hasta coordinar la logística en obra, los profesionales pierden horas buscando datos dispersos. ArquiBot nace como una solución a este problema: un agente conversacional inteligente capaz de asistir a arquitectos y constructoras en tiempo real a través de WhatsApp. No es un simple chatbot; es un sistema agéntico capaz de consultar bases de datos internas, calcular costes laborales e incluso gestionar órdenes de compra con supervisión humana.

¿Qué hace ArquiBot?

ArquiBot actúa como un jefe de obra virtual disponible 24/7. Sus capacidades principales incluyen:

  • Consultas Técnicas y de Precios (RAG): El bot tiene acceso a una biblioteca de documentos (PDFs, Excel, Word) con normativas, precios de materiales y convenios.
  • Cálculos de Mano de Obra: Realiza estimaciones de costes basándose en el tipo de trabajador y horas, aplicando tarifas predefinidas.
  • Logística y Clima: Consulta APIs externas para verificar si el clima permite trabajar (OpenWeather) y calcula tiempos de entrega de materiales.
  • Gestión de Compras (Human-in-the-Loop): Genera órdenes de compra formales y envía correos electrónicos a proveedores, pero siempre solicitando aprobación humana antes de ejecutar acciones críticas.

Arquitectura Técnica

El proyecto está construido sobre un stack moderno de Python, utilizando LangGraph para la orquestación del agente, lo que permite un flujo cíclico y con memoria, a diferencia de las cadenas lineales tradicionales.

Ingesta de Conocimiento (RAG Multi-formato)

El sistema no alucina información; se basa en datos reales. He implementado un sistema de ingesta (ingest.py) que escanea directorios de conocimiento.

  • Tecnologías: LangChain, PyPDFLoader, Docx2txtLoader, CSVLoader.
  • Vector Store: Los documentos se fragmentan (chunking) y se convierten en vectores (embeddings) usando el modelo all-MiniLM-L6-v2. Estos vectores se almacenan en PostgreSQL mediante la extensión PGVector, permitiendo búsquedas semánticas rápidas.

El Cerebro: LangGraph y Google Gemini

El núcleo de ArquiBot es un grafo de estado (StateGraph).

  • Modelo LLM: Utilizo Google Gemini 2.5 Flash por su eficiencia y ventana de contexto.
  • Orquestación: El grafo define nodos para el "Agente" y las "Herramientas". El flujo decide dinámicamente si responder al usuario o invocar una herramienta externa (Function Calling).
  • Persistencia: Gracias a PostgresSaver, el bot tiene memoria a largo plazo ("Memory Persistence"). Si reinicias el servidor, el bot recuerda la conversación con cada usuario.

Human-in-the-Loop (HITL)

Una de las características más avanzadas es la interrupción segura. Cuando el agente decide generar una orden de compra, el flujo se detiene gracias a la configuración de interrupt_before en LangGraph. El sistema espera a que el usuario (el arquitecto) escriba "APROBAR ORDEN". Solo entonces, el grafo reanuda su ejecución, genera la orden y dispara la herramienta de envío de email. Esto previene compras accidentales o alucinaciones costosas.

Python
{
  # Snippet de la configuración del Grafo
  builder = StateGraph(AgentState)
  builder.add_node("agente", nodo_agente)
  builder.add_node("herramientas", ToolNode(lista_herramientas))

  # Definimos interrupción antes de ejecutar herramientas críticas
  app = builder.compile(
      checkpointer=checkpointer,
      interrupt_before=[("herramientas", {"tools": ["generar_orden_compra"]})]
  )

}

Interfaz y Despliegue (FastAPI + Twilio)

Para que sea accesible en obra, la interfaz es WhatsApp.

  • API Gateway: Un servidor FastAPI maneja los webhooks entrantes de Twilio (WhatsApp) y Telegram.
  • Manejo de Hilos: Cada número de teléfono se convierte en un thread_id único en la base de datos, manteniendo sesiones independientes para cada usuario.
  • Comunicación: Utilizo la API de Twilio para recibir y enviar mensajes, conectando el input del usuario directamente con el grafo de LangGraph.