摘要:
實時業務校驗平臺作為阿里集團老牌的業務審計系統,覆蓋了集團絕大部分的業務對賬場景,線上上問題及時發現以及減少集團資損上發揮著巨大作用,保障了各個系統的業務穩定性。本文主要介紹實時業務校驗平臺(以下簡稱BCP: Business Check Platform)在智慧化方面的創新和實踐。
關鍵詞:數值一致性、狀態一致性、多值屬性、演算法加速
需求緣起
隨著業務規模的擴張,阿里集團內部的系統變得越來越複雜,在這種複雜的分散式系統架構下,難免會出現遠端呼叫失敗,訊息傳送失敗,併發bug等等問題,這些問題最終會導致系統間的資料不一致,導致使用者體驗受損,使用者利益受損,對平臺來說就是產生資損。意識好的或者是出過問題的系統,可能會去配置一些校驗任務,比如每隔1小時,去跑一次離線計算任務,判斷這段時間內是不是有資料故障出現,但是這種方式時效性較差,然後每個系統團隊的對賬方式都比較零散隨意,我們沒有一套體系化解決資料問題的方案,線上問題又一直存在不斷有新的問題產生,處理比較被動,資料質量這塊一直是個空白的領域。
BCP就是在這種背景下產生,用來幫助業務系統實時校驗線上的每一筆資料,填補資料質量領域的空白。BCP主要實現以下4個目標:
-
高實時性的發現線上業務髒資料或者錯誤邏輯,第一時間發現並及時通知技術保障,而不是等客戶反饋。
-
方便的接入各種業務規則,通過指令碼規則編寫的方式,讓各應用快速接入平臺。
-
整合訂正工具,形成規範的髒資料訂正流程。
-
業務上線的實時監控,新上線業務可以很方便的進行校驗。
為了更高效率的讓應用快速接入業務對賬平臺,同時減少對應用帶來的效能損耗和程式碼侵入,BCP通過事件模式,把業務資料變化觸發的訊息(如DB變更日誌資料,訊息中介軟體訊息)轉換成響應業務的事件,放入到事件執行佇列進行規則的檢查,事件監聽框架採用了通用的架構設計,實現了訊息的對接,而DB日誌又可以轉接到訊息上,實現資料庫變更的實時監聽。
BCP的執行依賴規則,規則是對業務邏輯(規律)的抽象,通過執行規則檢查資料,發現問題。所以核心問題是如何定義規則,傳統的對賬模式一般需要業務方在理解透業務的情況下進行資損點預判與梳理,然後配置手工規則指令碼,對資料進行實時校驗及時發現異常。
隨著業務規模的擴張,業務變更變得愈發頻繁,我們需要不斷的增加新的校驗規則以適應新業務的對賬需求,這裡面需要業務開發、業務測試以及技術支援共同來梳理,消耗非常多的人力,這種方法已經越來越不適應各種複雜業務場景的需要,而且很多情況下即使是提前進行預防梳理,仍然不能覆蓋住所有可能的資損場景。極端一點的情況是,我們很多的資損點都是通過“踩坑”踩出來的,即發生了資損問題之後再去編寫對賬邏輯亡羊補牢,所以傳統的對賬模式暴露出瞭如下幾個問題:
-
過於依賴專家知識和經驗,對於每個新場景都需要人工生產規則,效率低通用性差。
-
無法及時適應大規模資料的變化,特別是當資料、規律發生變化時。
-
漏報,極端情況甚至是在系統出了故障“踩坑”後才觸發某些規則的發現。
目前BCP接收了集團內大部分的業務資料,如何將這些資料產生更大的價值,是我們一直在思考的問題,智慧化就是其中的一個方向。
我們希望通過智慧化的方式讓機器自動去發現業務資料之間的規律與異常資料,幫助業務方進行資損點梳理與監控,讓資損防控的工作變得更加簡單和高效,解決上面提到的若干問題。
引入智慧化
釐清定位:
BCP要實現智慧化,首要目標就是找清楚自己的定位,而機器學習從學習形式上,可以分為監督學習和非監督學習,監督學習是在學習過程中通過提供對錯標註指示,讓機器自我減少誤差的過程;相對的,由於人工標註成本較高的原因,讓機器從類別未知的沒有對錯指示的訓練樣本中進行模式識別的問題稱為非監督學習。
由於規則本身的邏輯問題或者業務的變化,不可避免的要帶來誤報警的干擾,當然這還是在BCP傳統手工規則的時代,業務方非常清楚自己的業務邏輯的情況下發生的。如果引入智慧化對賬,所有的對賬邏輯都由機器自己去發現然後自動進行異常資料告警,誤報的可能性一定是非常高的,所以我們在設計之初就把這個問題定位為了監督學習的問題。
既然是監督學習,就要有標註的工作,標註的工作由誰來做?BCP作為一個業務下層的統一平臺不理解業務,做不了這個事,那隻能交給業務開發方自己來做。標註什麼內容?是異常資料還是機器發現的對賬邏輯?如果是異常資料,首先資料量比較大標註的任務會比較多,其次單獨看一條資料是否有異常從成本上來講也比較高,所以我們選擇的是直接標註由機器發現的對賬邏輯。
確定目標:
BCP實現智慧化,主要完成兩個目標:
-
自動識別資損點,即從業務資料中發現潛在的規律。
-
自動識別異常資料,即找出不符合業務資料規律的異常點。
定義核心思想:
BCP智慧化的核心思想是,基於大部分資料正常的原則來找規律和異常資料,即我們假設大部分的業務資料都是正常的,只有極少部分的資料存在問題。
上圖是一個簡單的通過智慧化尋找異常資料的例子,我們通過四條資料就可以找出可能的資料之間的線性規律和對應的異常資料。
而對應的,我們可能會想到一些極端場景:
-
由於開發核心業務邏輯編寫的錯誤,可能導致大部分業務資料都是錯誤的,且存在同樣的錯誤邏輯,這種場景智慧化對賬並不能起到應有的作用,但是會給出相應的錯誤邏輯規律,給業務方來參考評估。
-
由於跨部門對賬的需求,會存在不同業務邏輯的資料混雜在一起的情況,如果不對這種資料進行清洗歸類,智慧化對賬很難找到資料之間的規律,所以為了產生最好的效果,需要保證資料之間是具有共性的。
引入智慧化的具體操作流程:
我們利用了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個種類的對賬:
- 某個屬性等於一個固定值,此類對賬一般用來判斷資料是否正確響應,標記位是否正確。例如:
response.code=200,responseDataObject.success=true,bizOrder.attributes.unity=1複製程式碼
- 某個屬性雖然不是100%等於一個固定值,但是在某種條件下是100%等於一個固定值,此類對賬一般用來解決資料狀態是否正確躍遷,多份資料屬性一致性的檢測,例如:
if attributes.bizCode=refund,then attributes.status=0 and attributes.forOdrRcv=14![image]複製程式碼
- 某個屬性出現的情況和另一個屬性出現的情況完全一致,此類對賬一般用來解決資料標是否存在,紅包是否漏發,屬性是否缺失等等,例如:
if exists credit_buy,then exists rev複製程式碼
- 上述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 。那麼我們的問題可以完全轉化為關聯分析來解。
但是,在實際應用時,還有兩個問題需要解決:
- 關聯分析一般用來處理“布林”型別,即屬性只能有兩種取值狀態,我們實際應用中屬性會有多種狀態
- 關聯分析的搜尋空間巨大,資料量大時搜尋複雜度指數級增長
為了解決這兩個問題,我們的方案是:
- 對資料進行轉化,有n種狀態的屬性被拆為n個不同的屬性,每個屬性變為“布林”型別。
- 針對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.
本文作者:(按姓氏拼音排序,排名不分先後)
高超(龍多):阿里巴巴集團安全生產高可用架構組技術專家。
高靖昆(井乾):阿里巴巴達摩院機器智慧技術演算法專家。
孫亮(圖宇):阿里巴巴達摩院機器智慧高階技術演算法專家。
歡迎關注“阿里巴巴中介軟體官方微博” ※一個集乾貨與前衛的技術號
歡迎關注“阿里巴巴中介軟體”官方公眾號,與技術同行