InSpace。一个新的视频会议平台,在聊天中使用TensorFlow.js的毒性过滤器

99 阅读4分钟

香普兰学院助理教授、InSpace公司首席执行官纳林-霍尔的特邀文章

InSpace是一个通信和虚拟学习平台,让人们能够以熟悉的物理方式,但在虚拟空间中进行互动、协作和教育。InSpace是由教育家为教育家建立的,将教育置于平台的中心。

  • InSpace的设计是为了反映真实课堂的流动、个人和互动性质。它允许参与者摆脱现有会议解决方案中的"布雷迪邦奇 "的框框,创造一个有趣、自然和吸引人的环境,促进互动和协作。

  • 每个人都被代表在一个视频圈中,可以在空间中自由移动。当人们彼此相邻时,他们可以听到并参与对话,而当他们离开时,音频会逐渐消失,使他们能够找到新的对话。

  • 当参与者放大时,他们可以看到整个空间,这提供了视觉社交线索。人们可以从课堂讨论无缝切换到私人谈话或基于小组/团队的工作,类似于实验室或教室的形式。

  • 教师可以在需要时与每个人交谈,在个别学生和小组之间移动以进行更多的私人讨论,并将学生小组放在音频隔离的房间里进行合作,同时仍然属于一个虚拟空间。

作为一个协作平台,InSpace的一个基本功能是聊天。从第一天起,我们就想提供一种机制,帮助警告用户不要发送和接收有毒信息。例如,在有年轻人的课堂上,老师可能希望有一种方法来防止学生输入不恰当的评论。或者,一个大型讨论的主持人可能想要一个方法来减少不适当的垃圾邮件。或者个人用户可能想自己过滤掉这些评论。

识别有毒评论的一个简单方法是检查是否存在一系列的词语,包括脏话。比这更进一步的是,我们不想仅仅通过信息中包含的词语来识别有毒信息,我们还想考虑到背景。因此,我们决定使用机器学习来实现这一目标。

经过一些研究,我们在TensorFlow.js中找到了一个预先训练好的毒性检测模型,可以很容易地集成到我们的平台中。重要的是,这个模型完全在浏览器中运行,这意味着我们可以警告用户不要发送有毒的评论,而他们的信息不会被存储或被服务器处理。

从性能上看,我们发现在浏览器的主线程中运行毒性处理程序会对用户体验造成损害。我们决定,一个好的方法是使用Web Workers API将消息的毒性检测与主应用程序分开,因此这些进程是独立的、非阻塞的。

GIF moderating toxic comments

Web Workers通过发送和接收消息连接到主应用程序,你可以将你的数据包在其中。每当用户发送消息时,它就会被自动添加到一个所谓的队列中,并从主应用程序发送至Web Worker。当Web Worker从主应用程序收到消息时,它开始对消息进行分类,当输出准备好时,它将结果发回主应用程序。根据网络工作者的结果,主应用程序要么将消息发送给所有参与者,要么警告用户它是有毒的。

Chart showing how toxicity filter works

下面是主应用程序的伪代码,我们通过提供网络工作者的路径作为参数来初始化网络工作者,然后设置每次工作者发送消息时将调用的回调,同时我们还声明当用户提交消息时将调用的回调。

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

当用户发送消息时,我们将其传递给网络工作者。

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

工作者初始化后,它开始监听来自主应用程序的数据消息,并使用声明的onmessage回调处理这些消息,然后将消息发回给主应用程序。

// toxicity-filter worker// here we import dependenciesimportScripts( // 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 decisionconst threshold = 0.9;// the main model promise which would be used to classify the messageconst modelPromise = toxicity.load(threshold);// registered callback to run when the main app sends the data messageonmessage = ({ 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的信息,请访问inspace.chat