تاريخ النشر: 1 أكتوبر 2025
قبل استخدام أي من واجهات برمجة التطبيقات المضمّنة في الذكاء الاصطناعي، يجب تنزيل النموذج الأساسي وأي تخصيصات (مثل عمليات الضبط الدقيق) من الشبكة، واستخراج البيانات المضغوطة، ثم تحميلها في الذاكرة. يوضّح هذا الدليل بعض أفضل الممارسات لتحسين تجربة المستخدمين أثناء انتظارهم اكتمال عملية التنزيل.
تتبُّع تقدّم عملية التنزيل ومشاركته
تحتوي كل واجهة برمجة تطبيقات مدمجة للذكاء الاصطناعي على الدالة create()
لبدء جلسة. تتضمّن الدالة
create()
خيار monitor
يتيح لك
الوصول إلى حالة التنزيل
لمشاركتها مع المستخدم.
في حين أنّ واجهات برمجة التطبيقات المضمّنة للذكاء الاصطناعي مصمّمة للذكاء الاصطناعي من جهة العميل، حيث تتم معالجة البيانات في المتصفّح وعلى جهاز المستخدم، يمكن أن تسمح بعض التطبيقات بمعالجة البيانات على خادم. تعتمد طريقة مخاطبة المستخدم في شريط تقدّم تنزيل النموذج على الإجابة عن السؤال التالي: هل يجب أن تتم معالجة البيانات محليًا فقط أم لا؟ إذا كان هذا صحيحًا، سيكون تطبيقك من جهة العميل فقط. إذا لم يكن الأمر كذلك، يمكن أن يستخدم تطبيقك عملية تنفيذ مختلطة.
من جهة العميل فقط
في بعض السيناريوهات، تكون معالجة البيانات من جهة العميل مطلوبة. على سبيل المثال، من المرجّح أنّ تطبيق الرعاية الصحية الذي يتيح للمرضى طرح أسئلة حول معلوماتهم الشخصية يريد أن تبقى هذه المعلومات خاصة بجهاز المستخدم. على المستخدم الانتظار إلى أن يتم تنزيل النموذج وجميع عمليات التخصيص وتصبح جاهزة قبل أن يتمكّن من استخدام أي ميزات لمعالجة البيانات.
في هذه الحالة، إذا لم يكن النموذج متاحًا بعد، عليك عرض معلومات حول تقدّم عملية التنزيل للمستخدم.
<style>
progress[hidden] ~ label {
display: none;
}
</style>
<button type="button">Create LanguageModel session</button>
<progress hidden id="progress" value="0"></progress>
<label for="progress">Model download progress</label>
لجعل هذا العنصر يعمل، يجب استخدام بعض JavaScript. يعيد الرمز أولاً واجهة عرض مستوى التقدّم إلى الحالة الأولية (إخفاء مستوى التقدّم وتعيينه على صفر)، ثم يتحقّق مما إذا كانت واجهة برمجة التطبيقات متوافقة على الإطلاق، ثم يتحقّق من توفّر واجهة برمجة التطبيقات:
- رمز الخطأ API هو
'unavailable'
: لا يمكن استخدام تطبيقك من جهة العميل على هذا الجهاز. تنبيه المستخدم بأنّ الميزة غير متاحة - حالة واجهة برمجة التطبيقات هي
'available'
: يمكن استخدام واجهة برمجة التطبيقات على الفور، ولا حاجة إلى عرض واجهة مستخدم لعرض مستوى التقدّم. - حالة واجهة برمجة التطبيقات هي
'downloadable'
أو'downloading'
: يمكن استخدام واجهة برمجة التطبيقات بعد اكتمال عملية التنزيل. اعرض مؤشرًا لمدى التقدّم وعدِّله كلما تم تشغيل الحدثdownloadprogress
. بعد اكتمال التنزيل، اعرض الحالة غير المحدّدة للإشارة إلى أنّ المتصفّح بصدد استخراج النموذج وتحميله في الذاكرة.
const createButton = document.querySelector('.create');
const promptButton = document.querySelector('.prompt');
const progress = document.querySelector('progress');
const output = document.querySelector('output');
let sessionCreationTriggered = false;
let session = null;
const createSession = async (options = {}) => {
if (sessionCreationTriggered) {
return;
}
progress.hidden = true;
progress.value = 0;
try {
if (!('LanguageModel' in self)) {
throw new Error('LanguageModel is not supported.');
}
const availability = await LanguageModel.availability();
if (availability === 'unavailable') {
throw new Error('LanguageModel is not available.');
}
let modelNewlyDownloaded = false;
if (availability !== 'available') {
modelNewlyDownloaded = true;
progress.hidden = false;
}
console.log(`LanguageModel is ${availability}.`);
sessionCreationTriggered = true;
const llmSession = await LanguageModel.create({
monitor(m) {
m.addEventListener('downloadprogress', (e) => {
progress.value = e.loaded;
if (modelNewlyDownloaded && e.loaded === 1) {
// The model was newly downloaded and needs to be extracted
// and loaded into memory, so show the undetermined state.
progress.removeAttribute('value');
}
});
},
...options,
});
sessionCreationTriggered = false;
return llmSession;
} catch (error) {
throw error;
} finally {
progress.hidden = true;
progress.value = 0;
}
};
createButton.addEventListener('click', async () => {
try {
localSession = await createSession({
expectedInputs: [{ type: 'text', languages: ['en'] }],
expectedOutputs: [{ type: 'text', languages: ['en'] }],
});
promptButton.disabled = false;
} catch (error) {
output.textContent = error.message;
}
});
promptButton.addEventListener('click', async () => {
output.innerHTML = '';
try {
const stream = localSession.promptStreaming('Write me a poem');
for await (const chunk of stream) {
output.append(chunk);
}
} catch (err) {
output.textContent = err.message;
}
});
إذا دخل المستخدم إلى التطبيق أثناء تنزيل النموذج بشكل نشط إلى المتصفّح، ستشير واجهة التقدّم إلى موضع المتصفّح في عملية التنزيل استنادًا إلى البيانات التي لا تزال مفقودة.
يمكنك الاطّلاع على العرض التوضيحي الذي يوضّح هذا المسار عمليًا. إذا لم تكن واجهة برمجة التطبيقات المضمّنة للذكاء الاصطناعي (في هذا المثال، Prompt API) متاحة، لن يمكن استخدام التطبيق. إذا كان لا يزال يجب تنزيل نموذج الذكاء الاصطناعي المضمّن، سيظهر للمستخدم مؤشر تقدّم. يمكنك الاطّلاع على الرمز المصدر على GitHub.
التنفيذ المختلط
إذا كنت تفضّل استخدام الذكاء الاصطناعي من جهة العميل، ولكن يمكنك إرسال البيانات مؤقتًا إلى السحابة الإلكترونية، يمكنك إعداد عملية تنفيذ مختلطة. وهذا يعني أنّه يمكن للمستخدمين تجربة الميزات على الفور، بينما يتم تنزيل النموذج المحلي في الوقت نفسه. بعد تنزيل النموذج، يمكنك التبديل ديناميكيًا إلى الجلسة المحلية.
يمكنك استخدام أي عملية تنفيذ من جهة الخادم للوضع المختلط، ولكن من الأفضل على الأرجح استخدام مجموعة النماذج نفسها في كل من السحابة الإلكترونية وعلى الجهاز لضمان الحصول على جودة نتائج قابلة للمقارنة. توضّح مقدمة عن Gemini API وتطبيقات الويب الطرق المختلفة لاستخدام Gemini API.
يعرض العرض التوضيحي هذا المسار أثناء التنفيذ. إذا لم تكن واجهة برمجة التطبيقات المدمجة المستندة إلى الذكاء الاصطناعي متاحة، سيتم استخدام واجهة Gemini API المستندة إلى السحابة الإلكترونية بدلاً من العرض التوضيحي. إذا كان لا يزال يجب تنزيل النموذج المضمّن، سيظهر للمستخدم مؤشر تقدّم، وسيستخدم التطبيق Gemini API في السحابة الإلكترونية إلى أن يتم تنزيل النموذج. يمكنك الاطّلاع على رمز المصدر الكامل على GitHub.
الخاتمة
ما هي فئة تطبيقك؟ هل تحتاج إلى معالجة البيانات بنسبة% 100 من جهة العميل، أم يمكنك استخدام أسلوب مختلط؟ بعد الإجابة عن هذا السؤال، الخطوة التالية هي تنفيذ استراتيجية تنزيل النماذج الأنسب لك.
احرص على إعلام المستخدمين دائمًا بموعد إمكانية استخدام تطبيقك من جهة العميل، وذلك من خلال عرض مستوى تقدّم تنزيل النموذج كما هو موضّح في هذا الدليل.
يُرجى العِلم أنّ هذه ليست مجرد عملية لمرة واحدة، فإذا أزال المتصفّح النموذج بسبب ضغط التخزين أو عند توفّر إصدار جديد من النموذج، سيحتاج المتصفّح إلى تنزيل النموذج مرة أخرى. سواء اخترت استخدام طريقة العرض من جهة العميل أو الطريقة المختلطة، يمكنك التأكّد من أنّك تقدّم أفضل تجربة ممكنة للمستخدمين، وأنّ المتصفّح سيتولّى الباقي.