如何使聊天机器人多语言

2021-07-26 07:29:52

总结:我决定建立自己的语言翻译服务器,这样我创建的聊天机器人可以理解的不仅仅是英语。 DwayneBot 是我过去几个月一直在构建的聊天机器人。它连接到不同类型的聊天室,听取人们所说的内容,并对内容做出回应。它的工作原理是扫描发送到房间的每条消息,以获得它可以响应的命令。与大多数聊天机器人一样,命令是以一些可自定义的字符开头的单词,通常是“!”。所以:!uptime、!commands、!random、!wiki 等。有时他们接受参数/选项。您可以通过说 !random 16 32 向机器人询问 16 到 32 之间的随机数。或者您可以使用 !wiki He Who Remains 索取 Wikipedia 上的 He Who Remains 摘要。我写了很多命令来做很多不同的事情。然而,关于这些类型的命令和参数的事情是,它们实际上非常有限。由于它们只是没有分隔符或任何东西的单词,因此没有很大的灵活性。就像如果有多个选项一样,第一个只能是一个词,否则机器人不知道哪个是哪个。并且没有办法拥有多个可选参数。所以 DwayneBot 可以理解这些命令,但它也足够先进,可以理解常规问题/陈述,因此它可以响应以下内容:启用这意味着我必须编写一些 NLP(自然语言处理)代码,以便机器人可以实际转换这些将复杂的请求转化为它可以执行的操作。起初我尝试使用 Go NLP 库让事情变得更简单,但是像标记化和命名实体提取这样的东西实际上并没有像我想象的那样帮助我。相反,我使用大量我自己的手动语言/日期解析代码(其中一些我已经在构建这个网站的 1.5 年中慢慢编写)和大量的正则表达式来确定我自己的解决方案,这只是一种方式轻松(大声笑)搜索特定短语/模式的文本。

所以这意味着我设计了机器人来将它读取的每条消息与短语列表进行比较。这些短语中的每一个都映射到机器人理解的动作。例如,“how do you work”是一个映射到 About 操作的短语,就像 !about 一样。并且“从 1 到 10 中选择一个数字”映射到随机数操作,就像 !random 1 10 一样。这对我来说非常酷,而且实际上到目前为止工作得非常好。但是,虽然无可否认,它很兴奋,但它仍然不够好。因为我只会英文,所以机器人只会英文。每个正则表达式模式都是英文的。问题是,我什至不喜欢英语。我真的不喜欢我不会任何其他语言,所以我不喜欢机器人也不知道。 DwayneBot 可以做但我不能做的一件事是在处理之前自动翻译输入。因此,将翻译深入到其核心成为我的首要目标。我认为这当然不会是完美的,但它会是一个足够好的开始。幸运的是,有很多翻译 API 可以让您轻松检测给定文本的语言并快速进行翻译。不过,我对自己的选择并不满意。我遇到了几类 API:当然,谷歌、微软和亚马逊都有广泛的“认知服务”API,包括语言翻译。谷歌支持 109(!!) 种语言,微软支持 90 种,亚马逊支持 71 种。他们在人工智能、机器学习和“认知”领域拥有太多的权力,我对提供比他们更多的数据不感兴趣已经得到了。我真的不想给他们任何人比我必须的更多的钱。这些天我什至不喜欢在亚马逊上购物。

我的很多网络搜索都导致了 RapidAPI,这立即让我不信任他们。据我所知,他们只是从互联网上(来自决定与他们签约的 API 作者/提供商)收集 API 并处理付款。体面的业务,但当然,就像任何发现自己处于该位置的公司一样,他们显然正试图从 API 看门人中尽可能多地受益,这让我感到有些恼火。无论如何,这个组中有一些看起来还不错,尽管当然他们都支持比巨人少得多的语言。我很早就决定不使用 RapidAPI 的任何 API,所以这并不重要。然后是那些不属于前两组的人看起来很不错。通常更糟糕的语言支持,但考虑到巨人队从行业中吸取所有资金、人才和资源,这是可以预料的。幸运的是,在我考虑所有这些的时候,我碰巧遇到了一个名为 LibreTranslate 的项目。它对我来说特别有趣,因为它是开源的,并且是自托管的。事实证明,自托管解决方案非常适合我正在尝试做的事情。 DwayneBot,就像这个网站(和我真的一样),没有很多依赖项。大部分功能来自服务器本身,因此在大多数情况下,只要 Digital Ocean 的基础设施在运行,网站就会运行。外部的一切(如服务器使用的所有不同 API:OpenWeather、Spotify、Giphy、Steam 等)在无法访问时都会得到妥善处理,正如您对设计精良的系统所期望的那样。机器人的基本功能(包括所有语言处理)是由我编写的,没有任何依赖性。这就是我想要的。我不喜欢引入完全依赖于其他服务的核心功能的想法。

所以我在 Web 服务器上安装了 LibreTranslate,这意味着我现在可以控制一个永久免费的翻译 API。设置也很容易,即使我无缘无故地从头开始构建项目(我只需要在修复我的 python 安装并安装几个依赖项后使用 pip install )。注意:在进入下一部分之前,我想弄清楚这个项目的细节。 LibreTranslate 是一个使用 Argos Translate 项目作为依赖项提供 API(并进行 API 管理)的项目。 Argos Translate 是真正进行翻译的公司。我将在下面提到这两个项目,但在大多数情况下,您可以将它们视为同一件事。 Argos Translate 的好处在于它通过使用语言独立的语言“模型”来工作。每个模型都是机器学习的结果,基本上是一个包含两种语言翻译数据的 zip 文件。当您安装 LibreTranslate 时,您负责为您感兴趣的语言查找和安装模型。有一个默认设置,但是您找到的越多,您的实例可以翻译成/从的语言就越多。默认设置包含:阿拉伯语、中文、英语、法语、德语、印地语、印度尼西亚语、爱尔兰语、意大利语、日语、韩语、波兰语、葡萄牙语、俄语、西班牙语、土耳其语和越南语。我正在努力获得更多。我想要对非洲语言的支持。我想要支持不止一种印度语言。我知道我不会赶上 Google 支持的 109 种语言,但我希望拥有超过 17 种语言。 另一个注意事项:我确实想投入一些时间和资源来创建或鼓励创建更多 Argos 翻译楷模。科技巨头不可能是唯一支持世界上更边缘化人群的语言的公司。就在我发现 LibreTranslate 之前,我开始实现对名为 DeepL 的第三方翻译 API 的支持。因为这个翻译计划是从多个翻译“提供者”开始的——我自己的非公开 LibreTranslate 实例和 DeepL——我设计了我的翻译服务(我简称为 Translate)来接收文本输入进行翻译并决定使用哪个提供者.这样我就可以在需要时添加其他提供者或删除 DeepL。理想情况下,我只会找到更多 Argos Translate 模型,并且主要使用我自己的实例。

现在,我将 Translate 设计为仅在启用 DeepL 且满足某些条件时才使用它。在任何其他情况下,作为后备,它将使用我的 LibreTranslate 实例。那么为什么还要使用 DeepL 呢?我听说 DeepL 非常擅长某些(欧洲)语言,所以我希望机器人也非常擅长这些语言。很好地抵消了我服务器上的一些资源,因为我还不知道负载下对它的全部影响。在安装 LibreTranslate 之前,我已经开始编写集成,所以……我只是将它保留在那里,而不是删除代码。 DwayneBot 然后使用此翻译服务(同样,它自己决定使用哪个提供商): 自动翻译,它将(启用时)将指向机器人的陈述/问题翻译成英语,以便对其进行解析。当直接要求翻译某些内容时(例如:嘿机器人,将英语翻译成日语是一种糟糕的语言)

当我最喜欢的机器人操作之一 ExecTranslate 用于让机器人解析语句,从中执行任何操作,然后将所有输出翻译成给定的语言。为了测试 Translate,包括它选择一个提供商而不是另一个提供商的频率,并随着时间的推移密切关注结果,我在网站的 /utils 部分添加了一个页面,您可以在其中翻译文本,就像使用任何一个其他网络服务。我还最终添加了一个管理页面来查看 DeepL 的使用情况并启用或禁用它。我实际上非常担心 LibreTranslate 可能会给服务器带来多大的压力。对于我在这里所做的一切,我只使用了一个 Digital Ocean Droplet(以及单独的 Postgres 和 Spaces 实例)。如果这最终真的打败了服务器并开始影响网站本身,我将不得不停止它并可能考虑租用第二台服务器。磁盘使用 - 下载默认模型集需要一段时间。我担心该集合的总大小会很大,但总共大约 3.1 GB。 CPU - 我没有测量过它,但它似乎根本不使用太多 CPU。我还没有对它进行压力测试。 RAM - 它确实使用了相当数量的 RAM。到目前为止,我 4 GB 的 32.8%。注意:服务器重启后现在占用的内存要少得多。我在等多久才能重新爬回来。到目前为止,这就是我为翻译计划的一切。我之前描述的三个机器人功能(自动翻译、使用 !translate 直接翻译和完整响应翻译)已经运行良好。 DwayneBot 将继续发展并做更高级的事情,其中​​一些可能真正受益于拥有本地翻译支持。

当然,翻译服务也可用于网站的其余部分,因此最终我将添加对翻译网站某些部分和所有文章的支持。不过就目前而言,我仍在测试和稳定(并撰写)其他机器人功能。还有更多。