头一回见!提高10倍效率,阿里给业务校验平台插上了AI的翅膀

@Franki Chamaki

摘要:算法

实时业务校验平台做为阿里集团老牌的业务审计系统,覆盖了集团绝大部分的业务对帐场景,在线上问题及时发现以及减小集团资损上发挥着巨大做用,保障了各个系统的业务稳定性。本文主要介绍实时业务校验平台(如下简称BCP: Business Check Platform)在智能化方面的创新和实践。数据库

关键词:数值一致性、状态一致性、多值属性、算法加速安全

需求缘起

随着业务规模的扩张,阿里集团内部的系统变得愈来愈复杂,在这种复杂的分布式系统架构下,不免会出现远程调用失败,消息发送失败,并发bug等等问题,这些问题最终会致使系统间的数据不一致,致使用户体验受损,用户利益受损,对平台来讲就是产生资损。意识好的或者是出过问题的系统,可能会去配置一些校验任务,好比每隔1小时,去跑一次离线计算任务,判断这段时间内是否是有数据故障出现,可是这种方式时效性较差,而后每一个系统团队的对帐方式都比较零散随意,咱们没有一套体系化解决数据问题的方案,线上问题又一直存在不断有新的问题产生,处理比较被动,数据质量这块一直是个空白的领域。bash

▵ 事件模式

BCP就是在这种背景下产生,用来帮助业务系统实时校验线上的每一笔数据,填补数据质量领域的空白。BCP主要实现如下4个目标:架构

  • 高实时性的发现线上业务脏数据或者错误逻辑,第一时间发现并及时通知技术保障,而不是等客户反馈。并发

  • 方便的接入各类业务规则,经过脚本规则编写的方式,让各应用快速接入平台。框架

  • 整合订正工具,造成规范的脏数据订正流程。机器学习

  • 业务上线的实时监控,新上线业务能够很方便的进行校验。分布式

为了更高效率的让应用快速接入业务对帐平台,同时减小对应用带来的性能损耗和代码侵入,BCP经过事件模式,把业务数据变化触发的消息(如DB变动日志数据,消息中间件消息)转换成响应业务的事件,放入到事件执行队列进行规则的检查,事件监听框架采用了通用的架构设计,实现了消息的对接,而DB日志又能够转接到消息上,实现数据库变动的实时监听。ide

▵ BCP系统架构

BCP的运行依赖规则,规则是对业务逻辑(规律)的抽象,经过执行规则检查数据,发现问题。因此核心问题是如何定义规则,传统的对帐模式通常须要业务方在理解透业务的状况下进行资损点预判与梳理,而后配置手工规则脚本,对数据进行实时校验及时发现异常。

随着业务规模的扩张,业务变动变得愈发频繁,咱们须要不断的增长新的校验规则以适应新业务的对帐需求,这里面须要业务开发、业务测试以及技术支持共同来梳理,消耗很是多的人力,这种方法已经愈来愈不适应各类复杂业务场景的须要,并且不少状况下即便是提早进行预防梳理,仍然不能覆盖住全部可能的资损场景。极端一点的状况是,咱们不少的资损点都是经过“踩坑"踩出来的,即发生了资损问题以后再去编写对帐逻辑亡羊补牢,因此传统的对帐模式暴露出了以下几个问题:

  • 过于依赖专家知识和经验,对于每一个新场景都须要人工生产规则,效率低通用性差。

  • 没法及时适应大规模数据的变化,特别是当数据、规律发生变化时。

  • 漏报,极端状况甚至是在系统出了故障“踩坑”后才触发某些规则的发现。

▵ 以往的配置模式

目前BCP接收了集团内大部分的业务数据,如何将这些数据产生更大的价值,是咱们一直在思考的问题,智能化就是其中的一个方向。

咱们但愿经过智能化的方式让机器自动去发现业务数据之间的规律与异常数据,帮助业务方进行资损点梳理与监控,让资损防控的工做变得更加简单和高效,解决上面提到的若干问题。

引入智能化

厘清定位:

BCP要实现智能化,首要目标就是找清楚本身的定位,而机器学习从学习形式上,能够分为监督学习和非监督学习,监督学习是在学习过程当中经过提供对错标注指示,让机器自我减小偏差的过程;相对的,因为人工标注成本较高的缘由,让机器从类别未知的没有对错指示的训练样本中进行模式识别的问题称为非监督学习。

因为规则自己的逻辑问题或者业务的变化,不可避免的要带来误报警的干扰,固然这仍是在BCP传统手工规则的时代,业务方很是清楚本身的业务逻辑的状况下发生的。若是引入智能化对帐,全部的对帐逻辑都由机器本身去发现而后自动进行异常数据告警,误报的可能性必定是很是高的,因此咱们在设计之初就把这个问题定位为了监督学习的问题。

@Hitesh Choudhary

既然是监督学习,就要有标注的工做,标注的工做由谁来作?BCP做为一个业务下层的统一平台不理解业务,作不了这个事,那只能交给业务开发方本身来作。标注什么内容?是异常数据仍是机器发现的对帐逻辑?若是是异常数据,首先数据量比较大标注的任务会比较多,其次单独看一条数据是否有异常从成本上来说也比较高,因此咱们选择的是直接标注由机器发现的对帐逻辑。

肯定目标:

BCP实现智能化,主要完成两个目标:

  1. 自动识别资损点,即从业务数据中发现潜在的规律。

  2. 自动识别异常数据,即找出不符合业务数据规律的异常点。

定义核心思想:

BCP智能化的核心思想是,基于大部分数据正常的原则来找规律和异常数据,即咱们假设大部分的业务数据都是正常的,只有极少部分的数据存在问题。

▵ 经过智能化寻找异常数据的例子

上图是一个简单的经过智能化寻找异常数据的例子,咱们经过四条数据就能够找出可能的数据之间的线性规律和对应的异常数据。

而对应的,咱们可能会想到一些极端场景:

  1. 因为开发核心业务逻辑编写的错误,可能致使大部分业务数据都是错误的,且存在一样的错误逻辑,这种场景智能化对帐并不能起到应有的做用,可是会给出相应的错误逻辑规律,给业务方来参考评估。

  2. 因为跨部门对帐的需求,会存在不一样业务逻辑的数据混杂在一块儿的状况,若是不对这种数据进行清洗归类,智能化对帐很难找到数据之间的规律,因此为了产生最好的效果,须要保证数据之间是具备共性的。

引入智能化的具体操做流程:

▵ 整体流程图

咱们利用了BCP以前沉淀的大量历史业务数据,将这些数据经过不一样的算法进行离线分析,生成规则(规律),同时为了减小误报的发生,使用者能够对生成的规律进行人工确认(标注),确认后会生成校验规则,进行线上数据的实时校验。

引入智能化后的应用场景

下面咱们介绍BCP中两种不一样模式的智能化场景:1)数值一致性场景;2)状态一致性场景。以后咱们具体介绍如何在两种场景产生规律。注意,实际中算法的应用并不局限于电商交易数据,而是能够解决全部有属性关联数据这一类场景的异常检测需求。

数值一致性场景:

数值一致性场景对应于连续性数据(continuous variable),主要解决具备线性关系的对帐场景,好比和价格,积分有关的相关计算场景,如以前图4中的例子。咱们将找到的线性关系做为规律,违背该规律的就能够认为是异常数据;咱们的目标是利用大量历史数据,智能的找出以上规律,经过人工确认校验规则,而后利用校验规则来检测异常。

算法介绍:

针对连续变化数据,咱们考虑N条数据 x:1,⋯,x:N,其中每条数据都有D个数值属性p1,p2,⋯,pD参与找规律。咱们能够将数据记作维度为N×D的矩阵X=[x1:,x2:,⋯,xD:], 其中xi:∈RN(i=1,⋯,D) 。为简化标注咱们后面记xi=xi:∈RN 。咱们的目标是从数据 X 中找出D个属性之间的线性规律。每一则规律能够表示为一个向量r=[a1,a2,⋯,aD], 其中ai(i=1,⋯,D)表明线性规律的系数。如规律p1=2p2+p3可表示成r=[−1,2,1,0,⋯,0](共有D−3个0) 。咱们用−r 能够表示一样的规律,咱们这里约定让规律表达中有尽量多的正数。上面的线性关系可使用矩阵的形式表示为: Xr=0.

在实践中,咱们的目标是找到全部线性规律的集合。事实上,该问题能够建模为一个对数据在低维度空间线性分解的,找到属性之间的关系(下图红色部分表示低维空间的的线性关系),同时还要容忍数据中少许存在的异常(即下图灰色部分的稀疏矩阵)。

▵ 数据模型

理想状况下,咱们观察到的数据事实上是能够用一个低秩矩阵来表示。可是在实际中,观察到的数据在不少时候是受到异常污染的,因此除了低秩矩阵外,咱们还须要使用一个稀疏矩阵来表示受污染的状况:稀疏矩阵中的非零值表示该行数据不知足某些线性规律,零值表示为正常数据。

从数学上看,每一个规律对应于X中一组线性相关的列。咱们使用线性回归算法能够简单的检验一组列是否存在线性关系。这里咱们举一个简单的例子:假如数据中存在规律p1=2p2+p3,或者写成p3=p1−2p2,那么咱们能够线性回归研究XS=[x1,x2],yS=x3的关系找到该规律(即系数)。可是在实际中,直接使用线性回归很可贵到较好的效果,由于实际数据中会可能会存在少许异常数据,所以有少许数据不知足p3=p1−2p2的规律,从而致使直接使用实际数据进行线性回归时会产生误差,进而不能找到真正的规律。

为了解决这个问题,咱们提出了迭代线性拟合(Iterative Linear Regression)的算法来从含有异常的数据中找到规律。该算法的基本思想是当咱们进行线性拟合时,异常的数据必然会带来较大的残差,那么咱们在拟合后根据较大的残差将异常的数据剔除,再进行新一轮的线性拟合,直到全部数据的残差都很小才中止迭代。若是有规律,那回归中所得的系数最后会收敛到规律系数;若是没有规律,则迭代会由于一些条件而提早终止。算法大体流程可参考下图。

▵ 迭代线性拟合流程

状态一致性场景:

状态一致性场景对应于分类型数据(categorical data),主要是用来作数据属性状态的识别和一致性判断,状态一致性仅考虑状态,针对于分类变量属性之间的if-then关系。相似的,违背该if-then关系的数据能够认为是异常。

状态一致性对帐能够细分为4个种类的对帐:

  1. 某个属性等于一个固定值,此类对帐通常用来判断数据是否正确响应,标记位是否正确。例如:
response.code=200,
responseDataObject.success=true,
bizOrder.attributes.unity=1
复制代码
  1. 某个属性虽然不是100%等于一个固定值,可是在某种条件下是100%等于一个固定值,此类对帐通常用来解决数据状态是否正确跃迁,多份数据属性一致性的检测,例如:
if attributes.bizCode=refund,then attributes.status=0 and attributes.forOdrRcv=14![image]
复制代码
  1. 某个属性出现的状况和另外一个属性出现的状况彻底一致,此类对帐通常用来解决数据标是否存在,红包是否漏发,属性是否缺失等等,例如:
if exists credit_buy,then exists rev
复制代码
  1. 上述3类对帐的混合状况,而且引入针对特殊数据的筛选逻辑,支持更精细的一致性对帐,例如:
if bizorder.attributes.ptl contains('COUPON'),then attributes.peer =true and bizorder.attributes.item contains('80194')
复制代码

算法介绍:

针对分类变量的数据,咱们一样考虑N条数据x:1,⋯,x:N,其中每条数据都有D个分类变量属性p1,p2,⋯,pD参与找规律,对于i=1,⋯,D, 每一个属性pi均可以取对应分类变量集合Vi中的值。这里咱们记Vi={ai1,⋯,aini }表明属性pi能够有ni个不一样的分类变量可取的值的集合。咱们的目标是从数据 X 中找出D个属性之间的关联规律。每一则规律能够表示为一个集合映射

r=∪j∈J {pj,aji|pj=aji,1≤i≤nj}⇒ ∪k∈K {pk,aki|pk=aki,1≤i≤nk},其中J∩K=∅ 。例如,规律“当p1是a12,  p2是a21,那么p3是a31” 能够表达为
r={{p1,a12}∪{p2,a21}⇒{p3,a31}}.


一样,咱们须要找到的规律就是一个集合R={r(1),r(2),⋯ }包含尽量多的规律。
复制代码

从问题定义来看,这是一个能够转化为关联分析挖掘(association rule mining)的问题。关联分析最初是用来找交易数据中产品的规律的。例如,从大量交易数据中发现规律{网球拍}⇒⇒{网球},则代表顾客若是买了网球拍,有很大几率也会买网球。常见的关联规律是布尔关联规律(Boolean association rules),即考虑的数据项是布尔型,只有存在或不存在两种状态(如前面的购买网球拍只有存在和不存在两种状态)。假设咱们对分类变量规律进行简化,全部属性pi都只有两种状态,即ai1=0 不存在, ai2=1 存在, 其中ni=2,∀i=1,⋯D 。那么咱们的问题能够彻底转化为关联分析来解。

可是,在实际应用时,还有两个问题须要解决:

  1. 关联分析通常用来处理“布尔”类型,即属性只能有两种取值状态,咱们实际应用中属性会有多种状态
  2. 关联分析的搜索空间巨大,数据量大时搜索复杂度指数级增加

为了解决这两个问题,咱们的方案是:

  1. 对数据进行转化,有n种状态的属性被拆为n个不一样的属性,每一个属性变为“布尔”类型。
  2. 针对BCP的特殊场景,用户只关心数据所有都符合的规律,咱们对算法作了优化,相比传统对Apriori及FP Growth算法,能够达到50-100倍的提速,从而在数据量大属性多的场景也能够运行。

咱们后面会对这两点再作介绍,首先咱们介绍一下传统的找关联规则的方法思想。考虑以下例子,假设咱们有5条数据, 3个属性,以下表所示:

咱们将全部交易记作X,每一条数据记做x, 定义如下基本概念:

  • 项集(itemset): 项的集合S,包含k个项的称为k−项集,如{ p1,p2}为二项集。

  • 支持度(support):描述一个项集在全部数据中出现的频繁程度,定义为 supp(S)=|x∈X;S⊆x|/|X| 。上例中项集{p1}的支持度为4/5=0.8,项集{ p1,p2}的支持度为3/5=0.6。

  • 置信度(confidence):描述一条规律被知足的频繁程度,假设一条关于项集的规律P⇒Q ,则该条规律的置信度为conf(P⇒Q)=supp(P∪Q)/supp(P)。如上例中咱们发现规律p1⇒p2,则该规律的置信度为supp(p1,p2)/supp(p1)=0.6/0.8=0.75。

如今,咱们讲述关联分析找规律的方法,主要包括如下两步:

  • 频繁项集的产生:找到数据集中支持度大于某个阈值(min_support)的全部项集,该阈值叫作最小支持度;

  • 规则的产生:从第一步的频繁项集中,根据k-项集和比k高的项集联合,找到规则置信度大于某个阈值全部规则。

其中第一步的计算开销通常远大于第二步,不少算法都集中在第一步中如何更高效的产生频繁项集,主要有先验算法(Apriori)与频繁模式增加(FP Growth),咱们用比较成熟的Apriori算法来解决。

多值属性:

以上咱们仅考虑了布尔关联规律场景,属性只有存在/不存在两种状态,实际应用中属性每每能够取多个值,为此咱们对数据进行转化,假如咱们有如下5条数据,2个属性p1,p2,其中属性p1是匿名状态有两种状态分别为a11=匿名, a12=实名,属性p2是评价积分有三种状态分别为a21=好评, a22=中评, a23=差评。那么咱们有分类变量数据以下:

经过转换,咱们能够将以上多状态值的分类变量数据转化为布尔型:

通过转换咱们就能够用一样的方法解决实际数据中的属性多状态值问题。

算法加速:

实际应用中,业务方每每更关心置信度为100%的规律,而算法在搜索的时候,若是仍是简单的采用不停产生规律而后计算置信度将非100%置信度的规律剔除这种作法,运行时间会很是久。这里咱们对算法作了优化,经过对搜索路径的更改,让算法在产生规律时就只搜索100%置信度的规则,从而加快运行时间提高效率,达到相比以前50-100倍的提速。

所以,实际中算法的大体流程以下图所示:

以上介绍的两种算法目前已经稳定运行在BCP平台,而且大量应用在集团的业务对帐场景中,日均调用量在亿级别次,每日发现几十到上百例数据质量问题,经过检测出异常及时进行告警避免了资产的损失。

小结

对于阿里巴巴而言,今年是BCP智能化的元年,经过智能化咱们总体提高了业务对帐的效率,使得实时业务校验这项工做变得更加简单。

可是,将来的路还很长,在海量的业务数据中,还有不少潜在的规律能够挖掘,数值类和状态类的智能化只是咱们实现智能对帐的第一步,后面咱们还会准备在更多的对帐领域实现智能化,让机器智慧给业务带来更多红利。

参考文献:

[1]Böhm, C., Kailing, K.,Kröger, P., & Zimek, A. (2004). Computing Clusters of Correlation ConnectedObjects. In Proceedings of the 2004 ACM SIGMOD International Conference onManagement of Data (pp. 455–466). New York, NY, USA: ACM.

[2]Agrawal, R., &Srikant, R. (1994). Fast Algorithms for Mining Association Rules in LargeDatabases. Journal of Computer Science and Technology, 15(6), 487–499.

[3]Li, J., Zhang, X., &Dong, G. (1999). Efficient Mining of High Confidence Association Rules withoutSupport Thresholds. Principles of Data Mining and Knowledge Discovery,(September 1999), 283–288.

本文做者:(按姓氏拼音排序,排名不分前后)

高超(龙多):阿里巴巴集团安全生产高可用架构组技术专家。

高靖昆(井乾):阿里巴巴达摩院机器智能技术算法专家。

孙亮(图宇):阿里巴巴达摩院机器智能高级技术算法专家。


欢迎关注“阿里巴巴中间件官方微博” ※一个集干货与前卫的技术号

欢迎关注“阿里巴巴中间件”官方公众号,与技术同行

相关文章
相关标签/搜索