【RASA】Core模块

Rasa是一个开源机器学习框架,用于构建上下文AI助手和聊天机器人。

Rasa有两个主要模块:

  • Rasa NLU:用于理解用户消息,包括意图识别和实体识别,它会把用户的输入转换为结构化的数据。
  • Rasa Core:是一个对话管理平台(同时处理多个对话,互不干扰|上下文信息会存储到如redis中,进行管理),用于举行对话和决定下一步做什么。

story.md解析

Rasa的故事是一种训练数据的形式,用来训练Rasa的对话管理模型。故事是用户和人工智能助手之间的对话的表示,转换为特定的格式,其中用户输入表示为相应的意图(和必要的实体),而助手的响应表示为相应的操作名称。Rasa核心对话系统的一个训练示例称为一个故事。

 example:

 <!-- ##表示story的描述,没有实际作用 -->

## greet + location/price + cuisine + num people

 * greet

    - utter_greet

 * inform{"location": "rome", "price": "cheap"}

    - action_on_it

   - action_ask_cuisine

* inform{"cuisine": "spanish"}

   - action_ask_numpeople    

* inform{"people": "six"}

   - action_ack_dosearch

<!-- Form Action-->

## happy path 

* request_weather

    - weather_form

   - form{"name": "weather_form"}

   - form{"name": null}

其中story.md中主要包含3部分:

1、messages

使用*开头的语句表示用户的输入消息,我们无需使用包含某个具体内容的输入,而是使用NLU管道输出的intent和entities来表示可能的输入。需要注意的是,如果用户的输入可能包含entities,建议将其包括在内,将有助于policies预测下一步action。这部分大致包含三种形式,示例如下:

(1)*greet表示用户输入没有entity的情况;

(2)* inform{"people": "six"} 表示用户输入包含entity情况,响应这类intent为普通action;

(3)* request_weather 表示用户输入Message对应的intent为form action情况。

2、actions

使用-开头的语句表示要执行动作(Action),可分为utterance actions和custom actions,其中,前者在domain.yaml中定义以utter_为前缀,比如名为greet的意图,它的回复应为utter_greet;后者为自定义动作,具体逻辑由我们自己实现,虽然在定义action名称的时候没有限制,但是还是建议以action_为前缀,比如名为inform的意图fetch_profile的意图,它的response可为action_fetch_profile。

3、events

Events也是使用-开头,主要包含槽值设置(SlotSet)和激活/注销表单(Form),它是是Story的一部分,并且必须显示的写出来。Slot Events和Form Events的作用如下:

domain.yml解析:

domain,译为**“领域”**,它描述了对话机器人应知道的所有信息,类似于“人的大脑”,存储了意图intents、实体entities、插槽slots以及动作actions等信息,其中,intents、entities在NLU训练样本中定义,slots对应于entities类型,只是表现形式不同。它还包括机器能够说的templates 。

1、intent

2、entities

3、slots

slots,即插槽,它就像对话机器人的内存,它通过键值对的形式可用来收集存储用户输入的信息(实体)或者查询数据库的数据等。

4、actions

actions即bot的回应,rasa core支持3种action——default actions,utter actions和custom actions。

DefaultAction是Rasa Core默认的一组actions,我们无需定义它们,直接可以story和domain中使用。包括以下三种action:

  • action_listen:监听action,Rasa Core在会话过程中通常会自动调用该action;
  • action_restart:重置状态,比初始化Slots(插槽)的值等;
  • action_default_fallback:当Rasa Core得到的置信度低于设置的阈值时,默认执行该action。

UtterAction是以utter_为开头,仅仅用于向用户发送一条消息作为反馈的一类actions。定义一个UtterAction很简单,只需要在domain.yml文件中的actions:字段定义以utter_为开头的action即可,而具体回复内容将被定义在templates部分。

 CustomAction,即自定义action,允许开发者执行任何操作并反馈给用户,比如简单的返回一串字符串,或者控制家电、检查银行账户余额等等。它与DefaultAction不同,自定义action需要我们在domain.yml文件中的actions部分先进行定义,然后在指定的webserver中实现它,其中,这个webserver的url地址在endpoint.yml文件中指定。

5、forms

6、responses

responses部分就是描述UtterActions具体的回复内容,并且每个UtterAction下可以定义多条信息,当用户发起一个意图,比如 “你好!”,就触发utter_answer_greet操作,Rasa Core会从该action的模板中自动选择其中的一条信息作为结果反馈给用户。

7、sess_config

session_config,即会话配置,这部分的作用为配置一次会话(conversation session)是否有 超时限制。 举例来说:

session_config:

carry_over_slots_to_new_session: true

  session_expiration_time: 60

每次会话的超时时间为60s,如果用户开始一段会话后,在60s内没有输入任何信息,那么这次会话将被结束,然后Bot又会开启一次新的会话,并将上一次会话的Slot值拷贝过来。当然,我们希望舍弃上一次会话Slot的值,可以将carry_over_slots_to_new_session设置为false。另外,当session_expiration_time被设置为0时,Bot永远不会结束当前会话并一直等待用户输入(注:执行action_session_start仍然可以开始一次新的会话,在设置为0的情况下)。

8、templates

bot可以说的东西的模板字符串

一般来说,简单的chatbot的domain.yml主要包含intents、entities、actions和templates。

policies说明:

Policies是Rasa Core中的策略模块,对应类rasa_core.policies.Policy,它的作用就是使用合适的策略(Policy)来预测一次对话后要执行的行为(Actions)。预测的原理是衡量命中的哪些Policies哪个置信度高,由置信度高的Policy选择合适的Action执行。假如出现不同的Policy拥有相同的置信度,那么就由它们的优先级决定,即选择优先级高的Policy。Rasa对提供的Policies进行了优先级排序,具体如下表:

每一轮对话中,定义在配置文件中的每个policy在预测下一个action的时候都会有对应的置信度。如果两个策略得到相同的置信度(比如,memorization和mapping policy的置信度总是1或0),将会考虑到policies的优先级。rasa policies为各个policy设定了默认优先级。大的数值意味着更高的优先级,所以一般情况下不会同时使用同一优先级的policy。

memoization policy

MemoizationPolicy只记住(memorizes)训练数据中的对话。如果训练数据中存在这样的对话,那么它将以置信度为1.0预测下一个动作,否则将预测为None,此时置信度为0.0。下面演示了如何在策略配置文件config.yml文件中,配置MemoizationPlicy策略,其中,max_history(超参数)决定了模型查看多少个对话历史以决定下一个执行的action。

keras policy

KerasPolicy策略是Keras框架中实现的神经网络来预测选择执行下一个action,它默认的框架使用LSTM(Long Short-Term Memory,长短期记忆网络)算法,结构为LSTM+Dense+softmax,但是我们也可以重写KerasPolicy.model_architecture函数来实现自己的框架(architecture)。

embedding policy

EmbeddingPolicy,即循环嵌入式对话策略(Recurrent Embedding Dialogue Policy,REDP),它通过将actions和对话状态嵌入到相同的向量空间(vector space)能够获得较好的效果,REDP包含一个基于改进的Neural Turing Machine的记忆组件和注意机制,在该任务上显著优于基线LSTM分类器。

目前rasa版本里面embedding policy被替换为了ted policy,ted policy是transformer embedding policy,采用的是transformer结构。

  

redp框架主要目的便是计算dialogue states和system actions的表征,因此在inference阶段,将当前dialogue states的表征和所有候选system actions的表征计算相似度,并选择最高的actions作为输出,并根据action的不同进行下一步动作。

论文中将结构分为4个部分,分别为: 

featurization:第一步是将user input,slot,system action这些信息进行特征化。

  • user input主要是nlu模块得到的intent和entity信息;
  • system actions将action名字中的词作为特征(比如action_search_restaurant = {action, search, restaurant}),这些特征因为都是词,所以各自都使用bag-of-words的方法进行表征;
  • slot信息将使用一个bianry vector进行表征,各个维度上代表的slot信息出现了就是1否则为0。

embedding layer

对于user input, slots, system actions来说,embedding layer的参数各不相同,它是个dense layer。

attention

由于未来的对话是未知的,这里面的attention只能用之前时刻的信息作为输入,该模块使用的是一个修改版本的NTM,attention机制采用的是tensorflow自带的BahdanauAttention(tf.contrib.seq2seq.BahdanauAttention)。并且,针对user memory和system memory上的attention,分别使用了两个不同的模块。 

lstm

lstm用于对话状态追踪:

  • 输入: user memory attention之后的结果与embedded user input相加,而后再将embedded slots vector拼接成一个向量作为LSTM当前轮的输入向量;
  • 输出:LSTM的输出向量(隐层接一个dense layer)与system memory attention的结果进行相加,这个作为当前轮的dialogue state embedding。
  • 得到当前轮的dialogue state embedding后,会存入LSTM state中,并且会将所有前面轮数的相应dialogue state embedding与system memory attention中的二值化的attention权值进行相乘,从而可以实现在维护的所有历史state中进行跳转的目的(即跳转到历史的任意一轮的对话state中)。 

存在的问题:

对于源码中的attention模块以及lstm的输入有些不理解的地方

  • 源码中的两块attention的输入分别是embed_utter和embed_prev_action,对于这两部分是否是user memory和system memory存在疑问。

form policy

FormPolicy是MemoizationPolicy的扩展,用于处理(form)表单的填充事项。当一个FormAction被调用时,FormPolicy将持续预测表单动作,直到表单中的所有槽都被填满,然后再执行对应的FormAction。

mapping policy

MappingPolicy可用于直接将意图映射到要执行的action,从而实现被映射的action总会被执行,其中,这种映射是通过triggers属性实现的。

  

fallback policy

如果意图识别的置信度低于nlu_threshold,或者没有任何对话策略预测的action置信度高于core_threshold,FallbackPolicy将执行fallback action。就是对话机器人意图识别和action预测的置信度没有满足对应的阈值,该策略将使机器人执行指定的默认action。

参考文档

recurrent embedding dialogue policy:https://arxiv.org/pdf/1811.11707.pdf 

transformer embedding policy: https://arxiv.org/pdf/1910.00486.pdf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值