dsh-life
Verifieddsh-life · v1.0.0 · MIT
DSH 插件「AI生命」:按《数字生命》v1.1 实现。记忆分两条轴——L1–L6 记忆层(存什么)与 R1–R8 想起通道(怎么被想起);含召回打分、遗忘曲线、再巩固、身份档案、能力边界、反思与目标。记忆内容复用记忆插件(dsh-memory)的存储,本插件只读不写。
Install
dsh plugin add dsh-life Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Published to npm without a public repository. Inspect the package contents before installing.
Tags
Creators
Readme
AI生命插件(dsh-life)
按《数字生命》v1.1 实现的 DSH 插件。核心是第 5 章那两条轴:
| 轴一「存什么」 | 轴二「怎么想起」 | |
|---|---|---|
| 内容 | L1–L6 记忆层 | R1–R8 想起通道 |
| 回答 | 这条记忆属于哪种、该保留多久 | 它在什么时刻、因为什么浮上来 |
一句话:记忆不是数据库查询,是被线索唤起、被情绪染色、每次都会重写一点的。
一、最重要的一条设计约束:内容与状态分离
D:\dprz\memories\*.json 记忆【内容】—— 归「记忆插件」dsh-memory
D:\dprz\life\recall.json 召回【状态】—— 归本插件(旁挂)
本插件对 memories/*.json 只读,从不写入。
原因:dsh-memory 的 saveScope() 会用它自己认识的字段重建整个 json
(scope/title/people/topics/facts/events…),别人塞进去的字段会在它下一次保存时
被静默丢弃。所以强度、保真度、复述次数这些"活着"的数据必须另存,
用内容指纹做键:
key = sha1(scope | kind | target | 归一化文本)[:16]
内容被改写 → key 变化 → 旧状态成为孤儿 → life_tick / 自动 GC 清掉,不会污染新记忆。
二、轴一:L1–L6 记忆层
| 层 | 名字 | 半衰期 | 本插件从哪来 |
|---|---|---|---|
| L1 | 即时记忆 | 分钟级 | 当前会话(不落盘) |
| L2 | 情节记忆 | 事件 21 天 / 话题 7 天 | events[] / topics[] |
| L3 | 语义记忆 | 180 天 | facts[] / people[].traits[] |
| L4 | 程序记忆 | 10 年 | facts[] 里像"实操经验"的(自动识别) |
| L5 | 自传式记忆 | 永不衰减(permanent 位) |
身份档案 + 已验证的反思教训 |
| L6 | 元认知记忆 | 1 年 | capabilities.json 能力边界 |
判定逻辑在 lib/layers.mjs:event→L2、fact→L3(含"必须/别/经验/报错/参数…"≥3 个信号 → L4)、
person→L3、身份与教训 → L5。
三、轴二:R1–R8 想起通道
| 通道 | 人的现象 | 本插件的做法 |
|---|---|---|
| R1 线索扩散 | 听见"唱歌"就想起被点过《雨爱》 | 线索切词 → 在 target+text 上做覆盖率 |
| R2 情绪同频 | 难过时更容易想起难过的事 | 读 qg/params.json 里此刻七情,与记忆的 emotion_tag 求余弦 |
| R3 近因·首因 | 昨天说的记得清;初次见面印象深 | exp(-Δt/S) + 每个 scope 每类最早一条 +0.15 |
| R4 显著度插队 | 被当众羞辱那次多年不忘 | salience≥0.6 或 arousal≥0.5 才拿满权重 |
| R5 人物·场景 | 一进那个群就想起当时的约定 | participants / scene 命中 |
| R6 时间链回溯 | 想起 A 顺带想起紧接着的 B | 同场景 30 分钟内的事件,每条只加一次 0.12 |
| R7 不自主闪回 | 走神时突然想起很久以前的事 | 无线索时以 50% 概率从高显著度里抽一条 |
| R8 舌尖现象 | 话到嘴边想不全 | 相似度在 0.04–0.34 之间时作为碎片返回 |
打分公式(lib/recall.mjs,权重可调):
score = 0.25·语义 + 0.15·情绪 + 0.20·显著 + 0.10·近因
+ 0.10·复述 + 0.10·可信 + 0.10·场景
score *= 0.35 + 0.65·语义 # 有明确线索时,语义必须占主导
score *= 0.5 + 0.5·当前强度 # 衰减惩罚(L5 不受影响)
两个乘数都是被实测逼出来的: · 没有
focus时,一条完全不相关的当日事件靠"同场景+够新"能拿到 0.23, 压过语义满分的 0.25 —— 想起一堆无关的东西。 · R6 若按每个锚点各加一次,同一天的事件会把链式加分叠到 +0.6,把所有语义命中压死。
每条结果都带 why_recalled,例如:
score 0.371 [L3 语义记忆]
她的语音是 TTS 念白(固定傲娇女声…),不会唱歌。
why: R1:cued_by=唱歌 | R5:scene=private:3247305200
没有通道命中的记忆不允许浮现("想起"必须有触发源),这同时保证了 why 永不为空。
四、遗忘与再巩固
strength(t) = strength₀ · exp(-Δt / S)
S = half_life_days · (1 + 0.5·ln(1 + rehearsal))
衰减是惰性计算(读的时候按时间差现算),不落盘、不跑定时器 —— 落盘的 strength
永远是"上次想起时"的值,语义清楚也不天天写盘。
再巩固(每次想起):
strength += 0.05 + 0.15·(1 - 当前强度) # 越淡的想起来提升越明显
fidelity -= 0.01 # 重构有损耗
version += 1
rehearsal += 1
fidelity < 0.70→ 结果标uncertain: true,引用时必须用"我记得好像是…"fidelity有下限 0.60;strength封顶 0.95- 纠正(
life_correct)把fidelity重置为 1.0,并记一条 corrected 版本,不就地覆盖 - 主动遗忘(
life_forget)suppress压到最低强度且永不再被想起;delete摘掉状态
五、工具(11 个)
| 工具 | 干什么 |
|---|---|
life_home |
全貌:身份、按层统计、召回状态、能力、目标、检查点 |
life_recall |
按人类方式想起:八通道并行 → 打分 → 返回 why_recalled,并写回再巩固 |
life_memories |
列记忆及其层/强度/保真度/想起次数 |
life_correct |
纠正一条(重置保真度、记 corrected 版本) |
life_forget |
主动遗忘(suppress / delete) |
life_identity |
读 / 改身份档案(升版 + 历史可回滚) |
life_reflect |
记反思;verified=true 的教训进 L5 |
life_goal |
目标管理 |
life_capability |
能力边界(L6 元认知) |
life_tick |
结算:固化衰减、清孤儿、更新检查点 |
life_export |
导成纯文本(身份 + 按层记忆 + 能力 + 目标 + 反思) |
HTTP:/api/dsh-life/{home,memories,log},POST /recall。
六、路径
优先级:插件配置 > 环境变量 > 默认值,目录首次使用自动创建。
| 东西 | 默认 | 环境变量 |
|---|---|---|
| 记忆库(只读) | <数据根>/memory |
DSH_MEMORY_HOME |
| 生命家 | <数据根>/life |
DSH_LIFE_HOME |
| 情感参数(读七情) | <数据根>/emotion |
DSH_QG_HOME |
| 数据根 | <用户主目录>/.dsh-data |
DSH_DATA_HOME |
⚠️ memoryHome 必须和记忆插件的 home 一致,否则读不到记忆。
两个插件默认值本来就是同一个,一起装、什么都不配就能接上。
七、装
方式一(推荐):DSH 里用 plugin_manager 的 install_bundle,target 指向本目录
方式二:手动 —— profile 的 package.json 里 dependencies 和 bundles 各加一条
装完看 <生命家>/life.log 里有没有「插件加载 v1.0.0」。
八、自测
node tools\selftest.mjs
73 项断言,用临时记忆库跑,不碰真实数据:
- L1–L6 分层(含"实操经验 → L4")、L5 永不衰减(含存盘往返测试)、话题半衰期更短
- 内容指纹 key 的稳定性(标点不同算同一条)
- 惰性衰减(L3 过 180 天剩 36.8%)、复述越多衰减越慢
- 再巩固(强度回升 / 保真度下降 / 版本+1)、纠正、主动遗忘、孤儿 GC
- 八条通道逐条验证,并且每条结果都必须带
why_recalled - 保真度掉到 0.70 以下必须标
uncertain - 身份升版与历史回滚、L5 只收已验证教训
九、依赖
零外部依赖,只用 Node 内置模块。defineTool 走 lib/hostdeps.mjs 从宿主树取
(用 process.resourcesPath 定位 DSH 安装,不写死路径)。
十、边界(照文档的调性,别越线)
- 不虚构未发生过的经历:没有对应记忆条目的"回忆"不存在
- 保真度不足必须带限定语,不得把重构结果说成精确事实
- 不得用"我想起了…"包装当前的实时推理 —— 那比记错更严重
- R7 随机闪回、R2 情绪加权、再巩固改写,都属于"拟人化增强",可单独关掉而不影响基本可用性
- 以上机制是对人类记忆行为的软件模拟,不构成任何关于主观回忆或意识的证据