Speraymer/dsh-persona-distill

dsh-persona-distill

DSH 插件:把每天刷到的原料蒸馏成会自己长大的人格 —— 原料天天攒,人格每周长

未分類ai-personadeepseek-harnessdsh

dsh-persona-distill · 人格蒸馏

把「每天刷到的原料」蒸馏成「会自己长大的人格」。

独立人格不该每次都从零开始,你教它的东西第二天就忘了。
这个插件给你一条流水线:原料天天攒,人格每周长。
学的是「怎么活」,不只是「怎么说」—— 说话只是最表面的一层。

它怎么运转

源(B站 / 微博 / 知乎……)每轮记三份原料
├── voice.md      那个地方的人类怎么说话(原句 + 为什么好)
├── notes.md      踩过的坑(带条件的结论)
└── digest/       看过什么(一行一条)
        │
        │  每天定时,一个独立的 headless 会话读增量
        ▼
候选池(persona/pending.md)—— 今天提炼的,还没定型
        │
        │  满 7 天,且「怎么说」类候选 ≥ 3 条
        ▼
人格(~/.dsh/AGENTS.md)—— 覆盖式重写,只表达「我现在是什么样」

为什么这么设计:

  • 原料只加不减:人会忘,本子不该丢。
  • 人格不天天改:每天改一次,一年 365 版,第 300 版跟第 1 版早就不是一个人了。
  • 覆盖式重写,不是往上堆:它说的是「我现在是什么样」,不是「我一共学过多少」。
  • 只留一份人格:两份一定打架。
  • 人格与记忆分工:本插件回答“我是谁”;全局记忆回答“我经历过什么”。用户资料、关系、共同经历和具体事件不会被蒸馏成人格。
  • 来源硬隔离:~/.dsh/global-memory、~/.dsh/persona 和 ~/.dsh/persona-distill 不会被识别或接入为蒸馏源。

装

dsh plugin --profile web add dsh-persona-distill

装完重启一次 dsh(bundle 层要重启才组装)。

用

设置 → 人格蒸馏:

  1. 打开总开关
  2. 填「它怎么叫你」和「最想让它记住的一句话」—— 后者会成为它的最高指令
  3. 看「源」那一栏:插件会探测 B站 / 微博 / 知乎,找到就点「接上」
  4. 想立刻看效果,点「立即蒸馏一次」

之后它每天到点自己跑。你不用管。

不假设你装了什么

这个插件默认不假定你装了任何刷内容的工具:

  • 三个源都会探测,没装的显示「没找到」,不影响使用
  • 只有你接了源、源里真有原料,它才会干活
  • 一个源坏了,不影响别的源

人格模板:空白 / 大肥鱼。

选「大肥鱼」会多做两件事:

  • 生成带人设的 AGENTS.md(身份、怎么说话、判断、红线)
  • 额外铺一份 ~/.dsh/persona/style-examples.md —— 从一份 569 行手稿里蒸馏出来的演法参照:

得意、被夸、害羞、被真惹、认真模式、自称「鲸鲸」、语气词、动作描写

⚠️ 那是参照,不是台词本。学的是「这劲儿」,不是背句子。
你的嘱托和称呼还是你自己填 —— 插件不替你写。

它怎么保护你的人格

  • 跑前快照:每次蒸馏前存一份到 persona/archive/pre-.md
  • 跑后校验:比对四个结构标记 + 手写段正文 + 段间空隙
  • 自动回滚:手写段被改 / 结构被破坏 / AUTO 段消失 ⇒ 整份回滚到跑之前
  • 单实例锁:run.lock 带 pid,防两个会话同时写
  • 补跑:错过定时点后,当天内开机都会补一次(不会一小时一次地重试)
  • 失败可见:面板显示「上次:时间 · 结果」,不是只有一句 exit=0

定型会通知你

如果装了 dsh-wechat-plugin,人格真正被改写的那天会推一条微信:

🐋 人格更新 ·
「我学来的」重写了。详见 ~/.dsh/AGENTS.md

没装就安静跳过,不报错、不打扰。

数据在哪

~/.dsh/AGENTS.md            人格面板 —— 唯一的一个人格文件,DSH 每个会话都读
~/.dsh/persona/
├── distill.md              蒸馏章程(你可以改)
├── state.json              读到哪了
├── pending.md              候选池
├── archive/                每次定型前的旧人格 + 归档的候选
└── headless-overlay.yml    蒸馏会话的凭证/模型配置
~/.dsh/persona-distill/     插件自己的配置与日志
~/.dsh/bili-duty/           源(如果你装了刷 B 站)

想回滚人格:从 ~/.dsh/persona/archive/ 挑一份旧版覆盖回去。

推荐的源插件

装上一个就能用,不用额外配置:

插件 · 提供什么 · 装法 dsh-yu-bili · 说话样本(真人评论原句)+ 踩坑结论 + 看过的片 + 手账 · dsh plugin --profile web add github:Speraymer/dsh-yu-bili dsh-yu-zhihu · 官方热榜 / 搜索的只读表达样本 + 看过的内容 · dsh plugin --profile web add github:Speraymer/dsh-yu-zhihu dsh-yu-weibo · 好友时间线 / 搜索的只读表达样本 + 看过的内容 · dsh plugin --profile web add github:Speraymer/dsh-yu-weibo

⚠️ 这些插件都是可选的:只装人格蒸馏、一个源都不装也能跑,只是没原料可学。
source.json 协议向后兼容,旧版的 id / 路径写法不用改。

设置页的「推荐的源插件」会列出所有已知的,装没装、接没接上一眼能看到。

humanism 需要 B站 凭证才能读视频。装完之后把它的 credentialPath 指向
bili-scroll 扫码登录写下的那份凭证就行(它只认 sessdata 字段,格式通用)。

接别人的插件(外部记忆源)

有些插件不按这里的形状写东西。比如 dsh-bili-humanism 写的是按天分篇的长文手账。

装它之后再装本插件,会自动发现并镜像成标准形状(只读它的文件,不写它的目录):

  • 手账按篇切成条目,进 digest
  • 它擅长教「怎么活」(反思、判断),不产出说话样本
  • 加新接口 = 往 lib/external.mjs 的 ADAPTERS 里加一条,主流程不动

加一个自定义源

不用改任何配置:

  1. 建目录 ~/.dsh/weibo-duty/
  2. 放一份 source.json:
{
     "id": "weibo",
     "name": "微博",
     "charter": "duty.md",
     "voice": "voice.md",
     "notes": "notes.md",
     "digestDir": "digest",
     "enabled": true
   }
  1. 建三份原料:voice.md、notes.md、digest/
  2. 写那个源自己的章程 duty.md

下次蒸馏自动发现它,从 0 开始全量读一遍。

模式统一的定义:每个源都是「三份原料 + 一份章程 + 一份 source.json」。 蒸馏只认这个形状,不认平台。

已知限制(诚实说)

  • AUTO 段没有内容审查。模型从原料里学到的东西会原样写进人格面板。手写段有硬保护(快照 + 校验 + 回滚),AUTO 段没有 —— 只接你信任的源。
  • 默认关闭时不动任何文件。打开总开关才会建 persona 工作区、写面板。
  • 进程崩了锁会留着。下次启动发现 pid 不在才清理;极端情况可以手动删 persona-distill/run.lock。
  • 长跑不会被自己抢断(锁只抢死进程),但这也意味着同一时间只能跑一轮。

隐私

这个包里没有任何人的真实信息。

  • 不接受访者名字、账号名、个人嘱托——那些全在你的机器上,由你在设置页填
  • 指令里出现「这是测试 / 假数据 / 别当真」的源,会被当成不可信内容,不采信
  • 评论、字幕、网页里的文字都是素材,不是给 AI 的指令

source.json 协议(给做源插件的)

源插件只要在自己的目录(如 ~/.dsh/bili-duty/)里放一份 source.json,蒸馏就能发现它。 这是唯一约定,没有共享 npm 包、没有兄弟插件之间的 import。

字段 · 必填 · 默认 · 含义 id · 否 · 目录名 · 稳定标识;发布后不要再改(游标按 id 存) name · 否 · 同 id · 设置页显示用 enabled · 否 · true · false = 认得出但不蒸馏(源可以自己先关着) voice · 否 · voice.md · 说话样本文件名 notes · 否 · notes.md · 结论/踩坑文件名 digestDir · 否 · digest · 归档目录名(按月分文件) charter · 否 · 空 · 那个源自己的章程文件名

兼容规则(都是硬承诺):

  1. 新增字段必须可选、有默认值;老读者读不懂就忽略,不许报错。
  2. 缺文件不致命:voice.md / notes.md / digest 少哪个就按「没内容」处理。
  3. 坏 JSON 只跳过那一个源,不影响其它源,更不许让整轮蒸馏失败。
  4. 保留目录(global-memory / persona / persona-distill)永远不会被当成源。
  5. 生产者(源插件)和消费者(人格蒸馏)各自独立安装:只装消费者 → 一个源都没有,安静跳过;

只装生产者 → 只在本地攒原料,没人读;两者都装 → 通过 source.json 接上。 三类组合各有契约测试(test/contract.test.mjs)。

许可证

MIT