Agent将Rasa Core的功能通过API开放出来,像模型训练,对话处理等都可以通过Agent完成,一个模型训练的例子:
import sys
from rasa_core.policies.keras_policy import KerasPolicy
from rasa_core.agent import Agent
if len(sys.argv) < 3:
print("请指定数据路径和模型的存储名称")
exit()
domain = "{}/domain.yml".format(sys.argv[1])
stories = "{}/data/stories.md".format(sys.argv[1])
dialogue = "{}/models/{}".format(sys.argv[1], sys.argv[2])
agent = Agent(domain, policies=[KerasPolicy(validation_split=0.0,epochs=400)])
training_data = agent.load_data(stories)
agent.train(training_data)
agent.persist(dialogue)
rasa core的主要功能是实现:对话追踪 & 对话管理的任务
简单理解为把 对话的过程记录下来
主要涉及 tracker 、event类
在Rasa Core中Tracker负责记录整个对话的流程,而Tracker中数据的新增、编辑和删除是通过Event进行管理的。
Events用于描述一个对话过程中任何可能发生的事情。简单来说,Event就是对bot一切行为的抽象。
{'event': 'user', 'timestamp': 1576028292.7156482, 'text': ' 文本审核',
'parse_data': {
'intent': {'name': 'request_search_TextsReviews', 'confidence': 0.9437154531478882},
'entities': [],
'intent_ranking': [{'name': 'request_search_TextsReviews', 'confidence': 0.9437154531478882}, {'name': 'query_attendance_rules', 'confidence': 0.13368795812129974}, {'name': 'request_search_EA', 'confidence': 0.12188508361577988}, {'name': 'inform_people_conference', 'confidence': 0.11569312959909439}, {'name': 'inform_time_conference', 'confidence': 0.0498206689953804}, {'name': 'confirm', 'confidence': 0.0410604402422905}, {'name': 'greet', 'confidence': 0.01581529527902603}, {'name': 'request_search_conference', 'confidence': 0.0}, {'name': 'inform_floor_conference', 'confidence': 0.0}, {'name': 'confirm + goodbye', 'confidence': 0.0}], 'text': '文本审核'},
'input_channel': 'cmdline'},
rasa-core内部实现了以下Event
Event对象是Rasa Core描述会话中发生的所有事件和明确rasa.core.trackers.DialogueStateTracker该如何更新其状态的基类,因此不能被直接使用,而是通过它包含的具体事件(event)实现。
(1)通用事件
(2)自动跟踪事件
tracker类的init
def __init__(self, sender_id, slots,
max_event_history=None):
"""Initialize the tracker.
A set of events can be stored externally, and we will run through all
of them to get the current state. The tracker will represent all the
information we captured while processing messages of the dialogue."""
# 可以跟踪的最长历史,tracker记录状态是以event为单位的
self._max_event_history = max_event_history
self.events = self._create_events([]) # 历史事件列表
self.sender_id = sender_id # 这个id和rasa的chenel特性有关系
self.slots = {slot.name: copy.deepcopy(slot) for slot in slots} # slot列表
###
# current state of the tracker - MUST be re-creatable by processing
# all the events. This only defines the attributes, values are set in
# `reset()`
###
self._paused = None # 暂停标志
# 一些action记录
self.followup_action = ACTION_LISTEN_NAME
self.latest_action_name = None
self.latest_message = None
self.latest_bot_utterance = None # bot的上一个返回内容
self._reset()
Policy是负责决策Action的调用在Tracker的状态发生变更之后,Policy来决定下一步的Action。
这个对象的主要作用是设计了各种魔法函数,处理不同类型的bot输出,并将其输出到OutputChannel中。看一下它的成员方法就能知道它的作用:
这个对象是对话系统的核心处理模块。它通过execute_action完成bot处理对话的流程。
这里需要注意一点,在processor执行action之前,agent将会调用processor的log_message方法,使用nlu_interpreter来对用户发送的文本做实体识别和意图识别,然后将信息保存在tracker中,这个逻辑比较简单,nlu模块也在前一篇文章中详细解析过了,因此这里就不详细展开了。
在多轮对话过程中全程记录对话状态信息。这个对象在开发自己的对话系统时,作用可是非常大的。很多对话状态信息,都可以从它这里得到。当然, 我们并不能直接去读写其定义的成员变量信息,需要通过其成员方法来操作成员变量,例如current_sate(),其核心内容如下:
Action是对用户输入的一种回应:
Actions are the things your bot runs in response to user input. There are three kinds of actions in Rasa Core:
(1)default actions (action_listen, action_restart, action_default_fallback)
rasa系统内置的粒度较小的action。与rasa_sdk中的action不同,这个是直接在rasa_core/actions下面的。相对于上面的form action来说,这里的action功能更单一,与events比较像,但是还是略有不同,下面举个实例ActionRestart:
所有default action的列表如下,它们的命名都非常简单直接: