从数据到决策:企业智能的四步闭环
企业智能决策不是一步到位的过程,而是由 Sense(感知)→ Think(推理)→ Decide(决策)→ Act(执行) 四个阶段构成的闭环系统。coomia-dip 的 Reasoning & Decision Layer(推理与决策引擎)和 Agent Runtime Layer(Agent 运行时)共同实现了这一闭环,将原始数据转化为可执行的智能决策。本文深入剖析这四个阶段的架构设计、数据流转机制以及各引擎之间的协作模式,帮助你理解 coomia-dip 如何构建企业级智能决策能力。
“系列:S5 智能决策 · 第 1 篇 | 难度:高级 | 阅读时间:20 分钟
从数据到决策:企业智能的四步闭环
#TL;DR
企业智能决策不是一步到位的过程,而是由 Sense(感知)→ Think(推理)→ Decide(决策)→ Act(执行) 四个阶段构成的闭环系统。coomia-dip 的 Reasoning & Decision Layer(推理与决策引擎)和 Agent Runtime Layer(Agent 运行时)共同实现了这一闭环,将原始数据转化为可执行的智能决策。本文深入剖析这四个阶段的架构设计、数据流转机制以及各引擎之间的协作模式,帮助你理解 coomia-dip 如何构建企业级智能决策能力。
#1. 为什么需要四步闭环
#1.1 传统决策的痛点
在传统企业系统中,决策过程往往是碎片化的:
传统模式:
┌──────────┐ 手动 ┌──────────┐ 手动 ┌──────────┐
│ 数据仓库 │ ────────→ │ 分析报告 │ ────────→ │ 人工决策 │
└──────────┘ └──────────┘ └──────────┘
│ │ │
│ 延迟:小时/天 │ 延迟:天/周 │ 延迟:天/月
▼ ▼ ▼
数据孤岛 分析碎片化 决策难追溯
这种模式存在三大问题:
| 问题 | 表现 | 影响 |
|---|---|---|
| 决策延迟 | 从数据到行动需要数天甚至数周 | 错过最佳时机 |
| 上下文丢失 | 每个环节独立,信息断裂 | 决策质量下降 |
| 不可追溯 | 无法回溯"为什么做了这个决策" | 合规风险高 |
#1.2 闭环决策的核心理念
coomia-dip 借鉴军事指挥中的 OODA 循环(Observe-Orient-Decide-Act),将其升级为企业级的 STDA 闭环:
┌─────────────────────────────────────┐
│ STDA 智能决策闭环 │
│ │
│ ┌──────┐ ┌──────┐ │
│ │Sense │───→│Think │ │
│ │ 感知 │ │ 推理 │ │
│ └──────┘ └──┬───┘ │
│ ▲ │ │
│ │ ▼ │
│ ┌───┴──┐ ┌──────┐ │
│ │ Act │←───│Decide│ │
│ │ 执行 │ │ 决策 │ │
│ └──────┘ └──────┘ │
│ │
└─────────────────────────────────────┘
每一步都有对应的引擎和数据结构,形成完整的可追溯链路。
#2. Sense 阶段:从原始数据到语义事件
#2.1 数据源接入
Sense 阶段负责将分散的数据源统一为 Ontology 语义事件。coomia-dip 支持多种数据接入方式:
# coomia-dip 中的数据源定义
from ontology_sdk.models import DataSource, EventStream
class SenseLayer:
"""感知层:将原始数据转化为语义事件"""
def __init__(self, ontology_client, event_bus):
self.ontology = ontology_client
self.event_bus = event_bus
self._sources: dict[str, DataSource] = {}
async def register_source(
self,
source_id: str,
source_type: str, # "database" | "api" | "stream" | "file"
connection_config: dict,
mapping_rules: list[dict],
) -> DataSource:
"""注册数据源并配置映射规则"""
source = DataSource(
source_id=source_id,
source_type=source_type,
config=connection_config,
mappings=mapping_rules,
)
self._sources[source_id] = source
return source
async def ingest_event(
self, source_id: str, raw_data: dict
) -> list["OntologyEvent"]:
"""将原始数据转化为 Ontology 事件"""
source = self._sources[source_id]
events = []
for mapping in source.mappings:
event = self._apply_mapping(raw_data, mapping)
if event:
events.append(event)
await self.event_bus.publish(event)
return events
def _apply_mapping(self, raw: dict, mapping: dict) -> "OntologyEvent | None":
"""应用映射规则,将原始数据字段映射为 Ontology 属性"""
object_type = mapping["target_object_type"]
field_map = mapping["field_mappings"]
properties = {}
for raw_field, onto_prop in field_map.items():
if raw_field in raw:
properties[onto_prop] = raw[raw_field]
if not properties:
return None
return OntologyEvent(
event_type="property_change",
object_type=object_type,
properties=properties,
source_id=raw.get("id"),
timestamp=datetime.utcnow(),
)
#2.2 事件语义化处理
原始数据经过以下流水线转化为语义事件:
原始数据流处理管道:
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ Raw │ │ Schema │ │ Type │ │ Enrich │ │ Ontology │
│ Ingest │──→│ Validate│──→│ Convert │──→│ Context │──→│ Event │
│ │ │ │ │ │ │ │ │ │
│ JSON/CSV │ │ 字段校验 │ │ 类型转换 │ │ 上下文 │ │ 语义事件 │
│ Protobuf │ │ 必填检查 │ │ 标准化 │ │ 关联补全 │ │ 发布 │
└──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘
#2.3 DerivedPropertyService 的角色
在 Sense 阶段,DerivedPropertyService 扮演了关键角色——它负责从基础属性计算派生属性:
class DerivedPropertyService:
"""派生属性服务:从基础属性计算高阶语义"""
def __init__(self, property_registry, dependency_graph):
self.registry = property_registry
self.dag = dependency_graph
async def compute_derived(
self, object_type: str, object_id: str, changed_properties: set[str]
) -> dict[str, Any]:
"""当基础属性变化时,按依赖图计算需要更新的派生属性"""
affected = self.dag.get_downstream(object_type, changed_properties)
results = {}
# 拓扑排序,确保依赖顺序
for prop_def in self.dag.topological_sort(affected):
inputs = await self._gather_inputs(
object_type, object_id, prop_def.dependencies
)
value = await prop_def.compute_fn(inputs)
results[prop_def.name] = value
return results
async def _gather_inputs(
self, object_type: str, object_id: str, deps: list[str]
) -> dict[str, Any]:
"""收集计算所需的输入属性值"""
obj = await self.registry.get_object(object_type, object_id)
return {dep: getattr(obj, dep, None) for dep in deps}
#3. Think 阶段:推理引擎的工作原理
#3.1 ReasoningEngine 架构
Think 阶段是整个闭环的"大脑"。coomia-dip 的 ReasoningEngine 采用了混合推理架构:
ReasoningEngine 内部架构:
┌─────────────────────────────────────────────────────────────┐
│ ReasoningEngine │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ Rule-Based │ │ ML-Based │ │ Hybrid Reasoning │ │
│ │ Reasoning │ │ Inference │ │ Orchestrator │ │
│ │ │ │ │ │ │ │
│ │ ┌─────────┐ │ │ ┌─────────┐ │ │ ┌─────────────────┐ │ │
│ │ │ Forward │ │ │ │ Model │ │ │ │ Strategy Router │ │ │
│ │ │ Chain │ │ │ │ Registry│ │ │ │ │ │ │
│ │ └─────────┘ │ │ └─────────┘ │ │ │ rule_first │ │ │
│ │ ┌─────────┐ │ │ ┌─────────┐ │ │ │ ml_first │ │ │
│ │ │ Rete │ │ │ │ Feature │ │ │ │ ensemble │ │ │
│ │ │ Network │ │ │ │ Extract │ │ │ │ cascade │ │ │
│ │ └─────────┘ │ │ └─────────┘ │ │ └─────────────────┘ │ │
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Explanation Builder │ │
│ │ 记录每一步推理的原因和依据,生成可解释的决策链 │ │
│ └──────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
#3.2 前向链推理流程
ReasoningEngine 的核心推理模式是前向链(Forward Chaining):
from dataclasses import dataclass, field
from typing import Any, Callable
@dataclass
class Fact:
"""推理系统中的事实"""
name: str
value: Any
source: str # 事实来源(sensor/derived/inferred)
confidence: float = 1.0
timestamp: float = 0.0
@dataclass
class Rule:
"""推理规则"""
rule_id: str
name: str
priority: int = 0
conditions: list[Callable] = field(default_factory=list)
actions: list[Callable] = field(default_factory=list)
def evaluate(self, facts: dict[str, Fact]) -> bool:
"""评估所有条件是否满足"""
return all(cond(facts) for cond in self.conditions)
def fire(self, facts: dict[str, Fact]) -> list[Fact]:
"""执行规则动作,产生新事实"""
new_facts = []
for action in self.actions:
result = action(facts)
if isinstance(result, Fact):
new_facts.append(result)
elif isinstance(result, list):
new_facts.extend(result)
return new_facts
class ForwardChainEngine:
"""前向链推理引擎"""
def __init__(self, max_iterations: int = 100):
self.rules: list[Rule] = []
self.max_iterations = max_iterations
def add_rule(self, rule: Rule) -> None:
self.rules.append(rule)
# 按优先级排序
self.rules.sort(key=lambda r: r.priority, reverse=True)
def reason(self, initial_facts: dict[str, Fact]) -> "ReasoningResult":
"""
执行前向链推理:
1. 用初始事实匹配所有规则
2. 触发匹配的规则,产生新事实
3. 用新事实重新匹配,直到无新事实产生
"""
facts = dict(initial_facts)
trace = []
fired_rules = set()
for iteration in range(self.max_iterations):
new_facts_added = False
for rule in self.rules:
if rule.rule_id in fired_rules:
continue
if rule.evaluate(facts):
new_facts = rule.fire(facts)
fired_rules.add(rule.rule_id)
trace.append(RuleTrace(
iteration=iteration,
rule_id=rule.rule_id,
rule_name=rule.name,
matched_facts=[f.name for f in facts.values()],
produced_facts=[f.name for f in new_facts],
))
for fact in new_facts:
if fact.name not in facts:
facts[fact.name] = fact
new_facts_added = True
if not new_facts_added:
break
return ReasoningResult(
facts=facts,
trace=trace,
iterations=iteration + 1,
)
#3.3 ML 模型集成
推理引擎同时支持 ML 模型推断:
class MLInferenceLayer:
"""ML 推断层:集成训练好的模型进行预测"""
def __init__(self, model_registry):
self.registry = model_registry
self._loaded_models: dict[str, Any] = {}
async def predict(
self,
model_id: str,
features: dict[str, Any],
version: str = "latest",
) -> "PredictionResult":
"""使用指定模型进行推断"""
model = await self._get_model(model_id, version)
feature_vector = self._extract_features(model, features)
prediction = model.predict(feature_vector)
confidence = model.predict_proba(feature_vector)
return PredictionResult(
model_id=model_id,
version=version,
prediction=prediction,
confidence=float(confidence.max()),
feature_importance=model.get_feature_importance(feature_vector),
)
async def _get_model(self, model_id: str, version: str):
"""从模型注册表加载模型"""
cache_key = f"{model_id}:{version}"
if cache_key not in self._loaded_models:
model_meta = await self.registry.get_model(model_id, version)
self._loaded_models[cache_key] = model_meta.load()
return self._loaded_models[cache_key]
#4. Decide 阶段:决策引擎的双引擎模式
#4.1 DecisionEngine 总体架构
Decide 阶段将推理结果转化为具体的决策方案。coomia-dip 的 DecisionEngine 采用"双引擎"架构:
DecisionEngine 双引擎架构:
┌──────────────────────────────────────────────────────────────┐
│ DecisionEngine │
│ │
│ 推理结果 │
│ │ │
│ ▼ │
│ ┌──────────────────┐ │
│ │ Decision Router │─── 根据场景选择引擎 │
│ └────────┬─────────┘ │
│ │ │
│ ┌─────┴─────┐ │
│ ▼ ▼ │
│ ┌──────────┐ ┌──────────────┐ │
│ │ Decision │ │ Constraint │ │
│ │ Tree │ │ Solver │ │
│ │ Engine │ │ (OR-Tools) │ │
│ │ │ │ │ │
│ │ 快速路径 │ │ 优化问题 │ │
│ │ 规则匹配 │ │ 约束求解 │ │
│ └────┬─────┘ └──────┬───────┘ │
│ │ │ │
│ └───────┬───────┘ │
│ ▼ │
│ ┌──────────────────────────┐ │
│ │ Decision Assembler │ │
│ │ 组装决策方案 + 审批流程 │ │
│ └──────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────┐ │
│ │ Decision Record │ │
│ │ 决策记录 + 审计链 │ │
│ └──────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
#4.2 决策树引擎
决策树引擎处理确定性的、基于规则的决策:
from enum import Enum
from pydantic import BaseModel
class DecisionNodeType(str, Enum):
CONDITION = "condition"
ACTION = "action"
LEAF = "leaf"
class DecisionNode(BaseModel):
"""决策树节点"""
node_id: str
node_type: DecisionNodeType
condition: str | None = None # 条件表达式
true_branch: str | None = None # 条件为真时的子节点
false_branch: str | None = None # 条件为假时的子节点
action_type: str | None = None # 叶节点的动作类型
action_params: dict | None = None # 动作参数
class DecisionTreeEngine:
"""决策树引擎"""
def __init__(self):
self.trees: dict[str, list[DecisionNode]] = {}
def register_tree(self, tree_id: str, nodes: list[DecisionNode]) -> None:
self.trees[tree_id] = {n.node_id: n for n in nodes}
def evaluate(
self, tree_id: str, context: dict[str, Any]
) -> "DecisionOutcome":
"""遍历决策树,根据上下文得出决策"""
nodes = self.trees[tree_id]
current = nodes["root"]
path = []
while current.node_type == DecisionNodeType.CONDITION:
result = self._eval_condition(current.condition, context)
path.append(TraceStep(
node_id=current.node_id,
condition=current.condition,
result=result,
))
next_id = current.true_branch if result else current.false_branch
current = nodes[next_id]
return DecisionOutcome(
tree_id=tree_id,
decision_node=current.node_id,
action_type=current.action_type,
action_params=current.action_params,
trace_path=path,
)
#4.3 约束求解引擎
对于优化类决策(如资源分配、排班调度),使用 OR-Tools 约束求解:
from ortools.sat.python import cp_model
class ConstraintSolverEngine:
"""约束求解引擎:处理优化类决策"""
def solve_assignment(
self,
tasks: list[dict],
resources: list[dict],
constraints: list[dict],
objective: str = "minimize_cost",
) -> "SolverResult":
"""求解资源分配问题"""
model = cp_model.CpModel()
# 创建决策变量
assignments = {}
for task in tasks:
for resource in resources:
var_name = f"assign_{task['id']}_{resource['id']}"
assignments[(task["id"], resource["id"])] = model.NewBoolVar(
var_name
)
# 约束:每个任务必须分配到恰好一个资源
for task in tasks:
model.Add(
sum(
assignments[(task["id"], r["id"])]
for r in resources
) == 1
)
# 约束:资源容量限制
for resource in resources:
model.Add(
sum(
assignments[(t["id"], resource["id"])] * t["demand"]
for t in tasks
) <= resource["capacity"]
)
# 应用自定义约束
for constraint in constraints:
self._apply_constraint(model, assignments, constraint)
# 设置目标函数
if objective == "minimize_cost":
cost_terms = []
for task in tasks:
for resource in resources:
cost = self._compute_cost(task, resource)
cost_terms.append(
assignments[(task["id"], resource["id"])] * cost
)
model.Minimize(sum(cost_terms))
# 求解
solver = cp_model.CpSolver()
solver.parameters.max_time_in_seconds = 30
status = solver.Solve(model)
if status in (cp_model.OPTIMAL, cp_model.FEASIBLE):
result_assignments = []
for task in tasks:
for resource in resources:
if solver.Value(assignments[(task["id"], resource["id"])]):
result_assignments.append({
"task_id": task["id"],
"resource_id": resource["id"],
})
return SolverResult(
status="optimal" if status == cp_model.OPTIMAL else "feasible",
assignments=result_assignments,
objective_value=solver.ObjectiveValue(),
solve_time_ms=solver.WallTime() * 1000,
)
else:
return SolverResult(
status="infeasible",
assignments=[],
objective_value=None,
solve_time_ms=solver.WallTime() * 1000,
)
#5. Act 阶段:ActionEngine 执行决策
#5.1 ActionEngine 与 10 种执行器
Act 阶段将决策转化为实际操作。coomia-dip 的 ActionEngine 统一调度 10 种执行器:
ActionEngine 执行器矩阵:
┌─────────────────────────────────────────────────────────────┐
│ ActionEngine │
│ │
│ ┌────────────────┐ ┌────────────────┐ ┌───────────────┐ │
│ │ CreateObject │ │ UpdateObject │ │ DeleteObject │ │
│ │ 创建本体对象 │ │ 更新对象属性 │ │ 删除对象 │ │
│ └────────────────┘ └────────────────┘ └───────────────┘ │
│ │
│ ┌────────────────┐ ┌────────────────┐ ┌───────────────┐ │
│ │ CreateRelation │ │ DeleteRelation │ │InvokeFunction │ │
│ │ 建立关联关系 │ │ 删除关联关系 │ │ 调用自定义函数 │ │
│ └────────────────┘ └────────────────┘ └───────────────┘ │
│ │
│ ┌────────────────┐ ┌────────────────┐ ┌───────────────┐ │
│ │ Webhook │ │ Notification │ │ SimpleOp │ │
│ │ 外部系统回调 │ │ 发送通知 │ │ 简单操作 │ │
│ └────────────────┘ └────────────────┘ └───────────────┘ │
│ │
│ ┌────────────────┐ │
│ │ CompositeOp │ ← 组合操作:编排多个原子操作 │
│ │ 事务性组合操作 │ │
│ └────────────────┘ │
└─────────────────────────────────────────────────────────────┘
#5.2 执行引擎核心代码
from abc import ABC, abstractmethod
from enum import Enum
class ExecutorType(str, Enum):
CREATE_OBJECT = "create_object"
UPDATE_OBJECT = "update_object"
DELETE_OBJECT = "delete_object"
CREATE_RELATION = "create_relation"
DELETE_RELATION = "delete_relation"
INVOKE_FUNCTION = "invoke_function"
WEBHOOK = "webhook"
NOTIFICATION = "notification"
SIMPLE_OP = "simple_op"
COMPOSITE_OP = "composite_op"
class ActionExecutor(ABC):
"""动作执行器基类"""
@abstractmethod
async def execute(self, params: dict) -> "ActionResult":
...
@abstractmethod
async def compensate(self, params: dict, execution_id: str) -> None:
"""补偿操作:用于 Saga 回滚"""
...
class ActionEngine:
"""统一动作执行引擎"""
def __init__(self, executors: dict[ExecutorType, ActionExecutor]):
self.executors = executors
self.audit_log = AuditLogger()
async def execute_action(
self,
action_type: ExecutorType,
params: dict,
decision_id: str,
operator: str,
) -> "ActionResult":
"""执行单个动作"""
executor = self.executors[action_type]
# 记录执行前快照
snapshot = await self._take_snapshot(action_type, params)
try:
result = await executor.execute(params)
# 审计日志
await self.audit_log.record(
decision_id=decision_id,
action_type=action_type.value,
operator=operator,
params=params,
result=result,
snapshot_before=snapshot,
status="success",
)
return result
except Exception as e:
await self.audit_log.record(
decision_id=decision_id,
action_type=action_type.value,
operator=operator,
params=params,
error=str(e),
snapshot_before=snapshot,
status="failed",
)
raise
#5.3 Temporal 工作流编排长事务
对于涉及多步操作的决策,使用 Temporal 编排 Saga 模式:
from temporalio import workflow, activity
from datetime import timedelta
@workflow.defn
class DecisionExecutionWorkflow:
"""决策执行工作流:Saga 模式"""
@workflow.run
async def run(self, decision: dict) -> dict:
"""执行决策的所有动作,支持补偿回滚"""
executed_actions = []
try:
for action in decision["actions"]:
result = await workflow.execute_activity(
execute_action_activity,
args=[action],
start_to_close_timeout=timedelta(minutes=5),
retry_policy=RetryPolicy(
maximum_attempts=3,
backoff_coefficient=2.0,
),
)
executed_actions.append((action, result))
return {
"status": "completed",
"results": [r for _, r in executed_actions],
}
except Exception as e:
# Saga 补偿:逆序回滚已执行的动作
for action, result in reversed(executed_actions):
try:
await workflow.execute_activity(
compensate_action_activity,
args=[action, result["execution_id"]],
start_to_close_timeout=timedelta(minutes=5),
)
except Exception as comp_error:
workflow.logger.error(
f"Compensation failed for {action['type']}: "
f"{comp_error}"
)
return {
"status": "rolled_back",
"error": str(e),
"compensated_actions": len(executed_actions),
}
#6. 闭环数据流:端到端示例
#6.1 供应链异常检测场景
以一个完整的供应链异常检测场景来展示四步闭环:
供应链异常检测闭环示例:
时间线 ───────────────────────────────────────────────────────→
[Sense] [Think] [Decide] [Act]
│ │ │ │
│ IoT 传感器报告 │ 规则引擎匹配 │ 决策树判定 │ 执行动作
│ 仓库温度 = 35°C │ "高温警告"规则 │ 需要紧急补货 │ ①创建补货单
│ │ │ │ ②通知仓管
│ ERP 同步 │ ML 模型预测 │ 约束求解器 │ ③调整路线
│ 库存量 = 50 │ 24h 后库存 < 20 │ 最优供应商 = B │ ④Webhook ERP
│ │ │ │
│ 天气 API │ 混合推理 │ 决策审批 │ ⑤审批流转
│ 明日气温 40°C │ 综合判定:高风险 │ 紧急→自动审批 │
│ │ │ │
▼ ▼ ▼ ▼
OntologyEvent ──→ ReasoningResult ──→ DecisionOutcome ──→ ActionResult
│
│ 反馈
▼
新的 Fact
(回到 Sense)
#6.2 端到端代码串联
async def supply_chain_decision_loop(
sense: SenseLayer,
reasoning: ReasoningEngine,
decision: DecisionEngine,
action: ActionEngine,
):
"""供应链智能决策闭环"""
# ── Sense ──
temperature_event = await sense.ingest_event(
"iot_warehouse_01",
{"sensor_id": "temp_01", "value": 35.0, "unit": "celsius"},
)
inventory_event = await sense.ingest_event(
"erp_system",
{"product_id": "SKU_001", "quantity": 50, "warehouse": "WH_01"},
)
# 计算派生属性
derived = await sense.derived_property_service.compute_derived(
"Warehouse", "WH_01", {"temperature", "inventory_level"}
)
# ── Think ──
facts = {
"temperature": Fact("temperature", 35.0, "sensor"),
"inventory": Fact("inventory", 50, "erp"),
"risk_level": Fact("risk_level", derived["risk_score"], "derived"),
}
reasoning_result = await reasoning.reason(facts, strategy="hybrid")
# ── Decide ──
decision_outcome = await decision.evaluate(
tree_id="supply_chain_emergency",
context={
"risk_level": reasoning_result.facts["risk_level"].value,
"predicted_shortage": reasoning_result.facts.get(
"predicted_shortage", Fact("predicted_shortage", True, "ml")
).value,
},
)
# ── Act ──
if decision_outcome.action_type == "emergency_replenishment":
# 约束求解:选择最优供应商
solver_result = await decision.constraint_solver.solve_assignment(
tasks=[{"id": "replenish_SKU001", "demand": 100}],
resources=[
{"id": "supplier_A", "capacity": 50, "cost": 10},
{"id": "supplier_B", "capacity": 200, "cost": 8},
],
constraints=[],
objective="minimize_cost",
)
# 执行一系列动作
await action.execute_action(
ExecutorType.CREATE_OBJECT,
{"object_type": "PurchaseOrder", "properties": {
"supplier": solver_result.assignments[0]["resource_id"],
"quantity": 100,
"priority": "urgent",
}},
decision_id=decision_outcome.decision_id,
operator="system:auto",
)
await action.execute_action(
ExecutorType.NOTIFICATION,
{"channel": "dingtalk", "template": "urgent_replenishment",
"recipients": ["warehouse_manager"]},
decision_id=decision_outcome.decision_id,
operator="system:auto",
)
#7. 闭环反馈机制
#7.1 决策效果评估
闭环的关键在于"闭"——执行结果必须反馈回感知层:
class FeedbackCollector:
"""决策反馈收集器"""
async def collect_outcome(
self, decision_id: str, metrics: dict
) -> "FeedbackRecord":
"""收集决策执行后的效果指标"""
original_decision = await self.decision_store.get(decision_id)
feedback = FeedbackRecord(
decision_id=decision_id,
expected_outcome=original_decision.expected_outcome,
actual_outcome=metrics,
deviation=self._compute_deviation(
original_decision.expected_outcome, metrics
),
timestamp=datetime.utcnow(),
)
# 将反馈作为新事实注入 Sense 层
await self.sense_layer.ingest_event(
"feedback_system",
{
"type": "decision_feedback",
"decision_id": decision_id,
"effectiveness": feedback.deviation,
},
)
return feedback
#7.2 规则自优化
反馈驱动的规则优化循环:
┌──────────┐ ┌──────────┐ ┌──────────┐
│ 决策记录 │────→│ 效果评估 │────→│ 规则调优 │
│ │ │ │ │ │
│ 历史决策 │ │ 偏差分析 │ │ 阈值调整 │
│ 300+ 条 │ │ 成功率 85% │ │ 权重更新 │
└──────────┘ └──────────┘ └──────┬───┘
│
▼
┌──────────┐
│ A/B 测试 │
│ 新规则 vs │
│ 旧规则 │
└──────────┘
#8. 性能与可观测性
#8.1 各阶段延迟预算
| 阶段 | 目标延迟 | 实际 P99 | 关键优化手段 |
|---|---|---|---|
| Sense | < 50ms | 32ms | 事件批处理、异步派生计算 |
| Think | < 200ms | 145ms | Rete 网络缓存、模型预加载 |
| Decide | < 100ms | 78ms | 决策树剪枝、求解器超时 |
| Act | < 500ms | 320ms | 异步执行、批量写入 |
| 端到端 | < 1s | ~600ms | 流水线并行 |
#8.2 可观测性指标
# 闭环监控指标
STDA_METRICS = {
"sense_events_total": Counter("sense_events_total", "感知事件总数"),
"think_reasoning_duration": Histogram(
"think_reasoning_duration_seconds", "推理耗时分布"
),
"decide_outcome_total": Counter(
"decide_outcome_total", "决策结果计数", ["outcome_type"]
),
"act_execution_total": Counter(
"act_execution_total", "动作执行计数", ["executor_type", "status"]
),
"feedback_deviation": Histogram(
"feedback_deviation", "决策效果偏差分布"
),
"loop_e2e_duration": Histogram(
"stda_loop_duration_seconds", "闭环端到端耗时"
),
}
#9. 与 Palantir Foundry 的对比
| 维度 | Palantir Foundry | coomia-dip |
|---|---|---|
| 推理引擎 | 闭源 Logic Engine | 开源 ReasoningEngine(前向链 + ML) |
| 决策引擎 | AIP Logic 内置 | DecisionEngine(决策树 + OR-Tools) |
| 执行引擎 | Actions Framework | ActionEngine(10 种执行器) |
| 工作流 | 内置引擎 | Temporal(云原生、可扩展) |
| 可解释性 | 有限 | 完整推理链 + 审计日志 |
| 用户函数 | TypeScript | Python/TS/Groovy/WASM/Kotlin |
| 开源 | 否 | 是 |
#Key Takeaways
- STDA 闭环(Sense→Think→Decide→Act)是 coomia-dip 智能决策的核心架构模式
- Sense 层通过 Ontology 事件和 DerivedPropertyService 将原始数据语义化
- Think 层的 ReasoningEngine 支持前向链推理和 ML 推断的混合模式
- Decide 层的 DecisionEngine 提供决策树快速路径和 OR-Tools 约束求解双引擎
- Act 层的 ActionEngine 统一调度 10 种执行器,支持 Temporal Saga 补偿
- 闭环反馈将执行结果注回感知层,驱动规则自优化
- 端到端延迟控制在 1 秒内,满足实时决策需求
#Next Article
下一篇 S5-02 规则引擎设计:前向链推理的原理与实现 将深入剖析 ReasoningEngine 的 Rete 网络实现、事实匹配算法和规则触发机制。
tags: #intelligent-decision #STDA-loop #reasoning-engine #decision-engine #action-engine #coomia-dip #enterprise-intelligence