Rasa 3.6.8自定义NumberPolicy故障排查及train方法疑问
问题解答
1. 代码中导致无法正常工作的问题
- 占位符未替换:
NAME_OF_THE_ACTION是硬编码占位符,必须替换成你在domain文件中定义的实际动作名称(比如action_handle_number),否则无法找到对应动作的索引。 - 缩进错误:
if user_msg.isnumeric():语句前多了一个空格,Python对缩进严格,会触发语法错误,需修正缩进与上一行对齐。 - 必要导入缺失:代码未包含依赖模块的导入语句,需添加以下内容:
from rasa.core.policies.policy import Policy, Resource from rasa.core.domain import Domain from rasa.shared.core.trackers import DialogueStateTracker, TrackerWithCachedStates from rasa.shared.utils.common import Text, Dict, Any, Optional from rasa.core.policies.recipe import DefaultV1Recipe - 优先级可能不足:当前优先级设为6,若其他内置政策(如RulePolicy默认优先级为7)优先级更高,会先触发其他政策,导致你的自定义政策无法生效。建议将优先级调高(比如设为8),确保它先执行判断。
- 数字匹配范围有限:
isnumeric()仅匹配纯整数格式,若需支持带小数的数字(如"12.3"),需改用user_msg.replace('.', '').isnumeric()并额外判断小数点数量,或用正则匹配数字格式。
2. train方法的必要性
必须实现train方法,因为Policy是抽象类,train是抽象方法,不实现会触发TypeError。由于你标记了is_trainable=False,方法内不需要编写训练逻辑,可简化为返回空资源:
def train( self, training_trackers: List[TrackerWithCachedStates], domain: Domain, **kwargs: Any, ) -> Resource: return Resource.empty()
不能直接写pass,因为方法声明了返回类型为Resource,必须返回符合类型要求的对象。
内容的提问来源于stack exchange,提问作者Hassan Sammour
相关产品推荐
相关产品推荐

