মডেল ডাউনলোড ব্যবহারকারীদের অবহিত

প্রকাশিত: ১ অক্টোবর, ২০২৫

যেকোনো বিল্ট-ইন এআই এপিআই ব্যবহার করার আগে, অন্তর্নিহিত মডেল এবং যেকোনো কাস্টমাইজেশন (যেমন ফাইন-টিউনিং) ডাউনলোড করতে হবে, সংকুচিত ডেটা বের করতে হবে এবং এই সমস্ত কিছু মেমোরিতে লোড করতে হবে। এই ডাউনলোডগুলি সম্পাদন করতে প্রয়োজনীয় সময় সম্পর্কে ব্যবহারকারীকে সতর্ক করা সর্বোত্তম অনুশীলন।

নিম্নলিখিত উদাহরণগুলিতে প্রম্পট এপিআই ব্যবহার করা হয়েছে, তবে ধারণাগুলি অন্যান্য সমস্ত বিল্ট-ইন এআই এপিআইতে প্রয়োগ করা যেতে পারে।

ডাউনলোডের অগ্রগতি পর্যবেক্ষণ করুন এবং শেয়ার করুন

প্রতিটি বিল্ট-ইন AI API একটি সেশন শুরু করার জন্য create() ফাংশন ব্যবহার করে। create() ফাংশনটিতে একটি monitor বিকল্প রয়েছে যাতে আপনি ডাউনলোডের অগ্রগতি অ্যাক্সেস করতে পারেন এবং ব্যবহারকারীর সাথে এটি শেয়ার করতে পারেন।

যদিও বিল্ট-ইন AI API গুলি ক্লায়েন্ট-সাইড AI এর জন্য তৈরি করা হয়, যেখানে ব্রাউজারে এবং ব্যবহারকারীর ডিভাইসে ডেটা প্রক্রিয়া করা হয়, কিছু অ্যাপ্লিকেশন সার্ভারে ডেটা প্রক্রিয়া করার অনুমতি দিতে পারে। মডেল ডাউনলোডের অগ্রগতিতে আপনি আপনার ব্যবহারকারীকে কীভাবে সম্বোধন করবেন তা এই প্রশ্নের উপর নির্ভর করে: ডেটা প্রক্রিয়াকরণ কি কেবল স্থানীয়ভাবে চালানো উচিত নাকি নয়? যদি এটি সত্য হয়, তাহলে আপনার অ্যাপ্লিকেশনটি কেবল ক্লায়েন্ট-সাইড। যদি না হয়, তাহলে আপনার অ্যাপ্লিকেশনটি একটি হাইব্রিড বাস্তবায়ন ব্যবহার করতে পারে।

শুধুমাত্র ক্লায়েন্ট-সাইড

কিছু পরিস্থিতিতে, ক্লায়েন্ট-সাইড ডেটা প্রক্রিয়াকরণ প্রয়োজন। উদাহরণস্বরূপ, একটি স্বাস্থ্যসেবা অ্যাপ্লিকেশন যা রোগীদের তাদের ব্যক্তিগত তথ্য সম্পর্কে প্রশ্ন জিজ্ঞাসা করার অনুমতি দেয়, সম্ভবত সেই তথ্যটি ব্যবহারকারীর ডিভাইসে গোপন রাখতে চায়। ব্যবহারকারীকে মডেল এবং সমস্ত কাস্টমাইজেশন ডাউনলোড এবং প্রস্তুত না হওয়া পর্যন্ত অপেক্ষা করতে হবে যাতে তারা কোনও ডেটা প্রক্রিয়াকরণ বৈশিষ্ট্য ব্যবহার করতে পারে।

এই ক্ষেত্রে, যদি মডেলটি ইতিমধ্যে উপলব্ধ না থাকে, তাহলে আপনার ডাউনলোড অগ্রগতির তথ্য ব্যবহারকারীর কাছে প্রকাশ করা উচিত।

<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>

বিল্ট-ইন মডেলটি ডাউনলোড হওয়ার সময়, অ্যাপটি এখনও ব্যবহার করা যাচ্ছে না।

এখন এটি কার্যকর করার জন্য, কিছুটা জাভাস্ক্রিপ্ট প্রয়োজন। কোডটি প্রথমে প্রোগ্রেস ইন্টারফেসটিকে প্রাথমিক অবস্থায় (প্রগতি লুকানো এবং শূন্য) রিসেট করে, API আদৌ সমর্থিত কিনা তা পরীক্ষা করে এবং তারপর API এর উপলব্ধতা পরীক্ষা করে :

  • API 'unavailable' : আপনার অ্যাপ্লিকেশনটি এই ডিভাইসে ক্লায়েন্ট-সাইড ব্যবহার করা যাবে না। ব্যবহারকারীকে সতর্ক করুন যে বৈশিষ্ট্যটি অনুপলব্ধ।
  • API 'available' : APIটি তাৎক্ষণিকভাবে ব্যবহার করা যেতে পারে, অগ্রগতি UI দেখানোর প্রয়োজন নেই।
  • API 'downloadable' অথবা 'downloading' : ডাউনলোড সম্পূর্ণ হওয়ার পরে API ব্যবহার করা যেতে পারে। একটি অগ্রগতি নির্দেশক দেখান এবং 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;
  }
});

মডেলটি ব্রাউজারে সক্রিয়ভাবে ডাউনলোড করার সময় ব্যবহারকারী যদি অ্যাপটিতে প্রবেশ করে, তাহলে এখনও অনুপস্থিত ডেটার উপর ভিত্তি করে অগ্রগতি ইন্টারফেসটি ডাউনলোড প্রক্রিয়ায় ব্রাউজারটি কোথায় আছে তা নির্দেশ করে।

ক্লায়েন্ট-সাইড ডেমো

এই ফ্লোটি কীভাবে কাজ করছে তা দেখানো ডেমোটি একবার দেখুন। যদি বিল্ট-ইন AI API (এই উদাহরণে, প্রম্পট API) উপলব্ধ না থাকে, তাহলে অ্যাপটি ব্যবহার করা যাবে না। যদি বিল্ট-ইন AI মডেলটি এখনও ডাউনলোড করার প্রয়োজন হয়, তাহলে ব্যবহারকারীকে একটি অগ্রগতি নির্দেশক দেখানো হবে। আপনি GitHub-এ সোর্স কোডটি দেখতে পারেন।

হাইব্রিড বাস্তবায়ন

আপনি যদি ক্লায়েন্ট-সাইড এআই ব্যবহার করতে পছন্দ করেন, কিন্তু অস্থায়ীভাবে ক্লাউডে ডেটা পাঠাতে পারেন, তাহলে আপনি একটি হাইব্রিড বাস্তবায়ন সেট আপ করতে পারেন। এর অর্থ হল ব্যবহারকারীরা স্থানীয় মডেল ডাউনলোড করার সময় তাৎক্ষণিকভাবে বৈশিষ্ট্যগুলি উপভোগ করতে পারবেন। মডেলটি ডাউনলোড হয়ে গেলে, গতিশীলভাবে স্থানীয় সেশনে স্যুইচ করুন।

হাইব্রিডের জন্য আপনি যেকোনো সার্ভার-সাইড বাস্তবায়ন ব্যবহার করতে পারেন, তবে তুলনামূলক ফলাফলের মান নিশ্চিত করার জন্য ক্লাউড এবং স্থানীয়ভাবে একই মডেল পরিবারের সাথে লেগে থাকা সম্ভবত সবচেয়ে ভালো। জেমিনি এপিআই এবং ওয়েব অ্যাপ দিয়ে শুরু করা জেমিনি এপিআইয়ের বিভিন্ন পদ্ধতি তুলে ধরে।

বিল্ট-ইন মডেলটি ডাউনলোড হওয়ার সময়, অ্যাপটি আবার ক্লাউড মডেলে ফিরে আসে এবং ইতিমধ্যেই ব্যবহারযোগ্য হয়ে যায়।

হাইব্রিড ডেমো

ডেমোটি এই প্রবাহটিকে কার্যকরভাবে দেখায়। যদি বিল্ট-ইন AI API উপলব্ধ না থাকে, তাহলে ডেমোটি ক্লাউডে Gemini API-তে ফিরে আসে। যদি বিল্ট-ইন মডেলটি এখনও ডাউনলোড করার প্রয়োজন হয়, তাহলে ব্যবহারকারীকে একটি অগ্রগতি নির্দেশক দেখানো হয় এবং মডেলটি ডাউনলোড না হওয়া পর্যন্ত অ্যাপটি ক্লাউডে Gemini API ব্যবহার করে। GitHub-এ সম্পূর্ণ সোর্স কোডটি একবার দেখুন।

উপসংহার

আপনার অ্যাপটি কোন শ্রেণীতে পড়ে? আপনার কি ১০০% ক্লায়েন্ট-সাইড প্রক্রিয়াকরণ প্রয়োজন নাকি আপনি একটি হাইব্রিড পদ্ধতি ব্যবহার করতে পারেন? এই প্রশ্নের উত্তর দেওয়ার পরে, পরবর্তী পদক্ষেপ হল আপনার জন্য সবচেয়ে ভালো কাজ করে এমন মডেল ডাউনলোড কৌশল বাস্তবায়ন করা।

এই নির্দেশিকায় বর্ণিত মডেল ডাউনলোডের অগ্রগতি দেখিয়ে নিশ্চিত করুন যে আপনার ব্যবহারকারীরা কখন এবং কখন আপনার অ্যাপ ক্লায়েন্ট-সাইড ব্যবহার করতে পারবেন।

মনে রাখবেন এটি কেবল একবারের চ্যালেঞ্জ নয়: যদি ব্রাউজার স্টোরেজ চাপের কারণে মডেলটি মুছে ফেলে অথবা যখন একটি নতুন মডেল সংস্করণ উপলব্ধ হয়, তখন ব্রাউজারকে আবার মডেলটি ডাউনলোড করতে হবে। আপনি ক্লায়েন্ট-সাইড বা হাইব্রিড পদ্ধতি অনুসরণ করুন না কেন, আপনি নিশ্চিত থাকতে পারেন যে আপনি আপনার ব্যবহারকারীদের জন্য সর্বোত্তম সম্ভাব্য অভিজ্ঞতা তৈরি করছেন এবং বাকিটা ব্রাউজারকেই পরিচালনা করতে দিন।