4. 规则语法设计:基础语法(IF-THEN)、复合条件(AND/OR/NOT)、变量与函数调用

好,咱们今天聊点实在的。规则语法设计,说白了就是给风控系统写「规矩」。你想想看,一个交易进来,系统得判断它是不是有问题。怎么判断?靠的就是我们写的这些规则。

我个人习惯把规则语法分成三个层次:基础判断条件组合能力扩展。咱们一层一层剥开看。

4.1 基础语法:IF-THEN 的哲学

IF-THEN 是所有规则引擎的基石。没有它,后面的一切都免谈。它的逻辑其实特别简单:如果条件成立,就执行动作

我在项目中遇到过最典型的场景——判断一笔交易是否来自高风险地区。代码写出来就是这样的:

IF transaction.country == "高风险地区A" THEN
    result = "拒绝"
END IF

嗯,这里要注意。IF-THEN 的「条件」部分,本质上是一个布尔表达式。它要么是 true,要么是 false。没有中间态。

但实际业务中,哪有这么简单?你想想看,一个用户可能同时触发多个风险点。这时候就需要更复杂的结构了。

核心要点:IF-THEN 是原子操作。每个规则最终都要拆解成若干个 IF-THEN 的原子组合。这是规则引擎能高效执行的关键。

4.2 复合条件:AND/OR/NOT 的实战用法

单一条件太脆弱了。真实的风控场景,往往是多个条件交织在一起。这时候 AND、OR、NOT 就派上用场了。

AND(与):所有条件同时满足,才算命中。我曾经在反欺诈规则里用过这样一个组合:

IF transaction.amount > 10000 
   AND user.registration_days < 7 
   AND device.is_emulator == true THEN
    result = "人工审核"
END IF

这个规则的意思是:大额交易 + 新注册用户 + 模拟器设备。三个条件同时成立,基本可以判定是欺诈行为。少一个都不行。

OR(或):只要有一个条件满足,就算命中。这个在风控里用得特别多,因为风险往往是「多因一果」的。

IF user.ip_country != user.phone_country 
   OR user.ip_country != user.billing_country THEN
    result = "增强验证"
END IF

你看,IP 地址和手机号国家不一致,或者和账单地址国家不一致,只要有一个对不上,就触发增强验证。这就是 OR 的典型用法。

NOT(非):取反操作。说实话,NOT 在风控规则里用得相对少一些,但用好了特别巧妙。

IF NOT user.is_verified THEN
    result = "限制交易"
END IF

说白了就是:只要用户没通过实名认证,就限制交易。简单粗暴,但有效。

我的小技巧:写复合条件时,我习惯用括号明确优先级。比如 (A AND B) OR (C AND D)。这样既清晰,又避免歧义。很多线上事故都是因为优先级搞错了。

4.3 变量与函数调用:让规则活起来

光有 IF-THEN 和逻辑运算符,规则还是太死板。你想想看,每个交易的用户画像、设备指纹、行为序列都不一样。怎么处理?靠变量和函数。

变量:规则引擎里的变量,其实就是从交易上下文中提取出来的「特征」。比如:

  • transaction.amount:交易金额
  • user.age:用户年龄
  • device.fingerprint:设备指纹
  • history.fraud_count_30d:近30天欺诈次数

这些变量从哪里来?从数据接入层来。我们在设计规则语法时,要提前定义好变量字典。不然规则写出来,引擎找不到变量,那就尴尬了。

函数调用:函数是规则引擎的「外挂」。有些逻辑用 IF-THEN 写起来太啰嗦,或者根本写不了,这时候就需要函数。

举个例子,判断一个邮箱是不是临时邮箱:

IF is_temp_email(user.email) == true THEN
    result = "拒绝"
END IF

这个 is_temp_email() 就是一个函数。它背后可能调用了第三方 API,也可能查了本地黑名单库。但规则引擎不关心这些,它只关心返回值。

我在项目中遇到过最常用的函数类型:

函数类别 示例 说明
字符串处理 contains(), regex_match() 匹配关键词、正则表达式
数值计算 abs(), round() 金额取整、差值计算
时间函数 date_diff(), hour_of_day() 判断交易时间、间隔
风控专用 risk_score(), device_risk() 调用风控模型评分
避坑指南:我曾经在项目里允许规则直接调用数据库查询函数。结果业务方写了一条规则,每次交易都去查全量用户表。系统直接被打挂了。后来我强制规定:函数只能操作当前交易上下文的数据,不允许跨请求查询。这是血的教训。

4.4 语法设计的整体架构

说了这么多,咱们用一张图把整个语法体系串起来。下面是我自己设计的规则语法架构图:

规则语法设计架构 规则 (Rule) IF (条件) THEN (动作) 基础条件 复合条件 函数调用 变量比较 数值判断 字符串匹配 AND / OR / NOT 括号优先级 条件嵌套 内置函数 自定义函数 外部服务调用

这张图把规则语法的三个核心要素串起来了。你从顶层往下看:一条规则,本质上就是「条件 + 动作」。条件可以是基础的变量判断,也可以是 AND/OR/NOT 组合出来的复合条件,还可以是调用函数得到的结果。

我个人建议,在设计规则语法时,优先保证基础语法的简洁性。别一上来就搞花里胡哨的语法糖。先把 IF-THEN 跑通,再把 AND/OR/NOT 加上,最后再考虑函数扩展。这样迭代起来最稳。

总结一下:
  • IF-THEN 是规则的原子单位,必须稳定可靠
  • AND/OR/NOT 是条件组合的「胶水」,注意优先级
  • 变量是规则的「数据源」,函数是规则的「能力外挂」
  • 语法设计要分层,先基础后扩展

嗯,关于规则语法的基础部分,今天就聊这么多。下一节咱们会深入讲讲规则引擎的执行流程和性能优化。到时候我会分享一些线上调优的真实案例,保证干货满满。

专注资料整理