إبلاغ المستخدمين بشأن تنزيل النماذج

تاريخ النشر: 1 أكتوبر 2025

قبل استخدام أي من واجهات برمجة التطبيقات المضمّنة في الذكاء الاصطناعي، يجب تنزيل النموذج الأساسي وأي تخصيصات (مثل عمليات الضبط الدقيق)، واستخراج البيانات المضغوطة، وتحميل كل ذلك في الذاكرة. من أفضل الممارسات تنبيه المستخدم إلى الوقت المطلوب لإجراء عمليات التنزيل هذه.

تستخدِم الأمثلة التالية Prompt API، ولكن يمكن تطبيق المفاهيم على جميع واجهات برمجة تطبيقات الذكاء الاصطناعي المدمجة الأخرى.

تتبُّع مستوى تقدُّم التنزيل ومشاركته

تستخدم كل واجهة برمجة تطبيقات مُدمَجة ومستنِدة إلى الذكاء الاصطناعي الدالة 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. يعيد الرمز أولاً ضبط واجهة التقدم إلى الحالة الأولية (إخفاء التقدم وتعيينه على صفر)، ويتحقق مما إذا كانت واجهة برمجة التطبيقات متوافقة على الإطلاق، ثم يتحقق من توفّر واجهة برمجة التطبيقات:

  • واجهة برمجة التطبيقات هي '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 localSession = 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({
      // ⚠️ Always pass the same options to the `availability()` function that
      // you use in `prompt()` or `promptStreaming()`. This is critical to
      // align model language and modality capabilities.
      expectedInputs: [{ type: 'text', languages: ['en'] }],
      expectedOutputs: [{ type: 'text', languages: ['en'] }],
    });
    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 من جهة العميل، أم يمكنك استخدام أسلوب مختلط؟ بعد الإجابة عن هذا السؤال، الخطوة التالية هي تنفيذ استراتيجية تنزيل النماذج الأنسب لك.

احرص على إعلام المستخدمين دائمًا بموعد إمكانية استخدام تطبيقك من جهة العميل، وذلك من خلال عرض مستوى تقدّم تنزيل النموذج كما هو موضّح في هذا الدليل.

يُرجى العِلم أنّ هذه ليست مشكلة تحدث مرة واحدة فقط، فإذا أزال المتصفّح النموذج بسبب ضغط التخزين أو عند توفّر إصدار جديد من النموذج، سيحتاج المتصفّح إلى تنزيل النموذج مرة أخرى. سواء اخترت استخدام طريقة العرض من جهة العميل أو الطريقة المختلطة، يمكنك التأكّد من أنّك تقدّم أفضل تجربة ممكنة للمستخدمين، ودع المتصفّح يتولّى الباقي.