聊天机器人已经有了很多很好的实现,比如图灵机器人、微软小冰都非常的智能而且语气都与人类相似。但这并不是一件一劳永逸的事情,在特定的场景下问题的回答是有边界的或者符合特定业务场景的,所以还是需要可以按需定制开发的机器人。
chatterBot项目是一个用Python实现聊天机器人的开源项目(作者:Gunther Cox,github地址),下面介绍下chatterBot的实现方式以及如何在这个项目的基础上做定制开发:
chatterBot将一个机器人分为input Adapter、logic Adapter、storage Adapter、output Adapter以及Trainer模块。
input Adapter: 这个模块被设计用来获取并处理用户输入,获取输入是指自动从外部获取输入,比如从gitter room, twitter等这些都是项目自带的输入插件。处理用户输入是把获取到的输入转化为可以进行下一步处理的Statement对象。Statement对象是对用户输入的抽象,包含了输入的text,附加信息并提供了序列化,对比等方法。input Adapter被设计成为插件式的,所以在实践当中,我们可以实现自己的input Adapter,比如为每个用户打上id,这样输入就包含了用户信息,在接下来的处理中就可以根据不同用户实现不同逻辑了。
logic Adapter: 完成输入处理后就到了逻辑处理,这依然是一个插件式的设计,主进程在启动时会将用户定义的所有逻辑处理插件添加到logic context中,然后交MultiLogicAdapter进行处理,MultiLogicAdapter会依次调用每个logic Adapter,logic Adapter被调用时先执行can_process方式判断输入是否可以命中这个逻辑处理插件。比如说 "今天天气怎么样"显然需要命中天气逻辑处理插件,但时间逻辑处理插件的can_process方法则应该返回False。在命中后logic Adapter要负责计算出对应的回答(也是包装成Statement对象)以及可信度(confidence),MultiLogicAdapter会取可信度最高的回答,并进入下一步。项目已经自带了很多logic Adapter,有close match、close meaning、时间逻辑、数学逻辑,甚至还有情感逻辑,大家可以自己探索。在实践当中,我们还是需要自己定制开发一些逻辑处理插件,如果我们希望自己的逻辑处理插件优先级始终高于自带的插件,可以提高confidence,自带的逻辑处理插件返回的confidence最大是1,只要confidence比1大就是最高优先级了。
storage Adapter: 刚才介绍logic Adapter时其实还有一点没有说明,就是大部分的逻辑处理还是基于训练集的,在处理时需要与训练集做匹配,所以这个项目将训练集的持久化也做成了插件式的,自带的持久化有文件型(json格式)、mongodb,我们也可以做自己的持久化层,比如支持redis,支持mysql。
output Adapter: 这个模块就不用详细介绍了,基本与input Adapter一致,只是这里处理的是输出。也是插件式设计,所以我们也可以定制开发,比如与腾讯等语音合成服务提供商的接口集成,我们的机器人就可以"开口说话了"。
Trainer: 这个模块提供训练机器人的方法,自带的方法有两种,一种是通过输入list来训练,比如["你好","你好啊"],后者是前者的回答,另一种是通过导入Corpus格式的文件来训练。如果这两种方法都没有办法满足的话,我们还可以写自己的训练模块,但总的来说还是要将最终的训练集转换成上述两种类型。
总结: chatterBot这个项目并不是一个非常完善的聊天机器人项目(如果你希望一安装就获得一个话唠一样的机器人那就可以放弃了),总的来说自带的功能有限,但是这个项目并不简单,因为项目本身结构非常清晰,又高度插件化,所以非常适合在此基础上做定制化开发,so 动手吧。