[ 什么是规则引擎 | 青训营笔记]

103 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天

规则引擎

什么是规则引擎?

举个例子:

用户在商城购买商品可以获得积分奖励,对应有一个奖励规则,不同价格的商品有不同价格的积分。

如果规则简单,可以通过if...else来实现。再复杂一点的可以通过列表for循环来计算。

但是如果是更复杂的规则,包括价格,用户标签,商品属性来判断积分的话,就需要一个规则引擎来实现:

         计算规则==>[规则引擎] <== 价格、标签等等
                      ==>积分

输入计算规则,价格和标签等等,得到对应的积分数值。

规则引擎的定义: 是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块来编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。

规则引擎将业务规则与程序代码解耦,使得业务人员可以不通过开发人员就实现对规则的修改。

规则引擎由哪些部分组成?

  • 数据输入

    • 预定义的语法规则编写的策略集

      • 例如 "price > 500"
    • 业务数据作为执行过程中的参数,例如价格,标签等

  • 规则理解

    • 按照预定义的语法语义等,正确理解业务规则所表达的含义
  • 规则执行

    • 根据输入的参数对规则进行解释和执行
    • 执行时进行类型检查,确保结果的正确性

规则引擎的应用场景有哪些?

  1. 风控对抗

    在对抗黑灰产时,风控系统的核心就是一个规则引擎,可以实时地根据黑灰产的特征快速识别和对抗。

  2. 活动策略运营

    业务策略与代码解耦,可以快速地根据用户反馈对运营策略进行优化和调整

  3. 数据分析和清洗

    使用规则引擎对数据进行整理、清洗和转换。

编译原理的基本概念

词法分析|语法分析|抽象语法树|类型检查

编译原理中的概念对应上述规则引擎的组成部分:

  • 规则理解

    • 词法分析,语法分析
  • 规则执行

    • 抽象语法树
  • 输入输出

    • 参数注入、类型检查

词法分析

把源代码中的字符串划分为Token的过程。

例如:

price > 500 && ( isNewUser || userLevel> 5)

price > 500 && ( isNewUser || userLevel > 5 )

通过有限状态机FSM(finate-state Automation)来识别Token。

语法分析

将词法分析划分好的Token列表转换成为 语法树的过程

price > 500 && ( isNewUser || userLevel > 5 )

划分为 oprand1 op oprand2的语法树

上述表达式的根节点就是 &&

如何转换为语法树?

  • 上下文无关文法

    产生式: 一个表达式可以由另外一直类型的表达式或者符号推导产生

    exp : add ;
    add : add '+' mul | mul;   // a + b * c
    mul : mul '*' pri | pri;   // a * b
    pri: string | bool | number | identifer;
    

    通过上述的BNF范式,定义了乘法与加法组成的表达式

  • 递归下降算法

    自顶向下构造语法树,不断对Tokens进行语法展开,展开过程中可能遇到递归。

类型检查

  • 类型综合

    根据子表达式的类型构造出父表达式的类型

  • 编译时检查&运行时检查

如何设计一个规则引擎

设计目标

  • 支持特定的词法、运算符、数据类型和优先级

    • 词法(Token)
  • 支持基于以上预定义语法规则的表达式的编译和执行

词法分析

需要设计词法分析的状态机。

语法分析

BNF范式定义来定义语法的规则

语法树执行与类型检查

  • 语法树执行:

    预先定义好每种操作符的执行逻辑,对抽象语法树进行后序遍历执行

  • 类型检查

    执行时检查:在一个节点的左右子节点执行完成后,分别检查左右子节点的类型是否符合当前操作符的预设规则。