4. 决策流编排语言入门:YAML/JSON 格式定义决策流、节点类型与属性配置
在额度策略工程中,决策流不再由硬编码实现,而是通过声明式语言(YAML 或 JSON)进行编排。这种方式将策略逻辑与代码解耦,使得策略分析师和风控工程师能够以接近自然语言的方式定义复杂的审批链路。本章将深入讲解决策流的核心结构、节点类型以及属性配置方法。
4.1 决策流的基本结构
一个标准的决策流定义文件通常包含三个顶层字段:metadata(元数据)、nodes(节点列表)和 edges(连线列表)。YAML 因其可读性高、支持注释,成为业界首选;JSON 则更适用于系统间传输。
| 字段 | 类型 | 说明 | 示例 |
|---|---|---|---|
| metadata | Object | 定义决策流的名称、版本、描述、作者等元信息 | name: credit_line_decision_v1 |
| nodes | Array | 包含所有决策节点的列表,每个节点有唯一 id 和类型 | id: node_001, type: rule |
| edges | Array | 定义节点之间的连接关系,包含 source、target 和条件 | source: node_001, target: node_002 |
4.2 核心节点类型与属性配置
额度决策流中的节点按功能可分为四大类:输入节点、规则节点、计算节点和输出节点。每种节点都有其专属的属性配置。
4.2.1 输入节点(Input Node)
决策流的起点,负责接收外部传入的变量,如用户ID、申请金额、征信报告数据等。通常配置变量映射和数据类型校验。
# YAML 示例:输入节点
nodes:
- id: input_001
type: input
config:
variables:
- name: user_id
type: string
required: true
- name: requested_amount
type: number
required: true
- name: credit_score
type: number
required: false
default: 0
4.2.2 规则节点(Rule Node)
核心判断单元,执行布尔逻辑运算。支持单条件、多条件组合(AND/OR)以及阈值比较。规则节点通常关联一个规则集 ID 或内联表达式。
# YAML 示例:规则节点
- id: rule_001
type: rule
config:
rule_set_id: "RS_1001" # 引用外部规则集
# 或使用内联规则
inline_rules:
- condition: "credit_score < 600"
action: "reject"
- condition: "credit_score >= 600 AND requested_amount <= 50000"
action: "approve"
4.2.3 计算节点(Compute Node)
执行数学运算或数据转换,如额度计算、利率换算、收入负债比计算。支持调用内置函数或自定义脚本。
# YAML 示例:计算节点
- id: compute_001
type: compute
config:
expression: "min(requested_amount, credit_score * 100)"
output_variable: "final_line_amount"
4.2.4 输出节点(Output Node)
决策流的终点,负责输出最终决策结果(通过/拒绝/人工审核)以及额度、利率等衍生变量。
# YAML 示例:输出节点
- id: output_001
type: output
config:
decision_field: "final_decision"
output_fields:
- name: "approved_amount"
source: "final_line_amount"
- name: "interest_rate"
source: "calculated_rate"
4.3 节点通用属性与连线定义
所有节点共享一组通用属性,用于控制执行顺序、超时、重试和日志记录。连线则定义了节点间的流转路径,支持条件分支。
| 属性 | 适用节点 | 说明 | 示例值 |
|---|---|---|---|
| id | 所有 | 节点唯一标识 | node_001 |
| type | 所有 | 节点类型 | rule |
| timeout_ms | 所有 | 节点执行超时时间(毫秒) | 5000 |
| retry_count | compute | 失败重试次数 | 2 |
| log_level | 所有 | 日志级别 | INFO |
连线(Edges)定义示例:
edges:
- source: input_001
target: rule_001
condition: "" # 无条件,直接流转
- source: rule_001
target: compute_001
condition: "result == 'approve'"
- source: rule_001
target: output_001
condition: "result == 'reject'"
condition 字段支持表达式引擎,可以引用上游节点的输出变量。空字符串表示无条件流转(默认路径)。
4.4 完整决策流示例(YAML)
以下是一个完整的额度审批决策流定义,包含输入、规则判断、额度计算和最终输出。
metadata:
name: "quick_credit_line_v1"
version: "1.0.0"
description: "小额快速额度审批流程"
nodes:
- id: input_data
type: input
config:
variables:
- name: user_id
type: string
- name: credit_score
type: number
- name: monthly_income
type: number
- id: check_credit
type: rule
config:
inline_rules:
- condition: "credit_score < 600"
action: "reject"
- condition: "credit_score >= 600"
action: "proceed"
- id: calculate_line
type: compute
config:
expression: "min(monthly_income * 3, 100000)"
output_variable: "line_amount"
- id: final_decision
type: output
config:
decision_field: "decision"
output_fields:
- name: "approved_line"
source: "line_amount"
edges:
- source: input_data
target: check_credit
- source: check_credit
target: calculate_line
condition: "result == 'proceed'"
- source: check_credit
target: final_decision
condition: "result == 'reject'"
- source: calculate_line
target: final_decision
4.5 JSON 格式对比与转换
虽然 YAML 是策略工程师的首选,但底层引擎通常将 YAML 编译为 JSON 执行。了解 JSON 格式有助于排查运行时问题。以下是同一决策流在两种格式下的对比。
| 特性 | YAML | JSON |
|---|---|---|
| 可读性 | 高,缩进清晰,支持注释 | 中,括号密集,不支持注释 |
| 文件大小 | 较小(无冗余括号) | 较大(键名需双引号) |
| 解析速度 | 较慢(需解析缩进) | 快(原生支持) |
| 适用场景 | 策略编写、版本管理 | 运行时传输、存储 |
4.6 节点属性配置进阶:上下文与变量作用域
在复杂决策流中,节点之间需要共享数据。每个节点执行后,其输出变量会被写入一个全局上下文(Context)对象。后续节点可以通过 $context.variable_name 引用这些变量。
# 节点间变量传递示例
nodes:
- id: compute_income_ratio
type: compute
config:
expression: "monthly_income / total_debt"
output_variable: "income_ratio" # 写入上下文
- id: check_ratio
type: rule
config:
inline_rules:
- condition: "$context.income_ratio > 0.4"
action: "reject_high_risk"
input.user_id、rule.credit_result、compute.final_amount。
4.7 本章小结
- 决策流由 metadata、nodes、edges 三部分组成,YAML 是推荐的编排语言。
- 四种核心节点类型:输入、规则、计算、输出,各有专属配置属性。
- 连线支持条件分支,通过
condition表达式控制流转路径。 - JSON 是运行时格式,YAML 是编写格式,两者可互相转换。
- 变量通过全局上下文传递,注意命名规范以避免冲突。