Optimizando la carga de contenido dinámico: De 11 segundos a instantáneo
En el proyecto Breniapp/brenia, nos enfrentamos a un reto de rendimiento significativo: la generación de cuestionarios a través de LLM estaba degradando la experiencia del usuario, alcanzando tiempos de carga de hasta 11 segundos en cada acceso al panel de administración.
El Problema
El proceso de refraseo de preguntas estáticas se ejecutaba de forma síncrona mediante una llamada externa a un servicio de inteligencia artificial. Cada vez que un usuario accedía a la vista, el servidor bloqueaba la respuesta esperando la conclusión de esta tarea costosa, incluso cuando el resultado final dependía únicamente de datos constantes (las preguntas y el idioma).
La Solución
Implementamos una capa de almacenamiento en caché para los resultados procesados. Al utilizar el hash de las preguntas combinado con la configuración regional (locale), logramos que la primera solicitud realice el trabajo pesado, mientras que todas las siguientes se sirvan instantáneamente desde la memoria cache con un tiempo de vida (TTL) de 7 días.
public function generateWithCache(array $questions, string $locale)
{
$cacheKey = 'induction_questions_' . $locale . '_' . md5(json_encode($questions));
return Cache::remember($cacheKey, now()->addDays(7), function () use ($questions) {
return $this->llmService->rephrase($questions);
});
}
Consideraciones clave
- Fiabilidad: Solo almacenamos en caché respuestas válidas. Si el LLM falla o devuelve un formato no parseable, no guardamos el resultado, permitiendo que futuras peticiones intenten realizar la llamada correctamente.
- Testing: Utilizamos PHPUnit para asegurar que el sistema respete la caché tras la primera llamada, verificando con
assertCallCountque solo se realice una solicitud externa independientemente del número de visitas.
Este cambio no solo mejora la latencia percibida en el panel de control, sino que también optimiza el consumo de recursos al evitar llamadas redundantes a la API externa.