Yayınlanma tarihi: 13 Kasım 2024
Nefret söylemi, taciz ve internetteki kötüye kullanım, internette yaygın bir sorun haline geldi. Toksik yorumlar önemli sesleri susturur ve kullanıcıları ve müşterileri uzaklaştırır. Toksik içerik algılama, kullanıcılarınızı korur ve daha güvenli bir internet ortamı oluşturur.
Bu iki bölümden oluşan seride, toksik içerikleri kaynağından (kullanıcı klavyeleri) tespit edip azaltmak için yapay zekanın nasıl kullanılacağını inceliyoruz.
Birinci bölümde bu yaklaşımın kullanım alanlarını ve avantajlarını ele aldık.
Bu ikinci bölümde, kod örnekleri ve kullanıcı deneyimi ipuçları da dahil olmak üzere uygulamayı ayrıntılı olarak ele alıyoruz.
Demo ve kod
Demomuzu inceleyin ve GitHub'daki kodu inceleyin.
Tarayıcı desteği
Demomuz Safari, Chrome, Edge ve Firefox'un en son sürümlerinde çalışır.
Model ve kitaplık seçme
Tarayıcısında makine öğrenimi modelleriyle çalışmak için araçlar sağlayan Hugging Face'ın Transformers.js kitaplığını kullanırız. Demo kodumuz bu metin sınıflandırma örneğinden alınmıştır.
Toksik dil kalıplarını belirlemek için tasarlanmış önceden eğitilmiş bir model olan toxic-bert modelini seçiyoruz. unitary/toxic-bert modelinin web uyumlu bir sürümüdür. Modelin etiketleri ve kimlik saldırılarını sınıflandırması hakkında daha fazla bilgi için Hugging Face model sayfasına bakın.
Model indirildikten sonra çıkarım hızlıdır.
Örneğin, test ettiğimiz orta sınıf bir Android cihazda (daha yüksek performanslı Pro modeli değil, normal bir Pixel 7 telefon) Chrome'un çalışması genellikle 500 milisaniyeden kısa sürer. Kullanıcı tabanınızı temsil eden kendi karşılaştırmalarınızı çalıştırın.
Uygulama
Uygulama sürecindeki temel adımlar şunlardır:
Toksisite eşiği belirleme
Toksisite sınıflandırıcımız, 0
ile 1
arasında toksisite puanları sağlar. Bu aralıkta, toksik yorumları belirlemek için bir eşik belirlememiz gerekir. Yaygın olarak kullanılan bir eşik 0.9
'tür. Bu sayede, çok sayıda yanlış pozitif (yani toksik olarak sınıflandırılan zararsız yorumlar) sonucuna yol açabilecek aşırı hassasiyetten kaçınırken açıkça toksik yorumları yakalayabilirsiniz.
export const TOXICITY_THRESHOLD = 0.9
Bileşenleri içe aktarma
Gerekli bileşenleri @xenova/transformers
kitaplığından içe aktararak başlayın. Ayrıca, toksisite eşiğimiz de dahil olmak üzere sabitler ve yapılandırma değerlerini de içe aktarırız.
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';
Modeli yükleme ve ana iş parçacığıyla iletişim kurma
Kötü niyetli davranış algılama modeli toxic-bert'i yükleyip sınıflandırıcımızı hazırlamak için kullanırız. Bunun en az karmaşık versiyonu şudur:
const classifier = await pipeline('text-classification', MODEL_NAME);
Örnek kodda olduğu gibi bir ardışık düzen oluşturmak, çıkarım görevlerini çalıştırmanın ilk adımıdır.
Ardışık düzen işlevi iki bağımsız değişken alır: görev ('text-classification'
) ve model (Xenova/toxic-bert
).
Anahtar terim: Transformers.js'de ardışık düzen, ML modellerini çalıştırma sürecini basitleştiren üst düzey bir API'dir. Model yükleme, jeton oluşturma ve son işleme gibi görevleri yönetir.
Demo kodumuz, hesaplama açısından pahalı model hazırlama adımlarını bir web çalışanına devrettiğimiz için modeli hazırlamaktan biraz daha fazlasını yapar. Bu sayede ana ileti dizisinin duyarlı kalması sağlanır. Masraflı görevleri bir web işleyiciye aktarma hakkında daha fazla bilgi edinin.
İşleyicimizin, modelin durumunu ve toksisite değerlendirmesinin sonuçlarını belirtmek için mesajlar kullanarak ana mesaj dizisiyle iletişim kurması gerekir. Model hazırlama ve çıkarım yaşam döngüsünün farklı durumlarıyla eşleştirdiğimiz mesaj kodlarına göz atın.
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 });
}
})();
Kullanıcı girişini sınıflandırma
classify
işlevimizde, kullanıcı yorumunu analiz etmek için daha önce oluşturduğumuz sınıflandırıcıyı kullanırız. Zehirli sınıflandırıcının ham çıkışını (etiketler ve puanlar) döndürürüz.
// 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;
}
Ana iş parçacığı iş parçacısında bunu yapmasını istediğinde sınıflandırma işlevimizi çağırırız. Demomuzda, kullanıcı yazmayı bıraktığı anda sınıflandırıcıyı tetikleriz (TYPING_DELAY
bölümüne bakın). Bu durumda, ana iş parçacımız iş parçacısına sınıflandırılacak kullanıcı girişini içeren bir mesaj gönderir.
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,
});
};
Çıktıyı işleme
Sınıflandırıcının çıkış puanlarının eşik değerimizi aşıp aşmadığını kontrol ederiz. Bu durumda, söz konusu etiketi not ederiz.
Rahatsız edici içerik etiketlerinden herhangi biri listelenirse yorum, rahatsız edici içerik barındırma ihtimali olduğu için işaretlenir.
// 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,
});
};
İpucu görüntüleme
isToxic
doğruysa kullanıcıya bir ipucu gösteririz. Demomuzda daha ayrıntılı toksisite türünü kullanmıyoruz ancak gerekirse ana mesaj dizisinde kullanılabilir hale getirdik (toxicityTypeList
). Bu türü, kullanım alanınızda yararlı bulabilirsiniz.
Kullanıcı deneyimi
Demomuzda aşağıdaki seçimleri yaptık:
- Yayınlamaya her zaman izin ver. İstemci tarafında gösterilen toksik içerikle ilgili ipucu, kullanıcının içerik yayınlamasını engellemez. Demomuzda, model yüklenmemiş olsa bile (ve dolayısıyla toksisite değerlendirmesi sunmasa bile) ve yorum toksik olarak algılansa bile kullanıcı yorum yayınlayabilir. Önerildiği gibi, toksik yorumları tespit etmek için ikinci bir sisteminiz olmalıdır. Uygulamanız için uygunsa kullanıcıya yorumunun istemcide onaylandığını ancak daha sonra sunucuda veya gerçek kişiler tarafından yapılan inceleme sırasında işaretlendiğini bildirebilirsiniz.
- Yanlış negatiflere dikkat edin. Bir yorum, toksik olarak sınıflandırılmadığında demomuz geri bildirim sunmaz (ör. "Güzel yorum"). Sınıflandırıcımız zaman zaman bazı toksik yorumları kaçırdığından, olumlu geri bildirim vermek hem çok fazla bilgi vermesi hem de yanlış sinyal göndermesi açısından sakıncalıdır.
Geliştirmeler ve alternatifler
Sınırlamalar ve gelecekte yapılacak geliştirmeler
- Diller: Kullandığımız model öncelikle İngilizceyi destekler. Çok dilli destek için ince ayar yapmanız gerekir. Hugging Face'ta listelenen birden fazla zehirlilik modeli, İngilizce dışındaki dilleri (Rusça, Hollandaca) desteklese de şu anda Transformers.js ile uyumlu değildir.
- Nuance: toxic-bert açıkça toksik olan ifadeleri etkili bir şekilde tespit etse de daha ince veya bağlama bağlı durumlarda (ironi, sarkazm) zorlanabilir. Toksisite, son derece öznel ve ince bir konu olabilir. Örneğin, belirli terimlerin veya hatta emojilerin toksik olarak sınıflandırılmasını isteyebilirsiniz. İnce ayar, bu alanlarda doğruluğu iyileştirmeye yardımcı olabilir.
Kötü niyetli davranış modelini hassaslaştırmayla ilgili bir makale yayınlayacağız.
Alternatifler
- Metin sınıflandırma için MediaPipe. Sınıflandırma görevleriyle uyumlu bir model kullandığınızdan emin olun.
TensorFlow.js zehirlilik sınıflandırıcısı. Daha küçük ve getirilmesi daha hızlı bir model sunar ancak bir süredir optimize edilmemiştir. Bu nedenle, çıkarım işleminin Transformers.js'ye kıyasla biraz daha yavaş olduğunu fark edebilirsiniz.
Sonuç
İstemci tarafında toksik içerik algılama, online toplulukları iyileştirmek için güçlü bir araçtır.
Transformers.js ile tarayıcıda çalışan toxic-bert gibi yapay zeka modellerinden yararlanarak, toksik davranışları caydıran ve sunucularınızdaki toksiklik sınıflandırma yükünü azaltan anlık geri bildirim mekanizmaları uygulayabilirsiniz.
Bu istemci tarafı yaklaşımı, tarayıcılarda zaten çalışıyor. Ancak özellikle model yayınlama maliyetleri ve indirme boyutu açısından sınırlamaları göz önünde bulundurun. İstemci tarafı yapay zeka için performansla ilgili en iyi uygulamaları uygulayın ve modeli önbelleğe alın.
Kapsamlı toksisite algılama için istemci tarafı ve sunucu tarafı yaklaşımlarını birleştirin.