rasaRasa

Rasa中的Tracker,Policy,Action和Agen

2019-04-24  本文已影响0人  洞渊的自习室
image

Tracker和Event

在Rasa Core中Tracker负责记录整个对话的流程,而Tracker中数据的新增、编辑和删除是通过Event进行管理的。

Policy

Policy是负责决策Action的调用在Tracker的状态发生变更之后,Policy来决定下一步的Action。

Action

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)
  2. utter actions, starting with utter_, which just sends a message to the user.
  3. custom actions - any other action, these actions can run arbitrary code

Action的自定义比较简单,只需要继承Action并提供对应方法即可。普通的Action是通过run方法来实现功能,例如讲一个笑话:

from rasa_core_sdk import Action

class ActionJoke(Action):
    def name(self):
        # define the name of the action which can then be included in training stories
        return "action_joke"

    def run(self, dispatcher, tracker, domain):
        # what your action should do
        request = requests.get('http://api.icndb.com/jokes/random').json() #make an apie call
        joke = request['value']['joke'] #extract a joke from returned json response
        dispatcher.utter_message(joke) #send the message back to the user
        return []

另一种常用的Action是FromAction,这种Action会进行表单校验,要求用户提供指定的slots:

class UserInfoForm(FormAction):
   """Example of a custom form action"""

   def name(self):
       # type: () -> Text
       """Unique identifier of the form"""

       return "userinfo_form"

   @staticmethod
   def required_slots(tracker):
       # type: () -> List[Text]
       """A list of required slots that the form has to fill"""

       return ["user_name"]

   def submit(self, dispatcher, tracker, domain):
       # type: (CollectingDispatcher, Tracker, Dict[Text, Any]) -> List[Dict]
       """Define what the form has to do
           after all required slots are filled"""

       # utter submit template
       # dispatcher.utter_template('utter_info_basic', tracker)
       response = {
               "intent": "user_info_basic",
               "slots":[
                   tracker.get_slot("user_name")
                   ]
               }
       dispatcher.utter_message(json.dumps(response))
       # dispatcher.utter_attachment(*elements)
       return []

在Action定义完成后需要在domain中添加,并且需要ActionServer来调用这些Action提供服务。

Agent

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)

Agent可以作为Rasa Core服务的入口,通过Agent来访问Rasa Core提供的功能。

上一篇下一篇

猜你喜欢

热点阅读