核心概念与术语:事实、规则、动作、冲突解决、议程
好,咱们正式开始聊策略引擎的核心概念。说实话,我见过不少团队,一上来就扎进代码里写规则,结果写到一半发现逻辑拧成了麻花。为什么?因为没把最基础的几个概念吃透。
这一章,咱们就把 事实(Fact)、规则(Rule)、动作(Action)、冲突解决(Conflict Resolution) 和 议程(Agenda) 这五个词掰开揉碎了讲。你想想看,搞懂了它们,策略引擎在你眼里就不再是黑盒子了。
1. 事实(Fact)—— 引擎认识的“原材料”
事实是什么?说白了,就是策略引擎知道的每一条信息。它可以是订单金额、用户年龄、设备状态、天气温度……任何你需要用来做决策的数据。
我个人习惯把事实分为两类:
- 初始事实:引擎启动时一次性塞进去的。比如用户提交的贷款申请单。
- 推导事实:规则执行过程中,引擎自己算出来的。比如根据收入算出的“信用评分”。
关键点:事实是引擎的“工作记忆”。它只存在于当前推理会话中,会话结束就清空。别指望它帮你做持久化存储。
我在项目中遇到过一个问题:有人把数据库里几百万条记录全当成事实塞进引擎。结果呢?内存直接爆了。记住,事实是当前上下文的快照,不是整个数据库。
2. 规则(Rule)—— 决策的“大脑”
规则就是引擎的决策逻辑。一个典型的规则长什么样?
规则模板:
IF [条件] THEN [动作]
实际例子:
IF 订单金额 > 1000 AND 用户等级 == "VIP"
THEN 应用折扣 0.85
规则由两部分组成:
- 条件部分(LHS):对事实的匹配判断。支持与、或、非、比较、范围等操作。
- 动作部分(RHS):条件满足时要执行的操作。比如修改事实、触发外部服务、记录日志。
我的建议:写规则时,条件尽量拆细。一条规则只做一件事。我曾经接手过一个项目,一条规则里塞了十几个条件,调试起来简直噩梦。拆成5条小规则,逻辑瞬间清晰了。
3. 动作(Action)—— 规则的“输出”
动作就是规则触发后,引擎实际干的事。常见的动作类型有:
| 动作类型 | 说明 | 示例 |
|---|---|---|
| 修改事实 | 更新或插入新的事实到工作内存 | 设置“风险等级 = 高” |
| 执行函数 | 调用外部代码或服务 | 发送短信通知、调用支付接口 |
| 控制流 | 影响引擎的推理流程 | 停止规则执行、跳转到指定规则 |
| 日志/审计 | 记录决策过程 | 写入“规则R3于12:00触发” |
注意:动作里不要写太重的逻辑,比如循环查数据库。引擎是单线程推理的,一个动作卡住,整个决策就卡死了。我曾经见过一个动作里调了个慢SQL,结果一次推理跑了30秒……
4. 冲突解决(Conflict Resolution)—— 引擎的“裁判”
好,问题来了。当多条规则同时满足条件时,引擎先执行哪条?这就是冲突解决要干的事。
常见的冲突解决策略有:
- 优先级(Priority/Salience):给每条规则设一个数字,越大越先执行。最常用。
- 最近使用(Recency):最近被修改过的事实触发的规则优先。
- 复杂度(Complexity):条件更多的规则优先(认为更具体)。
- 加载顺序(Load Order):谁先被加载到引擎里谁先执行。
我个人最推荐优先级策略。为什么?因为它最直观。你给核心业务规则设高优先级,给辅助规则设低优先级,一眼就能看出执行顺序。
避坑指南:我曾经在一个风控项目里,依赖了默认的“加载顺序”策略。结果后来有人调整了规则文件的加载顺序,整个决策逻辑全变了。从那以后,我强制要求所有规则必须显式声明优先级。
5. 议程(Agenda)—— 规则的“待办清单”
议程就是引擎内部维护的一个有序列表,里面装着所有已经满足条件、等待执行的规则实例。
引擎的工作流程是这样的:
- 把事实塞进工作内存。
- 引擎匹配所有规则,找出条件满足的规则。
- 把这些规则按冲突解决策略排序,放进议程。
- 从议程顶部取出一条规则,执行它的动作。
- 动作可能修改事实,导致新的规则被激活,或者已激活的规则失效。
- 重复步骤2-5,直到议程为空。
这个过程叫推理循环(Inference Cycle)。你想想看,它像不像一个循环:匹配 -> 排序 -> 执行 -> 再匹配。
6. 一张图看懂整体流程
下面这张图,把上面五个概念串起来了。我建议你多看两眼,理解它们之间的协作关系。
7. 一个完整的例子
光说概念太干,咱们跑一个完整的例子。假设我们做一个简单的订单折扣引擎:
// 事实
订单金额 = 1200
用户等级 = "VIP"
是否首次购买 = false
// 规则1(优先级 10)
IF 订单金额 > 1000 THEN 设置折扣 = 0.9
// 规则2(优先级 20)
IF 用户等级 == "VIP" THEN 设置折扣 = 0.85
// 规则3(优先级 5)
IF 是否首次购买 == true THEN 设置折扣 = 0.8
引擎执行过程:
- 匹配:规则1和规则2都满足条件。规则3不满足。
- 冲突解决:按优先级排序。规则2(优先级20) > 规则1(优先级10)。
- 议程:[规则2, 规则1]。
- 执行规则2:设置折扣 = 0.85。
- 执行规则1:设置折扣 = 0.9(覆盖了之前的0.85)。
- 议程为空,推理结束。最终折扣 = 0.9。
嗯,这里要注意:规则执行的顺序直接影响结果。如果规则1先执行,规则2后执行,最终折扣就是0.85。所以冲突解决策略不是摆设,它直接决定了业务逻辑的正确性。
8. 总结一下
这五个概念,是策略引擎的基石。我个人的经验是:
- 事实要轻量,别把数据库搬进来。
- 规则要单一职责,一条规则只做一件事。
- 动作要快,别在动作里做重计算。
- 冲突解决要显式声明优先级,别依赖默认行为。
- 议程是引擎的调度核心,理解它你就理解了推理循环。
把这些概念刻在脑子里,后面咱们写策略引擎的时候,你就能清楚地知道每一步在干什么了。