Rasa学习总结

简述

Rasa是一个开源的基于机器学习的chatbot开发框架。其主要分成两大模块:Rasa NLU和Rasa Core。使用Rasa NLU + Rasa Core,开发者可以迅速构建自己的chatbot。本文先是分析了Rasa的结构组成,然后介绍开发者如何方便地利用Rasa构建自己的chatbot。

本文面向需要使用Rasa快速构建自己的chatbot的同学,还有想进一步了解Rasa框架结构的同学,以及想学习Rasa构建一个自己的chatbot框架的同学。

快速安装

1
pip3 install rasa-x --extra-index-url https://pypi.rasa.com/simple

Rasa NLU

Rasa NLU负责提供自然语言理解的工具,包括意图分类和实体抽取。

举例来说,对于输入:

1
"I am looking for a Mexican restaurant in the center of town"

Rasa NLU的输出是:

1
2
3
4
5
6
7
{
"intent": "search_restaurant",
"entities": {
"cuisine" : "Mexican",
"location" : "center"
}
}

其中,Intent代表用户意图。Entities即实体,代表用户输入语句的细节信息。

预定义的pipeline

  • spacy_sklearn
    • 1.使用spaCy NLP进行tokenize和POS(Part of Speech,词性标注)。
    • 2.使用spaCy的featuriser来获取GloVe向量,然后pool成一个句子向量。
    • 3.使用sklearn分类器做意图分类。
    • 4.使用ner_crf模块来做命名实体识别。

rasa_nlu

Rasa Core

Rasa整体框架图:

rasa_arch

首先介绍一些核心概念。

Action

action是对系统响应的抽象。Rasa将对话管理视作一个分类问题,每轮都会在预先设定好的action集合中选出一个类别。Rasa Core定义了3中action

  • default action:系统预先定义好的动作,如action_listenaction_restartaction_default_fallback
  • utter action:一般以utter_开头,这种action就只会单纯地给用户返回文本消息。这类的action无需具体实现代码,只需在配置文件中指定其对应的相应文本模板即可。
  • custom action:用户可以任意编写此类action的代码。用户一般需要自己架设一个额外服务,然后在实现action时,让代码请求这个服务。

Tracker

Tracker是用于追踪对话状态的模块。当用户输入被解析后,会传入Tracker进行更新,然后系统会读取Tracker里的信息,作为策略判断的输入。

目前支持的tracker

  • InMemoryTrackerStore (default)
  • RedisTrackerStore
  • MongoTrackerStore
  • Custom Tracker Store

Events

Events用于描述一个对话过程中任何可能发生的事情。

Dispatcher

Dispatcher的作用是将消息以各种形式发送给用户。

Action + Dispatcher + Tracker + Events:

action被执行的时候,通常会将一个tracker对象传进去。这样它就可以利用各种相关的信息,比如slots、之前的utterance还有之前的action

action被执行的时候,通常会调用dispatcher将消息返还给用户。执行过程本身并不直接修改tracker,但是执行的完成后可能会返回eventstracker可以消费这些event,并更新状态。

Policy

policy的输入是tracker记录的当前对话状态,输出是一个系统响应action

policy包含一个featurizer。一个featurizer可以创造一个代表当前对话状态的向量。

特征包括以下三部分:

  • 1.上轮动作
  • 2.上轮的intent和entities
  • 3.本轮的slots

一个很重要的超参max_history:指定了要考虑多少个之前的状态。通常取值为3-6。

Story

所谓的story有点像剧本,描述可能出现的对话场景。实际上story就是一个个用户输入intent(entities)和系统设定的输出action用于policy的训练。

格式:

1
2
3
## story名称
* 用户的intent或者entity
- 系统的action

rasa_story

Interactive learning

交互式,让用户在每一次机器做出决定之后,给与反馈。
对于很难手动设计的边界情况非常有效。

原理:每次系统给出动作的时候,收集用户的y/n的信息,生成新的训练数据,对模型fine-tune。

动手实践

英文项目

官方起步项目:https://github.com/RasaHQ/starter-pack-rasa-stack

首先,按照网站上的README先安装好环境。
需要注意的文件:

  • data/nlu_data.md:训练nlu的数据。
  • data/stories.md :训练policy的数据。
  • nlu_config.yml :nlu模块相关的参数。
  • domain.yml :包括intent、entities、slots、actions、templates的定义。
  • actions.py:包括用户自定义的action代码。
  • endpoints.yml :包括和自定义网络调用相关的参数。
  • policies.yml :包括训练policy模型的参数。

中文项目

中文NLU:
Rasa NLU本身是只支持英文和德文的。中文因为其特殊性需要加入特定的tokenizer作为整个流水线的一部分。这个项目加入了jieba作为我们中文的tokenizer,这个适用于中文的rasa NLU的版本代码在github上:https://github.com/crownpku/rasa_nlu_chi

参考资料