一、Rasa项目实战之银行金融Financial Bot智能业务对话机器人支付业务流程解析与演示
支付业务是银行金融业务中的核心功能,对于本项目来说,先来看一下这个业务流程是如何工作的。首先运行Rasa命令rasa visualize来自动生成一个可视化流程图:
在下面这个流程图中,一种是支付给个人,另一种是支付信用卡欠款,在流程中需要使用相关的form来收集信息,然后才能调用微服务进行处理。
对话示例如下:
从这段对话中可以看到,这个支付业务流程使用了form来向用户收集三个方面的信息:信用卡账户,支付金额,以及支付时间。在收集支付时间时,对话系统并没有要求用户必须严格按照时间格式来输入,在这里只是输入了”today”,对话系统就会自动转换为下面的时间:Sunday Apr 24, 2022。
在这段对话背后,首先需要对收集到的各个信息(即slot)进行验证,只有验证通过后,才会进行form的提交,并调用相关的微服务进行处理。
二、通过Rasa interactive详解支付业务流程及微服务解析
启动interactive对话模式:
如果训练数据有变动,启动后Rasa框架对自动进行训练:
正在训练中:
训练完成后会保存模型,下次启动时就可以直接使用:
输入信息:I want to pay off my credit card
确认后继续执行:
这里可以看到slot “account_type”填充了值”credit”,这是由于在上一步根据用户输入信息提取了entity “account_type”的值,那么只需要定义一个slot mapping来映射到slot就可以了。这里也提到了需要运行cc_payment_form,先来看下这个form的定义:
可以看到这个form需要收集3个slots的信息,这与本文第一部分对给出的支付对话示例的分析一致。再来看下对话机器人是如何把从用户输入信息提取的实体信息映射到slot中的:
从上面的slot mapping可以看出,type是”from_entity”,而entity正是”account_type”,表明是通过从用户输入中提取实体的值再填充到slot 中。
继续运行form:
从form的定义可以看到,除了要收集跟业务流程直接相关的3个slots之外,也需要收集其它两个用于辅助form使用的slots,那么首先需要收集AA_CONTINUE_FORM。
继续执行:
选择选项1:
这时对话系统会根据用户的选择填充到AA_CONTINUE_FORM中,继续执行:
接下来需要收集slot “credit_card”的信息,输入信息:iron bank
确认后继续执行:
Slot “credit_card”正确填充了刚才输入的值,继续运行form:
按照form定义,接下来收集slot “amount-of-money”:
确认后继续执行:
Slot “amount-of-money”正确填充了值,继续运行form:
按照提示输入时间信息,这里输入tomorrow(明天发起支付),对话机器人给出的时间是:2022-04-25T00:00:00.000-07:00
确认后继续执行:
Slot打印的信息比较有意思,第2次打印信息表示time存储的是tomorrow,而最后一次转换为了微服务能够使用的时间格式的信息。继续运行form:
可以看到对话机器人提示用户确认是否需要在指定的时间发起支付,而这是由slot “zz_confirm_form”触发的,用户的选择关系到这个slot的值填充yes或者no。
这里选择执行选项1:
如上分析,slot的值为yes,再次运行form完成所有信息的收集并提交form:
可以看到提示是否运行微服务action_pay_cc,确认执行,执行完成后结果如下:
Payment of $500.00 towards your Iron Bank account scheduled to be paid at Monday Apr 25, 2022.
这是微服务类,name方法返回的是在domain中定义的action名称:
微服务的逻辑定义在run方法中,首先定义了一个slots列表,这是为了在微服务执行完成后需要对Rasa对话跟踪器tracker中使用的相关slots信息进行清空,以便为下一次业务对话流程做好准备:
从下面的代码可以看到,只有当用户确认要发起支付流程后(根据slot “zz_confirm_form”的值进行判断)才会执行支付逻辑,即首先从tracker中获取之前form收集到的3个业务流程相关的slots的值,然后调用方法pay_off_credit_card进行处理,由于支付涉及到账户金额的转移,所以对slot “amount_transferred”进行了处理。
如果用户不发起支付,则简单调用模板方法输出相关信息。在run方法的最后,return语句中根据前面定义的slots列表来清空slots的值,实际逻辑是只需要返回这样的SlotSet事件给Rasa server,Rasa框架就会自动对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版: