OpenClaw Dreaming 是一个模拟人类睡眠记忆巩固过程的记忆整合系统,它通过三个阶段(Light/Deep/REM)对短期记忆进行处理,最终生成机器可读状态和人类可读的梦境日记。这个功能的设计灵感来源于神经科学中关于人类睡眠时记忆巩固的研究,但在实现上采用了完全不同的技术路径。
在实际开发中,我发现这个系统特别适合处理那些需要长期积累和提炼的知识型数据。比如我在开发一个智能笔记应用时,就借鉴了类似的架构来处理用户笔记的长期价值评估。系统会定期"睡眠",在这期间对积累的碎片化信息进行整理和重组,最终形成更有结构化的知识网络。
系统采用分层架构设计,每个阶段都有明确的职责边界:
Light阶段:负责从短期记忆存储中提取候选片段。这里的关键是提取算法,我采用的是基于时间衰减和关联度的复合评分模型。具体实现上,每个记忆片段会被打上时间戳和关联标签,提取时优先选择:
Deep阶段:这是系统的核心处理环节,采用6维评分算法对记忆进行筛选。这六个维度包括:
REM阶段:负责将处理后的记忆转化为更易理解的表达形式。这里采用了自然语言生成技术,但特别加入了诗意化处理模块,使得输出更具可读性。
在实现这个系统时,我选择了Node.js作为主要技术栈,主要基于以下考虑:
特别值得一提的是,在6维评分算法的实现上,我使用了TensorFlow.js而不是Python版本,这样可以直接在Node.js环境中运行,避免了跨语言调用的开销。
javascript复制// Light阶段核心代码示例
async function lightStageProcessing() {
// 1. 获取短期记忆池中的候选片段
const candidates = await MemoryPool.query({
timeRange: 'last72hours',
minAssociationScore: 0.5,
limit: 100
});
// 2. 应用衰减因子计算最终得分
const scoredCandidates = candidates.map(memory => {
const timeDecay = calculateTimeDecay(memory.timestamp);
const associationBoost = memory.associations.length * 0.1;
const manualBoost = memory.isImportant ? 0.3 : 0;
return {
...memory,
lightScore: (timeDecay * 0.6) + (associationBoost * 0.3) + manualBoost
};
});
// 3. 按得分排序并筛选
return scoredCandidates
.sort((a, b) => b.lightScore - a.lightScore)
.slice(0, 30); // 只保留前30个候选
}
注意事项:时间衰减因子需要根据实际业务场景调整。在知识管理类应用中,我通常设置为3天衰减到50%,而在社交类应用中可能设置为1天。
Deep阶段的6维评分需要特别关注各维度的权重分配。经过多次实验,我总结出一个相对通用的权重配置:
| 维度 | 权重 | 计算方式 |
|---|---|---|
| 情感强度 | 20% | 使用VADER情感分析库获取 |
| 关联密度 | 25% | log(关联数+1) * 0.5 |
| 访问频率 | 15% | min(访问次数/10, 1) |
| 创建者权重 | 10% | 根据用户等级0-1标准化 |
| 结构化程度 | 20% | JSON深度 * 0.3 + 字段完整度 * 0.7 |
| 时间衰减补偿 | 10% | 1 - (当前时间-创建时间)/时间常数 |
实现时要注意各维度的归一化处理,确保最终得分在0-1之间。我通常会加一个sigmoid函数来平滑极端值。
系统采用JSON格式的配置文件,主要参数包括:
json复制{
"dreaming": {
"enabled": true,
"schedule": "0 3 * * *", // 每天凌晨3点运行
"lightStage": {
"maxCandidates": 30,
"timeDecayHalfLife": "72h"
},
"deepStage": {
"promotionThreshold": 0.7,
"dimensionWeights": [0.2, 0.25, 0.15, 0.1, 0.2, 0.1]
},
"remStage": {
"poeticStyle": "modern",
"diaryLength": "medium"
}
}
}
bash复制npm install @openclaw/core date-fns natural tensorflow
javascript复制const memoryPool = new MemoryPool({
persistTo: './memories',
maxShortTermItems: 1000
});
javascript复制const dreaming = new DreamingService({
memoryPool,
config: require('./config.json')
});
dreaming.start();
系统采用内容指纹和语义相似度双重去重机制:
在实际应用中,我发现这种组合既能保证去重效果,又不会过度合并有细微但重要的差异的内容。
系统支持两种触发方式:
我建议同时启用两种方式,并设置合理的心跳间隔(如最少6小时一次),避免频繁处理消耗资源。
记忆晋升率过低:
处理时间过长:
梦境日记可读性差:
在实际项目中应用这套系统时,我有几个特别有用的经验分享:
这个架构还可以进一步扩展:
我在最近的一个知识管理项目中,就扩展了REM阶段,使其能生成Markdown格式的知识卡片,直接插入到用户的笔记系统中,效果非常好。