本文基于 JVS-Rules 规则引擎,手把手搭建一个完整的贷前风控决策流,涵盖数据接入、变量加工、规则集、评分卡、额度决策及API调用。
一、风控业务背景
贷前审批是信贷业务的第一道防线。一个典型的流程包括:
- 用户实名验证(身份证、手机号)
- 黑名单过滤(内部黑名单、第三方欺诈库)
- 反欺诈规则(设备指纹、异常行为)
- 信用评估(征信分、收入负债比、多头借贷)
- 额度计算(评分卡 → 授信额度)
传统实现方式:每个环节硬编码或使用 Drools DRL 文件。维护成本高,策略上线慢(周级),且业务人员无法参与。
使用 JVS-Rules 可视化决策流后,风控策略可做到小时级上线,且业务人员可独立完成 80% 的规则调整。
二、整体决策流设计
我们设计的贷前风控决策流包含以下节点(按执行顺序):
| 序号 | 节点类型 | 功能说明 |
|---|---|---|
| 1 | 开始节点 | 定义入参(用户ID、申请金额等) |
| 2 | 数据源节点 | 调用征信API、查询内部数据库 |
| 3 | 变量加工节点 | 将原始数据转换为业务因子(负债收入比、多头借贷次数等) |
| 4 | 规则集节点 | 硬规则拒绝(年龄不符、黑名单、征信分过低) |
| 5 | 评分卡节点 | 对通过硬规则的用户进行信用评分 |
| 6 | 决策表节点 | 根据评分结果映射授信额度 |
| 7 | 结束节点 | 返回审批结果(通过/拒绝)、额度、拒绝原因码 |
下面逐步拆解每个节点的配置细节。
三、第一步:配置入参(开始节点)
在决策流基本信息中定义入参,供后续节点使用。本例入参如下:
| 参数名 | 字段Key | 类型 | 说明 |
|---|---|---|---|
| 用户ID | userId | String | 唯一标识 |
| 申请金额 | applyAmount | Double | 用户申请贷款金额 |
| 身份证号 | idNo | String | 用于身份核验 |
入参 JSON 格式自动生成:
json
{ "userId": "U10001", "applyAmount": 50000, "idNo": "410***************" }
四、第二步:数据源接入
风控决策需要多种数据来源。JVS-Rules 支持三种数据源接入方式:
4.1 接入征信API(API数据源)
配置步骤:
-
进入「数据源」管理,点击「新增」→「API 数据源」
-
填写数据方名称:「百行征信」
-
配置接口:
- URL:
https://api.baixingcredit.com/v1/query - 请求方式:POST
- 请求头:
Authorization: Bearer {{token}} - 入参:
{ "idNo": "{{idNo}}" }
- URL:
-
配置数据解析规则:返回 JSON 中提取
creditScore(征信分)、overdueCount(逾期次数)、debtAmount(负债总额) -
保存并测试接口
4.2 接入内部黑名单表(MySQL数据源)
配置步骤:
-
新增 MySQL 数据源,填入数据库连接信息
-
点击「同步结构」,选择
blacklist表 -
创建复合变量「黑名单查询」:
- 数据过滤条件:
idNo = {{idNo}} - 输出字段:
is_black(存在记录即命中)
- 数据过滤条件:
4.3 接入用户历史订单表(SQL变量)
如果内部数据库表结构复杂,可使用 SQL 变量直接写查询语句:
sql
SELECT COUNT(*) AS order_count_90d, SUM(amount) AS total_amount_90d FROM orders WHERE user_id = #{userId} AND create_time >= DATE_SUB(NOW(), INTERVAL 90 DAY)
配置参数:userId(String,必填),模拟值:"U10001"
五、第三步:变量加工
原始数据不能直接用于规则,需要加工成业务因子。
5.1 基础变量(函数加工)
在「变量管理」中创建以下基础变量:
| 变量名 | 计算公式 | 说明 |
|---|---|---|
| 年龄 | AGE(idNo) | 从身份证号提取年龄 |
| 负债收入比 | DIVIDE(debtAmount, monthlyIncome) | 负债总额 / 月收入 |
| 多头借贷次数 | SUM(applyCount_30d) | 近30天申请机构数 |
| 是否高龄 | GT(age, 60) | 布尔值,年龄>60为true |
JVS-Rules 提供 100+ 内置函数,包括文本、数学、逻辑、集合、时间等。上述
AGE、DIVIDE、GT均为内置。
5.2 复合变量(多行数据聚合)
我们需要「近6个月逾期次数」。创建复合变量:
- 数据源:
repayment_record表 - 过滤条件:
user_id = #{userId} AND status = '逾期' AND due_date >= DATE_SUB(NOW(), INTERVAL 6 MONTH) - 分组:无(直接统计)
- 聚合:
COUNT(*)→ 输出overdue_count_6m
然后创建基础变量 has_overdue:GT(overdue_count_6m, 0)
六、第四步:硬规则过滤(规则集节点)
在决策流画布上拖入「规则集」节点,配置多条并行判断的规则。规则之间为 OR 关系(任何一条命中即触发拒绝)。
规则集配置如下:
| 规则名称 | 条件表达式 | 命中后动作 |
|---|---|---|
| 年龄不符 | 年龄 < 18 OR 年龄 > 65 | 拒绝,原因码 A01 |
| 黑名单命中 | 黑名单查询.is_black == true | 拒绝,原因码 B02 |
| 征信分过低 | creditScore < 550 | 拒绝,原因码 C03 |
| 严重逾期 | overdue_count_6m >= 3 | 拒绝,原因码 D04 |
| 多头借贷超限 | 多头借贷次数 > 5 | 拒绝,原因码 E05 |
配置界面操作:
- 点击规则集节点 → 「添加规则」
- 每条规则中点击「添加关系组」,选择变量、比较符、比较值
- 设置命中后的分支:可连接到结束节点(拒绝),或继续执行(若设计为累计规则)
本案例设计为:任何硬规则命中,直接跳转到结束节点返回拒绝。在画布上将规则集的「拒绝」连线连接到结束节点,「通过」连线连接到评分卡节点。
七、第五步:信用评分(评分卡节点)
通过硬规则的用户进入评分卡。评分卡节点采用「简单评分卡」或「复杂评分卡」。本例使用简单评分卡。
配置评分卡:
- 拖入「简单评分卡」节点
- 设置评分维度(每个维度独立评分,最后加权求和):
| 维度 | 条件范围 | 分值 | 权重 |
|---|---|---|---|
| 年龄 | 25-40岁 | 30 | 1 |
| 年龄 | 41-55岁 | 20 | 1 |
| 年龄 | 18-24岁 或 56-60岁 | 10 | 1 |
| 月收入 | ≥20000元 | 40 | 1 |
| 月收入 | 10000-19999元 | 25 | 1 |
| 月收入 | 5000-9999元 | 10 | 1 |
| 征信分 | ≥700 | 30 | 1 |
| 征信分 | 600-699 | 15 | 1 |
| 征信分 | 550-599 | 5 | 1 |
| 负债收入比 | <0.3 | 20 | 1 |
| 负债收入比 | 0.3-0.5 | 10 | 1 |
| 负债收入比 | >0.5 | -10 | 1 |
总分计算:简单求和(权重均为1时,总分 = 各维度分值之和)。最高分 = 30+40+30+20 = 120,最低分可能出现负数。
评分卡节点输出 totalScore 变量,供后续决策表使用。
八、第六步:额度决策(决策表节点)
根据评分结果和申请金额,决策表输出最终额度(或拒绝)。
决策表配置:
| 评分区间 | 申请金额 ≤ 额度上限 | 审批结果 | 授信额度 | 拒绝原因 |
|---|---|---|---|---|
| ≥100 | 任意 | 通过 | 申请金额 × 1.0 | - |
| 80-99 | ≤30000 | 通过 | 30000 | - |
| 80-99 | >30000 | 拒绝 | 0 | 额度不足 |
| 60-79 | ≤10000 | 通过 | 10000 | - |
| 60-79 | >10000 | 拒绝 | 0 | 额度不足 |
| <60 | 任意 | 拒绝 | 0 | 信用评分低 |
在 JVS-Rules 决策表节点中:
- 点击「新增维度」添加条件列:
totalScore区间、applyAmount比较 - 添加结果列:
result(通过/拒绝)、creditLimit(数值)、rejectReason(字符串) - 逐行填写规则
决策表节点输出结果变量,供结束节点使用。
九、第七步:结束节点自定义输出
结束节点可以自定义输出字段。本例输出:
| 输出字段 | 类型 | 说明 | 取值来源 |
|---|---|---|---|
| approved | Boolean | 是否通过 | 决策表.result == "通过" |
| creditLimit | Double | 授信额度 | 决策表.creditLimit |
| rejectCode | String | 拒绝原因码 | 规则集命中的原因码 或 决策表.rejectReason |
| totalScore | Integer | 评分卡得分 | 评分卡.totalScore |
配置方式:在结束节点属性中点击「新增结果」,选择「变量」类型,从下拉框中选择上述变量。
十、在线测试与API调用
10.1 在线测试
决策流配置完成后,点击「模拟测试」按钮,输入测试数据:
json
{ "userId": "U10001", "applyAmount": 50000, "idNo": "410***************" }
点击「执行」,系统会:
- 高亮显示实际执行的节点路径
- 鼠标悬停任何节点可查看输入输出
- 最终显示结束节点的输出结果
10.2 API 调用
决策流启用后,业务系统可通过 HTTP 调用:
请求示例(cURL) :
bash
curl -X POST https://your-domain/api/risk/projectFlow/call/FLOW_CREDIT_001 \ -H "Content-Type: application/json" \ -H "Authorization: Bearer sk_xxxxx" \ -d '{"userId":"U10001","applyAmount":50000,"idNo":"410***************"}'
响应示例:
json
{ "code": 0, "msg": "success", "data": { "approved": true, "creditLimit": 50000, "rejectCode": "", "totalScore": 95 }, "timestamp": "2026-04-13T14:30:00.123Z" }
10.3 调用日志
每次调用都会记录在「执行日志」中,可查看:
- 完整入参和出参
- 各节点执行耗时
- 决策路径可视化回放
这对风控合规审计非常关键。
十一、总结
通过 JVS-Rules 规则引擎,我们仅用拖拽配置 + 少量函数就完成了一个企业级贷前风控决策流。相比硬编码方式:
| 对比项 | 传统硬编码 | JVS-Rules 规则引擎 |
|---|---|---|
| 策略上线周期 | 3-5 天 | 2 小时 |
| 业务人员参与度 | 低(只能提需求) | 高(可配置规则、评分卡、决策表) |
| 规则变更风险 | 高(代码回归) | 低(可视化测试,路径高亮) |
| 合规审计 | 需人工审查代码 | 自动记录版本、执行日志 |
| 维护成本 | 高(专职开发) | 低(运维+业务) |
本文完整决策流已在 JVS-Rules 中验证通过。如果你正在构建或重构风控系统,建议尝试规则引擎方案。
注:JVS-Rules 社区版开源免费,可满足大部分中小企业的风控需求。商业版提供动态公式、交叉决策表、异步执行等高级功能。