2. 风控规则基础
在构建风控系统时,规则是决策的最小逻辑单元。但单条规则几乎无法覆盖真实业务中的复杂风险,因此我们需要一套机制来组织、编排和执行大量规则。本节将围绕规则引擎、规则集、规则依赖、执行顺序以及常见风控场景展开,为后续理解DAG依赖图与循环检测打下基础。
一、规则引擎:从硬编码到可配置决策
规则引擎是一种将业务决策逻辑从代码中抽离出来的组件。它允许业务人员通过配置方式定义“条件—动作”对,由引擎负责解析、匹配和执行。在风控场景中,规则引擎的核心价值在于:快速响应策略变化、降低开发成本、提升决策透明度。
一个典型的风控规则通常包含以下要素:
- 规则标识:唯一ID,用于追踪和引用。
- 条件表达式:如“近1小时同设备登录次数 > 5”。
- 动作:命中后执行的操作,如“拒绝”“人工审核”“打标”。
- 优先级:决定规则在冲突或顺序执行时的先后。
- 依赖声明:该规则需要哪些前置规则的结果作为输入。
规则引擎的常见实现模式包括:
- Rete算法:适合大量规则的条件匹配,通过共享节点减少重复计算。
- 决策表:以表格形式表达多条件组合,直观但灵活性有限。
- 脚本引擎:如Groovy、Aviator,允许动态编写复杂逻辑。
- DAG编排引擎:将规则视为节点,依赖视为边,按拓扑顺序执行。
规则引擎不是越复杂越好。对于规则数量少、变更频率低的场景,硬编码或简单配置反而更稳定。引入引擎的时机通常是:规则数量超过50条、变更频率每周多次、或需要业务人员自助配置。
二、规则集:分组管理与批量执行
规则集是一组规则的集合,通常按业务维度划分,例如“登录风控规则集”“支付风控规则集”“营销反作弊规则集”。规则集的作用在于:
- 隔离:不同业务线的规则互不干扰。
- 复用:通用规则可被多个规则集引用。
- 批量执行:引擎可对规则集整体调度,决定串行或并行。
- 版本管理:规则集可整体发布、回滚,降低变更风险。
规则集内部通常有两种执行模式:
| 模式 | 特点 | 适用场景 |
|---|---|---|
| 全量执行 | 所有规则都执行,汇总所有命中结果 | 需要综合评分、多规则叠加决策 |
| 短路执行 | 命中高优先级规则后立即返回,不再执行后续 | 强拒绝场景,追求低延迟 |
| 并行执行 | 无依赖规则同时执行,提升吞吐 | 规则间无依赖、耗时较长 |
三、规则依赖与执行顺序:DAG的雏形
当规则之间存在“前置规则的结果影响后置规则是否执行或如何执行”的关系时,就产生了规则依赖。例如:
- 规则B需要规则A输出的“设备风险分”作为输入。
- 规则C仅在规则A命中“高风险”时才执行。
- 规则D需要规则B和规则C的结果共同判断。
这些依赖关系天然构成一个有向图。如果依赖关系设计得当,该图是一个有向无环图(DAG),可以按拓扑排序确定执行顺序。反之,如果出现循环依赖,引擎将无法确定执行起点,导致死锁或无限递归。
下面是一个简化的规则依赖配置示例:
{
"ruleSet": "login_risk",
"rules": [
{
"id": "R1",
"name": "设备异常检测",
"dependsOn": [],
"action": "output:deviceRiskScore"
},
{
"id": "R2",
"name": "IP信誉检测",
"dependsOn": [],
"action": "output:ipRiskScore"
},
{
"id": "R3",
"name": "综合风险评分",
"dependsOn": ["R1", "R2"],
"action": "output:totalRiskScore"
},
{
"id": "R4",
"name": "高风险拒绝",
"dependsOn": ["R3"],
"condition": "totalRiskScore > 80",
"action": "reject"
}
]
}
对应的执行顺序为:R1、R2 可并行执行,完成后执行R3,最后执行R4。若错误地让R1依赖R4,则形成循环,引擎必须检测并拒绝加载。
循环依赖是规则编排中最危险的错误之一。它可能不会在配置时立即暴露,而是在特定流量条件下触发,导致规则引擎线程阻塞、请求超时,甚至引发雪崩。因此,在规则集发布前进行循环检测是必备环节。
四、常见风控场景与规则编排实例
不同风控场景对规则依赖和执行顺序的要求差异很大。以下是几个典型场景:
- 登录风控:先做设备指纹、IP信誉等无依赖规则,再综合评分,最后决定放行、挑战或拒绝。
- 支付风控:依赖用户历史行为、商户风险、实时交易特征,规则间依赖复杂,通常需要DAG编排。
- 营销反作弊:规则数量多但依赖较浅,适合并行执行后汇总。
- 内容安全:先做敏感词、图片识别等独立检测,再根据结果决定是否人工复审。
以支付风控为例,一个简化的依赖关系如下:
用户历史风险分 ──┐
├──> 综合风险分 ──> 决策规则
商户风险分 ──────┤
│
实时交易特征 ────┘
在这个例子中,三个前置规则互不依赖,可以并行执行;综合风险分依赖三者结果;决策规则依赖综合风险分。整个图无环,可拓扑排序。
五、误区与复盘
在实际工程中,规则依赖与执行顺序常出现以下误区:
- 隐式依赖:规则B实际上使用了规则A的输出,但配置中未声明依赖,导致执行顺序随机,结果不稳定。
- 过度串行:将所有规则串行执行,虽然顺序确定,但延迟高,吞吐低。
- 循环依赖未检测:依赖关系由多人维护,缺乏统一校验,上线后才发现死循环。
- 优先级与依赖冲突:高优先级规则依赖低优先级规则,但短路执行导致低优先级规则未执行,依赖落空。
- 规则集粒度过粗:所有规则放在一个集合中,依赖关系混乱,难以维护。
复盘建议:每次规则集变更后,自动生成依赖图并执行循环检测;对规则依赖进行显式声明,禁止隐式读取其他规则输出;对并行执行的规则,确保它们之间没有共享可变状态。