规则引擎的设计与实现|青训营笔记
这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天
什么是规则引擎
定义
规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。
一般来说,每次当业务人员修改决策规则时,开发人员都要修改业务代码,这存在着许多重复简单的劳动,十分繁琐和低效。而规则引擎就是实现了将业务决策从程序代码中分离出来的一个组件,业务人员可以直接使用预定义的命令修改程序而不需要再通过开发人员。
优点
显而易见,规则引擎可以提高业务逻辑修改的速度提高了效率,并且增加了服务的可维护性。
因此,在风控对抗、活动策划运营、数据分析与清洗等方面有很大作用。风控对抗:在与黑灰产的对抗中,速度是关键,规则引擎使开发人员不断的迅速调整策略。活动策划运营:提高了运营策划迭代的效率,可以实现更复杂的运营策略。数据分析与清洗:数据分析师可以利用规则引擎自定义数据处理的规则,方便快速地产出所需数据。
编译原理的基本概念
规则引擎需要有数据输入,能够理解、执行规则,并且需要检查输入以确保正确性。
当我们有一串字符串类型的输入,需要对其进行词法分析、语法分析,并生成抽象语法树。在生成抽象语法树即编译的过程中可以进行类型检查,这要求我们在输入的时候就确定类型,否则就只能在运行时判断类型是否有误。
词法分析
词法分析就是把源代码转化成词法单元(token)的过程。
简单来说,就是把句子分成独立的单词的过程。
我们通过一个有限自动机来实现词法分析。有限自动机就是一个状态机,它的状态数量是有限的,在任何状态下,基于输入的数据都能做状态的转化。
比如接收到一个数字或下划线时,进入状态1,在这时再接收到数字、下划线或者字母时,状态不变,一直接受直到接受到其他字符时状态改变。
语法分析
在上下文无关语法中,可以使用如下巴克斯范式(BNF)来表达。
比如在只包含加减的输入中:
exp : add ; //表达式是加法式
add : add '+' mul | mul ; //加法式是加法式与乘法式用‘+’连接或者是乘法式
mul : mul '*' pri | pri ; //乘法式是乘法式与基础式用‘*’连接或者是基础式
pri : string | bool | number | identifer ; //接触式是字符串、布尔值、数字或表示符
很显然,这是一种递归,而且从优先级低的操作符开始到优先级高的操作符。
我们可以采用递归下降算法,即不断对token进行语法展开,自顶向下构造语法树。
值得一提的是,当我们遇到左括号时,由于左括号属于基础式中的标识符,我们一直递归到了树的最低层,但是括号之间的仍然是一个完整的表达式,我们递归时需要自顶向下重新递归。
类型检查
可以根据子表达式的类型构造出父表达式的类型,比如数字加数字结果的类型仍然为数字。
后记
规则引擎的学习我仅停留在理论层面,以上也只是初学者对今天的学习总结,方便后续复习回顾,顺便拿个青豆,希望我以后能更有造就。