如何在RASA表单中为插槽添加条件以控制提问流程?
解决Rasa表单条件跳过问题
你的问题核心在于story仅用于匹配对话流程的历史路径,无法直接控制表单是否跳过某个插槽的询问。要实现「满足条件才询问对应问题,否则跳过」的逻辑,需要在表单的配置文件或自定义动作中设置条件规则,而非依赖story里的slot_was_set。
方法1:在forms.yml中配置插槽条件
在表单的required_slots字段里,为每个需要条件控制的插槽添加condition,指定只有当条件满足时,该插槽才会被触发询问。
假设你需要根据contact_prefer的值,决定是否收集phone_number或sms_number,配置示例如下:
forms: basic_info_form: required_slots: contact_prefer: - type: from_entity entity: contact_prefer phone_number: - type: from_text condition: - slot_was_set: - contact_prefer: "phone call" sms_number: - type: from_text condition: - slot_was_set: - contact_prefer: "text(SMS)"
配置完成后,表单会先收集contact_prefer,再根据其值判断是否询问对应号码插槽,不满足条件则直接跳过。
方法2:自定义表单验证类(复杂逻辑场景)
如果需要更灵活的条件判断,可以在actions.py中自定义表单验证类,重写required_slots方法动态返回需要收集的插槽:
from rasa_sdk import FormValidationAction, Tracker from rasa_sdk.executor import CollectingDispatcher from typing import Dict, List, Text, Any class ValidateBasicInfoForm(FormValidationAction): def name(self) -> Text: return "validate_basic_info_form" def required_slots( self, slots_mapped_in_domain: List[Text], dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[Text, Any], ) -> List[Text]: required_slots = ["contact_prefer"] contact_prefer = tracker.get_slot("contact_prefer") if contact_prefer == "phone call": required_slots.append("phone_number") elif contact_prefer == "text(SMS)": required_slots.append("sms_number") return required_slots
随后在domain.yml中关联这个验证动作:
forms: basic_info_form: validate: validate_basic_info_form
关键提醒
- 你现有的story代码无需修改(仅用于匹配对话流程),表单的逻辑控制完全由配置或自定义动作负责。
- 确保
domain.yml中已正确定义所有用到的插槽、意图和响应(比如询问手机号/短信号的utter动作)。
内容的提问来源于stack exchange,提问作者Rishi
相关产品推荐
相关产品推荐

