当一个平台同时承载可信 AI 评测、数字资产存证和多语言文脉生态时,真正棘手的并不是再增加几个业务模块,而是划清边界:哪些能力应该开放给社区,哪些证据数据必须严格保护;哪些接口需要长期稳定,哪些业务逻辑可以快速替换。
微内核架构提供了一条可行路径:把身份、协议、策略和证据链等稳定能力压缩进内核,再把频繁变化的功能拆成可插拔引擎。所谓“五引擎”,重点不在数字本身,而在于用明确的能力边界阻止业务代码侵入底层。
来源摘要没有列出五个引擎的正式名称。下文使用一组便于落地的参考划分,属于工程化示例,不代表原系统的具体模块命名。
内核稳定,不等于所有代码都不变
“底层永远稳定、业务永远可迭代”不应该被理解为底层代码永不发布新版本。更准确的目标是:内核对外契约稳定,业务实现可以独立演进。
一个可维护的系统可以分成四层:
| 层次 | 主要职责 | 变化频率 |
|---|---|---|
| 微内核 | 插件注册、命令分发、身份上下文、策略检查、证据摘要 | 低 |
| 引擎协议 | 输入输出结构、错误码、能力声明、版本协商 | 较低 |
| 业务引擎 | AI 评测、资产登记、文脉处理等领域逻辑 | 中高 |
| 接入与应用 | HTTP API、管理后台、工作流、第三方集成 | 高 |
这里最容易犯的错误,是让微内核理解具体业务。例如,内核不应该知道“模型幻觉分数”或者“数字藏品归属关系”是什么;它只需要知道某次命令由谁发起、调用了哪个能力、是否通过策略校验,以及应该留下什么可验证凭据。
判断一段逻辑是否应进入内核,可以问三个问题:
- 删除某个业务赛道后,这段逻辑是否仍然必要?
- 它是否必须被所有引擎以同一种方式执行?
- 它的变更是否会迫使全部插件一起升级?
前两个答案为“是”且第三个答案可通过兼容协议控制时,才适合进入内核。
五个引擎应是能力域,而不是五个巨型服务
一种参考拆分方式是:
- 可信评测引擎:执行模型评测、规则评分和结果归一化。
- 数字资产引擎:处理资产登记、状态转换和权属关联。
- 文脉处理引擎:管理多语言内容、术语映射和文化语境元数据。
- 策略引擎:根据主体、动作、资源与环境作出授权判断。
- 审计查询引擎:读取经过授权的证据索引,生成审计视图。
这些名称只是示例。工程上更重要的是每个引擎都遵守同一套最小协议:
输入:命令类型 + 协议版本 + 调用者上下文 + 业务载荷
输出:结果状态 + 结构化结果 + 可公开元数据 + 错误信息
副作用:通过内核提供的端口访问存储、消息和证据服务
引擎不应直接读取另一个引擎的数据库。跨域协作应通过版本化命令、事件或查询接口完成,否则所谓“五引擎”很快会退化为共享数据表的分布式单体。
开放的是架构,受保护的是数据与控制权
开放源码和开放数据不是同一件事。平台可以公开以下内容:
- 引擎接口与 SDK;
- 插件生命周期和能力声明格式;
- 证据摘要算法及验证工具;
- 示例引擎、测试套件和协议文档。
但这并不意味着要公开原始评测样本、资产权属材料、用户身份信息、密钥或完整审计记录。可以采用三道边界:
- 代码边界:社区插件只能调用受控端口,不能直接进入核心数据库。
- 数据边界:对外返回凭据、哈希和必要元数据,而不是原始证据。
- 执行边界:插件经过签名、权限声明、资源限制和版本检查后才可加载。
需要特别注意:哈希只能证明内容是否发生变化,不能替代加密和访问控制。低熵数据还可能被字典攻击反推出原文。生产环境仍需使用 KMS、信封加密、租户隔离、密钥轮换和最小权限策略。
一个可以运行的微内核原型
下面的示例只使用 Python 标准库,展示三个关键点:统一引擎协议、注册式分发,以及只写入摘要的链式证据日志。五个引擎均为演示实现,实际项目应替换成独立模块或进程。
将以下内容保存为 app.py:
from __future__ import annotations
import hashlib
import json
import time
from dataclasses import dataclass
from pathlib import Path
from typing import Any, Callable
Engine = Callable[[dict[str, Any]], dict[str, Any]]
@dataclass(frozen=True)
class Command:
engine: str
actor: str
payload: dict[str, Any]
protocol: str = 'v1'
class EvidenceLog:
def __init__(self, path: str = 'evidence.jsonl') -> None:
self.path = Path(path)
def _last_hash(self) -> str:
if not self.path.exists():
return '0' * 64
lines = self.path.read_text(encoding='utf-8').splitlines()
return json.loads(lines[-1])['chain_hash'] if lines else '0' * 64
def append(self, command: Command, result: dict[str, Any]) -> dict[str, str]:
# 示例只保存业务内容摘要,不把原始载荷写入证据日志。
canonical = json.dumps(
{'command': command.payload, 'result': result},
ensure_ascii=False,
sort_keys=True,
separators=(',', ':'),
).encode('utf-8')
content_hash = hashlib.sha256(canonical).hexdigest()
previous_hash = self._last_hash()
chain_hash = hashlib.sha256(
f'{previous_hash}:{command.engine}:{content_hash}'.encode('utf-8')
).hexdigest()
record = {
'time': int(time.time()),
'engine': command.engine,
'actor': command.actor,
'protocol': command.protocol,
'content_hash': content_hash,
'previous_hash': previous_hash,
'chain_hash': chain_hash,
}
with self.path.open('a', encoding='utf-8') as file:
file.write(json.dumps(record, ensure_ascii=False) + '\n')
return {'content_hash': content_hash, 'chain_hash': chain_hash}
class Kernel:
def __init__(self, evidence: EvidenceLog) -> None:
self.evidence = evidence
self.engines: dict[str, Engine] = {}
def register(self, name: str, engine: Engine) -> None:
if name in self.engines:
raise ValueError(f'engine already registered: {name}')
self.engines[name] = engine
def dispatch(self, command: Command) -> dict[str, Any]:
if command.protocol != 'v1':
raise ValueError(f'unsupported protocol: {command.protocol}')
if command.engine not in self.engines:
raise KeyError(f'unknown engine: {command.engine}')
# 生产环境应在此处调用策略端口,而不是硬编码授权规则。
result = self.engines[command.engine](command.payload)
receipt = self.evidence.append(command, result)
return {'result': result, 'receipt': receipt}
def trust_eval(data: dict[str, Any]) -> dict[str, Any]:
score = max(0, min(100, int(data.get('score', 0))))
return {'normalized_score': score, 'passed': score >= 80}
def asset_registry(data: dict[str, Any]) -> dict[str, Any]:
return {'asset_id': data['asset_id'], 'status': 'registered'}
def context_engine(data: dict[str, Any]) -> dict[str, Any]:
return {'language': data.get('language', 'und'), 'terms': data.get('terms', [])}
def policy_engine(data: dict[str, Any]) -> dict[str, Any]:
return {'allowed': data.get('role') in {'auditor', 'operator'}}
def audit_query(data: dict[str, Any]) -> dict[str, Any]:
return {'query_id': data.get('query_id'), 'status': 'accepted'}
if __name__ == '__main__':
kernel = Kernel(EvidenceLog())
kernel.register('trust-eval', trust_eval)
kernel.register('asset-registry', asset_registry)
kernel.register('context', context_engine)
kernel.register('policy', policy_engine)
kernel.register('audit-query', audit_query)
response = kernel.dispatch(
Command(
engine='trust-eval',
actor='developer-42',
payload={'model': 'demo-model', 'score': 87},
)
)
print(json.dumps(response, ensure_ascii=False, indent=2))
使用 Python 3.10 或更高版本运行:
python app.py
cat evidence.jsonl
再次执行后,新的证据记录会引用上一条记录的 chain_hash。修改中间记录将导致后续链条无法重新计算通过。这个示例尚未实现完整验证器、并发写入、数字签名和密钥管理,因此只能用于理解边界,不能直接作为生产存证系统。
把原型推向生产时,可以这样改造:
- 将
Engine函数升级为带版本和能力声明的插件接口; - 使用数据库事务或单写入者队列保证证据顺序;
- 用机构私钥签署证据回执,并把签名密钥放入 KMS 或 HSM;
- 将原始业务数据加密存入独立数据域,证据服务只持有摘要和定位符;
- 对第三方插件采用容器、WASM 或独立进程隔离;
- 为协议建立契约测试,确保旧插件在内核升级后仍可工作。
演进时守住四条红线
采用微内核并不会自动得到解耦。团队还需要用发布规则和测试机制守住边界:
- 内核不导入业务包:依赖方向只能由引擎指向内核协议。
- 证据不可静默覆盖:更正应追加新记录,并关联被更正的凭据。
- 协议版本显式声明:破坏性变更必须启用新版本或提供适配器。
- 插件权限默认关闭:存储、网络、密钥和跨租户访问均按需授权。
落地时不必一开始就拆成五个微服务。更稳妥的方式是先构建模块化单体:内核、协议和五个能力域位于不同包中,通过接口通信;当某个引擎出现独立扩缩容、安全隔离或发布节奏需求时,再将它迁移为进程外插件。
微内核真正保护的不是某一份代码,而是系统的演进能力。开放接口让社区可以共建,证据边界让关键数据不因开放而失控,稳定协议则让 AI 评测、数字资产与多语言生态能够共享基础设施,却不必共享彼此的复杂度。