3. 决策流核心概念

决策流核心概念 学习卡片

在风控系统中,决策流并不是一张“画着箭头的流程图”,而是一套可执行、可回放、可审计的编排模型。理解它的第一步,是把图中每一个元素都映射为运行时语义:谁在执行、依据什么执行、执行后去哪里、失败如何兜底、变更如何追溯。本节围绕八个核心概念展开,帮助你建立从“画图”到“跑流”的完整认知。

一、核心原理:决策流是一张有向图,但不止于图

决策流本质上是一个有向无环图(DAG)或允许有限循环的有向图。节点代表计算单元,边代表控制流或数据流,条件决定边的通断,动作是节点内的具体行为,分支与汇聚构成图的拓扑结构,子流程用于封装复用,版本管理保证变更可控。它们的关系可以概括为:

  • 节点:最小执行单元,如规则集、模型评分、名单查询、脚本、人工审核。
  • 边:节点之间的连接,携带条件表达式或默认优先级。
  • 条件:布尔表达式,决定走哪条边,通常引用上下文变量。
  • 动作:节点被触发后执行的操作,如赋值、拒绝、打标、调用外部服务。
  • 分支:一个节点出边多于一条,形成路径选择。
  • 汇聚:多条入边汇入同一节点,需定义合并策略。
  • 子流程:可被多次调用的独立决策流,拥有自己的入参与出参。
  • 版本管理:对决策流定义进行快照、发布、回滚与灰度。

关键认知:节点负责“算什么”,边负责“往哪走”,条件负责“凭什么走”,动作负责“走的时候做什么”。四者分离,才能让风控策略既灵活又可控。

二、方法流程:从建模到执行的六步法

要让决策流真正落地,建议遵循以下流程:

  1. 定义上下文:明确输入变量(如用户ID、设备指纹、申请金额)和输出变量(如决策结果、风险分、命中规则)。
  2. 划分节点:按职责拆分,避免一个节点做太多事。例如“查黑名单”和“算评分”应分开。
  3. 连接边与条件:为每条边设置条件表达式和优先级,确保互斥或可排序。
  4. 设置动作:节点执行后写入上下文,供后续节点和边使用。
  5. 处理分支与汇聚:分支要覆盖所有可能路径,汇聚要定义变量合并规则。
  6. 封装子流程与版本:将通用逻辑抽为子流程,发布时生成版本号并记录变更。

下面是一个简化的决策流配置片段,展示节点、边、条件与动作的声明方式:

{
  "flowId": "risk_loan_apply",
  "version": "v3.2.1",
  "nodes": [
    {
      "id": "n1",
      "type": "ruleSet",
      "name": "基础准入",
      "action": { "set": { "basePass": "true" } }
    },
    {
      "id": "n2",
      "type": "model",
      "name": "欺诈评分",
      "action": { "set": { "fraudScore": "$model.score" } }
    },
    {
      "id": "n3",
      "type": "decision",
      "name": "最终决策",
      "action": { "set": { "result": "REJECT" } }
    }
  ],
  "edges": [
    { "from": "n1", "to": "n2", "condition": "$basePass == true", "priority": 1 },
    { "from": "n1", "to": "n3", "condition": "$basePass == false", "priority": 2 },
    { "from": "n2", "to": "n3", "condition": "$fraudScore >= 0.8", "priority": 1 }
  ]
}

执行时,引擎从入口节点开始,按边优先级和条件求值,逐步推进,直到到达终止节点。每一步都应记录日志,便于回放与审计。

三、案例/场景:分支与汇聚在反欺诈中的应用

假设一个贷款申请场景:先做基础准入,再根据用户类型分流。新用户走“强校验”分支,老用户走“弱校验”分支,最后汇聚到“额度计算”节点。汇聚时,需要合并两条路径产生的变量,例如riskLevel和verifyScore。

概念 在本场景中的体现 注意事项
节点 基础准入、强校验、弱校验、额度计算 职责单一,便于复用
边 准入→强校验、准入→弱校验、强/弱→额度 条件互斥,避免歧义
条件 $userType == "NEW" 变量必须已定义
动作 设置riskLevel、调用外部接口 失败要有兜底
分支 新老用户分流 覆盖所有枚举值
汇聚 两条路径汇入额度计算 定义变量合并优先级
子流程 “强校验”封装为可复用子流程 入参出参清晰
版本管理 v3.2.1 发布,支持回滚 记录变更人与时间

实践建议:分支节点出边建议设置default边,防止条件未命中导致流程卡死。汇聚节点应明确变量合并策略,如“后到覆盖”或“取最大值”。

四、误区/复盘:常见坑与规避策略

在实际项目中,以下误区最容易导致决策流“看起来对,跑起来错”:

  • 条件重叠:多条边条件同时为真,引擎按优先级选择,但业务上可能希望互斥。应通过条件设计或优先级显式控制。
  • 汇聚丢变量:两条分支都设置了同名变量,汇聚后不确定用哪个。应在汇聚节点定义合并规则。
  • 子流程副作用:子流程修改了全局上下文,导致调用方行为不可预期。应限制子流程只通过出参返回结果。
  • 版本混乱:线上运行版本与测试版本不一致,回滚无依据。应强制版本号、变更日志和灰度发布。
  • 循环无界:允许循环但未设最大次数,导致死循环。应设置循环上限和超时。

复盘要点:每次决策流变更后,必须用历史样本回放,对比新旧版本的决策差异。差异率超过阈值时,需人工确认后再全量发布。

掌握这八个概念,你就拥有了阅读和设计任何风控决策流的基础语言。下一步,我们将进入编排器的具体实现,看看这些概念如何被引擎解析和执行。