一、HelpDesk智能对话机器人查询incident状态的完整业务流程解析
首先运行命令rasa visualize可以获取可视化流程图:
下面是命令执行完成后自动弹出的web页面,在这个流程图中,重点看一下关于检查incident状态的流程是如何工作的,从图中可以看到这样一条路径:
START -> utter_greet -> utter_help -> incident_status_form -> action_check_incident_status
当然也可以直接输入信息要求对话机器人查询状态信息。
下面通过Rasa 提供的交互式对话模式来看一下完整的业务运行流程。首先进入交互式模式:
然后需要启动action server:
确保NLU组件duckling处于运行状态,duckling用于从用户输入信息中提取如数字,email等各种实体信息(entity extraction),下面是相关配置信息:
运行状态如下所示:
按照上面所给的查询incident状态的流程路径,首先从跟对话机器人打招呼开始:
确认意图识别正确,继续执行:
按照提示运行utter_greet这个action,对话机器人输出以下信息:
Hallo! I'm your IT Helpdesk Assistant.
确认没问题,继续执行utter_help:
这时对话机器人会给出各种帮助信息,由于我们想查询之前创建的incident的状态,所以输入以下信息:
这时识别到的意图为”incident_status”,符合预期,所以继续执行:
接下来就需要使用form来收集后面查询状态需要用户提供的信息了,检查domain配置中关于这个form的定义:
从定义看,唯一需要向用户收集的信息就是email,继续运行提示的form:
可以看到当前requested_slot的值为email,所以对话机器人输出如下信息:
What is your email address?
输入上篇文章中创建一个incident时使用到的email:
对话机器人正确提取了email的信息,继续执行:
这时slot “email”已经填充了值,继续运行form:
由于这个form只需要收集email的信息,所以接下来就需要调用微服务action_check_incident_status来执行incident的状态查询了:
但是微服务在执行时抛出了异常,前面文章提到HelpDesk对话机器人需要连接第三方的incident管理系统ServiceNow来完成incident的创建,那么要查询已创建的incident的状态也需要登录到ServiceNow系统,从上面的报错信息可以看到,是调用Python的http异步框架asyncio时出现了连接错误,所以未能真正完成查询操作。在这种情况下,对话机器人的回复如下:
Since ServiceNow isn't connected, I'm making this up!
The most recent incident for hiheartfirst@gmail.com has been closed
提示用户当前incident系统不可用。
下面是完成上述流程后的可视化运行图:
二、查询intent状态的微服务解析
执行微服务action_check_incident_status,在action server端的日志输出如下:
这是在domain配置中的定义:
对应的微服务类如下,需要继承自Rasa SDK的Action接口:
需要实现接口Action中的name方法:
实现接口Action中的run方法:
从tracker中获取对话机器人向用户收集的slot “email”信息,并定义一组incident的状态:
使用localmode(一般用于测试目的),status就从上面定义的值列表中选取,当然也可以把值放入SQLite数据库进行查询:
从第三方incident管理系统中根据用户提供的email取回对应的incident的状态,如果返回结果不为空,则构建消息返回给用户,否则返回错误信息:
在方法的最后,需要重置当前所有slot的值为空,以便为下一次接受用户创建incident的请求做好准备,同时在这里会通过触发SlotSet事件来把当前email的值赋给另外一个slot “previous_email”,这样可以在某些场景下不需要用户再次输入email。