4. 规则语言与表达:DRL、决策表、决策树、评分卡
在风控规则引擎中,规则的语言与表达形式直接决定了业务人员与系统之间的沟通效率、规则的维护成本以及推理性能。本章深入剖析四种主流的规则表达形式:DRL(Drools Rule Language)、决策表、决策树和评分卡,并对比其适用场景与优劣。
4.1 DRL(Drools Rule Language)
DRL 是 Drools 规则引擎的原生规则语言,是一种声明式编程语言,允许用户以“当条件满足时执行动作”的方式定义业务逻辑。DRL 文件通常以 .drl 为后缀,包含规则包(package)、导入(import)、全局变量(global)、函数(function)以及规则(rule)等核心元素。
4.1.1 DRL 基本结构
package com.example.fraud.rules
import com.example.fraud.model.Transaction
import com.example.fraud.model.Account
global com.example.fraud.service.AlertService alertService
rule "High Amount Transaction"
when
$t: Transaction(amount > 10000, currency == "USD")
$a: Account(accountId == $t.accountId, riskLevel == "HIGH")
then
alertService.sendAlert("High risk transaction detected: " + $t.getTransactionId());
$t.setFlag("MANUAL_REVIEW");
end
关键要素解析:
- package:定义规则所属的包名,用于命名空间隔离。
- import:导入 Java 类或事实类型。
- global:定义全局变量,通常用于服务注入或日志记录。
- rule:规则主体,包含
when(条件部分,LHS)和then(动作部分,RHS)。 - 模式匹配:使用
$变量名: 类名(属性约束)进行事实绑定与过滤。
4.1.2 DRL 高级特性
| 特性 | 说明 | 示例 |
|---|---|---|
| 复合条件 | 使用 &&、||、! 组合多个约束 |
amount > 1000 && amount < 5000 |
| 存在性检查 | 检查是否存在满足条件的事实 | exists(Transaction(amount > 10000)) |
| 累积函数 | 对集合进行聚合计算 | accumulate( $t: Transaction(), sum($t.amount) ) |
| 规则继承 | 通过 extends 复用规则属性 |
rule "BaseRule" ... end → rule "ChildRule" extends "BaseRule" |
| Salience(优先级) | 控制规则触发顺序,值越大优先级越高 | salience 100 |
4.2 决策表(Decision Table)
决策表是一种以表格形式表达规则集合的方式,特别适合条件维度较多、动作组合固定的场景。Drools 支持基于 Excel(.xls/.xlsx) 或 CSV 的决策表,通过 spreadsheet compiler 编译为 DRL 规则。
4.2.1 决策表结构
| 条件列1:交易金额 | 条件列2:用户等级 | 条件列3:设备指纹 | 动作:风险等级 | 动作:处置方式 |
|---|---|---|---|---|
| > 50000 | VIP | 未知 | HIGH | 人工审核 |
| 10000 ~ 50000 | 普通 | 已知 | MEDIUM | 增强验证 |
| < 10000 | 任意 | 任意 | LOW | 放行 |
最佳实践:决策表适合规则数量在 20~200 条之间的场景。超过 200 条时,建议拆分为多个决策表或改用决策树,以保持可读性。
4.3 决策树(Decision Tree)
决策树是一种树形结构的规则表达方式,每个内部节点代表一个属性测试,每个分支代表测试结果,每个叶子节点代表一个决策结果。在风控中,决策树常用于构建可解释的评分模型或规则集。
4.3.1 决策树与规则引擎的映射
决策树可以等价转换为一系列 if-then 规则,每条从根到叶子的路径对应一条规则。这种转换使得决策树既能保持可视化可解释性,又能直接部署到规则引擎中执行。
4.4 评分卡(Scorecard)
评分卡是一种基于权重的线性评分模型,广泛应用于信用评估和欺诈评分。在规则引擎中,评分卡通常以 特征-分值映射表 的形式存在,引擎根据输入特征查找对应分值并累加,最终根据总分阈值做出决策。
4.4.1 评分卡结构示例
| 特征 | 取值区间 | 分值 |
|---|---|---|
| 年龄 | 18-25 | 10 |
| 年龄 | 26-40 | 30 |
| 年龄 | 41-60 | 25 |
| 收入(月) | < 5000 | 5 |
| 收入(月) | 5000-20000 | 20 |
| 收入(月) | > 20000 | 35 |
| 历史逾期次数 | 0 | 40 |
| 历史逾期次数 | 1-2 | 15 |
| 历史逾期次数 | >=3 | 0 |
评分卡决策逻辑:
- 总分 = 年龄分值 + 收入分值 + 历史逾期次数分值
- 若总分 ≥ 70:低风险,自动放行
- 若 40 ≤ 总分 < 70:中风险,增强验证
- 若总分 < 40:高风险,拒绝交易
4.5 四种表达形式对比
| 维度 | DRL | 决策表 | 决策树 | 评分卡 |
|---|---|---|---|---|
| 可读性 | 中(需熟悉语法) | 高(表格直观) | 高(树形可视化) | 高(分值透明) |
| 灵活性 | 极高(支持复杂逻辑) | 中(适合固定组合) | 中(路径固定) | 低(线性累加) |
| 维护成本 | 中(需开发人员) | 低(业务人员可维护) | 低(剪枝后稳定) | 低(调分即可) |
| 执行性能 | 高(Rete 算法优化) | 高(编译为 DRL) | 高(O(log n)) | 极高(O(n) 查表) |
| 适用场景 | 复杂规则、动态条件 | 多条件组合、合规清单 | 可解释性要求高的分类 | 信用评分、额度计算 |
4.6 混合使用策略
在实际风控系统中,通常不会只使用一种规则表达形式,而是根据场景混合使用:
- 顶层决策:使用决策树快速分流(如区分新用户/老用户、高/低风险渠道)。
- 中间层规则:使用 DRL 处理复杂交叉条件(如设备指纹 + 地理位置 + 交易行为组合)。
- 底层评分:使用评分卡对用户信用、交易风险进行量化打分。
- 配置层:使用决策表让业务人员快速调整参数化规则(如黑名单、白名单、限额配置)。
注意事项:混合使用时,必须统一规则引擎的 事实模型(Fact Model) 和 全局变量,避免不同表达形式之间产生数据冲突。建议在规则包层面进行命名空间隔离,并通过
agenda-group 或 activation-group 控制规则执行顺序。