本文继续围绕工业级业务对话平台和框架Rasa,对Rasa项目实战之银行金融Financial Bot智能业务对话机器人的主要业务功能所使用的微服务进行解析,并通过Rasa Interactive的调试来帮助理解其背后的逻辑。
一、Rasa项目实战之银行金融Financial Bot智能业务对话机器人业务功能微服务解析与调试
- Financial Bot进行账户余额查询及Rasa Interactive调试
首先运行命令rasa run actions –debug启动action server:
运行命令rasa interactive进入交互式对话模式:
输入信息:
确认执行后输出:
执行action “utter_greet”:
执行action “utter_help”,对话机器人提供下列反馈供用户选择:
输入查询账户余额信息:
执行action “action_show_balance”,返回了查询结果:
可视化流程图更新如下,可以很清晰地看到到目前为止整个对话执行过程:
检查action server输出的调试信息,当用户确认执行action_show_balance之后,Rasa server会调用在action server上运行的微服务action_show_balance,实际上会执行微服务的run方法,处理完成后会把结果通过HTTP response的方式返回给Rasa server:
这是在domain中注册的微服务:
ActionShowBalance是查询账户余额的微服务类,继承自Rasa SDK的Action,包含了两个方法name和run:
这是name方法,返回在domain文件中注册的action name:
这是run方法,首先从tracker中获取slot “account_type”的值,如果是credit类型,则从数据库中取得当前要求查询余额的用户(sender_id)的卡片信息:
-如果当前用户提供的卡片信息存在并且可以在数据库中找到,那么就会根据当前卡片信息查询信用卡余额并返回结果给用户:
-如果当前用户没有提供卡片信息用于查询,那么会根据用户的sender_id从数据库中查询出该用户所有的卡片信息,通过循环的方式来获取每一张卡片的余额信息:
-如果不是credit类型,则通过用户id查询用户账户余额,在这里会检查另一个slot “amount_transferred”是否有值,如果有值表示存在转账金额,会对账户余额进行相应的处理:
检查对话输出信息,发现slot “account_type”的值为None,那么就不会执行上面的credit这段代码逻辑,而是查询用户账户余额信息:
下面这段代码逻辑用于检查是否存在用户需要切换业务场景的情况:
2. Financial Bot进行transactions消费查询及Rasa Interactive调试
输入查询消费交易的信息,从输出结果看,对话机器人正确识别了”last month”的时间:
确认继续执行:
运行form “transaction_search_form”来收集信息:
这时检查action server的输出日志,可以看到调用了验证action来对form收集的信息进行验证:
这是验证类,包括了对search_type,vendor_name,time等信息的验证方法:
根据requested_slot “vendor_name”输入选择的vendor信息:
确认继续执行:
运行form “transaction_search_form”:
可视化流程图更新如下:
继续根据对话机器人反馈进行选择,这里选择1:
运行form “transaction_search_form”,之后会输出信息询问用户是否需要查询时间段为上个月的关于Target的交易信息:
这时检查action server的输出日志,可以看到执行了微服务action_ask_transaction_search_form_zz_confirm_form:
检查domain文件,注册了这个action:
这是微服务类ActionAskTransactionSearchFormConfirm,继承自Action:
其中name方法定义了在domain中注册这个微服务的action name:
选择1执行:
运行form “transaction_search_form”:
当form收集完信息后,可以看到requested_slot为null,active_loop也设置为null来使当前运行的form进入不激活状态。
根据提示运行action “action_transaction_search”,返回的查询结果如下,查到了关于Target的13笔交易及总金额,然后会把查询时使用的所有slots都设置为空:
可视化流程图更新如下:
检查action server的输出日志,可以看到执行了action “action_transaction_search”:
这是domain文件中注册的微服务:
这是微服务类,它继承自Rasa SDK的Action:
方法name返回domain中使用的action name,Rasa server会根据这个name来调用action server上运行的微服务,需要注意的是这个name也必须是唯一能标识这个微服务的名称:
这是方法run,首先对各个slots进行初始化赋值:
从tracker中获取各个slots的值,然后从数据库中查询出所有符合条件的交易信息:
注意这里使用了第三方工具包SQLAlchemy来进行数据库查询:
调用dispatcher返回查询结果信息给用户,在return语句中通过使用slots初始化列表来产生SlotSet事件,通过这个事件可以把tracker中的各个slots的值设置为初始值,以便为下一次查询做好准备:
Rasa 3.x 源码高手之路:系统架构、内核算法、源码实现详解:
Rasa 3.x 源码高手之路:基于Transformer的对话机器人RasaPolice:
星空NLP对话机器人论文班:NLP领域10篇最高质量的对话机器人经典论文解密:
Rasa 3.X 智能对话机器人案例开发硬核实战高手之路 (7大项目Expert版本):
Advanced Python硬核实力高手实战之路:架构、算法、源码、案例(81讲):
NLP on Transformers 高手之路137课Pro版: