首页 > 其他分享 >决策引擎与规则引擎学习

决策引擎与规则引擎学习

时间:2023-11-16 16:46:55浏览次数:33  
标签:实现 决策 DSL 引擎 规则 表达式

决策引擎应用场景

随着互联网金融的发展以及银行数字化转型的需求,金融风控、智能风控、智能营销等话题频频出现,而 “决策引擎” 作为支撑其业务场景的核心系统,也受到了更多的关注。一般来说,决策引擎可以用于包括金融风控、内容风控、推荐营销、物联网监控等各个领域,凡是涉及到使用规则或模型来做业务决策的场景都可以考虑使用决策引擎来实现。

规则引擎(专家系统)被更多人所熟知,那么决策引擎又是什么?和规则引擎有什么区别和联系呢?我认为,决策引擎正是在规则引擎的基础上发展而来的。事实上,有不少决策引擎系统就是通过规则引擎改造实现的。而差别在于决策引擎在规则引擎的基础上实现了更多元的决策方式,并引入了流程编排过程,使其可以支持更复杂的决策场景。

规则引擎的实现模式是规则清单,执行的主体是规则,简单的规则引擎就是罗列出所有规则并执行,有些复杂的规则引擎会引入规则的优先级和规则编排,但编排的主体仍是规则。

决策引擎的实现模式是决策流编排,执行的主体是决策流,在决策流中编排不同的规则节点、决策节点以及分支节点来实现复杂的决策流程。

简单介绍了决策引擎是什么,现在我们来看一下它是如何实现的?将决策引擎拆解开来,从基础构建元素 “规则” 开始,再将规则组合起来构成更复杂的决策集合。

如果:(申请借款总金额 > 5000 或 申请多头借贷数量 < 3) 且 月薪 <= 8000
那么:拒绝

(风控规则案例)

要实现这条规则,首先想到可以通过代码 if / else 来实现。

public string Rule(double sumAmount, int loanNum, double salary)
{
    if((sumAmount > 5000.0 || loanNum > 3) & salary <= 8000)
    {
        return "refuse";
    }
    else
    {
        return "pass";
    }
}

(规则模拟代码)

此代码有明显的硬编码问题,规则调整要涉及到开发、测试、上线的流程,调整周期长。且规则逻辑维护到了代码中,难以传承,也容易造成生产中跑的规则和业务预想的规则有差异。当有大量规则或决策场景接入时,工作量巨大难以维护。

(生产中的决策流包含几十个决策节点)

(生产中的规则集包含上百条规则)

为了实现规则调整不受系统制约,我们需要将 规则配置 与 程序代码 进行分离。我们可以通过在程序中嵌套脚本或代码来实现,这样每次调整规则,只需要重新加载即可,而不用修改和发布系统程序。

常见的嵌入式脚本有 Lua、Groovy、Javascript 等,市面上有不少引擎是基于此类脚本语言实现的。另一种方式可以通过自定义语言语法,也叫领域特定语言 Domain Specific Language(DSL),比如大名鼎鼎的开源规则引擎 Drools 就自己实现了一套 DSL语法(命名为 DRL)。DSL 可以更清晰地表达要实现的规则含义。

rule "rule1"
when
    ( age < 18) && ( age >= 0)
then
    actor = "minor"
end

(Drools 语法 demo)

我们也自定义实现了一套 DSL ,使用的语法结构是 Yaml。简单介绍下 Yaml 是一个轻量级的语法结构,比 xml / json 更小巧,可读性非常好,完全面向人类语言,也有很好的表达能力,支持多种数据结构。

 

用 Yaml 将该规则描述出来。对规则进行拆解发现,规则由三个条件表达式组成。

  条件表达式一:申请借款总金额 > 5000

  条件表达式二:申请多头借贷数量 < 3

  条件表达式三:月薪 <= 8000

每个条件表达式又分别由 特征、运算符、阈值 构成。

然后将这三个条件表达式的计算结果,再进行逻辑(布尔)运算。

(表达式一 或 表达式二) 且 表达式三

逻辑运算后的结果,如果是 true,即代表命中,触发结果输出“拒绝”。

将上述过程用 Yaml 语法描述如下。

构建出规则 DSL 后,我们对其进行语法解析,从上述分析来看,解析过程主要是分别完成条件表达式的比较运算以及针对表达式结果的逻辑运算,最后根据结果输出。

实现比较运算的算子,要考虑不同类型特征需要支持不同的操作符和不同的实现。如数值型特征,支持大于、小于、等于、不等于、大于等于、小于等于、区间等;字符串特征支持等于、不等于、模糊查找等;数组特征的等于运算要考虑数组元素完全相同。实现时要根据特征的不同,来做不同的比较算子逻辑。

此外还要实现逻辑运算(or、and)和算数运算(+ - * / % 平方、开方等)。

对于复杂的表达式支持,要实现表达式运算。像 Python 类动态语言,支持 eval 执行字符串表达式。而像 Golang、Java 类静态语言,则需要自己实现字符串表达式的执行,其基本思路就是通过构建抽象语法树,将操作符、特征、常量区分出来,通过树的有序遍历来执行。有一些方便的三方包可以辅助实现表达式执行,如 govaluate(Golang)、SpEL(Java)、QLExpress(Java)。

 

标签:实现,决策,DSL,引擎,规则,表达式
From: https://www.cnblogs.com/hofmann/p/17836646.html

相关文章

  • 英语连读规则
    连读在连贯地说话或朗读时,在同一个意群(即短语或从句)中,如果相邻的两个词前者以辅音音素结尾,后者以元音音素开头,就要自然地将辅音和元音相拼,  构成一个音节,这就是连读。连读时的音节一般不重读,只需顺其自然地一带而过,不可以加音,也不可以读得太重。如:   nota......
  • 最高加速9倍!字节跳动开源8比特混合精度Transformer引擎
    前言 近年来,Transformer已经成为了NLP和CV等领域的主流模型,但庞大的模型参数限制了它的高效训练和推理。于是字节跳动在2019年12月和2021年6月分别推出了高效推理和训练引擎LightSeq,大大加速了Transformer系列模型的训练和推理,也打通了Transformer从训练到推理......
  • 异或规则,两值同为0,不同为1
    0xff^33的结果是:A220B221C222D223正确答案:C0xff11111111(255)00100001(33)异或操作11011110(222)首先0xff表示16进制的ff,即16*15+16=255^:表示的是异或运算符33就是十进制的33,现在将它们两个2进制化表达就是:0xff---->255---->1111111133......
  • 游戏引擎如何设计与架构
     以前做过游戏引擎,也看过几个商业引擎的源码如Torque等,还有用过一些第三方的引擎来开发游戏,如Unity,Cocos,Laya等,今天来说一说一款游戏引擎应该如何架构和设计,我做了一张图,如下,接下来讲围绕这张图分三个层次来给大家讲解一个游戏引擎的架构与设计。   OS平台抽象层  ......
  • 实用干货丨Eolink Apikit 配置和告警规则的各种用法
    API在运行过程中可能会遇到各种异常情况,如响应时间过长、调用频率过高、请求参数错误等,这些异常会对系统的稳定性和性能产生严重影响。因此,对API进行异常监控和告警是非常必要的。本文将介绍EolinkApikit中使用的告警规则,帮助开发者和运维人员更好地监控和管理API。全局告警......
  • 决策树(Decision Tree)
    决策树是一种基于树结构的分类和回归模型,它通过对数据进行逐步的分解,从根节点开始,根据不同的特征进行分割,最终到达叶节点,叶节点对应一个预测结果。以下是决策树的基本概念和构建过程的详细解释:决策树的基本概念:节点(Node):根节点(RootNode):树的起始节点,包含整个数据集。内部节......
  • Filebeat 仅收集命名规则为 myapp_20231114.log 这种当月产生的日志,以及 myapp.log 新
    Filebeat仅收集命名规则为myapp_20231114.log这种当月产生的日志,以及myapp.log新产生的当天的日志,可以通过以下配置来实现:filebeat.inputs:-type:logenabled:truepaths:-/data/myapp/logs/myapp_{{now|date:'yyyyMM'}}*.log-/data/myapp/logs/m......
  • 数据分享|WEKA关联规则挖掘Apriori算法在学生就业数据中的应用
    全文链接:https://tecdat.cn/?p=34254原文出处:拓端数据部落公众号关联规则挖掘作为数据挖掘的一个重要分支,对于发现数据之间的潜在关联和规律具有重要意义。在教育领域,学生就业数据是一类重要的数据资源,通过关联规则挖掘可以揭示学生就业相关的规律和影响因素。本文旨在探讨WEKA......
  • 极简流程引擎lazy-flow初赏
    极简流程引擎lazy-flow初赏支持清单无限级网关(支持)或签(多人审批,一人通行)(支持)串签(多人审批,按序审批)(支持)并签(多人审批,达成放行)(支持)任务转办(给别人审,自己不再参与)(支持)流程回退(支持逐步回退)......
  • 神策数据曹犟:三大引擎赋能数字化客户经营
    数字化转型时代,客户体验的重要性不言而喻,各行业围绕数字化客户经营的赛跑拉开帷幕。作为国内专业的数字化客户经营软件提供商,神策数据迅速抓住客户经营这一关键机会,提出MTAOO方法论、发布三大引擎产品体系,以此推动企业打好客户旅程编排(CustomerJourneyOrchestration,简称CJO)这......