Documentación

Enrutamiento de intención

Clasifica las solicitudes entrantes y enruta cada una al gestor óptimo: lógica determinista, un LLM especialista o una persona.

No todas las solicitudes del usuario necesitan el mismo tipo de gestor. Algunas se pueden responder con una consulta a la base de datos. Otras necesitan un LLM con contexto específico del dominio. Otras necesitan a una persona. TypeSafe puede situarse delante de todas ellas como un clasificador rápido y barato que determina qué gestor invocar.

Ejemplo: enrutamiento de atención al cliente

Imagina que estás construyendo un sistema de atención al cliente. Llegan mensajes y hay que enrutarlos al gestor adecuado. En lugar de enviar cada mensaje por un LLM costoso para averiguar qué tipo de solicitud es, clasificas primero y enrutas en consecuencia.

%%{init: {"fontFamily": "Inter, sans-serif", "flowchart": {"rankSpacing": 35, "wrappingWidth": 300, "subGraphTitleMargin": {"top": 12, "bottom": 36}}}}%%
flowchart LR
    message["customer message"]

    subgraph req["TypeSafe evaluates questions<br/>in parallel"]
        direction TB
        intent["<b>Choice:</b> intent"]
        complexity["<b>Score:</b> complexity"]
        %% Invisible links stack the questions; they are answered in parallel.
        intent ~~~ complexity
    end

    message -- "one request<br/>message + 2 questions" --> req
    req -- "one response<br/>2 answers with<br/>confidence" --> confidence{"<b>intent confidence<br/>≥ 0.5?</b><br/>your code"}
    confidence -- "no" --> human["human agent"]
    confidence -- "yes" --> route{"<b>which intent?</b><br/>"}
    route -- "order_status" --> order["order lookup<br/>deterministic code"]
    route -- "product_question" --> product["product specialist LLM"]
    route -- "return_exchange" --> returns["returns specialist LLM"]
    route -- "complaint" --> escalate{"<b>complexity > 1<br/>or its confidence < 0.5?</b><br/>"}
    escalate -- "yes" --> human
    escalate -- "no" --> complaint["complaint resolution LLM"]

Paso 1: clasifica la intención y la complejidad

questions
{
  "intent": {
    "type": "choice",
    "instructions": "The primary intent of this customer message",
    "criteria": {
      "order_status": "Asking about an existing order",
      "product_question": "Asking about a product before buying",
      "return_exchange": "Wants to return or exchange something",
      "complaint": "Unhappy with experience, wants resolution"
    }
  },
  "complexity": {
    "type": "score",
    "instructions": "How complex is this request to resolve",
    "criteria": [
      "Simple lookup or standard procedure",
      "Requires some judgment or multi-step process",
      "Unusual situation, edge case, or escalation needed"
    ]
  }
}

Paso 2: enruta al gestor óptimo

routing.py

def route_ticket(ticket_id, response):
    intent = response.answers["intent"]
    complexity = response.answers["complexity"]

    if intent.confidence < 0.5:
        # If we don't have enough confidence to classify, route to a human agent
        return route_to_human_agent(ticket_id)

    if intent.choice == "order_status":
        handle_order_status(ticket_id)

    elif intent.choice == "product_question":
        handle_with_llm(ticket_id, PRODUCT_SPECIALIST)

    elif intent.choice == "return_exchange":
        handle_with_llm(ticket_id, RETURNS_SPECIALIST)

    elif intent.choice == "complaint":
        low_confidence = complexity.confidence < 0.5
        # A higher complexity.score leans toward the "escalation needed" end of the scale.
        if complexity.score > 1 or low_confidence:
            # Too complex for safe automation, or we're not sure about the complexity; route to a human.
            route_to_human_agent(ticket_id)
        else:
            handle_with_llm(ticket_id, COMPLAINT_RESOLUTION)

Una intención se enruta a código determinista sin ningún LLM de por medio. Dos se enrutan a distintos LLM especialistas, cada uno cargado con un contexto diferente. Una usa la puntuación de complejidad para decidir entre un LLM y una persona. TypeSafe se encarga de la clasificación en una sola llamada rápida; los recursos costosos solo se invocan para las solicitudes que realmente los necesitan.

Fíjate en la comprobación adicional de confianza sobre la puntuación de complejidad. Como se explica en Confidence, siempre es importante considerar el significado de una puntuación de confianza baja en el contexto del sistema y lo que está en juego en la decisión.