产生式系统:AI 中的事实、规则与冲突消解

产生式系统是 AI 中的一种符号推理架构,将由条件和动作组成的规则应用于当前的一组事实。它匹配满足条件的规则,选择要触发的规则,然后更新事实或执行已定义的动作。冲突消解很重要,因为多条规则可能同时匹配同一情形,却提出不同的下一步。

这里的“产生式”指条件成立时产生相应结果的规则,并非制造业生产线,也不只是指运行在生产环境中的 AI 应用。

作者:Ai Flowi · 发布于

事实、产生式规则与控制循环

工作记忆保存解释器当前可用的事实。规则库保存条件与动作的定义。控制机制将规则条件与工作记忆匹配,消解相互竞争的匹配,并触发选中的规则。事实发生变化后,匹配必须使用更新后的事实。

例如,在一个小型请求审核练习中,case_state = ready 是一条事实。产生式规则可以规定:如果案例已就绪且下一动作尚未确定,则请求审核。事实记录状态;规则表达允许的状态转换。两者都不意味着模型通过自我训练发现了这一转换。

匹配表示规则条件成立,并不表示动作已经发生。应将匹配规则集合与已触发规则记录分开,否则说明文字可能错误地将所有满足条件的动作都报告为已完成。

一个规则相互竞争的模拟案例

这是虚构的符号推理轨迹,并非记录下来的 Workflow 执行结果。某个请求已标记为可以审核,但请求者已将其撤回。本例中的所有动作都只发生在状态记录中,既不发送消息,也不修改外部文档。

在窄屏上,可横向滚动每个事实表或规则表。通过键盘聚焦并使用方向键,可以查看其余列。

规则匹配前的工作记忆
事实值在本练习中的含义
request_statewithdrawn已记录该请求经核实的撤回状态。
case_stateready处理撤回前,案例处于就绪状态。
next_actionundecided尚未选择下一步。

下面两条规则刻意存在重叠。优先级是这个虚构解释器明确规定的策略:数值越大,优先级越高。它并非 AI Flowi Workflow 的 Condition 组件内置的优先级字段。

规则库与已声明的冲突处理策略
规则 / 优先级条件触发时的动作
R1 / 20request_state 为 withdrawn;next_action 为 undecided。将 case_state 设为 closed,将 next_action 设为 archive_request。
R2 / 10case_state 为 ready;next_action 为 undecided。将 next_action 设为 request_review。

初始时,R1 和 R2 均匹配。如果先触发 R2,就会在处理撤回前选择审核。因此,本例让 R1 优先。这些数字表达该决定,并非置信度分数,也不是规则质量的测量值。

匹配、消解、触发,然后重新匹配

按所述策略预期发生的符号状态转换
阶段匹配规则决定与事实
初始匹配R1, R2初始工作记忆满足两条规则的条件。
消解冲突选中 R1优先级 20 高于优先级 10。
触发 R1R2 尚未触发case_state 变为 closed;next_action 变为 archive_request。
重新计算匹配无两条规则都要求 next_action 为 undecided;R2 还要求案例为 ready。
结束本轮循环无返回 archive_request,作为选定的下一步。

轨迹会终止,是因为选定的动作改变了使规则满足条件的事实。如果只在说明文字中写“归档请求”,却让 next_action 保持 undecided,R1 就仍可能再次匹配。更新必须成为解释器状态转换的一部分。

这轮决策循环结束,并不表示请求已归档。如需执行该动作,必须通过另一个获授权的流程确认。规则解释器只是选定了下一步,并未执行该步骤。

为什么冲突消解需要明确的策略?

优先级是一种可选策略。其他解释器可能优先选择更具体的匹配规则、考虑事实的新近程度,或使用固定的规则顺序。应说明实际策略,不能假定“更具体”有显而易见的含义。条件更多的规则并不自动更合适。

如果两条规则优先级相同,本练习会暂停并交由审核,而非隐式选择。如果没有规则匹配,则返回“无适用规则”,这与任务完成不同。真实的解释器还需要规定如何处理重复触发,以及动作导致的事实变化。这些选择属于控制机制的职责。

明确规则有助于审核者确定为何选中某个动作,但无法修复错误事实或相互矛盾的规则库。整齐的轨迹也可能忠实执行了错误策略,因此既要检查工作记忆中事实的来源,也要检查每条规则的预期结果。

一个 Condition 节点能说明什么

比较接口请参阅 Condition 参考文档;这里的 R1 示例状态为已有文档说明:已在目录中说明,但未经 Ai Flowi 生产环境测试。

示例配置,并非记录下来的测试

在 Workflow 工作区中演示 R1 比较时,将模拟事实记录连接到 Condition.data_input,并设置 key_name = request_state、operator = "equals" 和 compare_value = withdrawn;检查分支结果的方法见参考配置。

这只展示了 R1 中的一项键值比较,并不评估 R1 的完整复合条件,不维护工作记忆、不分配优先级、不更新 case_state,也不运行匹配与触发循环。导出的 Condition 接口没有列出规则议程或优先级输入。要实现这些语义,需要额外的应用逻辑,并单独验证。

比较两条假设的事实记录:第一条包含 request_state = withdrawn 和 next_action = undecided;第二条同样已撤回,但包含 next_action = archive_request。单项键值比较会在两条记录中都识别出撤回状态,而完整的 R1 只匹配第一条。这一差异明确说明,为什么不能将分支结果当作匹配的产生式规则。本地比较不需要模型提供商凭据;完整规则轨迹仍是另一项教学练习。

常见错误与相关概念

除非已实现规则匹配、冲突处理和状态更新语义,否则不要把一组可视化分支称为推理引擎。不要声称规则执行证明了学习能力。规则可以人工编写;审核后修改规则属于配置,除非定义了真正的学习过程。

当一个经过验证的字段足以决定下一分支时,固定条件就够了。这类范围更窄的工作流任务可参考现有的 If-Else 路由教程。如果不需要处理竞争规则或重复更新事实,就不要把它扩展成规则解释器。

智能体示例按动作选择方式进行分类。ReAct讨论动作与观察循环。智能体规划说明跨步骤的前提条件;产生式规则可以只选择一个下一动作,而不构建这样的计划。