दूसरा हिस्सा: क्लाइंट-साइड एआई की मदद से, आपत्तिजनक कॉन्टेंट का पता लगाना

Maud Nalpas
Maud Nalpas

पब्लिश होने की तारीख: 13 नवंबर, 2024

नफ़रत फैलाने वाली भाषा, उत्पीड़न, और ऑनलाइन बुरे बर्ताव की समस्या इंटरनेट पर आम हो गई है. अपमानजनक टिप्पणियों की वजह से, अहम आवाज़ें दब जाती हैं और उपयोगकर्ता और खरीदार दूर हो जाते हैं. नुकसान पहुंचाने वाले कॉन्टेंट का पता लगाने की सुविधा, आपके उपयोगकर्ताओं को सुरक्षित रखती है और ऑनलाइन प्लैटफ़ॉर्म को ज़्यादा सुरक्षित बनाती है.

दो हिस्सों वाली इस सीरीज़ में, हम यह पता लगाएंगे कि एआई का इस्तेमाल करके, आपत्तिजनक कॉन्टेंट का पता कैसे लगाया जा सकता है और उसे कैसे कम किया जा सकता है. इसके लिए, हम उपयोगकर्ताओं के कीबोर्ड को सोर्स के तौर पर इस्तेमाल करेंगे.

पहले हिस्से में, हमने इस तरीके के इस्तेमाल के उदाहरणों और फ़ायदों के बारे में बताया था.

इस दूसरे भाग में, हम इसे लागू करने के बारे में विस्तार से जानेंगे. इसमें कोड के उदाहरण और यूज़र एक्सपीरियंस से जुड़ी सलाह शामिल है.

डेमो और कोड

हमारे डेमो को आज़माएं. साथ ही, GitHub पर मौजूद कोड के बारे में जानें.

टिप्पणी पोस्ट करने का डेमो.
जब उपयोगकर्ता टाइप करना बंद कर देता है, तब हम उसकी टिप्पणी में आपत्तिजनक कॉन्टेंट का विश्लेषण करते हैं. अगर किसी टिप्पणी को बुरे बर्ताव वाली टिप्पणी के तौर पर वर्गीकृत किया जाता है, तो हम रीयल-टाइम में चेतावनी दिखाते हैं.

ब्राउज़र समर्थन

हमारा डेमो, Safari, Chrome, Edge, और Firefox के नए वर्शन पर काम करता है.

कोई मॉडल और लाइब्रेरी चुनना

हम Hugging Face की Transformers.js लाइब्रेरी का इस्तेमाल करते हैं. यह लाइब्रेरी, ब्राउज़र में मशीन लर्निंग मॉडल के साथ काम करने के लिए टूल उपलब्ध कराती है. हमारा डेमो कोड, इस टेक्स्ट क्लासिफ़िकेशन के उदाहरण से लिया गया है.

हम toxic-bert मॉडल चुनते हैं. यह पहले से ट्रेन किया गया मॉडल है. इसे आपत्तिजनक भाषा के पैटर्न की पहचान करने के लिए डिज़ाइन किया गया है. यह unitary/toxic-bert का वेब के साथ काम करने वाला वर्शन है. मॉडल के लेबल और पहचान से जुड़े हमलों के क्लासिफ़िकेशन के बारे में ज़्यादा जानकारी के लिए, Hugging Face मॉडल पेज पर जाएं.

toxic-bert को डाउनलोड करने के लिए 111 एमबी की ज़रूरत होती है.

मॉडल डाउनलोड हो जाने के बाद, अनुमान लगाने की प्रोसेस तेज़ी से होती है.

उदाहरण के लिए, हमने जिस सामान्य 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';

मॉडल लोड करना और मुख्य थ्रेड से कम्यूनिकेट करना

हम टॉक्सिक-बर्ट मॉडल को लोड करते हैं और इसका इस्तेमाल, अपने क्लासिफ़ायर को तैयार करने के लिए करते हैं. इसका सबसे आसान वर्शन const classifier = await pipeline('text-classification', MODEL_NAME); है

उदाहरण के तौर पर दिए गए कोड की तरह पाइपलाइन बनाना, अनुमान लगाने से जुड़े टास्क चलाने का पहला चरण है.

पाइपलाइन फ़ंक्शन में दो आर्ग्युमेंट इस्तेमाल किए जाते हैं: टास्क ('text-classification') और मॉडल (Xenova/toxic-bert).

मुख्य शब्द: Transformers.js में, पाइपलाइन एक हाई-लेवल एपीआई है. यह एमएल मॉडल को चलाने की प्रोसेस को आसान बनाता है. यह मॉडल लोडिंग, टोकनाइज़ेशन, और पोस्ट-प्रोसेसिंग जैसे टास्क मैनेज करता है.

हमारा डेमो कोड, मॉडल तैयार करने के अलावा कुछ और काम भी करता है. ऐसा इसलिए, क्योंकि हम मॉडल तैयार करने के लिए, वेब वर्कर को कंप्यूटेशनल रूप से ज़्यादा मुश्किल चरणों को ऑफ़लोड करते हैं. इससे मुख्य थ्रेड को रिस्पॉन्सिव बनाए रखने में मदद मिलती है. ज़्यादा समय लेने वाले टास्क को वेब वर्कर को सौंपने के बारे में ज़्यादा जानें.

हमारे वर्कर को मुख्य थ्रेड से कम्यूनिकेट करना होता है. इसके लिए, वह मैसेज का इस्तेमाल करके मॉडल की स्थिति और आपत्तिजनक कॉन्टेंट के आकलन के नतीजों के बारे में बताता है. हमने मैसेज कोड बनाए हैं. इन्हें देखें. ये कोड, मॉडल तैयार करने और अनुमान लगाने के लाइफ़साइकल की अलग-अलग स्थितियों के बारे में बताते हैं.

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 के साथ ब्राउज़र में काम करते हैं. इससे, आपत्तिजनक व्यवहार को कम करने में मदद मिलती है. साथ ही, आपके सर्वर पर आपत्तिजनक कॉन्टेंट की पहचान करने का लोड कम हो जाता है.

क्लाइंट-साइड का यह तरीका, पहले से ही सभी ब्राउज़र पर काम करता है. हालांकि, इसकी सीमाओं को ध्यान में रखें. खास तौर पर, मॉडल को इस्तेमाल करने की लागत और डाउनलोड साइज़ के बारे में. क्लाइंट-साइड एआई के लिए, परफ़ॉर्मेंस से जुड़े सबसे सही तरीके लागू करें और मॉडल को कैश मेमोरी में सेव करें.

ज़हरीले कॉन्टेंट का पता लगाने के लिए, क्लाइंट-साइड और सर्वर-साइड, दोनों तरीकों का इस्तेमाल करें.