从DialogFlow迁移至Rasa遇NLU训练错误及Top3意图匹配需求
问题
现有一款基于DialogFlow的聊天机器人,后端采用Python开发、前端为React.js,运行状态良好。需求是当意图匹配置信度低于0.7时返回Top3匹配结果,但DialogFlow不支持该功能,因此计划迁移至开源框架Rasa。执行rasa train nlu步骤时出现错误提示:
Path 'data' doesn't contain valid NLU data in it. Please verify the data format. The NLU model training will be skipped now.
尝试给导出的JSON文件添加'responses' = []后仍报错,推测是因为意图未配置响应、而是关联数据库获取响应所致。想咨询三个问题:
- 能否仅使用训练示例和意图名称训练Rasa NLU模型?
- 是否有可将DialogFlow JSON文件转换为Rasa YAML格式的脚本(已使用rasa convert脚本但出现相同错误)?
- 有没有更简便的方法实现Top3意图匹配?
回答
1. 能否仅用训练示例和意图名训练Rasa NLU?
完全可以。Rasa NLU的核心就是通过意图示例训练意图分类模型,不需要绑定响应配置。只要训练数据格式符合Rasa要求——每个意图包含intent名称和examples列表(用户输入样本),不需要responses字段,就能正常训练。
比如标准的Rasa NLU YAML格式:
nlu: - intent: query_order_status examples: | - 我的订单到哪了 - 查一下订单物流 - 订单什么时候送达 - intent: cancel_order examples: | - 我要取消订单 - 帮我退掉这个订单
直接执行rasa train nlu即可完成训练,后续可在后端调用Rasa接口获取意图置信度,再自行从数据库拉取响应内容。
2. DialogFlow转Rasa YAML的脚本方案
官方rasa convert工具报错,大概率是因为导出的DialogFlow JSON缺少Rasa默认期望的字段(比如响应)。你可以自己写一个简单的Python脚本,只提取意图和训练示例:
import json import yaml # 读取DialogFlow导出的JSON文件 with open('dialogflow_intents.json', 'r', encoding='utf-8') as f: df_data = json.load(f) rasa_nlu_data = {'nlu': []} for intent in df_data['intents']: intent_name = intent['name'] # 提取所有训练样本 examples = [phrase['text'] for phrase in intent['trainingPhrases']] # 转换为Rasa格式 rasa_nlu_data['nlu'].append({ 'intent': intent_name, 'examples': '\n'.join([f'- {ex}' for ex in examples]) }) # 保存为Rasa的YAML文件 with open('nlu.yml', 'w', encoding='utf-8') as f: yaml.dump(rasa_nlu_data, f, allow_unicode=True, sort_keys=False)
这个脚本会忽略DialogFlow里的响应、实体等额外配置,只保留核心的意图名称和训练示例,生成的文件可直接用于Rasa NLU训练。
3. 实现Top3意图匹配的简便方法
除了迁移到Rasa,还有两种轻量方案:
- 调用DialogFlow API提取置信度列表:虽然DialogFlow控制台不支持返回Top3,但v2版本的API返回结果中会包含所有匹配的意图及其置信度。你可以在后端调用API后,自行过滤排序出Top3结果,当最高置信度低于0.7时返回给前端。
- 使用轻量NLU库:如果不想迁移框架,可以用
scikit-learn、spaCy这类轻量库,基于DialogFlow导出的训练示例训练简单的意图分类模型,自己实现Top3结果的返回逻辑,改动成本更低。
如果已经决定用Rasa,训练好NLU模型后,调用/model/parse接口即可获取所有匹配意图及置信度,后端对结果排序取Top3即可。
内容的提问来源于stack exchange,提问作者reinjee13

