Action
类是任何自定义操作的基类,要定义自定义操作,请创建Action
类的子类,并需要重写两个必须的方法name
和run
。Action Server 在收到运行操作的请求时,会根据name
方法返回值调用操作。
基础班的自定义操作如下所示:
class MyCustomAction(Action):
def name(self) -> Text:
return "action_name"
async def run(
self,
dispatcher,
tracker: Tracker,
domain: Dict[Text, Any],
) -> List[Dict[Text, Any]]:
return []
1. 方法
1.1 name
name
方法定义操作的名称,此方法返回的名称是机器人在域文件中使用的名称。
1.2 run
run
方法执行操作的副作用,返回的是rasa_sdk.events.Event
实例列表,以下是参数的解释:
dispatcher
:用于将消息发送回用户的调度程序,请使用dispatcher.utter_messages
或任何其他rasa_sdk.executor.CollectingDispatcher
方法tracker
:当前用户的状态跟踪器,我们可以使用tracker.get_slot(slot_name)
访问插槽的值,使用tracker.latest_messages.text
获取最新的用户消息,和任何其他rasa_sdk.Tracker
属性domain
:机器人的领域2. 示例
在餐厅机器人中,如果用户说“给我看看墨西哥餐厅”,机器人可以执行ActionCheckRestaurants
操作,它可能如下所示: ```python from typing import Text, Dict, Any, List from rasa_sdk import Action from rasa_sdk.events import SlotSet
class ActionCheckRestaurants(Action): def name(self) -> Text: return “action_check_restaurants”
def run(self,
dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
cuisine = tracker.get_slot('cuisine')
q = "select * from restaurants where cuisine='{0}' limit 1".format(cuisine)
result = db.query(q)
return [SlotSet("matches", result if result is not None else [])]
``` 此操作查询数据库以查找与请求的美食匹配的餐厅,并使用找到的餐厅列表来设置匹配插槽的值。