পার্ট 2: ক্লায়েন্ট-সাইড এআই বিষাক্ততা সনাক্তকরণ তৈরি করুন

মড নলপাস
Maud Nalpas

প্রকাশিত: নভেম্বর 13, 2024

ঘৃণামূলক বক্তব্য, হয়রানি, এবং অনলাইন অপব্যবহার অনলাইনে একটি ব্যাপক সমস্যা হয়ে উঠেছে। বিষাক্ত মন্তব্য গুরুত্বপূর্ণ কণ্ঠস্বরকে নীরব করে এবং ব্যবহারকারী ও গ্রাহকদের দূরে সরিয়ে দেয় । বিষাক্ততা সনাক্তকরণ আপনার ব্যবহারকারীদের রক্ষা করে এবং একটি নিরাপদ অনলাইন পরিবেশ তৈরি করে।

এই দুই পর্বের সিরিজে, আমরা কীভাবে AI ব্যবহার করতে হয় তার উৎসে বিষাক্ততা সনাক্ত করতে এবং প্রশমিত করতে পারি: ব্যবহারকারীদের কীবোর্ড।

প্রথম অংশে , আমরা এই পদ্ধতির ব্যবহারের ক্ষেত্রে এবং সুবিধাগুলি নিয়ে আলোচনা করেছি।

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

ডেমো এবং কোড

আমাদের ডেমো নিয়ে খেলুন এবং GitHub-এ কোডটি তদন্ত করুন।

মন্তব্য পোস্টিং ডেমো.
ব্যবহারকারী টাইপ করা বন্ধ করলে, আমরা তাদের মন্তব্যের বিষাক্ততা বিশ্লেষণ করি। মন্তব্যটিকে বিষাক্ত হিসাবে শ্রেণীবদ্ধ করা হলে আমরা রিয়েল-টাইমে একটি সতর্কতা প্রদর্শন করি।

ব্রাউজার সমর্থন

আমাদের ডেমো সাফারি, ক্রোম, এজ এবং ফায়ারফক্সের সর্বশেষ সংস্করণে চলে।

একটি মডেল এবং লাইব্রেরি নির্বাচন করুন

আমরা Hugging Face এর Transformers.js লাইব্রেরি ব্যবহার করি, যা ব্রাউজারে মেশিন লার্নিং মডেলের সাথে কাজ করার জন্য টুল সরবরাহ করে। আমাদের ডেমো কোড এই পাঠ্য শ্রেণিবিন্যাসের উদাহরণ থেকে উদ্ভূত হয়েছে।

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

টক্সিক-বার্টের ডাউনলোড সাইজ হল 111MB।

একবার মডেলটি ডাউনলোড হয়ে গেলে, অনুমান দ্রুত হয়।

উদাহরণস্বরূপ, এটি সাধারণত 500 মিলিসেকেন্ডের কম সময় নেয় Chrome-এ চলমান একটি মধ্য-রেঞ্জ অ্যান্ড্রয়েড ডিভাইসে যা আমরা পরীক্ষা করেছি (একটি নিয়মিত Pixel 7 ফোন, বেশি পারফরম্যান্স প্রো মডেল নয়)। আপনার নিজস্ব বেঞ্চমার্কগুলি চালান যা আপনার ব্যবহারকারী বেসের প্রতিনিধি।

বাস্তবায়ন

এখানে আমাদের বাস্তবায়নের মূল পদক্ষেপগুলি রয়েছে:

একটি বিষাক্ততা থ্রেশহোল্ড সেট করুন

আমাদের বিষাক্ততার শ্রেণিবিন্যাসকারী 0 এবং 1 মধ্যে বিষাক্ততার স্কোর প্রদান করে। সেই পরিসরের মধ্যে, বিষাক্ত মন্তব্য কী গঠন করে তা নির্ধারণ করতে আমাদের একটি থ্রেশহোল্ড সেট করতে হবে। একটি সাধারণভাবে ব্যবহৃত থ্রেশহোল্ড হল 0.9 । এটি আপনাকে অত্যধিক সংবেদনশীলতা এড়ানোর সময় স্পষ্টভাবে বিষাক্ত মন্তব্যগুলি ধরতে দেয় যা অনেকগুলি মিথ্যা ইতিবাচক (অন্য কথায়, বিষাক্ত হিসাবে শ্রেণীবদ্ধ ক্ষতিহীন মন্তব্য) হতে পারে।

export const TOXICITY_THRESHOLD = 0.9

উপাদান আমদানি করুন

আমরা @xenova/transformers লাইব্রেরি থেকে প্রয়োজনীয় উপাদান আমদানি করে শুরু করি। আমরা আমাদের বিষাক্ততা থ্রেশহোল্ড সহ ধ্রুবক এবং কনফিগারেশন মানও আমদানি করি।

import { env, pipeline } from '@xenova/transformers';
// Model name: 'Xenova/toxic-bert'
// Our threshold is set to 0.9
import { TOXICITY_THRESHOLD, MODEL_NAME } from './config.js';

মডেলটি লোড করুন এবং প্রধান থ্রেডের সাথে যোগাযোগ করুন

আমরা টক্সিসিটি ডিটেকশন মডেল টক্সিক-বার্ট লোড করি এবং আমাদের ক্লাসিফায়ার প্রস্তুত করতে এটি ব্যবহার করি। এর সর্বনিম্ন জটিল সংস্করণ হল const classifier = await pipeline('text-classification', MODEL_NAME);

একটি পাইপলাইন তৈরি করা, যেমন উদাহরণ কোডে, অনুমান কাজগুলি চালানোর প্রথম ধাপ।

পাইপলাইন ফাংশন দুটি আর্গুমেন্ট নেয়: টাস্ক ( 'text-classification' ) এবং মডেল ( Xenova/toxic-bert )।

মূল শব্দ: Transformers.js-এ, একটি পাইপলাইন হল একটি উচ্চ-স্তরের API যা ML মডেলগুলি চালানোর প্রক্রিয়াকে সহজ করে। এটি মডেল লোডিং, টোকেনাইজেশন এবং পোস্ট-প্রসেসিংয়ের মতো কাজগুলি পরিচালনা করে।

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

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

let classifier = null;
(async function () {
  // Signal to the main thread that model preparation has started
  self.postMessage({ code: MESSAGE_CODE.PREPARING_MODEL, payload: null });
  try {
    // Prepare the model
    classifier = await pipeline('text-classification', MODEL_NAME);
    // Signal to the main thread that the model is ready
    self.postMessage({ code: MESSAGE_CODE.MODEL_READY, payload: null });
  } catch (error) {
    console.error('[Worker] Error preparing model:', error);
    self.postMessage({ code: MESSAGE_CODE.MODEL_ERROR, payload: null });
  }
})();

ব্যবহারকারীর ইনপুট শ্রেণীবদ্ধ করুন

আমাদের classify ফাংশনে, আমরা একটি ব্যবহারকারীর মন্তব্য বিশ্লেষণ করতে আমাদের পূর্বে তৈরি ক্লাসিফায়ার ব্যবহার করি। আমরা বিষাক্ত শ্রেণীবদ্ধকারীর কাঁচা আউটপুট ফেরত দিই: লেবেল এবং স্কোর।

// Asynchronous function to classify user input
// output: [{ label: 'toxic', score: 0.9243140482902527 },
// ... { label: 'insult', score: 0.96187334060668945 }
// { label: 'obscene', score: 0.03452680632472038 }, ...etc]
async function classify(text) {
  if (!classifier) {
    throw new Error("Can't run inference, the model is not ready yet");
  }
  let results = await classifier(text, { topk: null });
  return results;
}

যখন প্রধান থ্রেড কর্মীকে তা করতে বলে তখন আমরা আমাদের শ্রেণীবদ্ধ ফাংশনকে কল করি। আমাদের ডেমোতে, ব্যবহারকারী টাইপ করা বন্ধ করার সাথে সাথে আমরা ক্লাসিফায়ারটিকে ট্রিগার করি ( TYPING_DELAY দেখুন)। যখন এটি ঘটে, আমাদের প্রধান থ্রেড কর্মীকে একটি বার্তা পাঠায় যাতে শ্রেণীবদ্ধ করার জন্য ব্যবহারকারীর ইনপুট থাকে।

self.onmessage = async function (message) {
  // User input
  const textToClassify = message.data;
  if (!classifier) {
    throw new Error("Can't run inference, the model is not ready yet");
  }
  self.postMessage({ code: MESSAGE_CODE.GENERATING_RESPONSE, payload: null });

  // Inference: run the classifier
  let classificationResults = null;
  try {
    classificationResults = await classify(textToClassify);
  } catch (error) {
    console.error('[Worker] Error: ', error);
    self.postMessage({
      code: MESSAGE_CODE.INFERENCE_ERROR,
    });
    return;
  }
  const toxicityTypes = getToxicityTypes(classificationResults);
  const toxicityAssessement = {
    isToxic: toxicityTypes.length > 0,
    toxicityTypeList: toxicityTypes.length > 0 ? toxicityTypes.join(', ') : '',
  };
  console.info('[Worker] Toxicity assessed: ', toxicityAssessement);
  self.postMessage({
    code: MESSAGE_CODE.RESPONSE_READY,
    payload: toxicityAssessement,
  });
};

আউটপুট প্রক্রিয়া করুন

আমরা পরীক্ষা করি যে ক্লাসিফায়ারের আউটপুট স্কোর আমাদের থ্রেশহোল্ড অতিক্রম করে কিনা। যদি তাই হয়, আমরা প্রশ্নযুক্ত লেবেলটি নোট করি।

যদি কোনো বিষাক্ততার লেবেল তালিকাভুক্ত করা হয়, তাহলে মন্তব্যটিকে সম্ভাব্য বিষাক্ত হিসেবে চিহ্নিত করা হয়।

// input: [{ label: 'toxic', score: 0.9243140482902527 }, ...
// { label: 'insult', score: 0.96187334060668945 },
// { label: 'obscene', score: 0.03452680632472038 }, ...etc]
// output: ['toxic', 'insult']
function getToxicityTypes(results) {
  const toxicityAssessment = [];
  for (let element of results) {
    // If a label's score > our threshold, save the label
    if (element.score > TOXICITY_THRESHOLD) {
      toxicityAssessment.push(element.label);
    }
  }
  return toxicityAssessment;
}

self.onmessage = async function (message) {
  // User input
  const textToClassify = message.data;
  if (!classifier) {
    throw new Error("Can't run inference, the model is not ready yet");
  }
  self.postMessage({ code: MESSAGE_CODE.GENERATING_RESPONSE, payload: null });

  // Inference: run the classifier
  let classificationResults = null;
  try {
    classificationResults = await classify(textToClassify);
  } catch (error) {
    self.postMessage({
      code: MESSAGE_CODE.INFERENCE_ERROR,
    });
    return;
  }
  const toxicityTypes = getToxicityTypes(classificationResults);
  const toxicityAssessement = {
    // If any toxicity label is listed, the comment is flagged as
    // potentially toxic (isToxic true)
    isToxic: toxicityTypes.length > 0,
    toxicityTypeList: toxicityTypes.length > 0 ? toxicityTypes.join(', ') : '',
  };
  self.postMessage({
    code: MESSAGE_CODE.RESPONSE_READY,
    payload: toxicityAssessement,
  });
};

একটি ইঙ্গিত প্রদর্শন করুন

যদি isToxic সত্য হয়, আমরা ব্যবহারকারীকে একটি ইঙ্গিত প্রদর্শন করি৷ আমাদের ডেমোতে, আমরা আরও সূক্ষ্ম-দানাযুক্ত বিষাক্ততার ধরন ব্যবহার করি না, তবে প্রয়োজনে আমরা এটিকে প্রধান থ্রেডে উপলব্ধ করেছি ( toxicityTypeList )। আপনি আপনার ব্যবহারের ক্ষেত্রে এটি দরকারী খুঁজে পেতে পারেন.

ব্যবহারকারীর অভিজ্ঞতা

আমাদের ডেমোতে, আমরা নিম্নলিখিত পছন্দগুলি করেছি:

  • সর্বদা পোস্ট করার অনুমতি দিন। আমাদের ক্লায়েন্ট-সাইড বিষাক্ততার ইঙ্গিত ব্যবহারকারীকে পোস্ট করা থেকে বাধা দেয় না। আমাদের ডেমোতে, ব্যবহারকারী একটি মন্তব্য পোস্ট করতে পারেন এমনকি যদি মডেলটি লোড না হয় (এবং এইভাবে একটি বিষাক্ততার মূল্যায়ন অফার করে না), এবং মন্তব্যটি বিষাক্ত হিসাবে সনাক্ত করা হলেও। প্রস্তাবিত হিসাবে , আপনার বিষাক্ত মন্তব্য সনাক্ত করার জন্য একটি দ্বিতীয় সিস্টেম থাকা উচিত। যদি এটি আপনার আবেদনের জন্য বোধগম্য হয়, তাহলে ব্যবহারকারীকে জানানোর কথা বিবেচনা করুন যে তাদের মন্তব্যটি ক্লায়েন্টে গেছে, কিন্তু তারপর সার্ভারে বা মানব পরিদর্শনের সময় পতাকাঙ্কিত হয়েছে।
  • মন মিথ্যা নেতিবাচক . যখন একটি মন্তব্য বিষাক্ত হিসাবে শ্রেণীবদ্ধ করা হয় না, তখন আমাদের ডেমো প্রতিক্রিয়া প্রদান করে না (উদাহরণস্বরূপ, "ভালো মন্তব্য!")। শোরগোল করা ছাড়াও, ইতিবাচক প্রতিক্রিয়া প্রদান করা ভুল সংকেত পাঠাতে পারে, কারণ আমাদের শ্রেণীবদ্ধকারী মাঝে মাঝে কিন্তু অনিবার্যভাবে কিছু বিষাক্ত মন্তব্য মিস করে।
মন্তব্য পোস্টিং ডেমো.
পোস্ট বোতামটি সর্বদা সক্রিয় থাকে: আমাদের ডেমোতে, ব্যবহারকারী এখনও তাদের মন্তব্য পোস্ট করার সিদ্ধান্ত নিতে পারেন, এমনকি যদি এটি বিষাক্ত হিসাবে শ্রেণীবদ্ধ করা হয় এমনকি যদি একটি মন্তব্যকে বিষাক্ত হিসাবে শ্রেণীবদ্ধ না করা হয়, আমরা ইতিবাচক প্রতিক্রিয়া প্রদর্শন করি না।

পরিবর্ধন এবং বিকল্প

সীমাবদ্ধতা এবং ভবিষ্যতের উন্নতি

  • ভাষা : আমরা যে মডেলটি ব্যবহার করছি তা প্রাথমিকভাবে ইংরেজি সমর্থন করে। বহুভাষিক সমর্থনের জন্য, আপনার সূক্ষ্ম টিউনিং প্রয়োজন। Hugging Face-এ তালিকাভুক্ত একাধিক বিষাক্ত মডেল অ-ইংরেজি ভাষা (রাশিয়ান, ডাচ) সমর্থন করে, যদিও তারা এই মুহূর্তে Transformers.js-এর সাথে সামঞ্জস্যপূর্ণ নয়।
  • সংক্ষিপ্ততা : যদিও বিষাক্ত-বার্ট কার্যকরভাবে প্রকাশ্য বিষাক্ততা সনাক্ত করে, এটি আরও সূক্ষ্ম বা প্রসঙ্গ-নির্ভর ক্ষেত্রে (বিদ্রূপ, ব্যঙ্গ) সাথে লড়াই করতে পারে। বিষাক্ততা অত্যন্ত বিষয়গত এবং সূক্ষ্ম হতে পারে। উদাহরণস্বরূপ, আপনি কিছু শর্ত বা এমনকি ইমোজিকে বিষাক্ত হিসাবে শ্রেণীবদ্ধ করতে চাইতে পারেন। ফাইন-টিউনিং এই ক্ষেত্রগুলিতে নির্ভুলতা উন্নত করতে সাহায্য করতে পারে।

আমরা একটি বিষাক্ত মডেল ফাইন-টিউনিং উপর একটি আসন্ন নিবন্ধ আছে.

বিকল্প

উপসংহার

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

Transformers.js-এর সাথে ব্রাউজারে চালানো টক্সিক-বার্টের মতো AI মডেলগুলি ব্যবহার করে, আপনি রিয়েল-টাইম ফিডব্যাক মেকানিজম প্রয়োগ করতে পারেন যা বিষাক্ত আচরণকে নিরুৎসাহিত করে এবং আপনার সার্ভারে বিষাক্ততার শ্রেণিবিন্যাস লোড কমিয়ে দেয়।

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

ব্যাপক বিষাক্ততা সনাক্তকরণের জন্য, ক্লায়েন্ট-সাইড এবং সার্ভার-সাইড পন্থাগুলিকে একত্রিত করুন।