في هذا البرنامج التعليمي، ستقوم بتشغيل مثال لتطبيق ويب يستخدم TensorFlow.js لإجراء الجلب المسبق التنبؤي للموارد. تم إنشاء هذا المثال باستخدام Angular ، وهو مستوحى من متجر Google Merchandise Store ولكنه لا يشارك أي بيانات أو تفاصيل تنفيذ معه.
يستخدم المثال نموذجًا تم تدريبه مسبقًا لإجراء التنبؤات. في سيناريو العالم الحقيقي، ستحتاج إلى تدريب نموذج باستخدام التحليلات من موقع الويب الخاص بك. يمكنك استخدام TFX للقيام بهذا التدريب. لمعرفة المزيد حول تدريب نموذج مخصص للجلب المسبق التنبؤي، راجع منشور المدونة هذا .
رمز المثال متاح على GitHub .
المتطلبات الأساسية
لإكمال هذا البرنامج التعليمي، تحتاج إلى تثبيت ما يلي في بيئة التطوير الخاصة بك:
قم بتثبيت المثال
احصل على الكود المصدري وقم بتثبيت التبعيات:
- قم باستنساخ أو تنزيل مستودع
tfjs-examples
. قم بالتغيير إلى دليل
angular-predictive-prefetching/client
وتثبيت التبعيات:cd tfjs-examples/angular-predictive-prefetching/client && yarn
قم بالتغيير إلى دليل
angular-predictive-prefetching/server
وتثبيت التبعيات:cd ../server && yarn
قم بتشغيل المثال
ابدأ كلاً من الخادم والعميل:
بدء تشغيل الخادم: في دليل
server
، قم بتشغيلyarn start
.ابدأ العميل:
- افتح نافذة طرفية أخرى.
- قم بالتغيير إلى
tfjs-examples/angular-predictive-prefetching/client
. قم بتشغيل الأوامر التالية:
yarn build cd dist/merch-store npx serve -s .
قد تتم مطالبتك بتثبيت حزمة الخدمة . إذا كان الأمر كذلك، أدخل y لتثبيت الحزمة.
انتقل إلى
http://localhost:3000
في متصفحك. يجب أن تشاهد متجرًا وهميًا لبضائع Google.
استكشف باستخدام DevTools
استخدم Chrome DevTools لرؤية الجلب المسبق أثناء العمل:
- افتح DevTools وحدد Console .
انتقل إلى بضع صفحات مختلفة في التطبيق، لتجهيز التطبيق. ثم حدد بيع في شريط التنقل الأيمن. يجب أن تشاهد إخراج السجل مثل هذا:
Navigating from: 'sale' 'quickview' -> 0.381757915019989 'apparel-unisex' -> 0.3150934875011444 'store.html' -> 0.1957530975341797 '' -> 0.052346792072057724 'signin.html' -> 0.0007763378671370447
يعرض هذا الإخراج توقعات للصفحة التي ستزورها أنت (المستخدم) بعد ذلك. يقوم التطبيق بجلب الموارد بناءً على هذه التوقعات.
لرؤية طلبات الجلب، حدد الشبكة . الإخراج صاخب بعض الشيء، ولكن من المفترض أن تكون قادرًا على العثور على طلبات للحصول على موارد للصفحات المتوقعة. على سبيل المثال، بعد توقع
quickview
، يقدم التطبيق طلبًا إلىhttp://localhost:8000/api/merch/quickview
.
كيف يعمل الجلب المسبق التنبؤي
يستخدم تطبيق المثال نموذجًا تم تدريبه مسبقًا للتنبؤ بالصفحة التي سيزورها المستخدم بعد ذلك. عندما ينتقل المستخدم إلى صفحة جديدة، يستعلم التطبيق عن النموذج ثم يقوم بالجلب المسبق للصور المرتبطة بالصفحات المتوقعة.
يقوم التطبيق بالجلب المسبق التنبؤي لعامل الخدمة ، حتى يتمكن من الاستعلام عن النموذج دون حظر الخيط الرئيسي. استنادًا إلى سجل التنقل الخاص بالمستخدم، يقوم عامل الخدمة بعمل تنبؤات للتنقل المستقبلي ويقوم بالجلب المسبق لصور المنتج ذات الصلة.
يتم تحميل عامل الخدمة في الملف الرئيسي لتطبيق Angular، main.ts :
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/prefetch.service-worker.js', { scope: '/' });
}
يقوم المقتطف أعلاه بتنزيل البرنامج النصي prefetch.service-worker.js
وتشغيله في الخلفية.
في merch-display.component.ts ، يعيد التطبيق توجيه أحداث التنقل إلى عامل الخدمة:
this.route.params.subscribe((routeParams) => {
this.getMerch(routeParams.category);
if (this._serviceWorker) {
this._serviceWorker.postMessage({ page: routeParams.category });
}
});
في المقتطف أعلاه، يراقب التطبيق التغييرات التي تطرأ على معلمات عنوان URL. عند التغيير، يقوم البرنامج النصي بإعادة توجيه فئة الصفحة إلى عامل الخدمة.
يتعامل البرنامج النصي لعامل الخدمة، prefetch.service-worker.js ، مع الرسائل الواردة من سلسلة الرسائل الرئيسية، ويقوم بعمل تنبؤات بناءً عليها، ويقوم بالجلب المسبق للموارد ذات الصلة.
يستخدم عامل الخدمة loadGraphModel
لتحميل النموذج المُدرب مسبقًا :
const MODEL_URL = "/assets/model.json";
let model = null;
tf.loadGraphModel(MODEL_URL).then((m) => (model = m));
يحدث التنبؤ في تعبير الوظيفة التالي:
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;
};
يتم بعد ذلك استدعاء وظيفة 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));
});
}
});
};
أولاً، يتنبأ prefetch
بالصفحات التي قد يزورها المستخدم بعد ذلك. ثم يتكرر على التوقعات. بالنسبة لكل تنبؤ، إذا تجاوز الاحتمال عتبة معينة بناءً على سرعة الاتصال، تقوم الوظيفة بجلب الموارد للصفحة المتوقعة. ومن خلال جلب هذه الموارد قبل طلب الصفحة التالية، يمكن للتطبيق أن يخدم المحتوى بشكل أسرع ويوفر تجربة أفضل للمستخدم.
ما هو التالي
في هذا البرنامج التعليمي، يستخدم التطبيق النموذجي نموذجًا تم تدريبه مسبقًا لإجراء التنبؤات. يمكنك استخدام TFX لتدريب نموذج للجلب المسبق التنبؤي. لمعرفة المزيد، راجع تسريع مواقعك باستخدام الجلب المسبق لصفحة الويب باستخدام التعلم الآلي .