金融智能風(fēng)控系統(tǒng)演進(jìn)開發(fā)實(shí)踐

分享嘉賓:賀鵬 融360 高級技術(shù)經(jīng)理
編輯整理:安然
出品平臺(tái):DataFunTalk
導(dǎo)讀:在我們的風(fēng)控工作中,風(fēng)控系統(tǒng)解決的問題是什么?比如我們常見的監(jiān)管要求、反欺詐、信用風(fēng)險(xiǎn)、黑產(chǎn)對抗、支付安全等。風(fēng)控系統(tǒng)就是在大數(shù)據(jù)支撐下,根據(jù)風(fēng)控專家經(jīng)驗(yàn)制定規(guī)則策略、以及機(jī)器學(xué)習(xí)/深度學(xué)習(xí)/AI領(lǐng)域建立的模型運(yùn)算,對當(dāng)前的業(yè)務(wù)風(fēng)險(xiǎn)進(jìn)行全面的評估,并給出決策結(jié)果的一套系統(tǒng)。
今天會(huì)和大家分享下融360金融風(fēng)控系統(tǒng)從搭建到重構(gòu)以及商業(yè)化的演進(jìn)過程,并分享如何解決遇到的問題與挑戰(zhàn)。主要分為三個(gè)階段:
第一階段:風(fēng)控服務(wù)演進(jìn)
第二階段:性能可靠性保障
第三階段:商業(yè)化演進(jìn)
01
第一階段:風(fēng)控服務(wù)演進(jìn)
1. 早期風(fēng)控系統(tǒng)的問題
我們早期的的風(fēng)控系統(tǒng)是一個(gè)大的單體系統(tǒng),如圖所示,包括規(guī)則決策、流程配置、模型計(jì)算、內(nèi)外部數(shù)據(jù)對接和特征加工計(jì)算,最后接入到各個(gè)業(yè)務(wù)系統(tǒng)中。

早期風(fēng)控系統(tǒng)面臨眾多的痛點(diǎn):首先需求相似度高且比較零散,比如經(jīng)常要調(diào)整某個(gè)閾值;上線周期長,從改代碼到測試上線,最快也要一天才能完成;代碼維護(hù)困難,耦合和重復(fù)嚴(yán)重,公司多條業(yè)務(wù)線都各自維護(hù)一套單體;頻繁的上線發(fā)布導(dǎo)致每周都會(huì)有2-3次生產(chǎn)故障;越往后隨著業(yè)務(wù)量的增加,則會(huì)面臨越多的挑戰(zhàn)。
總體來說,我們面臨的問題主要是:
變更效率低,周期長
需求瑣碎,重復(fù)單調(diào)
代碼耦合嚴(yán)重
線上故障率高
無法滿足多業(yè)務(wù)、多場景需求
2. 重構(gòu)抽象
那么針對于早期風(fēng)控系統(tǒng)問題,應(yīng)該如何解決?基本思路是對系統(tǒng)做重構(gòu)。那么如何保障重構(gòu)后系統(tǒng)的合理性,有效拆分限界上下文?經(jīng)過業(yè)務(wù)分析和抽象建模,我們將風(fēng)控系統(tǒng)歸納為六個(gè)要素依次是:規(guī)則、決策、流程、模型、特征、數(shù)據(jù)。

下面針對這些抽象依次展開分析:
① 規(guī)則抽象
首先我們舉個(gè)例子說下什么是規(guī)則?
規(guī)則1:
如果年齡小于18,輸出“未成年人”
如果年齡大于等于18,輸出“成年人”
寫過代碼的都知道這個(gè)很簡單,加個(gè)if/else 可以很快去滿足這個(gè)需求,這就是硬編碼的方式:

但是當(dāng)我需要調(diào)整時(shí)候,比如將18歲調(diào)整到23歲,就需要修改代碼上線。有沒有辦法讓規(guī)則邏輯與代碼做分離,并且可視化的進(jìn)行配置呢?這里就需要對規(guī)則進(jìn)行抽象,將其中元素模版數(shù)據(jù)化,如下圖:

這里左側(cè)的特征、運(yùn)算符、閾值構(gòu)成基本的規(guī)則表達(dá)式,也就是模式;右側(cè)的輸出即為我們的決策結(jié)果;最后將其抽象成一個(gè)可執(zhí)行的文本,可以用程序執(zhí)行。如下圖所示:

可執(zhí)行文本就是我們風(fēng)控領(lǐng)域的 DSL(領(lǐng)域特定語言),以后編寫規(guī)則就可以像寫 SQL 一樣寫一條 DSL 文本,這樣就做到了規(guī)則編寫與程序代碼分離。
如何解析這個(gè) DSL 文本,基本思路可以通過抽象語法樹來做,當(dāng)然可以借助一些開源組件來執(zhí)行,比如:Drools/Groovy/QlExpress/eval/goevaluate等。
② 組合決策
有了基本的規(guī)則抽象解析后,我們后續(xù)可以做更多的組合決策,比如規(guī)則集(決策集),決策樹,決策矩陣,決策表,運(yùn)算表達(dá)式等。

多規(guī)則組合起來就是規(guī)則集,規(guī)則集額外做的工作就是解決決策的沖突,不同的決策結(jié)果可以分不同等級,規(guī)則集的結(jié)果就等于觸發(fā)規(guī)則中優(yōu)先級最高的決策結(jié)果。
決策樹是一種樹形結(jié)構(gòu),拆分來看也是多個(gè)規(guī)則的執(zhí)行,它與規(guī)則集的差別在于,它的上一次模式匹配后會(huì)選擇路徑,從而影響下一次模式匹配,進(jìn)行決策出不同的結(jié)果。
決策矩陣就是橫軸和豎軸分別進(jìn)行模式匹配,并由二者的結(jié)果取交集來輸出決策結(jié)果。
③ 流程編排
有了不同的規(guī)則組合,進(jìn)一步我們希望進(jìn)行更復(fù)雜的流程編排,并引入分支流程??傮w編排形式分為順序編排和分支編排,以及他們的組合編排。順序編排就是把規(guī)則和決策串聯(lián)起來,并加入開始和結(jié)束節(jié)點(diǎn)。而分支編排又可以分為按流量編排和按條件編排。按流量進(jìn)行分支,就是我們常說的 Abtest,在風(fēng)控決策引擎中也叫冠軍挑戰(zhàn)者。通過編排后就構(gòu)成了我們的決策流。

那么決策流如何進(jìn)行解析執(zhí)行呢?通常有 pipeline 和 rete 兩類模式。
pipeline基本思想,所有特征和每一步執(zhí)行結(jié)果(衍生特征)會(huì)存儲(chǔ)到全局對象,下游可以依賴使用,整體流程呈現(xiàn)管道形式,決策流執(zhí)行路徑可以拉成一條直線。它的優(yōu)點(diǎn)是實(shí)現(xiàn)簡單方便,缺點(diǎn)是效率并不高,需要一個(gè)節(jié)點(diǎn)一個(gè)節(jié)點(diǎn)去依次匹配。
所以會(huì)出現(xiàn)rete算法來實(shí)現(xiàn)更高效的匹配,它的核心思想是根據(jù)規(guī)則庫構(gòu)建有效的模式匹配網(wǎng)絡(luò)并記錄匹配過程中節(jié)點(diǎn)的狀態(tài),從而得到有效的規(guī)則解析和較高的性能,是一種空間換時(shí)間的思路。它的優(yōu)點(diǎn)是執(zhí)行效率高,缺點(diǎn)是實(shí)現(xiàn)復(fù)雜,執(zhí)行過程中消耗較多的系統(tǒng)資源,需要提前衍生特征(有些情況下是不能提前計(jì)算的,比如有些數(shù)據(jù)成本不希望提前發(fā)生)。
不同的模式會(huì)有不同的適用場景,要根據(jù)自己的生產(chǎn)情況來定,我們的生產(chǎn)就是采用 pipeline的模式。
④ 可視化

規(guī)則,決策,流程組合在一起就構(gòu)成了風(fēng)控領(lǐng)域的核心系統(tǒng)——風(fēng)控決策引擎系統(tǒng)。那么我們希望給風(fēng)控專家提供一個(gè)可視化的操作界面,可以自由調(diào)整決策流和規(guī)則決策,而不用每次依賴工程團(tuán)隊(duì)開發(fā)代碼實(shí)現(xiàn)。
這里我們劃分了自然語言、關(guān)系型數(shù)據(jù)庫和領(lǐng)域特定語言(DSL)。自然語言提供給風(fēng)控專家更易解讀的可視化界面和自然語言描述,其相應(yīng)的數(shù)據(jù)存儲(chǔ)使用了關(guān)系型數(shù)據(jù)庫來落地,最后通過發(fā)布時(shí)將數(shù)據(jù)轉(zhuǎn)換為領(lǐng)域特定語言(DSL),由系統(tǒng)識(shí)別執(zhí)行 DSL。
⑤ 模型
相比于規(guī)則的局限性和可突破性,模型提供了風(fēng)控決策更多元化的能力。模型主要是利用已有數(shù)據(jù),通過機(jī)器學(xué)習(xí)、深度學(xué)習(xí)算法構(gòu)建模式,并用來預(yù)測結(jié)果,為風(fēng)控提供授信和反欺詐能力,整個(gè)模型是分為在線預(yù)測部分和離線訓(xùn)練部分組成。

在線預(yù)測部分,也叫模型引擎,通過將數(shù)據(jù)特征代入訓(xùn)練好的模型(特征+算法+參數(shù))中來執(zhí)行預(yù)測,并將預(yù)測結(jié)果反饋給決策引擎,用于進(jìn)一步的決策輸出。
離線訓(xùn)練部分,我們打造了一個(gè)機(jī)器學(xué)習(xí)平臺(tái),包括特征工程(特征挖掘),樣本處理,訓(xùn)練建模,模型回溯以及效果評估,最后通過模型部署到生產(chǎn)中。離線訓(xùn)練和回溯所依賴的數(shù)據(jù),又是源自在線預(yù)測時(shí)所積累的數(shù)據(jù)(導(dǎo)入離線數(shù)據(jù)倉庫),所以模型訓(xùn)練是需要時(shí)間來積累一定數(shù)據(jù)的。整體在線預(yù)測系統(tǒng)和離線訓(xùn)練系統(tǒng)完成了模型生命周期的閉環(huán)。
⑥ 數(shù)據(jù)特征
決策引擎和模型引擎都依賴于我們的數(shù)據(jù)特征(也有叫指標(biāo)或變量),那么接下來我們的就來看數(shù)據(jù)如何加工成特征,并且能盡量做到系統(tǒng)自動(dòng)化、可視化,在我們內(nèi)部叫特征引擎系統(tǒng)。
補(bǔ)充說明:決策引擎和模型引擎依賴的特征還是有區(qū)別的,決策引擎依賴的特征一般具有業(yè)務(wù)含義,比如借貸次數(shù),是否命中黑名單,而且種類有限;模型引擎依賴特征就是一個(gè)變量,不具可解釋性,而且維度超多,理論上可以衍生幾千、幾萬維特征。所以在開發(fā)這兩種特征上還是有些區(qū)別,但總的來說都是通過特征引擎這個(gè)系統(tǒng)來實(shí)現(xiàn)的。
特征數(shù)據(jù)一般來自于兩方面,內(nèi)部客戶提交的數(shù)據(jù)(二方數(shù)據(jù)),外部合作機(jī)構(gòu)提供的 API 數(shù)據(jù)(三方數(shù)據(jù))。首先我們要進(jìn)行數(shù)據(jù)接入(API 或數(shù)據(jù)庫對接);然后對接入的數(shù)據(jù)做數(shù)據(jù)加工計(jì)算(衍生特征),簡單的計(jì)算處理邏輯比如通過 jsonpath 獲取接口返回的 data 值,復(fù)雜的需要做一些聚合、過濾、填充等。

特征引擎的工作原理如圖所示,先接收要獲取的特征列表;分析特征列表直接和間接依賴的所有數(shù)據(jù)源(比如特征f1->f5 直接或間接依賴于數(shù)據(jù)源 d1,d2,d3);然后依次調(diào)用數(shù)據(jù)源,調(diào)用時(shí)可通過 DAG 分析先調(diào)用依賴的數(shù)據(jù)源,再將無依賴關(guān)系的數(shù)據(jù)源并發(fā)調(diào)用(這里先調(diào)用d3再并發(fā)調(diào)用d1,d2);最后按邏輯解析出所有特征。
3. 總結(jié)風(fēng)控系統(tǒng)架構(gòu)
以上就是我們從單體到微服務(wù)過程中的整體思考和服務(wù)拆分演進(jìn)過程,下面給出我們的風(fēng)控總體架構(gòu)圖:

從上到下分別是風(fēng)控接入層、風(fēng)控決策層和風(fēng)控平臺(tái)層:
業(yè)務(wù)應(yīng)用場景會(huì)有不同業(yè)務(wù)線,不同決策場景,對風(fēng)控系統(tǒng)有不同的需求,對輸出結(jié)果和系統(tǒng)響應(yīng)差別很大,所以風(fēng)控接入層主要用于隔離屏蔽業(yè)務(wù)相關(guān)性的。
風(fēng)控決策層就是我們的風(fēng)控中臺(tái),它由決策引擎、模型引擎、特征引擎三大引擎構(gòu)成,是通用的風(fēng)控能力,保障通用性,與業(yè)務(wù)解耦是主要設(shè)計(jì)目標(biāo)。
風(fēng)控平臺(tái)層支撐上游風(fēng)控中臺(tái),包括可視化的決策管理后臺(tái),用于做規(guī)則流程配置以及效果監(jiān)控;機(jī)器學(xué)習(xí)平臺(tái)用于訓(xùn)練回溯模型;特征計(jì)算平臺(tái)賦予多種計(jì)算能力;數(shù)據(jù)平臺(tái)提供風(fēng)控大數(shù)據(jù)基礎(chǔ)。
通過最新架構(gòu)調(diào)整,我們達(dá)成了重構(gòu)的目標(biāo):完全由風(fēng)控專家實(shí)現(xiàn)分鐘級調(diào)整發(fā)布,前臺(tái)、中臺(tái)、后臺(tái)職責(zé)清晰分工明確,并滿足了多條業(yè)務(wù)線、多種不同場景的風(fēng)控需求。
02
第二階段:性能可靠性
1. 新問題產(chǎn)生
隨著業(yè)務(wù)發(fā)展,新的問題逐漸產(chǎn)生,我們總結(jié)了我們的遇到的幾類問題,當(dāng)然歡迎大家在文末留言一起討論~

首先決策調(diào)用量增加,業(yè)務(wù)沉淀的數(shù)據(jù)增多,無論是數(shù)量還是維度上,對我們系統(tǒng)性能和穩(wěn)定性提出更高的挑戰(zhàn)。
其次,不同場景對決策時(shí)效性和數(shù)據(jù)準(zhǔn)確性上是有差異的。比如前篩場景要快速?zèng)Q策,秒級拿結(jié)果,而由于某個(gè)特征缺失造成的影響可以忽略;而用戶授信場景,希望可以拿到更準(zhǔn)的結(jié)果,如果遇到數(shù)據(jù)調(diào)用失敗希望重試一次,可接受的決策時(shí)間也更久一些(分鐘級);當(dāng)然還有一些場景是希望既快又準(zhǔn)的,魚和熊掌是否能兼得?
2. 決策時(shí)效性VS準(zhǔn)確性

① 區(qū)分時(shí)效性
從時(shí)效性,我們將決策場景分為實(shí)時(shí)決策場景和準(zhǔn)實(shí)時(shí)決策場景。針對不同的時(shí)效性,我們在系統(tǒng)處理上也是差異化來做,同步 or 異步是由上文提到的風(fēng)控接入層來實(shí)現(xiàn)的。
實(shí)時(shí)決策場景定義秒級決策,同步響應(yīng),保障性能優(yōu)先;同時(shí)在處理數(shù)據(jù)調(diào)用特征失敗時(shí)會(huì)進(jìn)行忽略,甚至如果決策超時(shí)會(huì)有兜底的降級策略;當(dāng)然決策流配置上和數(shù)據(jù)特征選擇上也要考慮簡單高效。
準(zhǔn)實(shí)時(shí)場景定義為分鐘級決策,一般是異步化響應(yīng)結(jié)果,保障準(zhǔn)確率優(yōu)先;在數(shù)據(jù)調(diào)用失敗時(shí)會(huì)重試,甚至有些關(guān)鍵數(shù)據(jù)接口失敗要開啟授信熔斷等待恢復(fù),這些都是保障準(zhǔn)確率的有效手段。
② 性能治理
在性能治理上可以考慮決策流配置、資源配給和區(qū)分調(diào)度三個(gè)方面。決策流冗長可以做拆分精簡,合并規(guī)則及節(jié)點(diǎn),去除無效規(guī)則等;所有系統(tǒng)服務(wù)多實(shí)例分布式部署,并做好容量評估,保障系統(tǒng)資源充足;根據(jù)決策時(shí)效不同,將系統(tǒng)部署拆分,分離長短任務(wù),避免長任務(wù)調(diào)度時(shí)間過長對短任務(wù)造成影響。
3. 特征計(jì)算
其實(shí)在整個(gè)決策流執(zhí)行鏈路中,耗時(shí)最嚴(yán)重的就是特征計(jì)算部分。那么我們有哪些特征計(jì)算的方式,來滿足我們更苛刻的性能需求?

① 實(shí)時(shí)計(jì)算
實(shí)時(shí)計(jì)算是我們最基礎(chǔ)的特征加工方式,就是在決策引擎調(diào)用特征引擎時(shí),特征引擎從數(shù)據(jù)源拉取數(shù)據(jù)并完成計(jì)算返回結(jié)果,它是一種讀時(shí)計(jì)算的模式,優(yōu)點(diǎn)是數(shù)據(jù)實(shí)時(shí)準(zhǔn)確,工程復(fù)雜度低,缺點(diǎn)就是性能并不高。
② 預(yù)計(jì)算
預(yù)計(jì)算就是我們對特征預(yù)先加工計(jì)算,當(dāng)決策引擎調(diào)用時(shí),直接返回上一次計(jì)算的結(jié)果。它是一種寫時(shí)計(jì)算模式,通過提前計(jì)算來削峰填谷,利用空間換時(shí)間提升性能。在性能上有更好的表現(xiàn),但其也有弊端,就是數(shù)據(jù)的準(zhǔn)確性。如果提前算好特征,但之后數(shù)據(jù)又發(fā)生了變化,那么數(shù)據(jù)就不準(zhǔn)了,所以什么時(shí)機(jī)做預(yù)計(jì)算就是關(guān)鍵。
早期我們實(shí)踐了觸發(fā)式預(yù)計(jì)算,由業(yè)務(wù)系統(tǒng)在某個(gè)節(jié)點(diǎn)觸發(fā)預(yù)計(jì)算程序完成計(jì)算,這種方式業(yè)務(wù)侵入性大,并且觸發(fā)的時(shí)機(jī)并不好掌控。
最新實(shí)踐是通過 CDC (change data capture)捕獲數(shù)據(jù)變化,發(fā)送到 Kafka,通過流式計(jì)算引擎 (Flink / 自研)方式來完成預(yù)計(jì)算,并將結(jié)果存儲(chǔ)到高速緩存中。當(dāng)然其也有局限性,比如預(yù)計(jì)算未完成時(shí)發(fā)生了特征調(diào)用,可能將無法拿到數(shù)據(jù),所以選擇這種方式也會(huì)評估數(shù)據(jù)的變化頻率。
③ 批計(jì)算
對于數(shù)據(jù)變化不敏感的數(shù)據(jù),進(jìn)行離線批計(jì)算將是更好的方式,既能保障了數(shù)據(jù)更加精準(zhǔn)(無實(shí)時(shí)數(shù)據(jù)的噪音),又能提高決策效率,但其缺點(diǎn)可能會(huì)缺失最新的數(shù)據(jù)。
④ 融合計(jì)算
融合計(jì)算結(jié)合了離線計(jì)算和實(shí)時(shí)計(jì)算的優(yōu)點(diǎn),將t-1的離線數(shù)據(jù)計(jì)算出的特征再去和當(dāng)天的實(shí)時(shí)數(shù)據(jù)做進(jìn)一步的計(jì)算,從而得出完整的特征。由于 t-1 的數(shù)據(jù)使用的是特征結(jié)果,所以性能會(huì)提高,但相應(yīng)數(shù)據(jù)精度會(huì)差一些,比如不能在全時(shí)間范圍內(nèi)進(jìn)行去重。
⑤ 總結(jié)
不同的計(jì)算模式有其各自的優(yōu)勢和局限性,所以在使用時(shí)也是根據(jù)不同的場景,做了不同的探索和使用。
4. 可靠性--全方位監(jiān)控體系
為了保障系統(tǒng)和決策的可靠性,我們做了全方位的監(jiān)控體系,包括業(yè)務(wù)層監(jiān)控、應(yīng)用層監(jiān)控、系統(tǒng)層監(jiān)控和調(diào)用鏈監(jiān)控。

下面三層監(jiān)控比較常見,一般生產(chǎn)系統(tǒng)都會(huì)去做,這里重點(diǎn)說下業(yè)務(wù)層監(jiān)控。
首先我們做了一個(gè)實(shí)時(shí)業(yè)務(wù)監(jiān)控大盤(通過流式計(jì)算引擎做到實(shí)時(shí)查看),我們的風(fēng)控專家,在后臺(tái)進(jìn)行策略調(diào)整后,可以直接觀測到調(diào)整效果,如果發(fā)現(xiàn)問題,可以快速調(diào)整回滾。另外我們加入了報(bào)警機(jī)制,對規(guī)則命中率,特征缺失率,決策通過率等進(jìn)行閾值配置報(bào)警。
同時(shí)我們將生產(chǎn)數(shù)據(jù)克隆下來,通過流量回放的方式輔助線下測試回歸。通過模型回溯來評估模型性能,開發(fā)迭代新模型。
03
第三階段:商業(yè)化輸出
通過我們兩年的生產(chǎn)打磨,已經(jīng)打造出一套高可靠、可擴(kuò)展、良好架構(gòu)的風(fēng)控系統(tǒng),我們希望能夠?yàn)樯虡I(yè)賦能,將系統(tǒng)對外輸出。我們商業(yè)化之路主要探索了本地化部署、SASS 服務(wù)、整體風(fēng)控能力輸出等方面,所以有了“魔方”這套系統(tǒng)。

在數(shù)字化業(yè)務(wù)落地實(shí)施中,場景、流量、風(fēng)控、科技 幾方面也是我們探索的方向。我們的產(chǎn)品也是從易用性、安全性、靈活性、易接入和普適性考慮,希望能夠給大家提供更好的服務(wù)。
今天的分享就到這里,謝謝大家,歡迎大家在留言區(qū)討論留言。
在文末分享、點(diǎn)贊、在看,給個(gè)3連擊唄~
分享嘉賓:

社群推薦:
關(guān)于我們:
??分享、點(diǎn)贊、在看,給個(gè)3連擊唄!??
