赞
踩
Rasa是一个开源机器学习框架,用于构建上下文AI助手和聊天机器人。
Rasa有两个主要模块:
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部分:
使用*开头的语句表示用户的输入消息,我们无需使用包含某个具体内容的输入,而是使用NLU管道输出的intent和entities来表示可能的输入。需要注意的是,如果用户的输入可能包含entities,建议将其包括在内,将有助于policies预测下一步action。这部分大致包含三种形式,示例如下:
(1)*greet表示用户输入没有entity的情况;
(2)* inform{"people": "six"} 表示用户输入包含entity情况,响应这类intent为普通action;
(3)* request_weather 表示用户输入Message对应的intent为form action情况。
使用-开头的语句表示要执行动作(Action),可分为utterance actions和custom actions,其中,前者在domain.yaml中定义以utter_为前缀,比如名为greet的意图,它的回复应为utter_greet;后者为自定义动作,具体逻辑由我们自己实现,虽然在定义action名称的时候没有限制,但是还是建议以action_为前缀,比如名为inform的意图fetch_profile的意图,它的response可为action_fetch_profile。
Events也是使用-开头,主要包含槽值设置(SlotSet)和激活/注销表单(Form),它是是Story的一部分,并且必须显示的写出来。Slot Events和Form Events的作用如下:
domain,译为**“领域”**,它描述了对话机器人应知道的所有信息,类似于“人的大脑”,存储了意图intents、实体entities、插槽slots以及动作actions等信息,其中,intents、entities在NLU训练样本中定义,slots对应于entities类型,只是表现形式不同。它还包括机器能够说的templates 。
slots,即插槽,它就像对话机器人的内存,它通过键值对的形式可用来收集存储用户输入的信息(实体)或者查询数据库的数据等。
actions即bot的回应,rasa core支持3种action——default actions,utter actions和custom actions。
DefaultAction是Rasa Core默认的一组actions,我们无需定义它们,直接可以story和domain中使用。包括以下三种action:
UtterAction是以utter_为开头,仅仅用于向用户发送一条消息作为反馈的一类actions。定义一个UtterAction很简单,只需要在domain.yml文件中的actions:字段定义以utter_为开头的action即可,而具体回复内容将被定义在templates部分。
CustomAction,即自定义action,允许开发者执行任何操作并反馈给用户,比如简单的返回一串字符串,或者控制家电、检查银行账户余额等等。它与DefaultAction不同,自定义action需要我们在domain.yml文件中的actions部分先进行定义,然后在指定的webserver中实现它,其中,这个webserver的url地址在endpoint.yml文件中指定。
responses部分就是描述UtterActions具体的回复内容,并且每个UtterAction下可以定义多条信息,当用户发起一个意图,比如 “你好!”,就触发utter_answer_greet操作,Rasa Core会从该action的模板中自动选择其中的一条信息作为结果反馈给用户。
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的情况下)。
bot可以说的东西的模板字符串
一般来说,简单的chatbot的domain.yml主要包含intents、entities、actions和templates。
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。
MemoizationPolicy只记住(memorizes)训练数据中的对话。如果训练数据中存在这样的对话,那么它将以置信度为1.0预测下一个动作,否则将预测为None,此时置信度为0.0。下面演示了如何在策略配置文件config.yml文件中,配置MemoizationPlicy策略,其中,max_history(超参数)决定了模型查看多少个对话历史以决定下一个执行的action。
KerasPolicy策略是Keras框架中实现的神经网络来预测选择执行下一个action,它默认的框架使用LSTM(Long Short-Term Memory,长短期记忆网络)算法,结构为LSTM+Dense+softmax,但是我们也可以重写KerasPolicy.model_architecture函数来实现自己的框架(architecture)。
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这些信息进行特征化。
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用于对话状态追踪:
存在的问题:
对于源码中的attention模块以及lstm的输入有些不理解的地方
FormPolicy是MemoizationPolicy的扩展,用于处理(form)表单的填充事项。当一个FormAction被调用时,FormPolicy将持续预测表单动作,直到表单中的所有槽都被填满,然后再执行对应的FormAction。
MappingPolicy可用于直接将意图映射到要执行的action,从而实现被映射的action总会被执行,其中,这种映射是通过triggers属性实现的。
如果意图识别的置信度低于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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。