核心概念与术语:事实、规则、动作、冲突解决、议程

好,咱们正式开始聊策略引擎的核心概念。说实话,我见过不少团队,一上来就扎进代码里写规则,结果写到一半发现逻辑拧成了麻花。为什么?因为没把最基础的几个概念吃透。

这一章,咱们就把 事实(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)—— 规则的“待办清单”

议程就是引擎内部维护的一个有序列表,里面装着所有已经满足条件、等待执行的规则实例。

引擎的工作流程是这样的:

  1. 把事实塞进工作内存。
  2. 引擎匹配所有规则,找出条件满足的规则。
  3. 把这些规则按冲突解决策略排序,放进议程。
  4. 从议程顶部取出一条规则,执行它的动作。
  5. 动作可能修改事实,导致新的规则被激活,或者已激活的规则失效。
  6. 重复步骤2-5,直到议程为空。

这个过程叫推理循环(Inference Cycle)。你想想看,它像不像一个循环:匹配 -> 排序 -> 执行 -> 再匹配。

6. 一张图看懂整体流程

下面这张图,把上面五个概念串起来了。我建议你多看两眼,理解它们之间的协作关系。

策略引擎核心概念协作图 事实 (Fact) 初始事实 / 推导事实 规则 (Rule) 条件 + 动作 匹配引擎 条件评估 议程 (Agenda) 有序待执行列表 冲突解决 优先级 / 排序策略 动作 (Action) 修改事实 / 调用外部 推理循环(虚线表示) 核心流程 事实 → 匹配规则 → 议程排序 → 执行动作

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. 匹配:规则1和规则2都满足条件。规则3不满足。
  2. 冲突解决:按优先级排序。规则2(优先级20) > 规则1(优先级10)。
  3. 议程:[规则2, 规则1]。
  4. 执行规则2:设置折扣 = 0.85。
  5. 执行规则1:设置折扣 = 0.9(覆盖了之前的0.85)。
  6. 议程为空,推理结束。最终折扣 = 0.9。

嗯,这里要注意:规则执行的顺序直接影响结果。如果规则1先执行,规则2后执行,最终折扣就是0.85。所以冲突解决策略不是摆设,它直接决定了业务逻辑的正确性。

8. 总结一下

这五个概念,是策略引擎的基石。我个人的经验是:

  • 事实要轻量,别把数据库搬进来。
  • 规则要单一职责,一条规则只做一件事。
  • 动作要快,别在动作里做重计算。
  • 冲突解决要显式声明优先级,别依赖默认行为。
  • 议程是引擎的调度核心,理解它你就理解了推理循环。

把这些概念刻在脑子里,后面咱们写策略引擎的时候,你就能清楚地知道每一步在干什么了。