一、前言
随着最近对话机器人的普及和推广应用,技术更新不断。前前后后也有很多的大厂有自己的对话系统,如百度开源的基于检索式机器人的框架AnyQ;Google开源的基于生成式对话系统DeepQA;Facebook开源的基于阅读理解的系统DrQA;北京大学知识库问答系统gAnswer。但这些技术都是为了完成对话系统中的一个任务,或者说为了机器人的一个能力而开发的技术,而现有的对话系统中多是各种技术的混合,例如一个对话系统,闲聊部分可能用到DeepQA一类的NLG技术,关于知识推理部分可能用到KBQA的部分,关于FAQ的回答可能用到AnyQ或者DRQA。如何将这些技术应用到一个系统中,还是对应用开发人员的一个考验。
幸运的是,近些年来,很多厂商都开源了自己的问答系统,整个系统是开包即用,例如Facebook开源的Blender系统,他具有个性人物聊天的功能,可以知识问答,是有史以来最大的开放域(Open-Domain)聊天机器人。还有Uber开源的Plato系统,也都具有比较完整的功能。但要说从框架完整性,可扩展性,易用性等各方面,RASA当仁不让是当前最全面的系统之一。下面我们详细介绍下RASA系统。
二、RASA系统的优势
Rasa为建立高效,灵活,专有的上下文对话机器人提供了必要的基础架构和工具。使用Rasa,任何人员都可以通过文本编辑器配置配置文件,就可以得到一个非常不错的对话机器人。
RASA的开发非常活跃,社区内有15k+的stars,4.1k+的forks,2500多万次下载,RASA跟踪了最前沿的技术,并应用到系统中,保证了RASA的技术领先性。RASA的NLU为开发人员提供了解消息,确定意图并捕获关键上下文信息的技术。支持多种语言,单一和多种意图,以及预训练和自定义实体等功能。RASA的CORE提供了多轮对话管理机制,使用Transformer技术自动学习上下文的与当前意图的关联性,而不是比较固定的状态机,再结合RulePolicy,提供了最大的灵活性。
假如您是一名开发人员,RASA也提供的非常好的扩展性,比如说Tokenizer,Featurizer,Classifier,Policy,Action等都提供了自定义功能,您可以只使用RASA的pipeline框架,而其他各个组件都自己定义。如果您是运维人员,您可以使用Rasa-x工具可视化的配置机器人,也可以达到非常不错的效果。
RASA提供了一套从开发、测试到生产部署全套的解决方案,并提供了Conversation-Driven Development (CDD)一套方法论,提供了Action Server,Rasa X等工具,支持Docker部署方式,简化生产运维等方式。
综上,RASA系统基本上涵盖开发对话系统的方方面面,不管是运维人员,还是开发人员都可以使用RASA开发一个比较好的对话系统。
三、RASA系统架构
Rasa开源体系结构
Rasa主要包括Rasa NLU(自然语言理解,即图中的NLU Pipeline)和Rasa Core(对话状态管理,即图中的Dialogue Policies)两个部分。Rasa NLU将用户的输入转换为意图和实体信息。该模块主要功能是意图分类,实体提取和响应检索功能。Rasa Core基于当前和历史的对话记录,决策下一个Action。
除了核心的自然语言理解(NLU)和对话状态管理(DSM)外,还有Agent代理系统,Action Server自定义后端服务系统,通过HTTP和Rasa Core通信;辅助系统Tracker Store、Lock Store和Event Broker等。还有上图没有显示的channel,它连接用户和对话机器人,支持多种主流的即时通信软件对接Rasa。
(1)Agent:从用户角度来看,Agent就是整个RASA系统的代理,主要是接收用户输入消息,返回Rasa系统的回答。从Rasa角度来看,它连接自然语言理解(NLU)和对话状态管理(DSM),根据Action得到回答,并且保存对话数据到数据库。
(2)Action Server:提供了Action与Policy解耦的一种方式。用户可以定义任何一种Action链接到Action Server上,通过训练学习,RASA可以将Policy路由到这个Action上。此外,通过rasa-sdk可以实现Rasa的一个热插拔功能,比如查询天气预报等。
(3)Tracker Store:将用户和Rasa机器人的对话存储到Tracker Store中,Rasa提供的开箱即用的系统包括括PostgreSQL、SQLite、Oracle、Redis、MongoDB、DynamoDB,当然也可以自定义存储。
(4)Lock Store:一个ID产生器,当Rasa集群部署的时候会用到,当消息处于活动状态时锁定会话,以此保证消息的顺序处理。
(5)Event Broker:简单理解就是一个消息队列,把Rasa消息转发给其它服务来处理,包括RabbitMQ、Kafka等。
(6)FileSystem:提供无差别的文件存储服务,比如训练好的模型可以存储在不同的位置。支持磁盘加载,服务器加载,S3这样的云存储加载。
四、RASA消息处理过程
上图展示了从用户的Message输入到用户收到Message的基本流程:
步骤1:用户输入的Message传递到Interpreter(NLP模块),然后识别Message中的意图(intent)和提取实体(entity)。
步骤2:Rasa Core将Interpreter提取的intent和entity传递给Tracker,然后跟踪记录对话状态。
步骤3:Tracker把当前状态和历史状态传递给Policy。
步骤4:Policy根据当前状态和历史状态进行预测下一个Action。
步骤5:Action完成预测结果,并将结果传递到Tracker,成为历史状态。
步骤6:Action将预测结果返回给用户。
五、参考文献
[1]Rasa 3.x官方文档:https://rasa.com/docs/rasa/
[2]Rasa Action Server:https://rasa.com/docs/action-...
[3]Rasa Enterprise:https://rasa.com/docs/rasa-en...
[4]Rasa Blog:https://rasa.com/blog/
[5]Rasa GitHub:https://github.com/rasahq/rasa
[6]Awesome-Chinese-NLP:https://github.com/crownpku/A...
[7]BotSharp文档:https://botsharp.readthedocs....
[8]BotSharp GitHub:https://github.com/SciSharp/B...
[9]rasa-ui GitHub:https://github.com/paschmann/...
[10]rasa-ui Gitee:https://gitee.com/jindao666/r...
[11]rasa_chatbot_cn:https://github.com/GaoQ1/rasa...
[12]Rasa_NLU_Chi:https://github.com/crownpku/R...
[13]nlp-architect:https://github.com/IntelLabs/...
[14]rasa-nlp-architect:https://github.com/GaoQ1/rasa...
[15]rasa_shopping_bot:https://github.com/whitespur/...
[16]facebook/duckling:https://github.com/facebook/d...
[17]rasa-voice-interface:https://github.com/RasaHQ/ras...
[18]Rasa:https://github.com/RasaHQ
[19]ymcui/Chinese-BERT-wwm:https://github.com/ymcui/Chin...
[20]Hybrid Chat:https://gitlab.expertflow.com...
[21]rasa-nlu-trainer:https://rasahq.github.io/rasa...
[22]crownpku/Rasa_NLU_Chi:https://github.com/crownpku/r...
[23]jiangdongguo/ChitChatAssistant:https://github.com/jiangdongg...
[24]Rasa框架应用:https://www.zhihu.com/column/...
[25]Rasa开源引擎介绍:https://zhuanlan.zhihu.com/p/...
[26]Rasa聊天机器人专栏开篇:https://cloud.tencent.com/dev...
[27]rasa-nlu的究极形态及rasa的一些难点:https://www.jianshu.com/p/553...
[28]Rasa官方文档手册:https://juejin.cn/post/684490...
[29]Rasa官方视频教程:https://www.bilibili.com/vide...
[31]Rasa Core开发指南:https://blog.csdn.net/AndrExp...