Neste tutorial, você executará um exemplo de aplicativo Web que usa o TensorFlow.js para fazer a pré-busca preditiva de recursos. Construído com Angular , o exemplo é inspirado na Google Merchandise Store, mas não compartilha nenhum dado ou detalhe de implementação com ela.
O exemplo usa um modelo pré-treinado para fazer previsões. Em um cenário real, você precisaria treinar um modelo usando análises do seu site. Você pode usar o TFX para fazer esse treinamento. Para saber mais sobre como treinar um modelo personalizado para pré-busca preditiva, consulte esta postagem do blog .
O código de exemplo está disponível no GitHub .
Pré-requisitos
Para concluir este tutorial, você precisa do seguinte instalado em seu ambiente de desenvolvimento:
Instale o exemplo
Obtenha o código fonte e instale as dependências:
- Clone ou baixe o repositório
tfjs-examples
. Mude para o diretório
angular-predictive-prefetching/client
e instale as dependências:cd tfjs-examples/angular-predictive-prefetching/client && yarn
Mude para o diretório
angular-predictive-prefetching/server
e instale as dependências:cd ../server && yarn
Execute o exemplo
Inicie o servidor e o cliente:
Inicie o servidor: No diretório
server
, executeyarn start
.Inicie o cliente:
- Abra outra janela do terminal.
- Mude para
tfjs-examples/angular-predictive-prefetching/client
. Execute os seguintes comandos:
yarn build cd dist/merch-store npx serve -s .
Você pode ser solicitado a instalar o pacote de serviço . Nesse caso, digite y para instalar o pacote.
Navegue para
http://localhost:3000
no seu navegador. Você deverá ver uma simulação de loja de mercadorias do Google.
Explorar com DevTools
Use o Chrome DevTools para ver a pré-busca em ação:
- Abra DevTools e selecione Console .
Navegue até algumas páginas diferentes do aplicativo para prepará-lo. Em seguida, selecione Venda na navegação esquerda. Você deverá ver a saída do log assim:
Navigating from: 'sale' 'quickview' -> 0.381757915019989 'apparel-unisex' -> 0.3150934875011444 'store.html' -> 0.1957530975341797 '' -> 0.052346792072057724 'signin.html' -> 0.0007763378671370447
Esta saída mostra previsões para a página que você (o usuário) visitará em seguida. O aplicativo busca recursos com base nessas previsões.
Para ver as solicitações de busca, selecione Network . A saída é um pouco barulhenta, mas você poderá encontrar solicitações de recursos para as páginas previstas. Por exemplo, após prever
quickview
, o aplicativo faz uma solicitação parahttp://localhost:8000/api/merch/quickview
.
Como funciona a pré-busca preditiva
O aplicativo de exemplo usa um modelo pré-treinado para prever a próxima página que um usuário visitará. Quando o usuário navega para uma nova página, o aplicativo consulta o modelo e, em seguida, busca previamente as imagens associadas às páginas previstas.
O aplicativo faz a pré-busca preditiva em um service worker , para que possa consultar o modelo sem bloquear o thread principal. Com base no histórico de navegação do usuário, o service worker faz previsões para navegação futura e busca previamente imagens de produtos relevantes.
O service worker é carregado no arquivo principal do aplicativo Angular, main.ts :
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/prefetch.service-worker.js', { scope: '/' });
}
O snippet acima baixa o script prefetch.service-worker.js
e o executa em segundo plano.
Em merch-display.component.ts , o aplicativo encaminha eventos de navegação para o service worker:
this.route.params.subscribe((routeParams) => {
this.getMerch(routeParams.category);
if (this._serviceWorker) {
this._serviceWorker.postMessage({ page: routeParams.category });
}
});
No snippet acima, o aplicativo observa alterações nos parâmetros do URL. Na alteração, o script encaminha a categoria da página para o service worker.
O script do service worker, prefetch.service-worker.js , manipula mensagens do thread principal, faz previsões com base nelas e pré-busca os recursos relevantes.
O service worker usa loadGraphModel
para carregar o modelo pré-treinado :
const MODEL_URL = "/assets/model.json";
let model = null;
tf.loadGraphModel(MODEL_URL).then((m) => (model = m));
A previsão acontece na seguinte expressão de função :
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;
};
A função predict
é então invocada pela função de pré-busca :
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));
});
}
});
};
Primeiro, prefetch
prevê as páginas que o usuário poderá visitar em seguida. Em seguida, ele itera sobre as previsões. Para cada previsão, se a probabilidade exceder um determinado limite com base na velocidade da conexão, a função busca recursos para a página prevista. Ao buscar esses recursos antes da próxima solicitação de página, o aplicativo pode potencialmente veicular conteúdo com mais rapidez e fornecer uma melhor experiência ao usuário.
O que vem a seguir
Neste tutorial, o aplicativo de exemplo usa um modelo pré-treinado para fazer previsões. Você pode usar o TFX para treinar um modelo para pré-busca preditiva. Para saber mais, consulte Acelere seus sites com pré-busca de páginas da Web usando aprendizado de máquina .