En este tutorial, ejecutará una aplicación web de ejemplo que utiliza TensorFlow.js para realizar una captación previa predictiva de recursos. Construido con Angular , el ejemplo está inspirado en Google Merchandise Store pero no comparte ningún dato ni detalles de implementación con ella.
El ejemplo utiliza un modelo previamente entrenado para hacer predicciones. En un escenario del mundo real, necesitaría entrenar un modelo utilizando análisis de su sitio web. Puede utilizar TFX para realizar dicho entrenamiento. Para obtener más información sobre cómo entrenar un modelo personalizado para la captación previa predictiva, consulte esta publicación de blog .
El código de ejemplo está disponible en GitHub .
Requisitos previos
Para completar este tutorial, necesita lo siguiente instalado en su entorno de desarrollo:
Instalar el ejemplo
Obtenga el código fuente e instale las dependencias:
- Clona o descarga el repositorio
tfjs-examples
. Cambie al directorio
angular-predictive-prefetching/client
e instale las dependencias:cd tfjs-examples/angular-predictive-prefetching/client && yarn
Cambie al directorio
angular-predictive-prefetching/server
e instale las dependencias:cd ../server && yarn
Ejecute el ejemplo
Inicie tanto el servidor como el cliente:
Inicie el servidor: en el directorio
server
, ejecuteyarn start
.Inicie el cliente:
- Abra otra ventana de terminal.
- Cambie a
tfjs-examples/angular-predictive-prefetching/client
. Ejecute los siguientes comandos:
yarn build cd dist/merch-store npx serve -s .
Es posible que se le solicite que instale el paquete de servicio . Si es así, ingrese y para instalar el paquete.
Navegue hasta
http://localhost:3000
en su navegador. Deberías ver una tienda simulada de productos de Google.
Explora con DevTools
Utilice Chrome DevTools para ver la captación previa en acción:
- Abra DevTools y seleccione Consola .
Navegue a algunas páginas diferentes de la aplicación para prepararla. Luego seleccione Venta en la navegación izquierda. Deberías ver una salida de registro como esta:
Navigating from: 'sale' 'quickview' -> 0.381757915019989 'apparel-unisex' -> 0.3150934875011444 'store.html' -> 0.1957530975341797 '' -> 0.052346792072057724 'signin.html' -> 0.0007763378671370447
Este resultado muestra predicciones para la página que usted (el usuario) visitará a continuación. La aplicación recupera recursos basándose en estas predicciones.
Para ver las solicitudes de recuperación, seleccione Red . La salida es un poco ruidosa, pero debería poder encontrar solicitudes de recursos para las páginas previstas. Por ejemplo, después de predecir
quickview
, la aplicación realiza una solicitud ahttp://localhost:8000/api/merch/quickview
.
Cómo funciona la captación previa predictiva
La aplicación de ejemplo utiliza un modelo previamente entrenado para predecir la página que visitará un usuario a continuación. Cuando el usuario navega a una nueva página, la aplicación consulta el modelo y luego busca previamente imágenes asociadas con las páginas previstas.
La aplicación realiza la captación previa predictiva en un trabajador del servicio , para que pueda consultar el modelo sin bloquear el hilo principal. Según el historial de navegación del usuario, el trabajador del servicio hace predicciones para la navegación futura y busca previamente imágenes de productos relevantes.
El trabajador del servicio se carga en el archivo principal de la aplicación Angular, main.ts :
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/prefetch.service-worker.js', { scope: '/' });
}
El fragmento anterior descarga el script prefetch.service-worker.js
y lo ejecuta en segundo plano.
En merch-display.component.ts , la aplicación reenvía eventos de navegación al trabajador del servicio:
this.route.params.subscribe((routeParams) => {
this.getMerch(routeParams.category);
if (this._serviceWorker) {
this._serviceWorker.postMessage({ page: routeParams.category });
}
});
En el fragmento anterior, la aplicación busca cambios en los parámetros de la URL. Al cambiar, el script reenvía la categoría de la página al trabajador del servicio.
El script del trabajador del servicio, prefetch.service-worker.js , maneja mensajes del hilo principal, hace predicciones basadas en ellos y busca previamente los recursos relevantes.
El trabajador del servicio usa loadGraphModel
para cargar el modelo previamente entrenado :
const MODEL_URL = "/assets/model.json";
let model = null;
tf.loadGraphModel(MODEL_URL).then((m) => (model = m));
La predicción ocurre en la siguiente expresión de función :
const predict = async (path, userId) => {
if (!model) {
return;
}
const page = pages.indexOf(path);
const pageId = tf.tensor1d([parseInt(page)], "int32");
const sessionIndex = tf.tensor1d([parseInt(userId)], "int32");
const result = model.predict({
cur_page: pageId,
session_index: sessionIndex,
});
const values = result.dataSync();
const orders = sortWithIndices(values).slice(0, 5);
return orders;
};
Luego, la función de captación previa invoca la función predict
:
const prefetch = async (path, sessionId) => {
const predictions = await predict(path, sessionId);
const formattedPredictions = predictions
.map(([a, b]) => `'${b}' -> ${a}`)
.join("\n");
console.log(`Navigating from: '${path}'`);
console.log(formattedPredictions);
const connectionSpeed = navigator.connection.effectiveType;
const threshold = connectionSpeeds[connectionSpeed];
const cache = await caches.open(ImageCache);
predictions.forEach(async ([probability, category]) => {
if (probability >= threshold) {
const merchs = (await getMerchList(category)).map(getUrl);
[...new Set(merchs)].forEach((url) => {
const request = new Request(url, {
mode: "no-cors",
});
fetch(request).then((response) => cache.put(request, response));
});
}
});
};
En primer lugar, prefetch
predice las páginas que el usuario podría visitar a continuación. Luego itera sobre las predicciones. Para cada predicción, si la probabilidad excede un cierto umbral basado en la velocidad de conexión, la función recupera recursos para la página predicha. Al obtener estos recursos antes de la solicitud de la siguiente página, la aplicación puede potencialmente ofrecer contenido más rápido y brindar una mejor experiencia de usuario.
¿Qué sigue?
En este tutorial, la aplicación de ejemplo utiliza un modelo previamente entrenado para hacer predicciones. Puede utilizar TFX para entrenar un modelo para la captación previa predictiva. Para obtener más información, consulte Acelere sus sitios con la captación previa de páginas web mediante aprendizaje automático .