Skip to content
BotServBotServ
Human-in-the-LoopApproval GateVetoAprobaciónSeguridad de agentesAgente IA

Aprobación Humana: Approval Gates para Agentes

Aprobación humana en agentes IA: Approval Gates, derechos de veto y Human-in-the-Loop. Controla tus agentes sin bloquearlos.

S

schutzgeist

11 min read
Aprobación Humana: Approval Gates para Agentes

Aprobación humana: Approval Gates para agentes

Qué cubre este artículo

  • Qué son los Approval Gates y cómo hacen que los agentes de IA sean controlables
  • Cuándo debes solicitar aprobación humana y cuándo no
  • Cómo implementar aprobaciones en LangGraph, CrewAI y AutoGen
  • Qué patrones de escalada y derechos de veto existen
  • Cómo evitar fatiga de aprobación y mantener la seguridad

Introducción

Los agentes de IA trabajan de forma autónoma. Planifican, invocan herramientas y toman decisiones sin intervención humana. Esto es lo que los hace útiles, pero también riesgoso. Una decisión equivocada puede enviar un email a todos los clientes, eliminar una base de datos o generar costos inesperados.

La aprobación humana, también conocida como Human-in-the-Loop, es el mecanismo de protección que permite que el agente sea autónomo, pero requiere aprobación humana en acciones críticas. El agente planifica, el humano revisa, el agente ejecuta. De esta forma obtienes velocidad sin perder el control.

Este artículo forma parte de la serie Seguridad de agentes y profundiza en los conceptos básicos de Aprobación humana.

¿Por qué necesito aprobación humana?

Imagina que tu agente debe pagar facturas automáticamente. Lee facturas, verifica montos e inicia transferencias. Sin aprobación, paga cada factura que encuentra. ¿Qué sucede si una factura contiene 50.000 euros porque un proveedor cometió un error tipográfico? El agente paga, porque no realiza verificaciones de plausibilidad.

O imagina que tu agente responde consultas de clientes. Tiene una herramienta para enviar emails. Un cliente pregunta sobre un reembolso. El agente decide de forma independiente prometer un reembolso de 10.000 euros y confirmar por email. Sin aprobación, ya está hecho.

La aprobación humana evita que tales acciones se ejecuten sin revisión. El agente prepara todo, tú lo revisas, apruebas o rechazas. Esto toma segundos, pero salva tu negocio.

Aprobación humana explicada brevemente

Un Approval Gate es un punto de control en el flujo de trabajo de un agente. Antes de que el agente ejecute una acción marcada como crítica, pausa. Te muestra qué quiere hacer, con qué parámetros y por qué. Tú decides: aprobar, rechazar o ajustar.

La idea central es simple: no toda acción necesita aprobación, pero sí cada acción irreversible, externa o costosa.

Para quién es este artículo

Este artículo está dirigido a desarrolladores que construyen agentes de IA con frameworks como LangGraph, CrewAI o AutoGen y quieren asegurar acciones críticas. Debes entender cómo funciona Tool-Calling y qué son sistemas de agentes. Conocimientos básicos de Python son útiles para los ejemplos de código.

Términos importantes

TérminoExplicación
Approval GatePunto de control donde una persona debe aprobar una acción planeada
Human-in-the-LoopPrincipio en el que una persona interviene en el flujo automatizado
VetoDerecho a rechazar una acción planeada del agente
EscalationDerivación de una decisión a una instancia superior
Approval FatigueEfecto de agotamiento cuando se solicitan demasiadas aprobaciones
Sync ApprovalAprobación donde el agente espera a que la persona decida
Async ApprovalAprobación donde el agente continúa y recupera el resultado más tarde
Risk ScoreEvaluación de qué tan riesgosa es una acción para priorizar aprobaciones
WhitelistLista de acciones permitidas que no necesitan aprobación
BlacklistLista de acciones prohibidas que nunca deben ejecutarse

Cuándo es necesaria una aprobación

Acciones irreversibles

Todo lo que no se puede deshacer necesita aprobación. Eliminar archivos, remover registros de base de datos, iniciar transferencias. Una vez que se ejecuta la acción, no hay vuelta atrás.

Comunicación externa

Todo lo que es visible externamente necesita aprobación. Enviar emails, publicar mensajes en Slack, publicar en redes sociales, hacer requests API a servicios externos. Un contenido incorrecto puede dañar la reputación o violar la privacidad.

Acciones costosas

Todo lo que cuesta dinero necesita aprobación. Iniciar recursos en la nube, hacer llamadas a API de pago, hacer pedidos. Establece un umbral: acciones menores a 10 euros se ejecutan automáticamente, por encima de eso necesitan aprobación.

Acciones con datos sensibles

Todo lo que procesa datos sensibles necesita aprobación. Exportar datos de clientes, enviar datos personales a servicios externos, crear backups de base de datos. Aunque la acción en sí parezca inofensiva, el contexto puede ser crítico.

Patrones de implementación

Aprobación síncrona

En la aprobación síncrona, el agente se detiene completamente. Envía la solicitud y espera. Solo cuando respondes, continúa o se detiene. Esta es la forma más simple, pero bloquea todo el flujo de trabajo.

import asyncio

class ApprovalGate:
    def __init__(self):
        self.pending = {}

    async def request_approval(self, action, params, reason):
        approval_id = generate_id()
        self.pending[approval_id] = {
            "action": action,
            "params": params,
            "reason": reason,
            "status": "pending"
        }
        # Agent pausiert hier und wartet
        while self.pending[approval_id]["status"] == "pending":
            await asyncio.sleep(1)
        return self.pending[approval_id]["status"] == "approved"

    def approve(self, approval_id):
        self.pending[approval_id]["status"] = "approved"

    def reject(self, approval_id):
        self.pending[approval_id]["status"] = "rejected"

Aprobación asíncrona

En la aprobación asíncrona, el agente continúa trabajando. Ejecuta tareas que no necesitan aprobación y vuelve a la aprobación después. Esto es más eficiente, pero más complejo de implementar.

class AsyncApprovalGate:
    def __init__(self):
        self.queue = []

    def submit_for_approval(self, action, params, reason):
        task_id = generate_id()
        self.queue.append({
            "id": task_id,
            "action": action,
            "params": params,
            "reason": reason,
            "status": "pending"
        })
        return task_id

    def check_status(self, task_id):
        task = next(t for t in self.queue if t["id"] == task_id)
        return task["status"]

    def process_pending(self):
        pending = [t for t in self.queue if t["status"] == "pending"]
        return pending

Aprobación basada en Risk Score

En lugar de categorizar manualmente cada acción, puedes calcular un Risk Score. Las acciones con puntuación baja se ejecutan automáticamente, las de puntuación alta necesitan aprobación.

def calculate_risk_score(action, params):
    risk = 0
    if action in ["delete_file", "drop_table"]:
        risk += 50
    if action in ["send_email", "post_slack"]:
        risk += 30
    if "amount" in params and params["amount"] > 1000:
        risk += 40
    if "external_api" in params:
        risk += 20
    return risk

def needs_approval(risk_score, threshold=50):
    return risk_score >= threshold

Aprobaciones en Frameworks

LangGraph Interrupt

LangGraph incluye una función interrupt integrada. El agente se pausa en un punto definido y espera entrada. Este es el método más directo para implementar approval gates.

from langgraph.graph import StateGraph, END
from langgraph.checkpoint.memory import MemorySaver

def execute_with_approval(state):
    action = state["planned_action"]
    if is_critical(action):
        # Agent pausiert hier
        approval = interrupt({
            "action": action["name"],
            "params": action["params"],
            "reason": action["reason"]
        })
        if not approval:
            return {"status": "rejected"}
    result = run_tool(action)
    return {"result": result, "status": "completed"}

workflow = StateGraph(AgentState)
workflow.add_node("plan", plan_step)
workflow.add_node("execute", execute_with_approval)
workflow.add_edge("plan", "execute")
workflow.add_edge("execute", END)

app = workflow.compile(checkpointer=MemorySaver())

CrewAI human_input

CrewAI ofrece el parámetro human_input=True para tareas. El agente solicita confirmación antes de ejecutar. Es simple, pero menos granular que LangGraph.

from crewai import Agent, Task, Crew

reviewer = Agent(
    role="Reviewer",
    goal="E-Mails vor dem Versand prüfen",
    backstory="Du bist verantwortlich für die Qualittssicherung.",
    allow_delegation=False
)

send_task = Task(
    description="Verfasse eine Antwort-E-Mail an den Kunden.",
    agent=reviewer,
    human_input=True
)

crew = Crew(agents=[reviewer], tasks=[send_task])
result = crew.kickoff()

AutoGen human_in_the_loop

AutoGen permite usar un UserProxyAgent. Este agente reenvía cada acción planificada a una persona real. Puedes configurar con qué frecuencia y en qué acciones se solicita intervención humana.

from autogen import ConversableAgent, UserProxyAgent

user_proxy = UserProxyAgent(
    name="Human",
    human_input_mode="ALWAYS",
    max_consecutive_auto_reply=0
)

assistant = ConversableAgent(
    name="Assistant",
    system_message="Du bist ein hilfreicher Agent."
)

user_proxy.initiate_chat(
    assistant,
    message="Fasse die neuesten E-Mails zusammen und sende sie an Slack."
)

Patrones de escalada

Escalada gradual

No todas las aprobaciones deben llegar al primer punto de contacto. Puedes definir niveles. Las acciones de bajo riesgo van al operador, las de riesgo medio al líder del equipo, las de riesgo crítico a la dirección.

def escalate(approval_request):
    risk = approval_request["risk_score"]
    if risk < 30:
        return "operator"
    elif risk < 70:
        return "team_lead"
    else:
        return "management"

def route_approval(approval_request):
    approver = escalate(approval_request)
    notify(approver, approval_request)
    return wait_for_response(approver)

Escalada por timeout

Si nadie responde dentro de un plazo determinado, la solicitud sube automáticamente al siguiente nivel. Esto evita que acciones críticas queden sin procesar.

import time

def request_with_timeout(approval, timeout_seconds=300):
    start = time.time()
    while time.time() - start < timeout_seconds:
        if check_response(approval["id"]):
            return get_response(approval["id"])
        time.sleep(5)
    # Timeout alcanzado, escalar
    return escalate_to_next_level(approval)

Derechos de veto

Un veto es el derecho a rechazar una acción sin proponer una alternativa. Los derechos de veto deben estar claramente definidos. Cualquier aprobador puede interponer un veto, pero no todos pueden autorizar una acción. Esto evita que una sola persona ejecute acciones críticas sin supervisión.

Evitar la fatiga de aprobación

El problema

Si tu agente somete cada pequeña acción a aprobación, terminarás confirmando sin pensar. Haces clic en “approve” sin leer. Esto es más peligroso que no tener aprobaciones, porque crea una falsa sensación de seguridad.

Soluciones

Aumentar granularidad: solicita aprobaciones solo para acciones realmente críticas. Los accesos de lectura, cálculos y transformaciones internas no necesitan aprobación.

Usar risk scores: automatiza la decisión de si se requiere aprobación. Una puntuación baja significa ejecución automática, una puntuación alta significa aprobación requerida.

Formar lotes: si el agente quiere ejecutar 50 acciones similares, muéstralas como una lista y pregunta una sola vez si todas están aprobadas. En lugar de 50 aprobaciones individuales, necesitas una.

Mantener whitelists: las acciones que se aprueban regularmente pueden ir a una whitelist. Se ejecutan automáticamente. Revisa la whitelist periódicamente.

Errores comunes

  1. Demasiadas aprobaciones: si cada acción requiere aprobación, nadie las revisa adecuadamente. Usa aprobaciones selectivamente, solo para acciones críticas.

  2. Sin criterios claros: si no está definido cuándo se necesita aprobación, los desarrolladores deciden de forma inconsistente. Documenta los criterios y automatízalos mediante risk scores.

  3. Sin timeout: si un aprobador no responde, el agente se detiene. Define timeouts y niveles de escalada para que el flujo continúe.

  4. Aprobaciones sin contexto: el agente solicita aprobación, pero el aprobador no ve el motivo. Siempre muestra la acción planificada, los parámetros y la justificación del agente.

  5. Sin auditoría: ¿quién aprobó qué? Si no lo registras, falta trazabilidad. Guarda cada aprobación con marca de tiempo, aprobador y decisión.

  6. Aprobación sincrónica en flujos largos: si el agente se pausa completamente en cada aprobación, el flujo toma eternidad. Usa aprobación asincrónica cuando sea posible para que el agente continúe trabajando.

  7. Sin separación de roles: si la misma persona planifica, aprueba y ejecuta, no hay control. Separa los roles: el agente planifica, otra persona aprueba.

  8. Veto sin justificación: si alguien interpone un veto sin explicar por qué, el agente no aprende. Solicita justificación en cada veto y guárdala en el audit log.

Hardware, costos y seguridad

Las aprobaciones humanas no cuestan hardware, pero sí tiempo. Cada aprobación retrasa el flujo el tiempo que necesita una persona para revisar la solicitud. Con aprobaciones sincrónicas, el agente se detiene; con aprobaciones asincrónicas, continúa, pero la acción crítica espera.

El costo de implementación es bajo. LangGraph, CrewAI y AutoGen ofrecen mecanismos integrados. Solo necesitas una interfaz de usuario para que los aprobadores den su visto bueno. Puede ser una interfaz de chat, un panel web o una solución basada en correo electrónico.

Desde el punto de vista de seguridad, las aprobaciones son una de las medidas más importantes. Son la última barrera antes de que se ejecute una acción irreversible. Combínalas con las otras medidas de seguridad de agentes: sandboxing, permisos de herramientas y guardrails. Si trabajas localmente con Ollama, aplican los mismos principios.

Cómo el agente decide qué acciones planificar en primer lugar está relacionado con su planificación y reflexión. Una buena planificación reduce el número de acciones críticas y, por lo tanto, el número de aprobaciones necesarias.

Enlaces de referencia

Preguntas frecuentes

¿Qué es un Approval Gate?

Un Approval Gate es un punto de control en el flujo de trabajo de un agente de IA. Antes de que el agente ejecute una acción marcada como crítica, se pausa y solicita la aprobación de una persona. Solo después de la aprobación se ejecuta la acción.

¿Cuándo necesito aprobaciones humanas?

Las aprobaciones humanas tienen sentido para cualquier acción que sea irreversible, tenga efectos externos o genere costos. Esto incluye eliminación de archivos, envío de correos electrónicos, llamadas API a servicios externos y pagos.

¿Cuál es la diferencia entre aprobación sincrónica y asincrónica?

Con aprobación sincrónica, el agente se detiene completamente y espera la decisión. Con aprobación asincrónica, el agente continúa trabajando y verifica más tarde si se otorgó la aprobación. La aprobación asincrónica es más eficiente, pero más compleja.

¿Qué es Approval Fatigue?

Approval Fatigue ocurre cuando un agente solicita demasiadas aprobaciones. Los aprobadores confirman automáticamente sin revisar las solicitudes. Esto es peligroso porque genera una falsa sensación de seguridad. Solución: utilizar aprobaciones de forma selectiva y aprovechar Risk Scores.

¿Qué es un derecho de veto?

Un derecho de veto permite a un aprobador rechazar una acción planeada sin necesidad de proponer una alternativa. Los derechos de veto deben estar claramente definidos y vinculados a roles.

¿Cómo implemento aprobaciones en LangGraph?

LangGraph ofrece la función interrupt. El agente se pausa en un punto definido del grafo y espera una entrada. Puedes guardar la entrada a través de un checkpointer y reanudarla después.

¿Necesito aprobaciones con modelos locales?

Sí. Incluso si trabajas localmente con Ollama y no envías datos al exterior, el agente puede ejecutar acciones irreversibles. Las aprobaciones son independientes de dónde se ejecute el modelo.

¿Qué es un Risk Score?

Un Risk Score es una evaluación numérica de qué tan riesgosa es una acción. Se calcula a partir de factores como el tipo de acción, parámetros y contexto. Las acciones con puntuación alta requieren aprobación, las acciones con puntuación baja se ejecutan automáticamente.

¿Cómo evito que el agente se quede esperando aprobaciones?

Utiliza aprobación asincrónica. El agente continúa ejecutando tareas no críticas mientras espera la aprobación para la acción crítica. Alternativamente, puedes establecer tiempos de espera y escalar si se exceden.

¿Puedo automatizar las aprobaciones?

Parcialmente. Puedes calcular Risk Scores y aprobar automáticamente las acciones con puntuación baja. Las acciones con puntuación alta siempre deben involucrar a una persona. Una automatización completa va en contra del propósito de Human-in-the-Loop.

¿Cómo registro las aprobaciones?

Guarda para cada aprobación la marca de tiempo, el aprobador, la acción planeada, los parámetros y la decisión (approved, rejected, modified). El registro debe estar fuera del alcance del agente para que no pueda manipularlo.

Referencias

  • LangGraph Documentation: Human-in-the-Loop Workflows
  • CrewAI Documentation: Human Input in Tasks
  • AutoGen Documentation: UserProxyAgent and Human-in-the-Loop
  • OWASP: Top 10 for Large Language Model Applications
  • NIST: AI Risk Management Framework
Volver al blog
Share:

Entradas relacionadas