如何从 Rasa 表单中提取插槽
How to extract slot from Rasa form
我向我的 rasa 机器人添加了一个表单。 rasa bot 在没有表单的情况下运行良好,但在添加表单时出现错误“无法通过操作 form_search_scholarship 提取插槽 SEARCH_NAME”。我不知道我错过了什么,因为我尝试了不同的变体。
domain.yml
...
entities:
- SEARCH_NAME
- SEARCH_KEYWORD
slots:
SEARCH_KEYWORD:
type: text
SEARCH_NAME:
type: text
...
stories.yml
## keyword search path
* menu
- utter_menu
* search_scholarship
- utter_search
* keyword_search_scholarship
- form_search_keyword
- form{"name": "form_search_keyword"}
- form{"name": null}
## scholarship name search path
* menu
- utter_menu
* search_scholarship
- utter_search
* scholarship_name_search
- form_search_scholarship
- form{"name": "form_search_scholarship"}
- form{"name": null}
actions.py
class ActionFormSearchKeyword(FormAction):
def name(self) -> Text:
"""Unique identifier of the form"""
return "form_search_keyword"
@staticmethod
def required_slots(tracker: Tracker) -> List[Text]:
"""A list of required slots that the form has to fill"""
return ["SEARCH_KEYWORD", ]
def submit(
self,
dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any],
) -> List[Dict]:
"""Define what the form has to do
after all required slots are filled"""
# utter submit template
dispatcher.utter_message(template="utter_search_found", search_result=tracker.get_slot('SEARCH_KEYWORD'),
search=tracker.get_slot('SEARCH_KEYWORD'))
# # utter submit template
# dispatcher.utter_message(template="utter_search_not_found", search_result=tracker.get_slot('SEARCH_KEYWORD'),
# search=tracker.get_slot('SEARCH_KEYWORD'))
return []
def slot_mappings(self) -> Dict[Text, Union[Dict, List[Dict]]]:
"""A dictionary to map required slots to
- an extracted entity
- intent: value pairs
- a whole message
or a list of them, where a first match will be picked"""
return {
"search_result": [self.from_entity(entity="SEARCH_KEYWORD"),
self.from_text()],
}
很难说出确切的问题是什么(查看 form_search_scholarship 操作代码会有所帮助,因为那是错误的来源)但我猜你可能没有正确提取名称来自输入文本的实体。这往往是您会看到此错误的最常见原因。
要解决此问题,我会:
- 运行
rasa nlu
在命令行输入打开助手失败。查看是否正确提取了预期的实体
- 如果不是,那可能是您的问题。我会推荐额外的额外训练数据(如果你有一份奖学金名单,我可能会使用查找 table:https://blog.rasa.com/improving-entity-extraction/)
- 如果 NLU 正确地提取了它,那么问题出在其他地方,您需要做更多的挖掘工作;如果没有训练数据 + 其他形式的代码,很难说确切的问题是什么。
我向我的 rasa 机器人添加了一个表单。 rasa bot 在没有表单的情况下运行良好,但在添加表单时出现错误“无法通过操作 form_search_scholarship 提取插槽 SEARCH_NAME”。我不知道我错过了什么,因为我尝试了不同的变体。
domain.yml
...
entities:
- SEARCH_NAME
- SEARCH_KEYWORD
slots:
SEARCH_KEYWORD:
type: text
SEARCH_NAME:
type: text
...
stories.yml
## keyword search path
* menu
- utter_menu
* search_scholarship
- utter_search
* keyword_search_scholarship
- form_search_keyword
- form{"name": "form_search_keyword"}
- form{"name": null}
## scholarship name search path
* menu
- utter_menu
* search_scholarship
- utter_search
* scholarship_name_search
- form_search_scholarship
- form{"name": "form_search_scholarship"}
- form{"name": null}
actions.py
class ActionFormSearchKeyword(FormAction):
def name(self) -> Text:
"""Unique identifier of the form"""
return "form_search_keyword"
@staticmethod
def required_slots(tracker: Tracker) -> List[Text]:
"""A list of required slots that the form has to fill"""
return ["SEARCH_KEYWORD", ]
def submit(
self,
dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any],
) -> List[Dict]:
"""Define what the form has to do
after all required slots are filled"""
# utter submit template
dispatcher.utter_message(template="utter_search_found", search_result=tracker.get_slot('SEARCH_KEYWORD'),
search=tracker.get_slot('SEARCH_KEYWORD'))
# # utter submit template
# dispatcher.utter_message(template="utter_search_not_found", search_result=tracker.get_slot('SEARCH_KEYWORD'),
# search=tracker.get_slot('SEARCH_KEYWORD'))
return []
def slot_mappings(self) -> Dict[Text, Union[Dict, List[Dict]]]:
"""A dictionary to map required slots to
- an extracted entity
- intent: value pairs
- a whole message
or a list of them, where a first match will be picked"""
return {
"search_result": [self.from_entity(entity="SEARCH_KEYWORD"),
self.from_text()],
}
很难说出确切的问题是什么(查看 form_search_scholarship 操作代码会有所帮助,因为那是错误的来源)但我猜你可能没有正确提取名称来自输入文本的实体。这往往是您会看到此错误的最常见原因。
要解决此问题,我会:
- 运行
rasa nlu
在命令行输入打开助手失败。查看是否正确提取了预期的实体 - 如果不是,那可能是您的问题。我会推荐额外的额外训练数据(如果你有一份奖学金名单,我可能会使用查找 table:https://blog.rasa.com/improving-entity-extraction/)
- 如果 NLU 正确地提取了它,那么问题出在其他地方,您需要做更多的挖掘工作;如果没有训练数据 + 其他形式的代码,很难说确切的问题是什么。