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编排。
  • 营销反作弊:规则数量多但依赖较浅,适合并行执行后汇总。
  • 内容安全:先做敏感词、图片识别等独立检测,再根据结果决定是否人工复审。

以支付风控为例,一个简化的依赖关系如下:

用户历史风险分 ──┐
                  ├──> 综合风险分 ──> 决策规则
商户风险分 ──────┤
                  │
实时交易特征 ────┘

在这个例子中,三个前置规则互不依赖,可以并行执行;综合风险分依赖三者结果;决策规则依赖综合风险分。整个图无环,可拓扑排序。

五、误区与复盘

在实际工程中,规则依赖与执行顺序常出现以下误区:

  1. 隐式依赖:规则B实际上使用了规则A的输出,但配置中未声明依赖,导致执行顺序随机,结果不稳定。
  2. 过度串行:将所有规则串行执行,虽然顺序确定,但延迟高,吞吐低。
  3. 循环依赖未检测:依赖关系由多人维护,缺乏统一校验,上线后才发现死循环。
  4. 优先级与依赖冲突:高优先级规则依赖低优先级规则,但短路执行导致低优先级规则未执行,依赖落空。
  5. 规则集粒度过粗:所有规则放在一个集合中,依赖关系混乱,难以维护。
复盘建议:每次规则集变更后,自动生成依赖图并执行循环检测;对规则依赖进行显式声明,禁止隐式读取其他规则输出;对并行执行的规则,确保它们之间没有共享可变状态。