13-10-2026

Ejemplo práctico de orquestación en ia con php

Objetivo del ejemplo

El siguiente código muestra un flujo de orquestación básico en PHP. Recibe una consulta de un usuario, la clasifica, recupera información relevante, genera una respuesta y realiza una validación final antes de devolver el resultado. Cada paso se ejecuta de forma secuencial y controlada.

Estructura del flujo

  1. Clasificación de la intención: determina el tipo de consulta.
  2. Recuperación de contexto: obtiene datos relacionados según la intención.
  3. Generación de respuesta: elabora la respuesta utilizando el contexto.
  4. Validación: comprueba que la respuesta cumple unos criterios mínimos.

Código completo



class AIOrchestrator
{
    private array $contextStore = [
        'factura' => 'Las facturas se emiten el día 5 de cada mes y están disponibles en el área de cliente.',
        'soporte_tecnico' => 'Para problemas de acceso, reinicia la contraseña desde el enlace de recuperación.',
        'pedido' => 'Los pedidos se procesan en 24-48 horas laborables. El seguimiento está disponible en la cuenta.',
        'general' => 'Puedes contactar con soporte en horario de 9:00 a 18:00 de lunes a viernes.'
    ];

    /**
     * Punto de entrada de la orquestación
     */
    public function process(string $userQuery): array
    {
        // Paso 1: Clasificar la intención
        $intent = $this->classifyIntent($userQuery);

        // Paso 2: Recuperar contexto según la intención
        $context = $this->retrieveContext($intent);

        // Paso 3: Generar respuesta
        $response = $this->generateResponse($userQuery, $context, $intent);

        // Paso 4: Validar la respuesta
        $validated = $this->validateResponse($response);

        return [
            'intent' => $intent,
            'context_used' => $context,
            'response' => $validated['response'],
            'is_valid' => $validated['is_valid'],
            'status' => $validated['is_valid'] ? 'success' : 'needs_review'
        ];
    }

    /**
     * Paso 1: Clasificación simple de la intención
     */
    private function classifyIntent(string $query): string
    {
        $query = strtolower($query);

        if (str_contains($query, 'factura') || str_contains($query, 'pago')) {
            return 'factura';
        }

        if (str_contains($query, 'acceso') || str_contains($query, 'contraseña') || str_contains($query, 'login')) {
            return 'soporte_tecnico';
        }

        if (str_contains($query, 'pedido') || str_contains($query, 'envio') || str_contains($query, 'seguimiento')) {
            return 'pedido';
        }

        return 'general';
    }

    /**
     * Paso 2: Recuperación de contexto
     */
    private function retrieveContext(string $intent): string
    {
        return $this->contextStore[$intent] ?? $this->contextStore['general'];
    }

    /**
     * Paso 3: Generación de respuesta
     * (En un caso real aquí se llamaría a un modelo de lenguaje)
     */
    private function generateResponse(string $query, string $context, string $intent): string
    {
        $templates = [
            'factura' => "Sobre tu consulta de facturación: {$context}",
            'soporte_tecnico' => "Respecto al problema de acceso: {$context}",
            'pedido' => "Sobre el estado de tu pedido: {$context}",
            'general' => "Gracias por contactar. {$context}"
        ];

        return $templates[$intent] ?? $templates['general'];
    }

    /**
     * Paso 4: Validación básica de la respuesta
     */
    private function validateResponse(string $response): array
    {
        $isValid = strlen($response) > 20 && !str_contains(strtolower($response), 'error');

        return [
            'response' => $response,
            'is_valid' => $isValid
        ];
    }
}

// Ejemplo de uso
$orchestrator = new AIOrchestrator();

$queries = [
    "No puedo ver mi factura del mes pasado",
    "He olvidado la contraseña de acceso",
    "¿Dónde está mi pedido número 45892?"
];

foreach ($queries as $query) {
    echo "Consulta: {$query}" . PHP_EOL;
    $result = $orchestrator->process($query);
    echo "Intención detectada: {$result['intent']}" . PHP_EOL;
    echo "Respuesta: {$result['response']}" . PHP_EOL;
    echo "Estado: {$result['status']}" . PHP_EOL;
    echo str_repeat('-', 50) . PHP_EOL;
}

Explicación del código

La clase AIOrchestrator actúa como coordinador central. El método público process() define el orden de ejecución de los pasos y garantiza que cada etapa reciba la información generada por la anterior.

Paso 1 – Clasificación de la intención

El método classifyIntent() analiza el texto de la consulta mediante reglas sencillas. En un entorno real este paso suele delegarse a un modelo de lenguaje o a un clasificador entrenado.

Paso 2 – Recuperación de contexto

Según la intención detectada se recupera información relevante desde un almacén de contexto (en este ejemplo un array estático). En producción este paso consultaría una base de datos, un sistema de recuperación aumentada (RAG) o una API interna.

Paso 3 – Generación de respuesta

Con la consulta original y el contexto recuperado se construye la respuesta. Aquí se utilizan plantillas para mantener el ejemplo autocontenido. En un caso real se realizaría una llamada a un modelo de lenguaje (OpenAI, Claude, modelo local, etc.).

Paso 4 – Validación

Antes de devolver el resultado se aplica una validación mínima. Si la respuesta no cumple los criterios, el flujo puede marcarse para revisión humana o activar un camino alternativo.

Resultado de ejemplo

Al ejecutar el script con las consultas de prueba se obtiene una salida similar a la siguiente:

Consulta: No puedo ver mi factura del mes pasado
Intención detectada: factura
Respuesta: Sobre tu consulta de facturación: Las facturas se emiten el día 5 de cada mes y están disponibles en el área de cliente.
Estado: success
--------------------------------------------------
Consulta: He olvidado la contraseña de acceso
Intención detectada: soporte_tecnico
Respuesta: Respecto al problema de acceso: Para problemas de acceso, reinicia la contraseña desde el enlace de recuperación.
Estado: success
--------------------------------------------------
Consulta: ¿Dónde está mi pedido número 45892?
Intención detectada: pedido
Respuesta: Sobre el estado de tu pedido: Los pedidos se procesan en 24-48 horas laborables. El seguimiento está disponible en la cuenta.
Estado: success
--------------------------------------------------

Posibles mejoras

  • Sustituir la clasificación por reglas por una llamada a un modelo de lenguaje.
  • Integrar un sistema de recuperación de información (RAG) en el paso de contexto.
  • Añadir gestión de errores y reintentos en cada etapa.
  • Persistir el estado del flujo para permitir pausas y reanudaciones.
  • Registrar cada paso para facilitar la observabilidad y la depuración.