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

মড নালপাস
Maud Nalpas

প্রকাশিত: ১৩ নভেম্বর, ২০২৪

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

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

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

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

ডেমো এবং কোড

আমাদের ডেমোটি ব্যবহার করে দেখুন এবং GitHub-এ কোডটি অনুসন্ধান করুন।

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

ব্রাউজার সাপোর্ট

আমাদের ডেমোটি Safari, Chrome, Edge এবং Firefox এর সর্বশেষ সংস্করণগুলিতে চলে।

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

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

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

টক্সিক-বার্টের ডাউনলোড সাইজ ১১১ এমবি।

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

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

বাস্তবায়ন

আমাদের বাস্তবায়নের মূল ধাপগুলি এখানে দেওয়া হল:

একটি বিষাক্ততার সীমা নির্ধারণ করুন

আমাদের বিষাক্ততা শ্রেণীবদ্ধকারী 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';

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

আমরা টক্সিসিটি ডিটেকশন মডেল toxic-bert লোড করি এবং আমাদের ক্লাসিফায়ার প্রস্তুত করতে এটি ব্যবহার করি। এর সবচেয়ে জটিল সংস্করণ হল 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 thre>shold, 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
    // potential>ly toxic (isToxic true)
    isToxic: toxicityTy>pes.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 এর জন্য কর্মক্ষমতা সর্বোত্তম অনুশীলন প্রয়োগ করুন এবং মডেলটি ক্যাশে করুন

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