Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之银行金融Financial Bot微服务代码逐行解密及工业级对话机器人高级代码实践(五十三)

84 篇文章 16 订阅

    本文继续围绕工业级业务对话平台和框架Rasa,对Rasa对话机器人项目实战之银行金融Financial Bot微服务代码逐行解析,并对工业级对话机器人高级代码最佳实践进行分析。

一、Rasa对话机器人项目实战之银行金融Financial Bot微服务代码逐行解密及工业级对话机器人高级代码最佳实践

  1. Financial Bot微服务中使用SlotSet, Restarted,FollowupAction,UserUtteranceReverted等Event解密

在Rasa SDK中,events的处理非常重要,对话机器人开发的复杂程度在于对状态的操作,而Rasa是通过events来控制状态的。

SlotSet用于直接修改状态:

ActionExecuted:当action完成时被触发,这个事件封装的信息包括action name,触发action的policy,以及confidence等:

SessionStarted,在session启动时触发,可以在session初始化时进行自定义操作,如用户身份信息验证等:

FollowupAction:event为followup,触发一个action之后,可以用代码的方式来指定接下来做什么:

                                                                                                       

UserUtteranceReverted:如果用户做的事情不属于当前对话业务流程,譬如闲聊或者是其它的业务,那就可以在处理完这些事情后使用这个事件使对话状态退回到当前业务流程中:

 2.  Financial Bot微服务中对SQLite数据库的使用解析

为了操作数据库,需要导入:

这是具体使用代码片段:

在微服务action类中需要导入:

下面是在profile_db文件里定义的数据库创建方法:

这是从数据库表中查询转账接收人信息的方法:

 3.  Financial Bot微服务中对自定义Form Validation类CustomFormValidationAction代码逐行剖析

微服务action中会导入:

这里定义了两个slots,用于当重复出现slots验证失败后如何更好地进行处理:

使用以下代码读取自定义form配置文件定义的参数:

在配置文件中定义了最大验证失败次数,当达到这个次数后,对话机器人会检查名为explain_{slot}的方法是否存在,如果存在则调用它以便对用户输出更友好的信息,如解释为何需要提供这个slot的信息等:

CustomFormValidationAction继承自FormValidationAction,这里使用metaclass=abc.ABCMeta表示它是一个抽象基类,它的用途是处理slots验证重复失败的情况:

为了使用这个自定义验证action,需要添加以下内容到你的对话机器人代码里:

-添加这两个intents:affirm,deny

-在domain.yml中定义这些slots,样例如下:

-在domain.yml中,为每一个form,声明”AA_CONTINUE_FORM”作为第一个请求的slot,样例如下:

-在domain.yml中,为每一个form,定义名为”utter_ask_{form}_AA_CONTINUE_FORM”的response,使用/affirm和/deny按钮,样例如下:

-自定义验证action类需要继承CustomFormValidationAction而不是FormValidationAction。另外可以根据需要添加explain_{slot}方法,用于当用户重复提交的信息不能通过验证时对话机器人应该做出进一步解释的情况,样例如下:

在自定义验证action类中必须实现name方法:

以下是验证方法,当验证连续失败且达到参数MAX_VALIDATION_FAILURES的值时,就会检查是否存在当前请求slot的explain方法,如果存在则调用它,然后会设置slot “AA_CONTINUE_FORM”为None,这会触发对话机器人使用模板response ”utter_ask_{form}_AA_CONTINUE_FORM”输出信息给用户 :

从tracker中获取slot “AA_CONTINUE_FORM”,如果没有,则添加这个slot,然后调用父类的验证方法validate()来进行验证:

下面的方法用于更新slot “repeated_validation_failures”,当连续验证失败次数达到MAX_VALIDATION_FAILURES的值时,就会设置slot “AA_CONTINUE_FORM”为None:

如果没有找到,则返回空的event list:

如果没有相关的events,则设置interrupt_form为True,否则对events进行循环检查,如果是requested_slot event,则设置interrupt_form为True:

如果interrupt_form为True则进行相应的处理:

检查events,如果requested_slot没有值,则在返回event list中添加slot “repeated_validation_failures”:

根据requested_slot是否有值来判断是否验证失败:

对slot “repeated_validation_failures”的值进行计算:

如果“repeated_validation_failures”的值大于设定参数的值,那么会调用explain方法:

这是explain操作的方法:

从tracker中获取requested_slot,然后根据取得的slot name调用相应slot的explain方法:

如果找不到slot的explain方法,则直接返回,否则通过coroutine的方式异步调用explain方法:

这是定义在Rasa SDK的utils.py文件里的coroutine方法:

下面是验证AA_CONTINUE_FORM的方法:

如果值为no,那么会设置requested_slot为None:

 4.  Financial Bot微服务中Payment Form Action源码及Validation代码逐行剖析

在action中通过key-value的方式定义了以下数据集合,在NEXT_FORM_NAME中,key代表了intent,value代表了form:

这是支付action类,继承自Action:

方法name返回action name:

方法run:

对slots进行初始化操作:

从tracker中获取各个slots的值,然后调用数据库操作方法pay_off_credit_card进行支付操作,然后设置相应slot的值,最后在return语句中根据slots初始化列表清空使用到的slots的值:

这是验证form所收集slots的类,继承自CustomFormValidationAction:

下面的方法从数据库中查询相关的金额,根据规则进行处理:

下面的方法用于验证slot “amount-of-money”是否有效:

从数据库中获取credit card信息:

根据slot的值来判断balance type,然后调用amount_from_balance方法获取对应的金额:

这里通过try…except来处理是否可以进行支付:

下面是关于credit_card的explain方法:

从数据库中获取credit card的信息输出给用户:

 5.  Financial Bot微服务中Money Transfer源码及Validation代码逐行剖析

这是money transfer的action类,继承自Action:

方法run:

对slots进行初始化操作:

从数据库中分别获取转账人账号和接收人账号,然后调用数据库方法进行转账操作:

输出信息并设置相应slot的值,在return语句中根据初始化slots列表对所有用到的slots清空:

这是验证form所收集slots的类,继承自CustomFormValidationAction:

验证接收人信息是否有效:

把传入的接收人名称同数据库查询结果进行比较:

对name进行相应处理:

下面是关于slot “PERSON”的explain方法:

输出信息给用户:

验证转账金额是否有效,首先从数据库中查询转账人的账户余额:

通过账户余额和转账金额判断是否可以进行转账:

 6.  Financial Bot微服务中Transaction Search源码及Validation代码逐行剖析

这是search transaction的action类,继承自Action:

方法run:

对slots进行初始化操作:

从tracker中获取各个slots的信息,然后调用数据库方法查询符合条件的交易信息:

输出查询结果,在return语句中会根据初始化slots列表把所有用到的slots清空:

这是验证form所收集slots的类,继承自CustomFormValidationAction:

方法run,首先检查tracker中是否存在slot “vendor_name”,如果没有则设置为requested slot:

验证是否是有效的search type:

根据数据库查询结果验证vendor name是否有效:

 7.  Financial Bot微服务中ActionSessionStart及ActionRestart自定义代码逐行剖析

ActionSessionStart继承自Action,name方法返回action name:

下面方法从tracker中获取SlotSet事件:

从tracker中获取events之后循环获取每个event的key和value来构建一个SlotSet,之后返回SlotSet事件列表:

方法run执行后返回SessionStarted事件:

从数据库中查询currency并对slot进行初始化,之后添加触发action_listen的ActionExecuted事件:

ActionRestart继承自Action,name方法返回action name

方法run返回Restared和FollowupAction事件列表,即会执行action_session_start操作:

 8.  Financial Bot微服务中ActionSwitchForms中的Ask、Deny、Affirm等行为代码逐行剖析

这个类用于确认是否需要运行form “transaction_search_form”,继承自Action:

方法run从tracker中获取各个slots信息:

这里会提供button选项给用户选择是否执行:/affirm和/deny,用户选择后会直接发送对应的intent给对话机器人:

这个类用于向用户确认是否需要切换form,它继承自Action,方法name返回action name:

方法run首先从tracker中获取当前运行的form,然后从tracker中获取最新用户输入所识别的intent,再根据这个intent从NEXT_FORM_NAME集合中获取对应的form:

如果没有找到next form,则设置next_form_name为None,否则提示用户当前运行的form还没有完成,是否确认需要切换到next_form_name所表示的form:

这里会提供button选项给用户选择是否执行:/affirm和/deny,用户选择后会直接发送对应的intent给对话机器人:

这个类用于用户确认不切换form的情况,它继承自Action,方法name返回action name:

根据tracker中获取的form信息检查是否可以继续运行这个form:

这个类用于用户确认切换form的情况,它继承自Action,方法name返回action name:

方法run首先从tracker中获取当前运行的form,然后从tracker中根据next_form_name获取要切换的form:


把当前form填充到slot “previous_form_name”中,然后设置slot “next_form_name”为None:

 9.  Financial Bot微服务中ActionSwitchBackAsk代码逐行剖析

这个类用于向用户确认是否切换回之前form的情况,它继承自Action,方法name返回action name

方法run:

这里会提供button选项给用户选择是否执行:/affirm和/deny,用户选择后会直接发送对应的intent给对话机器人,切换回以前的form后会把slot “previous_form_name”设置为None:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值