【青训营】规则引擎概述和入门

news2024/11/13 10:01:45

本文内容总结自 字节跳动青年训练营 第五届后端组

一、规则引擎是什么

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

比如说抖音、pdd上的各种优惠、满减券都是通过规则引擎生成出来的。规则引擎独立在应用程序代码之外,只要应用程序对其输入一定的条件,他就会生成出对应的决策和规则

在这种情况下,规则引擎:

  • 解决了开发人员为了修改业务细节而重复编码的问题
  • 业务决策和服务本身解耦,提高了服务的可维护性
  • 缩短开发路径,提高效率

规则引擎主要应用场景有:

  1. 风控对抗:规则引擎通常是风控系统的核心,使得产品和研发人员你可以不断调整和优化对抗策略,以实现最好的黑灰产识别效果
  2. 活动策略运营:比如各大电商的优惠策略
  3. 数据分析和清洗:数据引擎可以很方便德实现对数据的整理、清洗和转换。数据分析师可以根据不同的需求来自定义数据处理规则。

二、规则引擎的组成部分

  1. 数据输入
    支持接受使用预定义的语义编写规则作为策略集。也就是通过输入一定格式的数据,就可以使用规则引擎输出决策和规则

  2. 规则理解
    能够按照预先定义的语法、优先级等正确理解业务规则所表达的语义,其中对规则的理解不可以出现二义性

  3. 规则执行
    根据执行输入的参数对策略集中的规则进行正确的解释和执行

三、编译原理的基本概念

设计规则引擎需要一些编译原理的概念,因此需要先了解一些编译原理的概念

规则引擎的编译三部曲:

  • 理解:
    分为词法分析和语法分析,词法分析是把源代码字符串转化为词法单元Token;语法分析是在词法分析基础上是被出表达式的语法结构
  • 执行
    表达式抽象语法结构是树状结构的,抽象语法树一定是唯一确定的,不可以有二义性
  • 输入输出
    验证执行结果是否为合适的数据类型。同时在规则执行过程中,需要使用输入的参数值来计算语法树中的标识符节点值的过程

3.1 词法分析

词法分析会将源代码字符串转化为词法单元Token。

image.png

识别token需要使用到有限自动机,该状态机在任何一个状态,给予输入的字符,都能够做到一个确定状态的转换。其任意输入都对应着唯一的输出,也就是幂等的,这排除了他的二义性

3.2 语法分析

语法分析是在词法分析的基础上,识别表达式的语法结构的过程

image.png

我们可以将语句中的某些关键字提炼出来,将其以树状的结构组织起来,从而实现对它们的语法的分析。使用树状结构来实现表达式的切分,这一点在数据结构这门课中有学习到,如果忘记了可以去回顾一下

这种表达式切分形成的树状结构称为抽象语法树,其中每一个节点就是一个语法单元

image.png

在构建抽象语法树之前,还需要了解一些概念:
上下文无关语法
也就是编程语言句子不需要结合上下文就可以判断正确性,可以使用巴克斯范式BNF表达。现在的编程语言都是上下文,比如:

r := a+b

就是一个上下文无关语法,因为无论上下文是何种情况,r=a+b的执行流程都是一样的。其中BNF的表达式示例如下

exp : add;
add : add '+' mul | mul  //加法表达式
mul : mul '*' pri | pri  // 乘法表达式
pri : string | bool | number | identifer  //基础表达式

其中add : add ‘+’ mul | mul中,第一个add表示这是加法的BNF,第二个add表示为加数,第一个mul表示+运算符可以使用加数+乘数的形式(这个解释并不是太好)。

介绍完BNF之后,需要介绍递归下降算法,这是一个自顶向下构造语法树的算法,我们用实际例子进行讲解:
完成对

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

的语法解析

首先我们写出需要用到的BNF

exp : log;
log : log ('&&' | '||') cmp | cmp  // 逻辑表达式
cmp : cmp '>' add | add  // 比较表达式
add : add '+' mul | mul  //加法表达式
mul : mul '*' pri | pri  // 乘法表达式
pri : const | id | (exp)

其中优先级从上到下依次降低。

首先判断第一个token,也就是price
image.png
发现既不是逻辑表达式,也不是比较表达式,也不是加法,也不是乘法,也不是基础表达式,那么则是一个普通的标识符

接下来继续向下,下一个token为大于号>。我们上面递归到了底部,然后开始向上回溯,回溯到cmp的时候,符合要求,那么判断其是一个比较表达式。然后判断下一个token,为常量500,向下递归,发现其是一个常量,此时的递归下降算法图示如下

image.png

重复刚才的回溯步骤,发现下一个token是&&,是一个逻辑表达式。一直递归,到了最后其语法树如下:

image.png
最后将未命中的去除,得到最终的语法树

image.png

3.3 语法检查

类型综合

根据子表达式的类型构造出父表达式的类型,例如,表达式a+b的类型是根据a和b的类型定义的。比如:int a=10,int b=20,这是两个子表达式,那么a+b父表达式肯定是int型的。这也可以检查出不合法的父表达式,比如说string s=“str”, a=10,那么s+a则会被判断为非法

类型检查可以发生在表达式编译阶段,也就是构造语法树阶段,也可以发生在执行时阶段。编译时检查需要提前声明参数类型,而运行时检查可以根据执行时输入的值进行类型检查

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/190140.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python接口测试实战5(上) - Git及Jenkins持续集成

本节内容接上节内容:在框架搭建好的基础上注册Github并新建仓库使用Git上传项目Jenkins的安装Jenkins接口测试项目的配置注册Github并新建仓库Git简介Git(读音为/gɪt/。)是一个开源的分布式版本控制系统版本控制: 对项目及代码记录每次提交和修改&#…

【Docker】(六)使用network完成容器间的网络通信

1.前言 本系列文章记录了从0开始学习Docker的过程,Docker系列历史文章: (一)基本概念与安装使用 (二)如何使用Docker发布一个SpringBoot服务 (三)使用registry远程镜像仓库管理镜像…

12、特征值与特征向量

目录 一、特征值和特征向量的定义 二、特征值和特征向量的相关函数 三、特征值和特征向量的计算 一、特征值和特征向量的定义 假设A是一个nn的矩阵,A的特征值问题就是找到下面方程组的解: 其中,λ为标量,V为矢量,若…

【堆的认识及其优先级队列】java代码实现,保姆级教程学习堆和优先级队列

前言: 大家好,我是良辰丫💞💞⛽,我们又见面了,前面我们讲了用链表实现的二叉树,今天我们来接触堆的概念,堆是一种特殊的二叉树,只不过咱们的对底层原理是数组&#xff0c…

大数据监控平台-Prometheus监控Hadoop

简介 本篇主要是使用jmx配合Prometheus监控大数据平台 前提 链接:https://pan.baidu.com/s/1c6nsjOKw4-a_Wqr82l0QhQ 提取码:yyds --来自百度网盘超级会员V5的分享 先安装好Prometheus Flink(Pometheus监控)_顶尖高手养成计划的博客-CSDN博客_${en…

金融实践 | 信创存储 打造安全可控的金融数据底座

本文刊登于《金融电子化》杂志 2023 年 1 月上,作者为中国出口信用保险公司信息科技部张倩,曲文非,庞松松,康达。 2022 年初,中国人民银行《金融科技发展规划(2022—2025 年)》和银保监会《关于…

JAVA语言实验 实验 ( 二 )

JAVA语言实验 :实验 ( 一 ) JAVA语言实验 :实验 ( 二 ) JAVA语言实验 :实验 ( 三 ) 一、实验目的 (1)熟悉 Java 图形界面的基本设计。 (2)熟悉 Java 界面的菜…

【LeetCode每日一题】【2023/1/31】2319. 判断矩阵是否是一个 X 矩阵

文章目录2319. 判断矩阵是否是一个 X 矩阵方法1:直接遍历2319. 判断矩阵是否是一个 X 矩阵 LeetCode: 2319. 判断矩阵是否是一个 X 矩阵 简单\color{#00AF9B}{简单}简单 如果一个正方形矩阵满足下述 全部 条件,则称之为一个 X 矩阵 : 矩阵对…

spring boot文档阅读笔记——02

spring boot文档阅读笔记——01 目录标题一、日志(一)slf4j logback(spring boot默认方式)1. 获取日志对象方式:2. 设置日志级别:3. 设置日志格式:4. 输出到日志文件:5. 日志文件设置…

关于python的mediapipe库踩过的坑

大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页:lqj_本人的博客_CSDN博客-微信小程序,前端,vue领域博主lqj_本人擅长微信小程序,前端,vue,等方面的知识https://blog.csdn.net/lbcyllqj?spm1000.2115.3001.5343 哔哩哔哩欢迎关注&…

Nginx 常用配置汇总!

众所周知,Nginx 是 Apache服务不错的替代品。其特点是占有内存少,并发能力强,事实上 Nginx 的并发能力在同类型的网页服务器中表现较好,因此国内知名大厂例如:淘宝,京东,百度,新浪&a…

1.10 golang 切片Slice

1. 切片Slice 需要说明,slice 并不是数组或数组指针。它通过内部指针和相关属性引用数组片段,以实现变长方案。 1. 切片:切片是数组的一个引用,因此切片是引用类型。但自身是结构体,值拷贝传递。2. 切片的长度可以改变…

零基础机器学习做游戏辅助第六课--猫狗数据集认识卷积神经网络(二)

一、初识卷积 上一课我们已经将图像数据进行了预处理,这节课的重点就是学习卷积神经网络,到底什么是卷积,我们看图 input是我们输入的图像,Kernel是我们设置的3x3卷积核,卷积层将图像和卷积核进行计算提取特征输出神经元。

代码随想录算法训练营第35天 回溯算法 java :455.分发饼干 376. 摆动序列53. 最大子序和

文章目录贪心算法思路LeetCode 455.分发饼干题目详解LeetCode 376. 摆动序列题目详解思路示图LeetCode 53. 最大子序和题目详解思路示图总结贪心算法思路 以局部最优带动全局最优 LeetCode 455.分发饼干 题目详解 我做的是采用 优先满足胃口的思路。 对每个孩子 i&#xff…

【c#系列】PDF进行操作-浏览、分割、合并、插入、删除(2)

这节我们主要实现缩小、旋转、打印、分割、合并、放大等功能 1、 放大功能 单击放大按钮,实现PDF放大预览,效果如下: 设计代码: System.Windows.Forms.ToolStripButton FangDaBT_Tool;FangDaBT_Tool new System.Windows.Form…

GBase GCDW云数仓阿里云版免费试用来了!

GBase GCDW云原生数据仓库(GCDW)在阿里云计算巢上提供免费试用了!简单 3 步,即可获得一个免费试用的GCDW服务实例,您可以定制该服务实例的云主机规格和数据库计算服务节点数等实例参数,该免费试用支持的数据…

LabVIEW NI CompactRIO控制器:性能和吞吐量基准测试

LabVIEW NI CompactRIO控制器:性能和吞吐量基准测试CompactRIO控制器基于LabVIEW RIO架构,采用了功能强大的64位Intel Atom E3800片上系统(SoC)和Xilinx Kintex7 FPGA等最新技术。Intel Atom SoC提供了极高的性能和丰富的功能,包括集成式GPU和…

数据结构实验二 :二叉树的操作与实现

数据结构实验一:线性表,堆栈和队列实现 数据结构实验二 :二叉树的操作与实现 数据结构实验三: 图的操作与实现 数据结构实验四 : 查找和排序算法实现 文章目录一、实验目的:二、使用仪器、器材三、实验内容及原理1、教材P247实验题1:实现二叉树的各种基本…

Mybatis 笔记

一、mybatis简介 1.1 框架概念 软件的半成品,完成软件开发过程中的通用操作,实现特定的功能,从而简化开发人员在软件开发中的步骤,提升开发效率。 1.2 常用框架 MVC框架:简化servlet的开发步骤,与前端交…

java实现oracle和mysql的group by分组功能|同时具备max()/min()/sum()/case when 函数等功能

一、前言oracle和mysql的group by 分组功能大家应该清楚,那如何使用java实现同样的功能呢比如下面这个表idnameagemathEnglish10yujianlin2092.5103ww84102520102611036310351020我们需要按id分组,求最大age和math累计成绩我们的sql应该这样写select id,…