Dalam tutorial ini, Anda akan menjalankan contoh aplikasi web yang menggunakan TensorFlow.js untuk melakukan prefetching prediktif pada resource. Dibuat dengan Angular , contoh ini terinspirasi oleh Google Merchandise Store tetapi tidak membagikan data atau detail penerapan apa pun ke dalamnya.
Contoh ini menggunakan model terlatih untuk membuat prediksi. Dalam skenario dunia nyata, Anda perlu melatih model menggunakan analitik dari situs web Anda. Anda dapat menggunakan TFX untuk melakukan pelatihan tersebut. Untuk mempelajari lebih lanjut tentang melatih model kustom untuk pengambilan prediktif, lihat postingan blog ini .
Kode contoh tersedia di GitHub .
Prasyarat
Untuk menyelesaikan tutorial ini, Anda perlu menginstal yang berikut ini di lingkungan pengembangan Anda:
Instal contohnya
Dapatkan kode sumber dan instal dependensi:
- Kloning atau unduh repositori
tfjs-examples
. Ubah ke direktori
angular-predictive-prefetching/client
dan instal dependensi:cd tfjs-examples/angular-predictive-prefetching/client && yarn
Ubah ke direktori
angular-predictive-prefetching/server
dan instal dependensi:cd ../server && yarn
Jalankan contohnya
Mulai server dan klien:
Mulai server: Di direktori
server
, jalankanyarn start
.Mulai klien:
- Buka jendela terminal lain.
- Ubah menjadi
tfjs-examples/angular-predictive-prefetching/client
. Jalankan perintah berikut:
yarn build cd dist/merch-store npx serve -s .
Anda mungkin diminta untuk menginstal paket serve . Jika ya, masukkan y untuk menginstal paket.
Navigasikan ke
http://localhost:3000
di browser Anda. Anda akan melihat tiruan toko barang dagangan Google.
Jelajahi dengan DevTools
Gunakan Chrome DevTools untuk melihat tindakan pengambilan awal:
- Buka DevTools dan pilih Konsol .
Navigasikan ke beberapa halaman berbeda dalam aplikasi, untuk melakukan prime aplikasi. Kemudian pilih Penjualan di navigasi kiri. Anda akan melihat keluaran log seperti ini:
Navigating from: 'sale' 'quickview' -> 0.381757915019989 'apparel-unisex' -> 0.3150934875011444 'store.html' -> 0.1957530975341797 '' -> 0.052346792072057724 'signin.html' -> 0.0007763378671370447
Output ini menunjukkan prediksi halaman yang akan Anda (pengguna) kunjungi selanjutnya. Aplikasi mengambil sumber daya berdasarkan prediksi ini.
Untuk melihat permintaan pengambilan, pilih Jaringan . Outputnya sedikit berisik, tetapi Anda seharusnya dapat menemukan permintaan sumber daya untuk halaman yang diprediksi. Misalnya, setelah memprediksi
quickview
, aplikasi membuat permintaan kehttp://localhost:8000/api/merch/quickview
.
Cara kerja pengambilan prediktif
Aplikasi contoh menggunakan model terlatih untuk memprediksi halaman yang akan dikunjungi pengguna berikutnya. Saat pengguna membuka halaman baru, aplikasi menanyakan model dan kemudian mengambil gambar yang terkait dengan halaman yang diprediksi.
Aplikasi melakukan pengambilan awal prediktif pada pekerja layanan , sehingga dapat melakukan kueri model tanpa memblokir thread utama. Berdasarkan riwayat navigasi pengguna, pekerja layanan membuat prediksi untuk navigasi di masa mendatang dan mengambil gambar produk yang relevan terlebih dahulu.
Pekerja layanan dimuat di file utama aplikasi Angular, main.ts :
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/prefetch.service-worker.js', { scope: '/' });
}
Cuplikan di atas mengunduh skrip prefetch.service-worker.js
dan menjalankannya di latar belakang.
Di merch-display.component.ts , aplikasi meneruskan peristiwa navigasi ke pekerja layanan:
this.route.params.subscribe((routeParams) => {
this.getMerch(routeParams.category);
if (this._serviceWorker) {
this._serviceWorker.postMessage({ page: routeParams.category });
}
});
Dalam cuplikan di atas, aplikasi mengamati perubahan pada parameter URL. Saat diubah, skrip meneruskan kategori halaman ke pekerja layanan.
Skrip pekerja layanan, prefetch.service-worker.js , menangani pesan dari thread utama, membuat prediksi berdasarkan pesan tersebut, dan mengambil sumber daya yang relevan terlebih dahulu.
Pekerja layanan menggunakan loadGraphModel
untuk memuat model terlatih :
const MODEL_URL = "/assets/model.json";
let model = null;
tf.loadGraphModel(MODEL_URL).then((m) => (model = m));
Prediksi terjadi dalam ekspresi fungsi berikut:
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;
};
Fungsi predict
kemudian dipanggil oleh fungsi prefetch :
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));
});
}
});
};
Pertama, prefetch
memprediksi halaman yang mungkin dikunjungi pengguna berikutnya. Kemudian ia mengulangi prediksinya. Untuk setiap prediksi, jika probabilitas melebihi ambang batas tertentu berdasarkan kecepatan koneksi, fungsi akan mengambil sumber daya untuk halaman prediksi. Dengan mengambil sumber daya ini sebelum permintaan halaman berikutnya, aplikasi berpotensi menyajikan konten lebih cepat dan memberikan pengalaman pengguna yang lebih baik.
Apa selanjutnya
Dalam tutorial ini, aplikasi contoh menggunakan model terlatih untuk membuat prediksi. Anda dapat menggunakan TFX untuk melatih model untuk pengambilan awal prediktif. Untuk mempelajari lebih lanjut, lihat Mempercepat situs Anda dengan pengambilan halaman web terlebih dahulu menggunakan Machine Learning .