Ir al contenido principal

Estrategia Code-First: Cómo monday Service Optimiza la Evaluación de Agentes de IA con LangSmith

Estrategia Code-First: Cómo monday Service Optimiza la Evaluación de Agentes de IA con LangSmith

En el actual panorama de la Inteligencia Artificial generativa, muchas organizaciones cometen el error de tratar la evaluación como un control de "última milla". Sin embargo, el equipo de monday Service ha redefinido este paradigma, estableciendo la evaluación como un requisito de "Día 0". Al construir su nueva fuerza de trabajo de IA —un ecosistema de agentes personalizables basados en roles—, la compañía integró un marco de desarrollo orientado a evaluaciones (eval-driven development) para detectar fallos de calidad antes que sus usuarios.

Este enfoque corporativo ha permitido alcanzar hitos significativos en eficiencia operativa:

  • Velocidad: Reducción del ciclo de retroalimentación de 162 a 18 segundos (8.7 veces más rápido).
  • Cobertura: Pruebas exhaustivas sobre cientos de casos en minutos.
  • Observabilidad: Monitoreo de calidad en tiempo real sobre trazas de producción.
  • Evals as Code: Gestión de la lógica de evaluación bajo control de versiones y despliegue CI/CD.

La Arquitectura: El Desafío de los Agentes ReAct

monday Service utiliza agentes basados en el patrón ReAct (Razonamiento y Acción) mediante LangGraph. Aunque esta autonomía permite a los agentes resolver consultas complejas de TI, Recursos Humanos o Legal, también introduce una vulnerabilidad crítica: la cascada de errores.

Para entender esto, imaginemos el juego del "teléfono descompuesto": si el primer participante susurra una palabra ligeramente incorrecta, el mensaje final será algo completamente ajeno al original. En un agente ReAct, una pequeña desviación en un prompt o en el resultado de una herramienta puede encadenar una serie de decisiones lógicas erróneas, resultando en una respuesta final alucinada o incorrecta.

Los Dos Pilares de la Evaluación

Desde la perspectiva de arquitectura, el equipo implementó una estrategia de dos niveles para mitigar estos riesgos:

1. Evaluaciones Offline (La Red de Seguridad)

Funcionan como pruebas unitarias ejecutadas contra "datasets de oro" (casos de referencia). Su objetivo es garantizar que un ajuste en el prompt no rompa funcionalidades existentes.

2. Evaluaciones Online (El Monitor Continuo)

Se centran en el análisis del rendimiento del agente en el "mundo real", midiendo señales de negocio como la tasa de resolución automatizada y la satisfacción del usuario.

Para ilustrar estos niveles, podemos usar la metáfora de un coche de carreras:

  • Nivel 1 (Offline): Es el túnel de viento y las pruebas de motor en el laboratorio. Comparamos cómo se comporta el chasis (el agente) ante condiciones controladas.
  • Nivel 2 (Online): Es la telemetría en tiempo real durante la carrera. Monitoreamos cómo los neumáticos (las herramientas) y el motor (el modelo de IA) responden al asfalto real y al clima cambiante (las peticiones impredecibles de los usuarios).

Pilar A: Evaluaciones Offline y el Rigor Técnico

El equipo comenzó con un dataset de 30 tickets de IT reales (anonimizados) cubriendo categorías como acceso a software, problemas de VPN y soporte de hardware. Las comprobaciones se dividieron en dos categorías:

  1. Smoke Checks Determinísticos: Verificaciones de salud del runtime, formato del esquema de salida y persistencia de la conversación.
  2. LLM-as-a-Judge: Uso de evaluadores avanzados para medir la fidelidad a los artículos de la base de conocimientos (KB grounding) y la resolución de conflictos.

El problema de la Contaminación de Datos

Es vital que estos datasets de prueba sean dinámicos. La contaminación de datos en los benchmarks es como un estudiante que obtiene las preguntas del examen antes de la prueba: el resultado de "10" no refleja conocimiento real, sino una simple memorización, invalidando la evaluación de la capacidad de razonamiento del agente.

Optimización del Tiempo de Desarrollo (DevEx)

Inicialmente, las evaluaciones se ejecutaban de forma serial, convirtiéndose en un cuello de botella. Para solucionar esto, monday Service implementó una estrategia de paralelización híbrida:

  • Paralelismo (CPU-Bound): Distribución de cargas de trabajo en múltiples núcleos.
  • Concurrencia (I/O-Bound): Ejecución simultánea de múltiples llamadas a la API del LLM para reducir la latencia de espera.

A continuación, se presenta un ejemplo conceptual en Python de cómo se podría estructurar una evaluación concurrente utilizando la infraestructura de LangChain:

import asyncio
from langsmith import Client
from langchain_openai import ChatOpenAI
from langchain.evaluation import load_evaluator

async def evaluate_agent_concurrency(dataset_name):
    client = Client()
    evaluator = load_evaluator("labeled_criteria", criteria="correctness")
    llm = ChatOpenAI(model="gpt-4")
    
    # Obtenemos los ejemplos del dataset
    examples = list(client.list_examples(dataset_name=dataset_name))
    
    async def process_example(example):
        # Simulación de la ejecución del agente y su evaluación
        # En una arquitectura real, aquí se invocaría al agente de LangGraph
        response = "Respuesta generada por el agente" 
        score = await asyncio.to_thread(
            evaluator.evaluate_strings,
            prediction=response,
            input=example.inputs['question'],
            reference=example.outputs['answer']
        )
        return score

    # Ejecución concurrente de todas las evaluaciones
    results = await asyncio.gather(*(process_example(ex) for ex in examples))
    return results

# Este enfoque reduce drásticamente el tiempo de espera al no procesar
# un ticket tras otro, sino todos en una ráfaga controlada.

Pilar B: Evaluaciones Online y Multiturno

Dado que las conversaciones con agentes suelen ser largas, la métrica de éxito no puede ser una única respuesta. El equipo adoptó los Evaluadores Multiturno de LangSmith. Estos evalúan la trayectoria completa del diálogo, analizando si el agente guio al usuario eficazmente hacia la solución tras varios intercambios.

Evaluaciones como Código (EaC) y GitOps

Una de las innovaciones más destacadas es el tratamiento de los "jueces" (prompts de evaluación) como código de producción. En lugar de gestionarlos en una interfaz web, se definen como objetos estructurados en el repositorio.

Esto habilita un flujo de trabajo de Reconciliation Loop en el pipeline de CI/CD:

  1. Sincronización: Se envían las definiciones de los prompts al Registro de LangSmith.
  2. Conciliación: Se comparan las reglas locales con las activas en producción.
  3. Depuración (Pruning): Se eliminan automáticamente las evaluaciones obsoletas (zombis) que ya no existen en el código fuente.

Conclusión

El caso de éxito de monday Service demuestra que la escalabilidad de la IA en la empresa no depende solo de la potencia del modelo, sino del rigor de la infraestructura de evaluación. Al adoptar un enfoque de "Evaluación como Infraestructura" (similar a Terraform), las organizaciones pueden iterar con la confianza de que cada mejora en el agente está respaldada por datos empíricos y no por meras intuiciones.


Referencias:

Entradas populares de este blog

Enrutamiento Dinámico y Avanzado con Amazon API Gateway: ¡Adiós a los Proxies!

Enrutamiento Dinámico y Avanzado con Amazon API Gateway: ¡Adiós a los Proxies! En el mundo de las arquitecturas de microservicios, dirigir el tráfico de manera eficiente y flexible es un desafío constante. Tradicionalmente, esto implicaba configurar y mantener capas de proxy complejas o crear estructuras de URL enrevesadas. Sin embargo, Amazon API Gateway ha simplificado este proceso radicalmente con la introducción de las Reglas de Enrutamiento ( Routing Rules ), permitiendo un enrutamiento dinámico basado en cabeceras HTTP. En este post, exploraremos cómo esta funcionalidad puede simplificar tu arquitectura, reducir la sobrecarga operativa y habilitar patrones de despliegue avanzados como Canary Releases y A/B Testing de forma nativa. ¿Qué son las Reglas de Enrutamiento? Las Routing Rules son un recurso que se asocia a un dominio personalizado en API Gateway. Permiten desviar las solicitudes entrantes a diferentes integraciones de backend (como una etapa específica de ...

Python 3.14 y el Fin del GIL: Explorando Oportunidades y Desafíos

Python 3.14 y el Fin del GIL: Explorando Oportunidades y Desafíos La versión 3.14 de Python ha generado gran expectativa, principalmente por la implementación de mejoras significativas, entre las que destacan: Sub-intérpretes: Disponibles en Python durante dos décadas, pero limitados al uso de código C. Ahora se pueden emplear directamente desde Python. T-Strings: Un nuevo método para el procesamiento personalizado de cadenas, con una sintaxis similar a los f-strings , pero que devuelve un objeto que representa tanto las partes estáticas como las interpoladas de la cadena. Compilador Just-In-Time (JIT): Aunque aún experimental, esta característica promete mejorar el rendimiento en casos de uso específicos. Sin embargo, el aspecto más relevante de esta versión es la introducción de Python con hilos libres , también conocido como Python sin GIL . Es importante señalar que la versión estándar de Python 3.14 seguirá utilizando el GIL, pero se puede descargar (o construir) u...

¿Qué es el patrón Circuit Breaker y cómo se puede implementar con AWS Step Functions?

En el desarrollo de software, es común que las aplicaciones se comuniquen con servicios o recursos externos, como bases de datos, APIs o microservicios. Sin embargo, estos servicios o recursos pueden fallar o estar temporalmente indisponibles por diversas razones, lo que puede afectar el rendimiento y la disponibilidad de la aplicación. Para manejar estos escenarios de falla, se puede utilizar el patrón Circuit Breaker, que consiste en detectar y prevenir que una operación que tiene alta probabilidad de fallar se ejecute repetidamente, causando más problemas o consumiendo recursos innecesarios.  El patrón Circuit Breaker tiene tres estados posibles: cerrado, abierto y medio abierto. Cerrado : En este estado, el circuito está funcionando normalmente y la operación se ejecuta sin problemas. Si se detecta una falla, se incrementa un contador de fallas y se calcula un umbral de fallas, que puede ser un número o un porcentaje de fallas permitidas. Si el contador de fallas supera el u...