Skip to content

dsh-life

Verified

dsh-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 情绪加权、再巩固改写,都属于"拟人化增强",可单独关掉而不影响基本可用性
  • 以上机制是对人类记忆行为的软件模拟,不构成任何关于主观回忆或意识的证据