本文继续围绕工业级业务对话平台和框架Rasa,对Rasa项目实战之电商零售Customer Service智能业务对话机器人微服务代码进行解析,并且使用Rasa Interactive进行对话试验。在微服务中会进行数据库操作,并把结果返回给Rasa server来完成业务对话流程。
一、Rasa项目实战之电商零售Customer Service智能业务对话机器人微服务代码逐行解密及基于Rasa Interactive的对话试验
- Customer Service案例使用的SQLite3数据库中数据分析
在微服务中使用了SQLite3数据库:
可以从sqlite官网(https://sqlitebrowser.org/dl/)下载客户端:
这个项目使用的数据库包括2个表格:
-inventory:
商品库存表,包含以下字段数据:
-orders:
商品订单表,包含以下字段数据:
2. 增加了数据库的内容但在测试的时候却没有起作用原因及解决方案
运行以下命令启动微服务,在实际生产环境中,使用微服务的动态部署是非常重要的:
运行rasa shell –debug,输入对话信息查询订单状态:
继续运行form “order_status_form”:
根据对话要求输入email信息:
这时可以看到slot “email”已经被正确填充:
确认运行form “order_status_form”,然后执行action “action_order_status”来查询订单状态,这时可以看到对话机器人反馈说没有找到这个email的订单信息:
但是从数据库表orders中可以看到,实际上是存在这个email的订单信息的。为了定位问题,可以在下面的代码里加入打印email的信息来检查是否能从数据库中取得email:
为了使上述action的代码修改生效,需要重启action server:
继续输入查询订单状态信息:
确认运行form “order_status_form”,然后执行action “action_order_status”来查询订单状态,这时可以看到对话机器人反馈说没有找到这个email的订单信息:
检查action server输出的信息,发现已经打印出从数据库中获取的email信息:
这时检查目录actions,发现多了一个后缀为”-journal”的文件:
这说明数据库中的数据没有同步到磁盘文件里,所以可以关闭数据库客户端保存数据,再检查actions目录:
这时已经没有后缀为”-journal”的文件了。重新输入查询订单状态信息:
确认运行form “order_status_form”,然后执行action “action_order_status”来查询订单状态,这时可以看到对话机器人反馈找到这个email的订单信息,订单状态为pending:
再次查询表orders,可以发现这个email关联订单的状态是pending:
3. action_order_status代码逐行解析及Rasa Interactive试验解密
OrderStatus用于查询订单状态,它继承自Action,在name方法里返回action name:
下面是run方法,首先连接到SQLite3数据库:
从tracker中获取slot “email”的值,然后把这个email传入SQL语句的参数中,再通过cursor执行查询,并通过cursor返回一条数据:
如果存在返回数据,则转换为list,并且通过index为5获取对应表orders的字段”status”的值,然后调用dispatcher的utter_message方法生成response返回给Rasa server:
这里使用了domain.yml文件里配置的response模板action:
如果没有返回数据,则调用对应的response模板action:
4. action_cancel_order代码逐行解析及Rasa Interactive试验解密
CancelOrder用于取消订单,它继承自Action,在name方法里返回action name:
方法run首先连接到SQLite3数据库:
从tracker中获取email,然后传入SQL语句的参数里,通过cursor执行查询并返回一条数据:
如果查询到订单,则把status和email同时传入SQL语句的对应参数里,通过cursor执行更新订单状态的操作:
输入取消订单信息:
需要运行form “cancel_form”来收集信息:
执行action “action_cancel_order”来更新订单状态为取消的状态:
这时检查数据库记录,发现这个订单的状态已更新:
5. action_return代码逐行解析及Rasa Interactive试验解密
ReturnOrder用于退货订单,它继承自Action,在name方法里返回action name
方法run首先连接到SQLite3数据库:
从tracker中获取slot “email”的值,然后把这个email传入SQL语句的参数中,再通过cursor执行查询,并通过cursor返回一条数据
如果查询到订单,则把status和email同时传入SQL语句的对应参数里,通过cursor执行更新订单状态的操作:
输入更新订单状态信息:
运行”return_form”收集信息,然后执行action “action_return”:
这时检查数据库记录,发现这个订单的状态已更新:
6. action_product_search代码逐行解析及Rasa Interactive试验解密
ActionProductSearch用于查询库存产品,它继承自Action,在name方法里返回action name:
方法run首先连接到SQLite3数据库:
从tracker中获取color和size的值,传入SQL语句的参数里,通过cursor执行查询并返回一条数据:
如果取得数据,则调用response模板action ”utter_in_stock”输出查询结果信息,否则调用response模板action ”utter_no_stock”输出没有查询到结果的信息。注意在方法返回时会使用SlotSet事件来清空slot “size”和”color”的值:
输入查询商品库存信息:
接下来会运行”action_deactive_loop”防止进入其它的loop:
运行form “product_stock_form”之后会提示输入color信息:
运行action “action_product_search”,返回了查询结果:
7. action_survey_submit代码解析:
SurveySubmit会触发SlotSet事件来设置slot “survey_complete”的值为True,并调用相关的response模板actions:
8. chitchat和faq背后的ResponseSelector解密
关于chitchat和faq相关action是通过定义在config.yml中的pipeline里的ResponseSelector来触发的:
在domain.yml文件里会定义chitchat和faq的intents,当识别到这些intents时,ResponseSelector会根据向量相似度的计算来根据用户输入选择匹配的response输出给用户: