本文继续围绕工业级业务对话平台和框架Rasa,对Rasa项目实战之电商零售Customer Service智能业务对话机器人运行流程及项目Bug调试进行演示及剖析。
一、Rasa项目实战之电商零售Customer Service智能业务对话机器人运行流程及项目Bug调试全程演示
- 电商零售Customer Service智能业务对话机器人功能分析
在这个项目中会实现一些核心功能:
-查询订单状态
-取消购买的商品
-退回购买的商品
-检索是否有想购买的商品
-商品信息订阅功能
2. 电商零售Customer Service智能业务对话机器人运行流程
运行命令rasa visualize获取对话流程可视化图:
下面是左边部分的流程图:
从图中可以看到,主要使用了以下forms:
-cancel_form:订单取消表格
-return_form:商品退回表格
-product_updates_form:产品更新表格
-product_stock_form:库存信息表格
-order_status_form:订单状态表格
每个form下面都有对应的action,这些actions会触发form “suvey_form”用于收集客户的反馈信息。
中间部分的流程图:
右边部分的流程图:
在运行命令rasa train进行训练时出现报错信息:
根据提示信息,需要在domain文件里添加version信息:
针对另外的报错信息:Can’t load class for name ‘DucklingHTTPExtractor’,在config.yml查找相关的配置信息:
这时可以把name更新为”DucklingEntityExtractor”:
重新运行命令rasa train进行训练,可以看到没有报错信息了:
通过docker启动duckling:
这时如果在控制台运行以下命令就会报错:
3. 使用Rase shell --debug模式测试电商零售Customer Service项目及问题Bug思考
运行命令rasa shell –debug:
运行命令rasa run actions –debug 启动action server:
输入信息:Hi,对话机器人响应如下:
输入信息检查order status:
输出信息:
输入email信息:
输出信息:
根据上述选项选择之后输出信息如下:
根据用户输入的反馈信息对话机器人响应如下:
继续输入查询订单状态信息:
输出信息:
这时没有对话机器人没有再请求email,这是因为session中已经保存了email的值:
在action里定义了使用的数据库:
重启一个新的对话session,输入email:
由于数据库存在上面输入的email,所以对话机器人返回了order status,并且让用户提供反馈:
提供反馈信息后就结束了对话过程:
继续查询商品库存状态:
获得的反馈如下:
从上面信息看,虽然前面用户输入信息已经说明size为8,但是对话机器人仍然请求size,说明可能是对话机器人没有正确提取出关于size的实体信息,继续输入size信息:
从下面输出信息看,size的信息已经正确提取,但是在slot “size”里没有设置值:
当直接输入size时,slot “size”正确填充了值:
说明在slot “size”填充时存在bug,不能根据提取到的entity的值自动填充到”size”。
4. 使用Rasa Interactive来尝试解决项目Bug
针对上面出现的slot “size”没有正确填充值的bug,启动interactive模式来进行调试:
Rasa interactive模式除了帮助定位问题外,还可以对不符合预期的对话预测行为进行纠正。
输入信息,然后根据反馈可以看到正确提取了size的值:
由于下面要执行的action不是预期的,所以输入No:
这时对话机器人给出下列action list:
我们预期的是执行form “product_stock_form”,所以选择这个form来执行:
可以看到requested_slot是”size”
输入size信息:
执行form “product_stock_form”后可以看到已经填充了slot “size”的值:
输入信息:
从输出信息可以看到slots已被正确填充:
运行form “product_stock_form”,并执行action “action_product_search”:
可以看到返回了查询结果:
最后运行form “survey_form”,选择rating选项5:
保存训练数据:
5. 调整rule文件效果测试及问题分析
首先检查nlu.yml里的训练数据:
Intent “product_stock”会触发form “product_stock_form”,所以检查rules.yml中的rule:
我们期望的是当识别到product_stock时,直接进入form “product_stock_form”,所以修改如下:
重新训练模型:
发现报错:
所以需要删除stories里有冲突的数据:
重新训练后进入interactive模式:
输入信息:
分析输出信息,发现slot “size”并没有填充值:
6. 调整slot配置测试及问题解决方案剖析
检查domain.yml文件里的slot mapping:
可以发现slot “size”的填充必须满足form “product_stock_form”被激活的条件,但是从rule的定义看当识别intent为“product_stock”时并没有激活form,所以上面关于rule的修改是无效的。
可以调整size的mappings,如下图所示,copy原有的mapping来增加一个mapping,然后在这个新增mapping的conditions里指定intent:product_stock,这样当识别到这个intent时,就会把提取到的entity的值映射到slot “size”中。