一、问题根源:通用规则引擎为何在金融风控中'失语'?
金融风控不是简单的布尔判断,而是强语义、高可解释、多系统协同的决策过程。Drools、Easy Rules 等通用引擎默认将规则抽象为 when...then 表达式,但无法原生表达如下业务逻辑:
- 逾期天数需按账单日动态滚动计算(非静态字段比对);
- 贷后评分需基于近6个月结构化还款流水聚合建模;
- 多头借贷接口返回字段(如
totalCreditAmount)需自动绑定至业务变量他行授信总额,而非人工硬编码映射; - 监管审计要求回答:'哪条规则节点触发拒绝?依据哪个接口的哪次调用结果?'------而通用引擎仅输出
result = false。
本质是架构层未将'业务决策即资产'作为设计原点,导致每次对接都需额外封装函数、补全日志、统一口径,技术债持续累积。
二、能力一:决策设计器------用可版本化配置替代硬编码流程
决策设计器并非可视化拖拽界面,而是以声明式配置+元数据驱动实现业务逻辑资产化。其技术关键点如下:
-
模板化决策流定义 :预置
loan_pre_screening.yaml、post_loan_monitoring.json等标准模板,内含符合银保监《智能风控模型管理指引》的节点类型(准入/拦截/转人工/加权评分); -
混合编排引擎 :支持在同一决策流中嵌套
DecisionTableNode(用于地区利率策略批量配置)与ScorecardNode(加载PMML或自定义Groovy评分脚本),二者共享同一上下文变量池; -
细粒度版本控制 :每次保存生成不可变配置快照,存储结构为:
{ "version": "v2.3.1", "modifiedBy": "risk-admin@bank.com", "timestamp": 1715829430123, "diff": ["added: node_scorecard_002", "removed: condition_rule_011"] } -
权限嵌入式校验 :所有API操作(如
/api/rule/deploy)强制校验X-Role: RULE_AUDITOR或X-Role: BUSINESS_CONFIGURATOR,拒绝越权发布。
三、能力二:函数计算器------将业务因子注册为可调度服务
函数计算器本质是一个轻量级无状态计算注册中心 ,所有函数均以 FunctionDefinition 对象注册到内存注册表,并支持热加载。典型实现方式:

-
开箱即用金融函数 :如
OverdueDaysRollingCalculator继承AbstractFinanceFunction,接收accountDate(账单日)、repayDateList(还款日期数组)参数,内部按自然月滚动窗口计算:def calc = { accountDate, repayDates -> def currentMonth = accountDate.withDayOfMonth(1) repayDates.findAll { it >= currentMonth }.size() } -
多引擎适配器 :通过
FunctionExecutorFactory统一分发至不同执行器:SqlFunctionExecutor:执行SELECT SUM(amount) FROM credit_log WHERE user_id = ? AND month <= ?;ApiFunctionExecutor:自动注入Authorization: Bearer ${token}并重试3次;
-
结构化变量支持 :
CompositeVariable类型可接收 JDBC ResultSet 或 JSON Array,供评分卡节点直接调用.getRows().sum{it.score}; -
全链路日志埋点 :每个函数执行生成唯一
executionId,日志结构包含inputJson、outputJson、stackTrace(异常时),日志落库表function_execution_log。
四、能力三:数据源抽象------统一异构数据接入契约
数据源抽象层采用 SPI(Service Provider Interface)机制 ,将各类数据源标准化为 DataSourceInstance 接口实例:

-
统一连接池管理:MySQL/Oracle 使用 HikariCP,API 使用 OkHttp 连接池,Excel 使用 Apache POI 缓存 Sheet 引用;
-
语义自动映射 :
MultiHeadLoanAutoMapper工具类通过 NLP 关键词匹配(如正则(?i)(credit|limit|amount)→授信总额)+ 人工标注样本训练轻量分类器,生成字段映射配置:{ "sourceField": "totalCreditAmount", "businessVar": "he_xing_shou_xin_zong_e", "dataType": "DECIMAL", "required": true } -
失败降级策略配置 :在数据源配置中声明
fallbackStrategy: CACHE_THEN_DEFAULT,当 API 调用超时(timeout=3000ms),自动读取 Redis 中ds:multihead:last_success缓存值,缓存失效则返回预设default: {"totalCount":0}; -
强绑定配置界面 :在规则编辑页右侧面板,点击『关联数据源』即可选择已注册实例,所选字段实时注入变量列表,杜绝
user_info.name与userInfoDTO.getName()的命名割裂。
五、能力四:执行追溯------满足监管要求的节点级可审计日志
执行追溯能力基于 事件溯源(Event Sourcing)模式 实现,每条风控请求生成唯一 traceId,全程记录决策事件流:
-
节点级判定日志 :每个条件节点输出标准 JSON 片段,含原始值、计算过程、判定结果:
{ "nodeId": "cond_liability_ratio", "expression": "liabilityRatio > 0.7", "evaluated": {"liabilityRatio": 0.723}, "result": "REJECT", "reason": "负债率=72.3% > 阈值70%" } -
双向日志关联 :规则日志中
functionExecutionIds: ["fx-abc123", "fx-def456"],对应函数日志中executionId: "fx-abc123",支持从拒绝结果一键下钻至征信接口返回空值; -
合规元信息强制注入 :所有日志写入前自动附加:
version: v2.3.1(规则版本)operator: risk-audit-team(操作人标识)clientIp: 10.20.30.40(调用方IP)timestamp: 1715829430123
-
审计就绪导出:前端提供『复制JSON日志』按钮,输出格式严格遵循《银行保险机构操作风险管理办法》附件3日志规范,无需二次清洗。

六、结语:技术落地的关键不是'能不能',而是'要不要原生支持'
JVS-Rules 的四大能力并非功能堆砌,而是围绕金融风控本质------语义可读、计算可复用、数据可契约、执行可归因------进行的架构级收敛。开发者无需再为每个新接口写适配器、为每次审计补日志、为每个策略改分支逻辑。真正的效率提升,始于让技术栈与业务语义同频。
✅ 下一步建议:在测试环境部署 JVS-Rules 后,优先验证
多头借贷接口自动映射和节点级执行日志导出两个高频合规场景,确认字段语义对齐与审计字段完整性。