一種靈活的規則引擎設計

文章發布于公號【數智物語】?(ID:decision_engine),關注公號不錯過每一篇干貨。

來源 |?上海交通大學計算機科學與工程系

作者 |?余鍇

摘要:規則引擎起源于基于規則的專家系統,屬于人工智能的范疇,通過模仿人類的推理方式,通過試探性推理,使用人類能夠理解的方式證明其結論。規則引擎在現實應用中實現了業務和代碼分離,通過代理的方式將業務語言定義傳遞到系統中,維護和管理復雜的業務規則,從而起到支撐業務靈活多變的作用。本文提出一種新的輕型規則引擎,旨在及時交付并提供更為靈活和復雜的邏輯控制功能,并且能基于類似隨機森林的方法優化業務規則,可以應用在自動化信貸審批。

關鍵詞:規則引擎;信貸審批;隨機森林;

01

引言

規則引擎起源于基于規則的專家系統(CLIPS:源于1984年NASA的人工智能項目),規則引擎通過模擬人類的思考方式,使用試探性推理方法得到結果,并使用人類能夠理解的方式證明其結論。

規則引擎自80年代至今,已經產生了多種商業及開源的產品,基本上都是基于Java開發, 既有商業產品,也有開源項目,其中最出名的是Drools。

目前絕大部分規則引擎都基于RETE算法設計,RETE算法是一種歸納法推理算法,主要由規則庫,工作內存和推理引擎三部分組成,通過構建網絡保存中間信息,能極大的提高規則匹配的效率。自1982年Forgy提出該算法以來經過幾次優化,受到廣泛的認可,其他還有一些匹配算法比如LFA,TREAI,LEAPS,但效率比不上RETE。

規則引擎目前主要的應用場景是CRM和審批系統。通過規則引擎企業得以快速靈活的制定和實施業務規則,從而快速的對市場做出反應或者是對審批流程進行快速的調整。

近年來經濟形勢的發展要求企業提高更快更好的服務,而且同時需要控制快速上漲的人力成本,越來越多的企業正在引入人工智能技術,其中之一就是規則引擎。目前規則引擎基本是使用Java構建的,一般只有大型企業才有技術和資金實力來構建這樣的系統。本文以信貸審批作為默認的業務場景,提出一種新的靈活的規則引擎設計,完全使用Python實現。

規則引擎把復雜、冗余的業務規則與程序分離,做到架構的可復用移植。通過約定好的規范,接受用戶的輸入,解析用戶的業務規則,最后執行解析好的業務規則作出決策。

一般情況下,所有的業務規則都可以表達成類似IF … THEN的條件語句,但由于企業的快速發展,業務規則會迅速增加,維護和管理這些業務規則會變得越來越困難,而規則引擎將至少具有三個作用:

(1)管理復雜的規則

(2)使用過程不再需要二次編程

(3)知識的管理和發現

以上三方面可以使得業務人員把注意力放到真正有意義的領域,減少重復性工作。從業務的角度上說,重要的是知識的獲取和復用,由于規則引擎將規則邏輯從代碼中分離,使得業務人員可以著重考慮規則中蘊含的知識,而規則引擎的推理和運行機制又解放了維護人員浪費大量的時間在邏輯判斷代碼上,在實際應用中起到了巨大的作用。

本文第一節進行概述,第二節簡單介紹RETE算法及設計的動機,第三節具體介紹AJIT規則引擎結構的設計,第四節介紹引擎核心的三個算法,第五節將對本文做總結。

02

RETE算法

2.1 算法介紹

RETE算法是1982年由卡內基大學的Forgy提出的一種高效的模式匹配方法。由于其推理的效率很高,因為不少優秀的規則引擎都是基于RETE或者RETE的改良算法設計的。

RETE采用了一種基于樹排序的方式,將規則的LHS(左手邊條件)進行網絡編碼,在初次編譯的時候保存推理的信息路徑,而在運行時只需要去查詢和匹配這些結果就完成了推理,從而大大節約了推理的時間。

2.2 相關概念

算法分為兩個部分:

(1) 規則編譯:根據規則集生成推理網絡的過程。

(2) 運行時執行:將數據送入推理網絡進行篩選的過程。

算法中的定義:

(1) 事實:對象之間及對象屬性之間的關系。

(2) 規則:由條件和結論構成的推理語句。一個規則的IF部分被稱為LHS,THEN部分被稱為RHS。

(3) 模式: IF語句的條件。IF語句有可能是由幾個更小的條件組成的大條件,而模式是指不能再分割的最小的原子條件。

算法是基于網絡的:

(1) Alpha網絡:將規則中每一個模式的集合生成Alpha memory。有兩種類型的節點,過濾類型的節點和其他條件過濾的節點。

(2) Beta網絡:有兩種類型的節點Beta memory和Join Node。前者主要存儲Join完成后的集合,后者包含兩個輸入口,分別輸入需要匹配的兩個集合,由Join節點做合并工作傳輸給下一個節點。

RETE存在的不足:事實上,從規則引擎的意義來說,RETE在對知識的獲取,驗證和更新上是存在困難的,而在避免重復運行代碼上也存在一定局限性。原因如下:

(1) 網絡結構

RETE的網絡是基于所有規則的模式的,RETE通過保存操作過程中的狀態避免大量計算。因此當新增加規則時應當更新網絡結構,重新編譯,當業務存在頻繁變化時,RETE的效果不會太好。

(2) 黑盒子推理

RETE更大的隱患是在于其推理過程。由于網絡是基于所有事實生成的,一旦在應用時規則出錯,定位問題將會耗費海量的時間,工作的重心又會回到代碼層面,不利于知識的學習。

03

AJIT規則引擎結構設計

本文提出的一種非常靈活的輕量規則引擎—AJIT(A just in time Rule Engine),完全使用Python語言實現,是在實際的業務中摸索出的一種創新性規則引擎。AJIT在性能上追求的是及時交付,其優點在于使用簡潔的結構和算法,大量節約使用者和維護者的時間,使之把精力放在業務的思考上而非代碼的修改上。并且Python可以方便地引入最新的機器學習或者AI的組件,使得AJIT更容易集成最先進的算法用于更復雜的決策。

3.1 規則結構

AJIT運行的基本單元是規則,每條規則都可以視為IF …(LHS) THEN …(RHS)的形式。

LHS:規則觸發的條件,可以視為自變量,有以下幾種情況:

(1)數據缺失。

(2)數據錯誤。

(3)數據正常的變量,又分為分類型變量(如性別)和連續性變量(如年齡)。

RHS:規則執行的動作,可以視為因變量,有以下幾種情況:

(1)空操作:為了滿足一部分特殊的情況,空操作不產生任何動作。

(2)選擇操作:進行標記動作,不影響決策結果。

(3)決策操作:又可分為分類型決策(如審批通過, 審批拒絕, 人工調整)和

量化型決策(改變金融方案的條件)。

從存儲的表結構來看,可以將規則分為扁平化規則和層級化規則:

(1)扁平化結構:窮舉LHS的組合,枚舉規則的所有情況。這種結構適用于簡單的規則,通過矩陣并行運算,執行速度非常快。

(2)層級化結構:以決策樹的結構進行層級化存儲,通過迭代執行,避免維度的組合爆炸問題。

3.2 規則邏輯塊

AJIT模擬人類一般處理問題的邏輯,把規則劃分為三大邏輯塊,R1,R2,R3。

R1:強規則,即可以通過這類型的規則給出直接的審批決定,比如申請人如果在黑名單中,拒絕貸款。

R2:弱規則,大部分此類的規則需要調整閾值做出決定,一般可以做出拒絕或者提高貸款要求。

R3:關于規則的規則,這部分用來進行綜合判斷和控制。

AJIT運行時會依次運行這三塊邏輯,并允許在任何一個位置終止。通過這種劃分可以讓業務人員更容易理解規則的設置,發現問題時容易追溯。從引擎程序的角度來說,進行必要的劃分也使控制變的更簡單。

3.3 數據表設計

AJIT通過設計豐富的控制字段和狀態字段使程序控制變的簡單,由于規則表現為高度結構化的形態,因此可以存儲在結構化數據庫中。數據表可分為三個部分:數據表, 規則表, 策略表。

(1) 數據表

數據表描述規則依賴的數據定義,以及規則運行過程保存的數據。

(a) LHS變量定義:定義LHS變量的數據源位置,對于靜態數據源只讀取一次,對于動態數據源則每次重新讀取。

(b) LHS查詢記錄:每次申請查詢的LHS變量, 包含申請人的ID,申請編號,變量值, 查詢的順序等信息。

(c) LHS組合表:每條規則對應一個LHS變量的組合。

(d) 規則追溯表:每次申請運行規則情況,包含申請人的ID,申請編號,規則所屬的邏輯塊,是否命中,對應的策略,以及觸發的原因等。

(2) 規則表

(a) LHS映射表:定義LHS變量的分箱映射,分為離散型變量和連續性變量。

(b) RHS定義表:定義RHS的值, 操作的類型有指定分類,加法控制, 比例控制,決策的結果有分類, 界限, 累加幾種,以及對應的變量值。

(c) 規則定義表:定義規則的IF...THEN內容, 對于扁平化規則,存儲規則對應的LHS變量的全部組合, 對于層級化規則,存儲每一層變量的下一跳變量(每條路徑至少有一個RHS)。

(d) 規則屬性表:定義規則的屬性,包括規則的ID,名稱,規則所屬的邏輯塊, 規則的控制字段(反轉,強制命中,可執行),規則的重要性,規則修改需要的權限,創建規則的用戶, 規則屬于的規則集。

(3) 策略表

(a) 策略定義:定義策略的名稱和作用。

(b) 策略匹配表:存儲策略到規則集的映射。規則集是規則的一個分類,一個規則可以屬于多個規則集。

04

引擎核心算法

引擎的核心算法構成完成了規則引擎的基本功能,負責規則導入,運行和優化的相關功能。

4.1 沖突解決

沖突解決算法完成規則的導入動作,要保證添加新規則之后,引擎決策的結果仍然是一致的。

從集合的角度來看,規則是由LHS變量集合觸發,得到RHS變量集合的過程,本質上同樣的LHS定義應該得到近似的RHS結構.因此首先要根據LHS集合的情況進行匹配,而后比較RHS的情況。

RHS比較的結果可以分為四類:沖突, 分歧, 細化, 簡化。沖突指LHS集合完全相同時,決策結果的矛盾(比如通過和拒絕),不允許存在沖突。分歧指LHS集合相交,決策結果的矛盾。細化指新的LHS集合包含了已有的LHS集合。簡化指新的LHS集合屬于某個已有的LHS集合。

圖4-1LHS集合的四種情況

偽代碼:

Ifset(New.LHS)&set(Old.LHS) == Null:?

?????? write(New) into DataBase?#互斥,不存在任何沖突

Else ifset(New.LHS)==set(Old.LHS): # 重合,可能存在沖突

?????? If New.RHS contradict Old.RHS:

????????????? Cancel New Or Overwrite Old # 沖突,二者取其一

?????? Else if set(New.RHS) != set(Old.RHS) :

????????????? warning # 僅給出警告,規則仍然可以寫入

Else ifset(New.LHS) intersect set(Old.LHS): # 相交

?????? intersect_LHS = set(New.LHS) intersect set(Old.LHS) # 共同的LHS部分

?????? If intersect_LHS.RHS_New != intersect_Old.RHS Or contradict:

????????????? warning #僅給出警告,規則仍然可以寫入

?????? Else: # 包含與被包含

????????????? If New.LHS belongs to Old.LHS:

???????????????????? suggest_check: reduction (簡化規則建議)

????????????? Elif New.LHS contains Old.LHS:

???????????????????? suggest_check: enhance (細化規則建議 )

沖突是由相同的信息得到不同的結果,只能選取其一;分歧是由不同額外的信息導致不同結果,可以同時存在,但是需要業務人員持續關注;簡化或者細化是對原有規則的修改,這幾部分工作均可以由根據實際業務情況逐漸使用機器學習的方法自動化。

4.2規則流水線

根據預先指定的策略,根據規則的邏輯塊及依賴關系組織規則的運行。

圖4-2 規則流水線

偽代碼:

step1根據策略選出待執行的所有規則。

step2將規則根據邏輯位置按順序分塊(R1,R2,R3)。

step3 For R in [R1,R2,R3]:

????????????? 創建同步任務列表 sync_task = []

????????????? 創建異步任務列表 async_task = []

????????????? step3.1? (同步規則)執行規則順序>=0的規則 # 規則順序為0的優先級最高

????????????? If rules are hierarchical rules: #層級化規則

???????????????????? For rule in rules:

??????????????????????????? sync_task.append(規則)

????????????? Else if rules are flat rules: # 規則是扁平化規則

???????????????????? rule_matrix = load(rules)

???????????????????? sync_task.append(rule_matrix)

????????????? step3.2 ?(異步規則)執行規則順序 = -1 的規則

????????????? If rules are hierarchical rules: #

???????????????????? For rule in rules:

??????????????????????????? task = register_async_task(rule)

??????????????????????????? async_task.append(task)

????????????? Else if rules are flat rules:

???????????????????? rule_matrix = load(rules)

???????????????????? task =register_async_task(rule_matrix)

???????????????????? async_task.append(task)

????????????? step3.3執行規則

????????????? For task in sync_task:

???????????????????? sync execute task?#同步阻塞的方式執行任務

????????????? For task in async_task:

???????????????????? async execute task #異步并行的方式執行任務

容易看出,引擎的執行時間只受限制于每個規則邏輯塊中的同步規則(需要阻塞式順序執行的規則)。這些規則一般是選擇性規則或者是比較復雜的規則,這部分是規則流水線的時間瓶頸。

4.3 規則優化

利用類似隨機森林的算法,通過對引擎內的規則進行總結和隨機實驗進行策略調優和知識發現。

圖4-3 規則優化數據結構圖

關鍵字段說明:

F1~Fn:使用的LHS變量。

FG1~FGn:根據基本的LHS變量衍生出的LHS變量。

Rule:基于Fn的組合。

Strategy: 基于Rule的組合。

Label: 機器學習的目標。

偽代碼:

Step1參數指定:

?????? 隨機樣本N, 用來建決策樹所使用的記錄數。

?????? 隨機變量維度m. 總的規則數M, 滿足m <<M。

Step2隨機生成樹 # 數據維度上的隨機優化

?????? For N in sample_over_records():

????????????? For m in sample_over_features():

???????????????????? y = label_choose()

???????????????????? random_tree =make_decision_tree()

???????????????????? For tree in existed_trees:

??????????????????????????? If random_treebetter than tree:

?????????????????????????????????? suggest(random_tree)# 建議更優的策略

Step3優化生成樹

?????? set_criteria() # 選擇一個優化指標,比如信息值

?????? feature = get_current_lhs()?# 獲取當前樹用的LHS集合

?????? y = label_chose() #選擇一個目標變量

?????? optimize_decision_trees() # 優化樹的分類

Step4隨機森林

?????? trees = make_random_trees(tree_number) # 根據指定的數量生成n棵樹

?????? y = label_choose() #選擇一個目標變量

?????? for tree in trees:

????????????? predict.append(vote by tree) #所有的樹進行投票預測

從業務上看,該算法提供三方面的支持:

(1)規則的閾值優化:通過樹的優化,修改最初規則配置。

(2)新的策略發現:找到更有效的策略。

(3)組合模型預測:多棵樹的投票,利于在缺失數據維度較多的情況下更好的決策。

05

總結

本文介紹了RETE算法在實際應用中的一些困難,并提出一種新的規則引擎AJIT, 通過流水線式的結構設計使得AJIT可進行更復雜的邏輯控制,并且可以很靈活的響應業務需求.以下從四方面總結AJIT的實踐經驗:

(1)工程實施

集成性。由于Python語言有數量眾多的包,因此數據清洗,矩陣運算,異步調度,服務部署等功能完全可以實現,僅有同用戶交互的前端技術需要用到JavaScript和HTML5。

解耦性。每個功能塊都是相對獨立的,因此實際工程可以根據實際情況最小化的實施。

(2)算法學習

由于所有的數據都是結構化存儲的,因此可以非常方便的進行用算法學習來替代人工來進行知識發現.通過可視化交互,業務管理人員可以理解規則引擎的建議,并做出合理原則。

(3)功能擴展

規則的執行過程是高度靈活的,Python在網絡爬蟲和人工智能方面有天然優勢,我們曾經在規則引擎中插入問卷驗證用戶的真實身份, 問卷的內容則是通過程序實時爬取的。資源允許的情況下,任何規則都可以靈活調用各種算法來擴展功能。

(4)性能

現實中,用Pandas數據框(毫秒級/操作)結構代替Numpy矩陣(50微秒級/操作)進行實施,因此引擎的運行速度較慢,每個申請的整體運行時間在15s左右, 但對于實時要求并不高的審批申請業務來說,這個時間是完全能夠接受的。事實上,AJIT設計并不適合追求極致的速度,考慮到要接入眾多的算法,即使采用并行技術,總體時間仍然會受限于最慢的算法。

AJIT引擎是在實際應用場景下催生出的一種規則引擎,三種基本算法還需要不斷的調優才能達到有效幫助人工提高效率,幫助企業做出更有效的決策。

從AJIT引擎本身特性來說,對于實時性要求不高的場景都可以進行擴展的研究和應用。

參考文獻:

[1]Charles.Forgy. Rete: A Fast Algorithmfor the Many Pattern/Many Object Pattern Match Problem, Carnegie-Mellon, 1982

[2]Alex Rupp. The Logic of the BottomLine: An Introduction to The Drools Project,TheServerSide.com,2004

[3]Jboss Drools Team.DroolsDocumentation:Chapter5 Hybrid Reasoning, 2016

[4]Max.Tardiveau. RETE Business Rule Engines,AutomatedBusiness Logic LLC, 2012

[5]鮑金玲. 基于規則引擎技術的Rete算法的研究,《科技信息》,2008,32(32):90-90

[6]孫懿青. 基于規則引擎的自解析匹配推理原型系統研究,南京師范大學,2006

[7]張劍,孟波. 基于規則引擎的一種智能工作流系統研究,《計算機工程與設計》, 2006, 27(14):2591-2593

[8]趙凡. 基于規則引擎的研究與應用,《多語種信息技術研究室, 2007》

星標我,每天多一點智慧

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容