简介本文主要关注风控决策引擎中决策树编排能力的搭建。决策引擎是风控的大脑,决策树的编排能力和经验是打造大脑的手段。如何构建高效、流畅、稳定、可靠的决策树排列能力,是风控决策引擎面临的重大挑战。这篇文章和大家分享一下过去施工的经验。背景任何系统在初期建设中肯定不是朝着“一步到位”的方向去建设的,而是架构设计者在后期尽量往可扩展性和可维护性的方向去建设。好的底层设计不怕产品后期的疯狂迭代,也很容易改变和调整。糟糕的“填鸭式”代码最终可能为了当时尽快实现功能而发展成“狗屎山”,维护成本越来越高。MVP小步迭代1.0现阶段目标:最小可行产品(MVP);小布迭代,快速上线;一个人扮演多个角色。风控部成立初期,人员少,缺乏UED和前端。毕竟风控本身不仅仅需要视觉设计和前端,更主要的是后台研发和战略运营,打击黑产。此时,为了尽快上线决策树功能,研发人员直接将决策树静态配置文件放在了代码层资源目录resource下(具体实现在下面分解),每次改动都需要释放。.引擎本身的构造并不完善,需要添加的功能也很多。一周发布几个版本是家常便饭,现阶段大家都可以接受。“静态轮换”2.0本阶段目标:无需发布版本,快速生产变更;与稳定性相关的考虑。随着部门团队的逐渐壮大和研发流程的规范化,风控策略操作人员对决策安排的响应时间和可视化能力的需求越来越迫切。效率高,但是版本的开发和发布需要规划和时间。每个人都要发布版本,并且集中在一个发布周期。周一提出的策略修订,将在周三连同大家的需求一起发布。这时候,黑产早早跑完了。同时,发布版本也存在一定的风险。如果出现问题,需要立即回滚。这个时候策略上线的时间会有所延迟。基于以上,我们认为是时候开放生产环境直接可视化决策树排列的能力了,但是我们没有前端同学,可能对决策引擎流程规范不熟悉如果再找其他部门,沟通成本还是很高的。那妥协了一个解决方案:将静态配置文件移动到DB存储,配置可以以文本字符的形式显示在前端。无需复杂的前端设计,只需要简单的表单文本框填写即可满足研发需求。修改决策流程的申诉。这样一来,原来的静态配置就可以“动”起来,直接在生产中进行配置,大大提高了生产部署的效率。可视化决策流编排3.0现阶段目标:高效、稳定、智能的可视化决策树编排能力。越来越多的业务条线与产品建设的风控挂钩。研发人员忙于对应风险场景的多变开发迭代。一部分精力负责修改决策树。对于操作,2.0版本的决策树只是一个字符串,而不是一棵树。没有办法也不敢修改策略操作,出错的风险太大。考虑到整个风控的体量和模式已经很稳定,也有一定的时间可以考虑决策制定可视化的产品投放策略,供人员使用。毕竟决策树本身的调整也是策略的职责之一,需要将其沉淀为高可用的产品。我们参考业界BPMN工作流的前端风格设计规范,提取风控决策树中需要用到的元素,构建自己的具有智能编排能力的决策引擎。可视化的拖拽式节点可以完全交付给策略人员自己配置使用。技术选择决策树的设计与实现其实是DAG(DirectedAcyclicGraph)的一种变体。图中的节点在业务层面具有不同的属性和功能。那么如何存储这个DAG结构呢?使用二维数组存储不能满足节点属性和边属性的要求。首先,边界无法定义,树可能非常大。第二,假设属性是用关联表实现的,会很零散,不能直接查看。得到。实际上,一个图可以用一个链表来表示,链表的存储结构用JSON或者XML来表示。可以想象,如果用JSON来表达,层级嵌套关系会很繁琐。毕竟JSON是用来序列化数据的。在显示方面,在XML中添加属性更方便直观。数据结构的一个例子是一个简单的决策树,如下所示。上面的决策树用XML数据结构表示如下:上面的数据结构非常直观的表示了当前需要绘制的决策树数据结构。与JSON数据表示相比,XML更灵活,扩展更方便,在横向和深度上能有更好的平衡决策流解析XML是一项非常成熟的技术。市场上有许多解析XML的开源实现。我使用common-digester来解析上面的数据结构。在POM中可以引入如下依赖:commons-digestercommons-digester<版本>1.8.1实体关系如下:XML数据分析如下:@DatapublicclassFlowEntity{privateStringid;私有字符串描述;私有INodestartNode;privateMapnodeMap=newHashMap<>();}Digesterdigester=newDigester();//解析流nodedigester.addObjectCreate("flow",FlowEntity.class);digester.addSetProperties("flow");//parsestartnodedigester.addObjectCreate("flow/start",StartNode.class);digester.addSetProperties("flow/start");//实现FlowEntity中的addNode方法,将当前节点记录到digester.addSetNext(“流/开始”,“addNode”);digester.addObjectCreate("flow/start/link",LinkBranch.class);digester.addSetProperties("flow/start/link");//实现StartNode中的addLink方法,将当前边输入digester.addSetNext("flow/start/link","addLink");//解析拆分nodedigester.addObjectCreate("flow/split",SplitNode.class);digester.addSetProperties("flow/split");digester.addSetNext("flow/split","addNode");digester.addObjectCreate("flow/split/condition",ConditionBranch.class);digester.addSetProperties("flow/split/condition");//实现SplitNode中的addCondition方法,将当前状态记录到digester中.addSetNext("flow/split/condition","addCondition");//省略...InputStreaminputStream=newByteArrayInputStream(xmlResource.getBytes());return(FlowEntity)digester.parse(inputStream);其中addNode的逻辑是将所有节点存储在一个nodeMap结构中,如果当前节点是起始节点,则赋值给startNode节点。解析完XML后,此时关联关系还没有建立。轮询完每个节点后,将节点相互连接起来,并验证节点是否足够存在,以确保它们可以关联成一棵树。publicvoidassembleToNode(MapnodeMap){if(Objects.isNull(nodeMap)){返回;}if(!nodeMap.containsKey(this.to)){thrownewRuntimeException(String.format("%sto:%scan'tfindnodefromnodeMap",this.desc,this.to));}this.toNode=nodeMap.get(this.to);}决策流执行决策执行只需要从startNode开始执行,递归执行直到找到唯一的出口并弹出。注意策略接口有输出决策结果。如果被拒绝,此时可以直接中断流程执行,返回结果。@Overridepublicvoidexecute(FlowContextcontext){//退出if(thisinstanceofEndNode){return;}//递归执行this.execute(context);}其中,SplitNode节点执行需要计算条件表达式,只要满足一个条件,就可以确定下节点,子类覆盖的实现是如下:注:我之前单独发过一篇关于条件表达式的文章。如果您有兴趣,请关注。大家可以在我的历史文章存档中找到,这里就不展开解释了。@Overridepublicvoidexecute(FlowContextcontext){Validate.notEmpty(condition,"nodeid:{}desc:{}[condition]isempty",this.getId(),this.getDesc());//主动判断Optionaltarget=condition.stream().filter(c->c.evaluate(context)).findFirst();//TODO:考虑返回到默认分支节点}target.get().getToNode().execute(context);}StrategyNode节点的执行原理与SplitNode相同,只是子类重写了实现方法来执行对应的规则引擎,以及得到判定结果后,就可以判断方向了,这里就不一一列举了。如上设计决策树的存储结构,再配合前端同学搭建的基于BPMN流程图的style,自定义风控需要的节点信息和表达方式,就可以搭建一个理想的树在anytime(这里提一句),但是前端同学为了丝滑的编排和辅助验证付出了很多,当然这不是本文的重点)。总结本文分享了决策引擎中决策流程图的思考和构建过程,从最小可用产品上线支撑业务发展,到沉淀可视化编排能力的工作区。当然,本文只是展示了一般决策流程的思考和构建过程。说明业务中还是会遇到各种挑战,比如性能需求,成本控制等等,挑战有很多,后续我会一一分享,欢迎关注。从0到1,构建智能风控决策引擎是性能优化的必经之路——火焰图我是如何入行做风控的?github.io/