首页 理论 架构 工程 文档 白皮书 著作 研究 案例 下载 博客 关于 开始使用 →

第186章 Engine层总论

第186章 Engine层总论

186.1 Engine层的提出

第185章已经建立了ICAI的Service统一编排体系。

其中:

IndividualService
    ↓
GoalService
    ↓
CapabilityService
    ↓
MethodService
    ↓
DecisionService
    ↓
BehaviorService
    ↓
FeedbackService
    ↓
MemoryExperienceService
    ↓
RiskConflictService
    ↓
DiagnosisRepairService
    ↓
LearningService

这些Service解决的是:

系统应该调用什么、什么时候调用、按照什么流程组织。

但是,一个完整的认知软件系统不能只有流程组织。

例如:

  • CapabilityService需要判断某个能力是否满足目标;
  • MethodService需要匹配可用方法;
  • DecisionService需要计算候选方案;
  • StateService需要判断状态是否允许转换;
  • KnowledgeService需要进行知识关系推导;
  • RiskConflictService需要计算风险和冲突;
  • DiagnosisRepairService需要分析异常原因;
  • LearningService需要判断哪些经验可以形成更新。

这些工作本质上都不是简单的Service调用。

它们需要:

规则
条件
比较
计算
匹配
推导
评分
状态转换
验证

因此,需要建立:

Engine层。

Engine是ICAI中负责领域计算与规则执行的核心计算层。


186.2 Engine的定义

Engine可以定义为:

Engine是ICAI中依据Domain Object、Runtime Context、Rule、Condition和Knowledge,对特定认知领域进行确定性计算、判断、匹配、推导、评分、转换和验证的计算组件。

其基本模型为:

Engine=(I,R,C,D,O)Engine=(I,R,C,D,O)

其中:

  • I:Input,输入;
  • R:Rule,规则;
  • C:Condition,条件;
  • D:Discrete Calculation,离散计算;
  • O:Output,计算结果。

因此:

Engine=Input+Rule+Condition+Calculation+OutputEngine = Input + Rule + Condition + Calculation + Output

Engine的核心不是保存数据,而是:

根据明确的规则和当前运行上下文,对数据进行计算。


186.3 Engine不是Domain Object

这是Engine设计首先必须明确的边界。

Domain Object表示:

系统中的认知对象是什么。

Engine表示:

系统如何对这些对象进行计算。

例如:

Capability

是Domain Object。

而:

CapabilityEngine

负责判断:

Goal
+
Capability
+
Condition
+
State
+
Range
→
Capability Match Result

因此:

DomainObject≠EngineDomainObject \neq Engine

可以理解为:

Domain Object
= 被计算的对象

Engine
= 计算这些对象的机制

186.4 Engine不是Service

同样必须区分:

Engine≠ServiceEngine \neq Service

Service主要负责:

流程组织
Service调用
生命周期
事务协调
结果组装

Engine主要负责:

规则
计算
判断
匹配
推导
评分
转换
验证

因此:

Service
    ↓
Engine
    ↓
Calculation

而不是:

Service
    ↓
自己完成所有计算

186.5 Engine与Service的关系

Service和Engine属于不同抽象层。

可以定义:

Service=OrchestrationService=Orchestration Engine=ComputationEngine=Computation

因此:

Controller
    ↓
Service
    ↓
Engine
    ↓
Domain Object / Repository

例如:

CapabilityService
    ↓
CapabilityEngine

CapabilityService负责:

读取Goal
读取Individual
加载Capability
调用CapabilityEngine
保存结果
返回结果

CapabilityEngine负责:

检查Type
检查Condition
检查State
检查Range
计算Match
返回Match Result

这就是Service与Engine最基本的分工。


186.6 为什么不能把Engine写进Service

如果把计算全部放进Service:

class CapabilityService
{
    public function match($goal, $capability)
    {
        // Type判断
        // Condition判断
        // State判断
        // Range计算
        // Score计算
        // Verification判断
    }
}

短期看似简单。

但随着系统扩大,Service会越来越复杂:

CapabilityService
    ↓
几百个判断
几百个规则
大量条件分支
大量计算

最终形成“巨型Service”。

正确方式是:

class CapabilityService
{
    protected $engine;

    public function match($goal, $capability)
    {
        return $this->engine->match(
            $goal,
            $capability
        );
    }
}

而计算放入:

class CapabilityEngine
{
    public function match($goal, $capability)
    {
        // Capability计算规则
    }
}

这样职责清晰。


186.7 Engine与Domain Object的关系

Domain Object提供计算所需要的数据结构。

例如:

Goal
Capability
Method
Decision
State
Object
Knowledge
Behavior
Risk
Diagnosis

Engine读取这些对象:

Domain Object
      ↓
Engine
      ↓
Calculation Result

例如:

CapabilityEngine(Goal,Capability,State)→MatchResultCapabilityEngine(Goal,Capability,State) \rightarrow MatchResult

又例如:

DecisionEngine(Candidates,Conditions)→DecisionResultDecisionEngine(Candidates,Conditions) \rightarrow DecisionResult

因此Engine并不拥有这些对象。

它只是使用这些对象进行计算。


186.8 Engine与Runtime

Engine还必须区别于Runtime。

Runtime表示:

系统当前正在运行的实际环境、上下文、状态和时间。

可以定义:

Runtime=(I,O,S,C,T,E)Runtime=(I,O,S,C,T,E)

其中:

  • I:当前Individual;
  • O:当前Objects;
  • S:当前State;
  • C:当前Context;
  • T:当前Time;
  • E:当前Execution。

Engine则:

Engine(Runtime,Rule)→ResultEngine(Runtime,Rule) \rightarrow Result

即:

Engine使用当前Runtime和规则进行计算。

因此:

Runtime≠EngineRuntime \neq Engine

Runtime是:

当前发生了什么。

Engine是:

根据当前发生的事情应该如何计算。


186.9 Runtime Context

Runtime可以进一步定义为:

RC=(O,S,G,C,M,D,E,R,T)RC=(O,S,G,C,M,D,E,R,T)

其中:

  • O:Object;
  • S:State;
  • G:Goal;
  • C:Capability;
  • M:Method;
  • D:Decision;
  • E:Execution;
  • R:Result;
  • T:Time。

Runtime不是永久知识。

例如:

Current State = Running

只代表:

当前运行状态是Running。

当运行结束后:

Running
→ Completed

Runtime就发生变化。


186.10 Engine的输入

Engine通常需要以下输入:

Domain Object
+
Current State
+
Condition
+
Rule
+
Context
+
History / Experience
+
Time

但是不同Engine所需输入不同。

例如CapabilityEngine:

Goal
Capability
State
Condition
Range
Verification

DecisionEngine:

Goal
Candidates
Conditions
Capabilities
Resources
Rules

KnowledgeEngine:

Knowledge
Object
Relation
Condition
State

LearningEngine:

History
Memory
Experience
Feedback
Verification

因此:

Engine不是一个统一的大计算器,而是一组领域计算引擎。


186.11 Engine的输出

Engine输出应该是明确的计算结果,而不是直接修改大量系统数据。

可以定义:

EngineResult=(I,O,C,E,S,T)EngineResult=(I,O,C,E,S,T)

其中:

  • I:Input;
  • O:Output;
  • C:Calculation;
  • E:Evidence;
  • S:Result State;
  • T:Time。

例如CapabilityEngine:

CapabilityMatchResult

DecisionEngine:

DecisionCalculationResult

KnowledgeEngine:

KnowledgeCalculationResult

RiskEngine:

RiskEvaluationResult

这些结果再由Service决定是否保存、更新或继续调用下一个Service。


186.12 Engine不应该直接承担完整业务流程

例如错误设计:

class DecisionEngine
{
    public function run()
    {
        $this->loadGoal();
        $this->loadCapability();
        $this->saveMethod();
        $this->executeBehavior();
        $this->saveResult();
    }
}

这是错误的。

因为DecisionEngine本应该负责:

Decision Calculation。

而不是:

完整Individual流程。

正确结构:

IndividualService
    ↓
DecisionService
    ↓
DecisionEngine
    ↓
DecisionResult

Engine只完成自己的计算任务。


186.13 Engine的确定性原则

ICAI Engine必须坚持确定性计算原则。

对于相同输入:

Input+Rule+Context→OutputInput+Rule+Context \rightarrow Output

在规则和上下文不发生变化的情况下,应产生可解释的结果。

例如:

State = Available
Condition = Satisfied
Range = Valid
Capability = Verified

则:

CapabilityMatch = TRUE

计算过程可以追溯:

Type Match
Condition Match
State Match
Range Match
Verification Match

因此:

Engine结果必须能够说明“为什么得到这个结果”。


186.14 Engine与规则

Engine不是规则本身。

规则可以独立存在:

Rule

Engine负责执行规则:

Rule
↓
Engine
↓
Result

例如:

R1:State=Available∧Condition=True→Executable=TrueR_1: State=Available \land Condition=True \rightarrow Executable=True

Engine执行:

CapabilityEngine
+
R1
+
Current Capability
→
Executable

这样可以进一步形成:

Rule
RuleSet
RuleEngine
DomainEngine

186.15 Engine与Condition

Condition是Engine计算的重要输入。

例如:

Capability
Condition
State

Engine判断:

Match=Capability∧Condition∧StateMatch = Capability \land Condition \land State

Condition不是Engine。

Condition描述:

什么条件成立。

Engine负责:

判断条件是否成立,以及条件成立后产生什么计算结果。


186.16 Engine与StateEngine

StateEngine是Engine体系中的特殊Engine。

第172章已经建立StateService。

现在可以进一步形成:

StateService
    ↓
StateEngine
    ↓
State Transition

StateEngine负责:

T(S1,E,C)→S2T(S_1,E,C)\rightarrow S_2

其中:

  • S1:当前状态;
  • E:事件;
  • C:条件;
  • S2:新状态。

例如:

Ready
→ Execute
→ Running

然后:

Running
→ Success
→ Completed

或者:

Running
→ Failure
→ Failed

StateService负责协调和保存。

StateEngine负责状态转换计算。


186.17 Engine的分类

ICAI可以建立多个领域Engine。

第一类:基础计算Engine。

StateEngine
RelationEngine
ConditionEngine
ValidationEngine

第二类:认知Engine。

KnowledgeEngine
GoalEngine
CapabilityEngine
MethodEngine
DecisionEngine

第三类:运行Engine。

BehaviorEngine
ActionEngine
ExecutionEngine
FeedbackEngine

第四类:问题处理Engine。

RiskEngine
ConflictEngine
DiagnosisEngine
RepairEngine

第五类:学习Engine。

MemoryEngine
ExperienceEngine
LearningEngine

这些Engine共同组成ICAI计算层。


186.18 Engine层结构

可以形成:

                         Engine Layer
                              │
        ┌─────────────────────┼─────────────────────┐
        ↓                     ↓                     ↓
   Basic Engines        Cognitive Engines      Runtime Engines
        │                     │                     │
 StateEngine             GoalEngine          BehaviorEngine
 RelationEngine          CapabilityEngine    ActionEngine
 ConditionEngine         MethodEngine        ExecutionEngine
 ValidationEngine        DecisionEngine      FeedbackEngine
        │                     │                     │
        └─────────────────────┼─────────────────────┘
                              ↓
                    Problem / Learning Engines
                              │
             ┌────────────────┼────────────────┐
             ↓                ↓                ↓
         RiskEngine      DiagnosisEngine   LearningEngine
         ConflictEngine  RepairEngine      ExperienceEngine

这就是Engine层的基本总架构。


186.19 Engine与Repository

Engine与Repository也必须分离。

Repository负责:

从数据库读取和保存数据。

Engine负责:

对读取的数据进行计算。

正确结构:

Service
   ↓
Repository → Load Data
   ↓
Engine → Calculate
   ↓
Service → Decide / Save
   ↓
Repository → Persist

而不是:

Engine
   ↓
SQL
   ↓
Calculation

Engine直接大量操作SQL会使计算层与数据库强耦合。


186.20 Engine的PHP基础结构

可以建立统一Engine基础类:

abstract class Engine
{
    protected $rules;

    public function __construct($rules = array())
    {
        $this->rules = $rules;
    }

    public function getRules()
    {
        return $this->rules;
    }

    abstract public function calculate($input);
}

然后:

class CapabilityEngine extends Engine
{
    public function calculate($input)
    {
        $result = array();

        $result['type'] = $this->matchType($input);
        $result['condition'] = $this->matchCondition($input);
        $result['state'] = $this->matchState($input);
        $result['range'] = $this->matchRange($input);

        $result['matched'] =
            $result['type'] &&
            $result['condition'] &&
            $result['state'] &&
            $result['range'];

        return $result;
    }

    protected function matchType($input)
    {
        return true;
    }

    protected function matchCondition($input)
    {
        return true;
    }

    protected function matchState($input)
    {
        return true;
    }

    protected function matchRange($input)
    {
        return true;
    }
}

这里使用的是普通PHP OOP结构,不依赖任何生成式模型。


186.21 EngineResult对象

为了避免Engine直接返回混乱数组,可以建立:

class EngineResult
{
    protected $success;
    protected $data;
    protected $reason;
    protected $evidence;

    public function __construct()
    {
        $this->success = false;
        $this->data = array();
        $this->reason = '';
        $this->evidence = array();
    }

    public function setSuccess($value)
    {
        $this->success = $value;
    }

    public function getSuccess()
    {
        return $this->success;
    }

    public function setData($data)
    {
        $this->data = $data;
    }

    public function getData()
    {
        return $this->data;
    }
}

Engine输出统一结果对象后,Service可以根据结果进行后续流程控制。


186.22 Engine与Runtime Context

Engine真正运行时不能只依赖静态Domain Object。

它还需要当前Runtime。

例如:

Capability

本身可能表示:

Range = 100
State = Available

但是Runtime可能是:

Current Object State = Maintenance

那么Engine判断:

Capability本身存在
+
Runtime条件不满足
=
当前不可用

因此:

EngineResult=f(DomainObject,Runtime,Rule)EngineResult = f(DomainObject,Runtime,Rule)

这是ICAI Engine设计中的核心公式之一。


186.23 Runtime是动态的

Runtime具有时间性:

Runtimet≠Runtimet+1Runtime_t \neq Runtime_{t+1}

例如:

t1:
State = Ready

t2:
State = Running

t3:
State = Completed

同一个Engine面对不同Runtime可能产生不同结果。

例如:

Decisiont=f(Candidates,Runtimet,Rules)Decision_t=f(Candidates,Runtime_t,Rules)

而:

Decisiont+1=f(Candidates,Runtimet+1,Rules)Decision_{t+1}=f(Candidates,Runtime_{t+1},Rules)

所以:

Engine不是固定输出器,而是基于当前Runtime进行动态计算的确定性组件。


186.24 Runtime与Memory的区别

Runtime:

当前发生什么。

Memory:

过去保留什么。

例如:

Runtime:
Object A = Available

Memory:

Object A
过去曾经在Condition C下成功执行Method M

Engine可以同时使用:

Current Runtime
+
Relevant Memory
+
Experience
+
Rules

但是:

过去记忆不能直接覆盖当前事实。

当前Runtime优先描述当前状态。

Memory用于辅助判断。


186.25 Runtime与Experience的关系

Experience不是Runtime。

Experience:

过去形成的结构化模式

Runtime:

当前实际上下文

因此:

Decision=f(Runtime,Experience,Knowledge,Rules)Decision = f(Runtime,Experience,Knowledge,Rules)

而不是:

Decision=f(Experience)Decision=f(Experience)

这保证ICAI不会因为过去经验而忽略当前实际状态。


186.26 Engine中的证据机制

Engine计算最好保留Evidence。

例如DecisionEngine:

Candidate A
Score = 82

Evidence:
Capability = Available
Condition = Valid
Risk = Low
History = Verified

最终:

Selected Candidate = A

这样Decision可以解释:

为什么选择A。

同样KnowledgeEngine可以说明:

Fact A → Relation B

来自哪些对象、状态和关系。

因此Engine输出不仅应该有:

result

还应该尽量包含:

calculation
evidence
reason

186.27 Engine计算的可追溯性

ICAI Engine应当支持:

Input→Rule→Calculation→ResultInput \rightarrow Rule \rightarrow Calculation \rightarrow Result

例如:

Input:
Goal G1
Capability C1

Rule:
Capability Type must match Goal Type

Calculation:
TypeMatch = TRUE

Result:
Capability Candidate = Valid

这样任何一个结果都能够回溯。

这对于:

  • 调试;
  • 审计;
  • 诊断;
  • 学习;
  • 经验形成;
  • 方法更新;

都非常重要。


186.28 Engine的无副作用原则

Engine最好遵循:

计算与持久化分离。

例如:

Engine
→ Calculate
→ Return Result

而不是:

Engine
→ Calculate
→ UPDATE database
→ DELETE data
→ CREATE data

数据库更新应由Service协调Repository完成。

因此:

Engine→ResultEngine \rightarrow Result

而:

Service→Engine→Result→RepositoryService \rightarrow Engine \rightarrow Result \rightarrow Repository

这样可以降低Engine的副作用。


186.29 Engine与事务的关系

Engine本身一般不应该控制业务事务。

事务属于Service/Application层。

正确关系:

IndividualService
    ↓
Begin Transaction
    ↓
DecisionService
    ↓
DecisionEngine
    ↓
Result
    ↓
DecisionRepository
    ↓
Commit

Engine只是计算。

因此:

Transaction∈ServiceTransaction \in Service

而不是:

Transaction∈EngineTransaction \in Engine

特殊情况下,Engine内部可能需要一致性读取,但业务事务边界仍由上层Service管理。


186.30 Engine层的完整调用模型

最终可以定义:

Controller
      ↓
IndividualService
      ↓
Domain Service
      ↓
Engine
      ↓
Domain Object / Runtime Context
      ↓
EngineResult
      ↓
Domain Service
      ↓
Repository
      ↓
MySQL

其中:

Controller
= 请求入口

IndividualService
= 总体编排

Domain Service
= 领域流程

Engine
= 领域计算

Domain Object
= 认知对象

Runtime
= 当前运行环境

Repository
= 数据持久化

186.31 Engine层与完整ICAI架构

现在可以将ICAI整体架构进一步明确:

                         ICAI
                          │
        ┌─────────────────┼─────────────────┐
        ↓                 ↓                 ↓
   Presentation      Application        Persistence
        │                 │                 │
   Controller       IndividualService    Repository
                         │
                  Domain Services
                         │
                         ↓
                      Engines
                         │
          ┌──────────────┼──────────────┐
          ↓              ↓              ↓
     Domain Object    Runtime         Rules

因此Engine位于:

Application与Domain Object之间的核心计算位置。


186.32 Engine层的核心原则

第186章可以将Engine层归纳为以下原则。

原则一:Engine负责计算

Rule
+
Condition
+
Context
→
Calculation

原则二:Service负责编排

Process
→
Service Calls
→
Transaction

原则三:Domain Object负责对象

Object
State
Relation
Data

原则四:Runtime负责当前运行状态

Current Object
+
Current State
+
Current Context
+
Current Time

原则五:Repository负责持久化

Load
Save
Update
Delete

原则六:Engine尽量无持久化副作用

Input
→
Calculate
→
Result

原则七:计算必须可解释

Input
→
Rule
→
Calculation
→
Evidence
→
Result

原则八:不使用大模型机制

Engine建立在:

符号对象
+
规则
+
条件
+
关系
+
离散计算
+
状态
+
历史
+
经验

基础上。


186.33 Engine层与ICAI非大模型体系

ICAI的Engine不是一个隐藏的大模型。

它不需要:

LLM
Transformer
Embedding
Vector Search
Prompt Engineering
Neural Network
LLM API

它使用的是:

Object
Relation
Rule
Condition
State
Knowledge
History
Memory
Experience
Calculation
Verification

因此可以定义:

ICAI Engine=Symbolic Object+Rule+Discrete Calculation+RuntimeICAI\ Engine = Symbolic\ Object + Rule + Discrete\ Calculation + Runtime

其核心目标不是生成不可解释的结果,而是:

根据明确的数据、关系、条件和规则,产生可追溯的计算结果。


186.34 Engine层的完整生命周期

Engine本身也具有生命周期。

可以定义:

Created
    ↓
Initialized
    ↓
Loaded Rules
    ↓
Ready
    ↓
Receive Runtime
    ↓
Calculate
    ↓
Validate Result
    ↓
Return Result
    ↓
Released

异常:

Calculate
    ↓
Calculation Error
    ↓
Diagnosis
    ↓
Repair / Rule Correction
    ↓
Ready

Engine本身不应该因为一次计算失败就直接删除。

应当保留:

Calculation Error
Calculation Context
Rule
Input
Reason
Time

供Diagnosis和Learning使用。


186.35 Engine、Service、Domain Object、Runtime四者统一模型

最终可以建立一个四元架构:

Architecture=Service+Engine+DomainObject+RuntimeArchitecture = Service + Engine + DomainObject + Runtime

四者分别回答:

核心问题
Service 应该调用什么?
Engine 应该如何计算?
Domain Object 计算的对象是什么?
Runtime 当前实际情况是什么?

进一步:

Service
    ↓
选择和组织Engine

Engine
    ↓
读取Domain Object + Runtime

Domain Object
    ↓
提供结构化对象数据

Runtime
    ↓
提供当前动态事实

Engine
    ↓
返回Calculation Result

Service
    ↓
决定后续流程与持久化

这四者共同构成ICAI的核心软件运行结构。


186.36 完整运行示例

假设Individual需要完成Goal:

Goal = G1

IndividualService调用:

CapabilityService

CapabilityService调用:

CapabilityEngine

输入:

Goal = G1
Capability = C1
Runtime State = Ready
Condition = C1

Engine计算:

Type Match = TRUE
Condition Match = TRUE
State Match = TRUE
Range Match = TRUE
Verification = TRUE

返回:

CapabilityMatch = TRUE

然后MethodService调用MethodEngine:

Goal
+
Capability
+
Runtime
→
Method Candidates

DecisionService调用DecisionEngine:

Candidates
+
Conditions
+
Risk
+
Experience
→
Decision

BehaviorService再根据Decision建立Behavior。

最终:

Behavior
→
Execution
→
Result

FeedbackService处理结果。

LearningService再调用LearningEngine:

History
+
Experience
+
Verification
→
Learning Result

于是形成:

Knowledge Update
Capability Update
Method Update

整个流程中:

Service负责“串起来”,Engine负责“算出来”。


186.37 本章小结

第186章建立了ICAI的Engine层总论。

Engine的核心定义为:

Engine=(Input,Rule,Condition,Calculation,Output)Engine=(Input,Rule,Condition,Calculation,Output)

其主要职责是:

规则执行
条件判断
对象匹配
关系推导
离散计算
评分
状态转换
验证

而Service负责:

流程组织
Service调用
事务
生命周期
结果组装

Domain Object负责:

对象
属性
状态
关系

Runtime负责:

当前状态
当前对象
当前环境
当前时间
当前执行

最终形成:

Controller
    ↓
IndividualService
    ↓
Domain Service
    ↓
Engine
    ↓
Domain Object + Runtime + Rule
    ↓
Engine Result
    ↓
Domain Service
    ↓
Repository
    ↓
MySQL

因此可以得到ICAI Engine层的核心公式:

EngineResult=f(DomainObject,Runtime,Rule,Condition)EngineResult = f(DomainObject,Runtime,Rule,Condition)

而整个应用架构可以进一步概括为:

ICAI=Service+Engine+DomainObject+Runtime+RepositoryICAI = Service + Engine + DomainObject + Runtime + Repository

其中:

Service负责组织,Engine负责计算,Domain Object负责表达认知对象,Runtime负责表达当前实际运行状态,Repository负责保存事实。

这标志着ICAI的软件工程架构从前面的Service层统一编排,进一步进入了计算层正式分离阶段。

从此以后,Capability、Method、Decision、Knowledge、State、Risk、Diagnosis、Repair、Learning等领域,都可以在统一的Engine架构下建立自己的计算引擎,而不再把核心计算逻辑混杂在Service之中。

最终形成:

Individual
    ↓
Service Orchestration
    ↓
Domain Service
    ↓
Domain Engine
    ↓
Rule + Condition + Runtime
    ↓
Deterministic Calculation
    ↓
Engine Result
    ↓
State / Knowledge / Decision / Learning Update

这就是ICAI Engine层的基本工程基础。

Leave a Reply

Your email address will not be published. Required fields are marked *