rasa core模块提供了一种交互学习(interactive learning)用来获取所需要的样本数据,可以减少人工构建story时一些考虑不周的问题。在interactive learning时,用户向机器人提供反馈,然后用于生成样本数据。
python -m rasa run actions --port 5055 --actions actions --debug
(1)已有训练好的模型
python -m rasa interactive -m models/20200713-092634.tar.gz --endpoints endpoints.yml --config config.yml
(2)没有训练好的模型,rasa会先训练好模型,然后再开启交互式会话
或者(没有已训练模型情况),rasa会先训练好模型,再开启交互式学习会话
python -m rasa interactive --data /data --domain domain.yml --endpoints endpoints.yml --config config.yml
交互界面如图所示:
结束后,在story.md中会生成一个story,如图所示:
知识库能存储领域性知识,利用知识库可以为rasa定制个性化的解答。rasa与知识库的交互流程大概是,首先Rasa先解析消息,然后使用自定义的actions检索知识库,然后将得到的领域知识合并到回复中。以官方给出的bank bot为例,一个与知识库交互的rasa项目流程如下:
知识库可以用来标识领域知识。通常,会使用图数据库来表示这种知识。图数据库以实体(有时候叫做nodes)、属性、关系的形式来存储数据。图数据库的种类有很多,如neo4j、grakn、graphDB等,官方给出的bank bot采用的是grakn存储知识。在知识库中存储知识时,我们需要考虑:
banking bot有四个实体:bank,person,account,card。每个实体都具有一些属性。比如bank实体有name和headquarters属性。
banking bot的新intent是通用的。但是,实体是特定的。如果把意图设定为通用,模型会变得非常的灵活,这样就没有必要针对添加到知识库中的每一个新的实体都创建新的意图,只需要添加更多的示例到某个意图中。
比如创建新的intent——query attribute,表示用户想要知道某个实体更多的细节,询问那个实体特定的属性。
bank bot为每个意图定义了一个自定义操作,因为每个意图都要求你以不同的方式查询知识库。一个新建的story如下所示:
## happy path * greet - utter_greet * query_entities - action_query_entities - slot{"entity_type": "bank"} * compare_entities - action_compare_entities * query_entities - action_query_entities - slot{"entity_type": "transaction"} * query_attribute - action_query_attribute * query_attribute - action_query_attribute * resolve_entity - action_resolve_entity * bye - utter_goodbye
在定义了新的意图和故事之后,需要在你的domain文件中添加新意图,行为,和实体。
为了检索知识库,我们需要定义一些action去执行这些操作,以action_query_attribute为例说明如何自定义一个新的action。
为了写自定义action(custom action),你需要集成Action类,并重写name和run函数。name方法需要返回action的名字。
查询知识库的代码集成到了GraphDatabase类中,在action的run函数中要先初始化GraphDatabase。
action可以通过slot槽中的关键词去知识库中检索相应的知识,并返回给用户。
https://github.com/RasaHQ/tutorial-knowledge-base