看 InSpace 如何使用 TensorFlow.js 在聊天中筛选不良内容

特邀博文 / Narine Hall,查普林学院助理教授兼 InSpace CEO

InSpace 是一个可以进行交流及虚拟学习的平台,用户可利用此平台以熟悉的物理方式在虚拟空间中互动、协作及教学。InSpace 是教育工作者专为同行构建的以教学为中心的平台。

  • InSpace 经过精心设计,可如实反映实际课堂的顺畅性、个性和互动特性。此平台可让参加者摆脱现有会议解决方案所营造的《脱线家族》式“方盒” 感,并可通过构建自然有趣、有吸引力的环境,促进参加者互动协作。

  • 每个人都通过一个视频圆圈表示,而视频圆圈可在空间中四处移动。当两个人的视频圆圈彼此相邻时,他们可以互相听到并进行对话,而当两人的视频圆圈移开时,音频就会消失,便于他们与其他人进行对话。

  • 当参加者缩小视图时,整个空间就会出现,其中包含了可视化的社交线索。用户可以从课堂讨论无缝切换至个人对话,或分组任务,就像在现实中的实验室或课堂一样。

  • 教师可以根据需要跟所有人说话,也可以在个别学生与小组之间移动进行私下谈话,以及将学生分组至隔离音频但仍属同一虚拟空间的房间,以便他们进行协作。

InSpace: A Virtual Education Platform

作为一个协作平台,聊天是 InSpace 的一项基本功能。最初,我们希望提供一种机制来帮助提醒用户不要发送和接收不良消息。例如,在面向年轻人开设的课堂上,教师可能需要采取某种方式来防止学生键入不当评论。或者,大型讨论会的主持人可能需要采取某种方式来减少不合时宜的垃圾内容。或者,个人用户可能需要过滤他们自己的内容。

识别不良评论的一种简单方式是检查消息中是否包含一系列不当用语,包括亵渎性语言。进一步而言,我们不想单凭消息中所包含的字词来识别不良消息,我们还希望考虑情境因素。因此,我们决定采用机器学习来实现此目标。

经过研究,我们在 TensorFlow.js 中发现一个检测 不良内容 的预训练模型,此模型可轻松集成到我们的平台中。重要的是,此模型可完全在浏览器中运行,这意味着在服务器存储或处理用户消息之前,我们就可以警告用户不要发送不良评论。

从具体表现来看,我们发现在浏览器的主线程中运行不良内容检测进程可能会影响用户体验。我们决定采用一个更好的方法,即使用 Web Workers API 将消息不良内容检测与主应用分开,以使这类进程成为独立的非阻塞进程。

image

Web Worker 通过发送和接收消息与主应用建立连接,您可以将数据封装在其中。每当用户发送消息时,主应用都会将消息自动添加到所谓的队列中,然后才将其发送至 Web Worker。当 Web Worker 收到来自主应用的消息时,会对消息分类,并在准备好输出内容时,将结果发送回主应用。主应用会根据 Web Worker 提供的结果将消息发送给所有参加者,或警告用户此消息包含不良内容。

image

下面是主应用的伪代码,其中我们通过提供 Web Worker 的路径作为参数对其进行初始化,然后设置 Worker 每次发送消息时都会调用的回调,而且还声明当用户提交消息时会调用的回调。

// main application
// initializing the web worker
const toxicityFilter = new Worker('toxicity-filter.worker.js'));
// now we need to set the callback which will process the data from the worker
worker.onMessage = ({ data: { message, isToxic } }) => {
 if (isToxic) {
   markAsToxic(message);
 } else {
   sendToAll(message);
 }
}

当用户发送消息时,我们将此消息传递至 Web Worker:

onMessageSubmit = message => {
 worker.postMessage(message);
 addToQueue(message);
}

初始化 Worker 后,此接口开始侦听来自主应用的消息数据,并通过声明的 onmessage 回调处理这些消息,然后将消息发送回主应用。

// toxicity-filter worker
// here we import dependencies
importScripts(
 // the main library to run Tenser Flow in the browser
 'https://cdn.jsdelivr.net/npm/@tensorflow/tfjs',
 // trained models for toxicity detection
 'https://cdn.jsdelivr.net/npm/@tensorflow-models/toxicity',
);
// threshold point for the decision
const threshold = 0.9;
// the main model promise which would be used to classify the message
const modelPromise = toxicity.load(threshold);
// registered callback to run when the main app sends the data message
onmessage = ({ data: message }) => {
 modelPromise.then(model => {
   model.classify([message.body]).then(predictions => {
     // as we want to check the toxicity for all labels,
     // `predictions` will contain the results for all 7 labels
     // so we check, whether there is a match for any of them
     const isToxic = predictions.some(prediction => prediction.results[0].match);
     // here we send the data message back to the main app with the results
     postMessage({ message, isToxic });
   });
 });
};

正如您看到的,此不良内容检测器的软件包可与应用直接集成,不需要用户对现有架构进行较大改动。主应用只需要一个小小的“连接器”,而过滤逻辑的相关代码则写在了单独的文件中。

如需详细了解 InSpace,请访问 https://inspace.chat

原文:InSpace: A new video conferencing platform that uses TensorFlow.js for toxicity filters in chat
中文:TensorFlow 公众号