Rasa调用jupyter.chat函数传入TrainingResult触发model_path类型错误
Rasa Jupyter环境调用chat方法报TypeError的排查与解决
核心报错根因
从错误调用栈最底层的genericpath.exists()触发逻辑就能定位问题:os.stat()方法仅支持接收字符串、字节、PathLike类型的路径值、整数句柄,但实际传入方法的路径参数是TrainingResult类的内存对象,类型完全不匹配,和模型文件是否存在没有关系。
排查步骤
- 先定位参数错配位置:在调用
chat()之前增加两行校验代码
运行后如果打印出的类型是print(type(model_path)) print(model_path) chat(model_path, endpoints)<class 'rasa.model_training.TrainingResult'>,即可完全确认是传参类型错配。 - 这种错配90%以上出现在Notebook连续调试场景:写代码时直接把
rasa.train()方法的返回值(也就是TrainingResult内存对象)赋值给了model_path字段,没有把内存对象转换成实际的模型文件路径。
解决方法
分两种场景处理:
- 场景1:训练已经完成、模型已经导出到本地
直接去项目根目录下的models/文件夹,找到训练生成的.tar.gz格式模型包,把完整的字符串路径赋值给model_path即可,不要传内存里的训练结果对象:model_path = "models/20240612-160500.tar.gz" endpoints = "endpoints.yml" chat(model_path, endpoints) - 场景2:在Notebook里连续执行训练、调试流程
不需要手动翻找models文件夹,直接从TrainingResult对象的内置字段里取路径即可——Rasa的TrainingResult实例本身就带有.model属性,存的就是导出模型的真实字符串路径:# 执行训练流程 train_res = rasa.train( domain="domain.yml", config="config.yml", training_files="data/" ) # 从训练结果中取出合法的路径字符串 model_path = train_res.model endpoints = "endpoints.yml" chat(model_path, endpoints) - 兜底校验:传参之前手动跑一次
os.path.exists(model_path),确认值的类型是字符串、且路径真实存在,避免后续出现路径找不到的报错。
内容的提问来源于stack exchange,提问作者shizra tariq
相关产品推荐
相关产品推荐

