type
status
date
slug
summary
tags
category
icon
password
大三的时候,完成作业的过程中,发现关于RASA的资料要不就是很散,要不就是资料过旧,找资料非常艰难,这篇文章简单介绍了RASA Core的Slot部分,与多轮对话有关,希望能帮到你
Slots
- Slots,槽值,相当于机器人的内存(memory),它们以键值对的形式存在,用于存储用户输入时消息时比较重要的信息,而这些信息将为Action的执行提供关键数据。Slots的定义位于
domain.yaml
文件中
- 它们通常与Entities相对应,即Entities有哪些,Slots就有哪些,并且Slots存储的值就是NLU模型提取的Entities的值。
- 这个例子中,定义了一个名为:object_type的槽(对应object_type实体),类型位text,预定义槽映射
from_entity
。
type: from_entity
表示该槽位的值来自于一个实体(entity),并且这个实体被指定为 object_type。
槽和对话行为
- 你可以使用
influence_conversation
属性来指定槽是否影响对话。如果想在槽中存储信息而不影响对话,请在定义槽时设置influence_conversation: false
。
- 以下示例定义了一个
age
槽,它将存储有关用户年龄的信息,但不会影响对话的流程。这意味着对话机器人每次预测下一个动作时都会忽略槽的值。
- 定义槽时,如果你省略了
influence_conversation
或将其设置为true
,则该槽将影响下一个动作预测,除非它的槽类型为any
。槽影响对话的方式将取决于槽的类型。
- 以下示例定义了一个影响对话的
home_city
槽。text
槽将根据槽是否具有值来影响对话机器人的行为。text
槽的特定值(例如:Bangalore 或 New York 或 Hong Kong)没有任何区别。
- 例如,考虑两个输入“What is the weather like?”和“What is the weather like in Bangalore?”。对话应该根据
home_city
槽是否由 NLU 自动设置而进行区分。如果槽已经设置,对话机器人可以预测action_forecast
动作。如果没有设置槽,则需要先获取home_city
信息才能预测天气,否则还是会询问Home_city
信息
槽类型
文本类型槽
- 类型
text
- 用途
存储文本值
- 示例
布尔类型槽
- 类型
bool
- 用途
存储
ture
或 false
值。- 示例
分类型槽
- 类型
categorical
- 用途
存储 N 个可选值之一的槽,类似于枚举
- 示例
浮点类型槽
- 类型
float
- 用途
存储实数
- 示例
- 默认值
- 低于min_value时,取min_value;超过max_value时,取max_value。
max_value=1.0
,min_value=0.0
列表类型槽
- 类型
list
- 用途
存储列表值
- 示例
比如说“我想买牙膏牙刷牙缸”那么这三个物品就是
shopping_item
- 描述
- 如果
influence_conversation
设置为true
,对话机器人的行为将根据列表是否为空而改变。存储在槽中的列表长度不会影响对话。 - 只有列表长度是零还是非零才重要。
任意类型槽
- 类型
any
- 用途
存储任意数据(可以为任意类型,例如:词典或列表)
- 示例
- 描述
any
类型槽在对话期间总是被忽略。对于此槽类型,
influence_conversation
属性不能设置为 true
。自定义槽类型
这里单独开个板块讨论
槽填充
通过初始化(domain.yml)
- 在domain.yaml文件中声明slots时,可以通过
initial_value
字段为当前slot提供一个初始值,也就是说,当会话开始时,被设定初始值的slot已经被填充好
通过NLU设置(stories.yml)
- 槽事件通过
slot_was_set
键进行指定,同时带有槽的名称和可选的槽值。
- 例如:
这意味着故事要求
feedback_value
槽的值为 positive
,对话才能够继续。- 这段代码描述了一个用户意图搜索场所的流程。用户表达了
search_venues
的意图,系统执行了action_search_venues
的行动,并在这个过程中设置了venues
槽位,存储了搜索到的场所信息(名为 "Big Arena",评分为 4.5)。这样的故事通常用于训练对话系统,让系统学会在接收到特定意图时执行相应的行动,并返回正确的信息。
- 是否需要包含槽的值取决于槽类型以及该值是否可以或应该影响对话。如果值无关紧要,例如:
text
槽,你可以只列出槽的名称,默认情况下,任何槽的初始值为null
通过点击按钮
按钮列表中的每个按钮都应该有两个键:
title
:按钮上显示的文本。
payload
:单击按钮时从用户发送给助手的消息。
这段代码定义了一个名为
utter_greet
的响应,该响应是对话系统中的一个组件,用于与用户进行交互。这里详细解释每一部分:- utter_greet
这是响应的名称。在对话系统的代码中,你可以通过引用这个名称来触发这个响应。
- text
text
字段定义了响应的主要文本内容,这里是向用户问候:“Hey! How are you?”。- buttons
buttons
字段定义了一个按钮列表,这些按钮将作为响应的一部分展示给用户。用户可以通过点击这些按钮来与对话系统进一步交互。- title: "great"
- 这是按钮上显示的文本,用户可以看到并点击它。
- payload: "/mood_great"
- 当用户点击这个按钮时,系统会接收到一个
/mood_great
的payload。这个payload通常用于触发对话系统的下一个动作或状态转移。
以
/
开头的消息直接发到RegexInterpreter
,它需要简写的/intent{entities}
格式的NLU输入。- 在上述示例中,如果用户单击按钮,则用户输入将直接分类为
mood_great
或mood_sad
意图。
- 你可以使用如下各式包含意图传递给
RegexInterpreter
的实体:
/inform{"ORG":"Rasa", "GPE":"Germany"}
RegexInterpreter
将根据意图对上述信息进行分类,并提取分别为ORG
和GPE
类型的实体Rasa
和Germany
。
通过Actions(actions.py)
- 这段代码定义了一个名为
ActionSearchVenues
的类,该类继承自Action
。在对话系统中,Action
类通常代表可以执行的操作或任务。在这个特定的类中,它代表搜索场所(venues)的操作。
- 下面是这段代码的详细解释:
- 方法 name
- 这个方法返回这个操作的名称,即
"action_search_venues"
。在对话系统中,这通常用于标识和引用这个特定的操作。 - 方法 run
run
方法是执行实际操作的地方。它接收三个参数:dispatcher
、tracker
和domain
。dispatcher
:用于发送消息到前端或用户界面。tracker
:包含了对话的当前状态,包括之前的对话历史、用户输入的槽位值等。domain
:定义了对话系统的领域和槽位信息。- 这里定义了一个
venues
列表,包含两个场所的信息,每个场所都有名称和评分。 - 使用
dispatcher
发送一条消息到前端,告诉用户已经找到了一些场所。 - 通过列表推导式和
join
方法,创建一个字符串,其中包含了所有场所的名称,并用逗号分隔。 - 使用
dispatcher
发送上一步创建的包含场所名称的字符串到前端。 - 最后,使用
SlotSet
创建一个槽位设置,将venues
列表设置为venues
槽位的值,并返回这个槽位设置。这表示对话系统现在知道venues
槽位包含哪些场所的信息,并且可以在后续的对话中使用这些信息。 - 这个
ActionSearchVenues
类定义了一个操作,用于搜索场所,并将搜索到的场所信息设置为venues
槽位的值。同时,它还通过dispatcher
向用户发送了找到场所的消息。
获取槽值
从Response中获取(domain.yaml)
- 在domain.yaml的responses部分,可以通过
{slotname}
的形式获取槽值
从Action中获取(actions.py)
这段代码定义了一个名为
ActionShowConcertReviews
的类,它继承自 Action
类。这个类代表一个动作,用于显示音乐会(concerts)的评论。下面是对这段代码的详细解释:- 这行代码从
tracker
中获取名为 "concerts" 的槽位的值,并将其存储在concerts
变量中。这个槽位可能存储了用户之前输入的音乐会信息。
- 使用
dispatcher
发送一条消息到前端,显示从槽位中获取的 "concerts" 信息。这里使用了 f-string(格式化字符串字面量)来插入concerts
变量的值。
- 最后,
run
方法返回一个空列表。在对话系统中,这通常意味着这个操作没有设置任何槽位或触发任何后续操作。这个操作只是简单地显示信息,并不涉及到更新对话状态或触发其他动作。
Tracker,可理解为跟踪器,作用是以会话会话的形式维护助手和用户之间的对话状态。
通过Tracker,能够轻松获取整个对话信息,其中就包括Slot的值。
那么下面这个对话就会变得非常的清晰:
- 故事描述:compare_reviews_concerts
- 步骤 1:
- intent: search_concerts
- 步骤 2:
- action: action_search_concerts
- 步骤 3:
- slot_was_set: concerts
- 步骤 4:
- intent: compare_reviews
- 步骤 5:
- action: action_show_concert_reviews
用户表达了搜索音乐会的意图(intent)。这通常意味着用户输入了一些文本,对话系统识别出这些文本表达的是搜索音乐会的意愿。
对话系统响应了用户的意图,执行了
action_search_concerts
动作。这个动作可能是搜索音乐会,并可能设置一些槽位(slots),如音乐会名称、艺术家等。在执行
action_search_concerts
动作后,系统设置了 concerts
槽位。槽位中存储的信息是 {"artist": "Foo Fighters", "reviews": 4.5}
,这表明搜索到的一个音乐会是由 Foo Fighters 演出的,并且它的评分是 4.5。接下来,用户表达了比较评论的意图。这可能意味着用户想要进一步了解之前搜索到的音乐会(或可能是其他音乐会)的评论,以便进行比较。
对话系统响应了用户的意图,执行了
action_show_concert_reviews
动作。这个动作应该是用来显示之前搜索到的音乐会的评论,或者是基于当前对话上下文的某个音乐会列表的评论。(多轮对话)📎 参考文章
- 官方文档
- 引用文章
- Author:Chailyn
- URL:https://own.chailyncui.blog/article/RASA-Slots
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts