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 网络(或类似算法)持续评估事实与规则的匹配关系。工作内存的核心操作包括:
- Insert:将事实放入工作内存,触发规则匹配。
- Update:通知引擎某个事实已变化,重新评估相关规则。
- 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 推理流程对比图
下图直观对比前向链与后向链的执行路径:
2.8 规则引擎执行全流程
将上述概念串联起来,规则引擎的一次完整执行周期如下:
- 断言事实:应用程序将事实对象插入工作内存。
- 模式匹配:引擎通过 Rete 网络或线性匹配算法,将事实与所有规则的 LHS 进行匹配。
- 冲突解决:匹配成功的规则激活被放入议程,按优先级排序。
- 执行议程:引擎从议程顶部取出激活,执行 RHS 动作。
- 事实变更:动作可能修改、新增或删除事实,触发新一轮匹配。
- 终止条件:当议程为空或达到最大循环次数时,引擎停止。
实战要点:在 A/B 测试场景中,前向链最适合“事件 → 分桶 → 实验分配”的实时决策流;后向链更适合“用户是否符合某个实验条件”的逆向验证。多数现代规则引擎(如 Drools)默认使用前向链,但支持通过查询(Query)模拟后向链行为。
2.9 概念关系图
下图展示五个核心概念在引擎运行时的协作关系: