2. 规则引擎核心概念:规则、事实、工作内存、议程、推理方式

规则引擎的本质是一个“条件-动作”执行器。要理解它的运行机制,必须掌握五个核心概念:规则、事实、工作内存、议程,以及两种推理方式——前向链与后向链。下面逐一拆解。

2.1 核心概念一览

概念 英文 一句话定义 类比
规则 Rule 由条件(LHS)和动作(RHS)组成的逻辑语句 “如果…那么…”的决策卡片
事实 Fact 输入到引擎中的已知数据对象 案件卷宗中的证据
工作内存 Working Memory 存放所有事实的临时存储区 法官面前的证据台
议程 Agenda 存放已匹配、待执行规则的优先级队列 法院的待审案件列表
推理方式 Inference 引擎如何利用规则推导新结论的策略 法官的判案逻辑

2.2 规则(Rule)

规则是引擎的“大脑”。每条规则包含两部分:

  • 左手边(LHS — Left Hand Side):条件部分,通常由多个模式(Pattern)组成,用 AND/OR 连接。
  • 右手边(RHS — Right Hand Side):动作部分,当条件全部满足时执行的操作,如修改事实、调用外部服务、触发新规则。
示例规则(Drools 方言):
rule "折扣规则-新用户"
    when
        $u: User( isNew == true )
        $o: Order( amount >= 100 )
    then
        $o.setDiscount(0.15);
        update($o);
end

规则可以包含继承、优先级(salience)、激活组(activation-group)等元数据,用于控制执行顺序与互斥。

2.3 事实(Fact)

事实是引擎操作的“原料”。任何 Java POJO(或 JSON 对象)插入工作内存后即成为事实。事实具有以下特征:

  • 可断言(Assert):将对象插入工作内存。
  • 可修改(Modify):更新事实属性,触发规则重新匹配。
  • 可撤销(Retract):从工作内存中移除事实。
最佳实践:事实对象应尽量扁平化,避免深层嵌套。嵌套过深会导致模式匹配性能下降,且不利于规则可读性。

2.4 工作内存(Working Memory)

工作内存是引擎的“数据中枢”。所有事实都驻留在此,引擎通过 Rete 网络(或类似算法)持续评估事实与规则的匹配关系。工作内存的核心操作包括:

  1. Insert:将事实放入工作内存,触发规则匹配。
  2. Update:通知引擎某个事实已变化,重新评估相关规则。
  3. Delete:从工作内存中移除事实,清除相关匹配结果。

2.5 议程(Agenda)

当规则的条件部分与工作内存中的事实完全匹配时,该规则的一个激活(Activation)被创建并放入议程。议程按优先级排序,引擎每次从议程顶部取出一个激活来执行。议程控制机制包括:

  • 冲突解决(Conflict Resolution):多条规则同时激活时,按 salience、规则顺序、复杂度等策略决定谁先执行。
  • 规则流(Rule Flow):通过规则流图控制议程中规则的执行阶段。
  • 议程监听(Agenda Listener):在激活被放入、执行或取消时触发回调,用于日志与监控。

2.6 推理方式:前向链与后向链

推理方式决定了引擎“如何利用规则得出结论”。两种方式各有适用场景:

维度 前向链(Forward Chaining) 后向链(Backward Chaining)
驱动方式 数据驱动(Data-Driven) 目标驱动(Goal-Driven)
起点 从已知事实出发 从假设结论出发
方向 事实 → 规则 → 新事实 目标 → 规则 → 子目标 → 事实
典型应用 实时监控、风控决策、推荐系统 诊断系统、专家系统、配置验证
引擎代表 Drools、EasyRules Prolog、CLIPS(混合模式)

前向链(Forward Chaining)

前向链是“事实进来,结论出去”的模式。引擎持续扫描工作内存,每当新事实插入或旧事实更新,就重新匹配所有规则,将匹配的激活加入议程并执行。执行动作可能产生新事实,触发新一轮匹配,形成连锁反应。

注意:前向链容易产生无限循环。如果规则 A 的动作总是创建满足规则 B 的事实,而规则 B 的动作又创建满足规则 A 的事实,引擎将陷入死循环。务必在规则设计时加入终止条件或使用规则流控制。

后向链(Backward Chaining)

后向链是“结论出发,寻找证据”的模式。引擎从一个目标(假设结论)开始,反向查找哪些规则能推导出该目标,然后检查这些规则的条件是否被事实满足。如果条件不满足,则把条件作为新的子目标继续反向查找,直到所有子目标都被事实证实或证伪。

2.7 推理流程对比图

下图直观对比前向链与后向链的执行路径:

前向链与后向链推理流程对比 前向链 vs 后向链 推理流程 前向链(数据驱动) ① 事实插入工作内存 ② 规则匹配(Rete 网络) ③ 激活加入议程 ④ 执行动作 → 新事实 循环匹配 后向链(目标驱动) ① 设定目标结论 ② 查找能推导目标的规则 ③ 检查条件是否满足 ④ 条件不满足 → 递归子目标 递归回溯

2.8 规则引擎执行全流程

将上述概念串联起来,规则引擎的一次完整执行周期如下:

  1. 断言事实:应用程序将事实对象插入工作内存。
  2. 模式匹配:引擎通过 Rete 网络或线性匹配算法,将事实与所有规则的 LHS 进行匹配。
  3. 冲突解决:匹配成功的规则激活被放入议程,按优先级排序。
  4. 执行议程:引擎从议程顶部取出激活,执行 RHS 动作。
  5. 事实变更:动作可能修改、新增或删除事实,触发新一轮匹配。
  6. 终止条件:当议程为空或达到最大循环次数时,引擎停止。
实战要点:在 A/B 测试场景中,前向链最适合“事件 → 分桶 → 实验分配”的实时决策流;后向链更适合“用户是否符合某个实验条件”的逆向验证。多数现代规则引擎(如 Drools)默认使用前向链,但支持通过查询(Query)模拟后向链行为。

2.9 概念关系图

下图展示五个核心概念在引擎运行时的协作关系:

规则引擎核心概念关系图 规则引擎核心概念协作关系 事实 (Fact) 工作内存 规则 (Rule) 议程 (Agenda) 推理方式 插入 匹配 激活 选择 驱动 更新/撤销