一、Rasa项目实战之银行金融Financial Bot智能业务对话机器人业务流程解析与演示
在设计和开发智能业务对话机器人时,需要考虑用户在与对话机器人进行多轮对话的过程中,会穿插进行多个业务流程的处理,对话机器人需要根据用户意图进行相应的操作。先来看下这段对话:
刚开始用户想查询账户进账情况,这时对话机器人提供3个vendor让用户选择,用户选择其中一个vendor查询指定时间段的进账情况,之后用户想查一下关于另一个vendor的交易情况,查询结果如下:
下面通过debug模式解析对话机器人是如何识别用户意图并通过与Rasa action server运行的相关微服务进行交互来完成对话过程的。
二、通过Rasa debug模式详解对话业务流程
输入信息:what did I earn?
启动Rasa DAG框架中的各个NLU组件,用来分析上面用户输入信息,这些组件包括DIETClassifier,SpacyNLP等等。
以下输出显示了识别到的用户意图为check_earnings,显然这是正确的,这里没有提取entities:
同时对话跟踪器会记录相应的事件:
这里会根据用户意图提取slot信息:
检查domain文件,可以看到这个slot的定义:
可以看到这个slot是由触发的intent来填充的,值就是deposit,与上面日志信息一致。
接下来就是使用配置的各个policies来进行预测,首先使用AugmentedMemoizationPolicy来进行预测,预测得到的action是transaction_search_form:
然后在日志中发现这条消息:
检查rules文件,确实存在这样的rule:
根据识别到的intent可以看出对应的对话机器人的下一个action就是transaction_search_form。
虽然看起来已经可以根据上面的rule来确定对话机器人接下来应该采取的action了,但是由于在我们的配置中还有其它的policy,譬如下面这个基于机器学习的TEDPolicy,它是基于用户输入信息识别到的意图来进行预测的,从预测结果看和上面rule的预测结果一致:
那么最后Rasa core来选择哪一个预测结果呢?从下面的输出信息可以看到最终选择的是RulePolicy的预测结果,这是因为这个policy的优先级最高(RulePolicy的预测confidence最高为1.00,而TEDPolicy的概率始终小于1.00)。
接下来就是运行transaction_search_form来激活form,然后对slot进行验证,这个逻辑是在验证微服务validate_transaction_search_form中完成的。
这时对话机器人输出如下信息:
这是因为已经激活了form “transaction_search_form”,下面是这个form的定义:
由于已经收集了slot “search_type”的值,从form定义中可以看到接下来需要收集vendor_name的信息,所以才会有上面对话机器人输出的关于询问用户vendor的信息。
根据前面给出的对话示例输入vendor:
从以下输出看使用了DIETClassifier来提取entity “vendor_name”的值:
这里需要使用验证微服务对填充到slot的值进行验证:
这是Rasa core调用验证微服务的日志信息:
根据form定义,接下来需要向用户收集时间信息:
所以对话机器人输出如下信息给用户:
按照对话示例输入时间信息:
可以看到这里使用了功能很强的DucklingEntityExtractor来提取时间信息,并且把last three weeks这句话分解为具体的时间格式的值分别放入from和to两个变量中:
从以下输出清晰看到通过触发SlotSet事件来设置slot的过程,key为time,而value则由from和to两部分组成:
这里同样会调用微服务对刚刚填充了值的slot “time”进行验证:
接下来请求下一个slot信息,也就是让用户确认是否需要提交form:
对话机器人输出如下:
选择1:Yes,对话机器人返回查询结果如下:
检查action server微服务日志,发现调用了微服务action_transaction_search:
三、业务流程微服务解析:
关于validate_transaction_search_form,这个微服务继承了Rasa SDK提供的form验证框架,这里可以看到直接继承的是一个自定义验证微服务类CustomFormValidationAction。在validate_transaction_search_form类中定义了关于slot “search_type”的验证方法。
这个方法使用了Python的coroutine机制,逻辑很简单,就是判断slot设置的值是否存在于预定义的列表中,如果不存在则说明值无效,需要重置这个slot的值为None:
这是验证vendor_name的方法,其逻辑是检查这个vendor是否存在于数据库中,如果存在则设置到这个slot “vendor_name”中,否则重置slot的值为None:
这是验证time的方法,首先从tracker中获取slot time的值,然后根据时间值进行解析,如果能够正确解析则设置slot的值,否则设置slot值为None:
下面是关于微服务类ActionTransactionSearch,它继承自Rasa SDK提供的接口Action:
这是name方法,返回这个微服务类在domain中配置的名称:
这是run方法,定义了微服务类的运行逻辑,首先定义了一个slots的初始化列表:
如果用户确认提交form,那么就会执行以下逻辑,即从对话跟踪器中取出各个slots的值,作为参数传入数据库查询语句中进行查询:
调用模板方法输出查询结果给用户,如果用户取消提交form,则调用另外的模板方法输出信息。在方法的return语句中会调用方法前面定义的slots初始化列表来触发SlotSet事件,目的是清空当前各个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版: