前言¶
做 IM 机器人或网页助手的人一般都会遇到同一个问题:上一轮还在聊,下一轮就什么都不记得了。常见做法是把最近若干轮对话塞进上下文,或者把聊天记录存进一个文件,下次按字符串搜出来。前者窗口一短就失忆,后者搜出来的是原文,机器人不会判断”这件事我还记不记得清”,也不会因为某天被凶过而让这件事多留几个月。
hippocampus_22 是 DSH 社区里的一个记忆类插件,维护者是 kianajunjie,目前 GitHub 上有 2 个星标。它的思路不是”聊天存数据库”,而是照海马体的工作方式做记忆:事件编码 → 巩固 → 遗忘 → 联想召回 → 元记忆。记忆存在一个本地 SQLite 文件里,不上传、不联网、不用向量库,开发时可以当库用,也可以用 CLI 直接操作。
下面介绍它是什么、提供哪些能力、如何在 DSH 里安装,以及适合什么场景。
一、定位与来源¶
一句话定位:这是一个面向长时运行陪伴型机器人的情感记忆层,负责把每一轮对话加工成有情绪权重的结构化记忆,并在下一轮对话时按规则召回。
它派生自同作者的 dsh-hippocampus v0.3.1(MIT),当前包版本 0.2.0,采用 MIT 许可证。派生与署名说明写在仓库的 NOTICE 文件里,二次分发需要保留 LICENSE 与 NOTICE。
技术要求是 Node 大于等于 22.5,依赖数为 0,只使用 Node 内置的 node:sqlite,不安装任何第三方包。
二、核心能力¶
README 里列出的能力如下,都是可以直接核对的:
- 事件记忆:每轮对话被加工成”谁、何时、发生了什么、什么情绪”,而不是原文落库。
- 情绪加权遗忘:被凶或被感动的那天能撑几个月,普通的一天很快淡掉。
- 确定度:每条记忆带”记得清 / 大概记得 / 只记得有这回事”三级标记,机器人不会假装很确定。
- 改口即失效:用户改主意之后(例如住址从成都改成杭州),旧事实自动作废,不会自相矛盾。
- 关系层:针对每个用户维护亲密、信任、未解开的疙瘩等维度,长时间不出现会淡化,关系修复后才解开。
- 事实 / 章节 / 技能 / 缺口:住哪、在哪个时期、做事方式、以及”我不懂什么”;不懂的地方可以主动问。
- 按人隔离:A 用户看不到 B 用户的记忆,群聊拿不到私聊记忆。
- 零依赖:只依赖 Node 内置 SQLite。
v0.2.0 相比 v0.1.0 多了几项维护能力:health 记忆体检测、port 记忆导入导出、report 人读档案导出、forget 条件遗忘。路线图里还列了记忆可视化面板和多设备同步,目前未实现。
三、记忆怎么流转¶
接入渠道可以是 QQ 桥、im、网页或其他软件。第一件事是映射身份:identities 表保证”同一人 = 一个 subject”,跨渠道也能认出来。
接下来的流程是:
handleTurn()认人,组装上下文,做一次召回。- 记忆落在
events、relations、facts、chapters、skills、gaps这几层里。 context()把召回结果整理成系统提示词块,返回给上层。
召回的方法在 src/recall.mjs 里,按 README 的说法是”词面匹配 + 图扩散 + 确定度”,具体实现细节在 docs/architecture.md。
四、安装与启用¶
作为 DSH 插件安装,官方安装命令来自 README:
dsh plugin --profile web add github:kianajunjie/hippocampus_22
上面这条命令对应 im / 网页两种使用方式。需要说明的是,插件会以当前 dsh 进程的权限运行,读文件、访问网络、执行命令的能力取决于你拉起 dsh 的方式,安装前建议先翻一遍源码和 LICENSE。
想先跑起来看效果,可以直接用 CLI。hippo 是安装后提供的命令行入口(包里的 bin 同时定义了 hippocampus-22 和 hippo):
npm i -g hippocampus-22
hippo demo
demo 会写入几条带情绪的旧事件,跑一次遗忘,再做一次召回,用来演示”情绪权重让旧记忆活得更久”这个行为。这个演示不需要 API Key。
五、CLI 能做什么¶
安装之后直接用 hippo 命令,常用操作如下:
hippo encode --turns <file.json> # 把对话批量编码成事件
hippo replay # 巩固:合并近重复 + 情绪衰减
hippo recall "腿疼" # 召回(带确定度)
hippo context --subject 主人 "..." # 直接看这一轮会塞进提示词的块
hippo remember "…" --pin # 主动记一条,--pin 永不衰减
hippo list 20 | audit | stats # 看记忆 / 看作废记录 / 看统计
hippo rel 主人 | rel-shift 主人 intimacy:1 why:吵架
hippo fact-add 主人 住在 杭州 | facts 主人
如果只是临时验证行为,hippo context 比较有用:给一个 subject 和一句输入,它会打印这一轮会塞进系统提示词的块,能直接看到召回结果和确定度。
六、作为库或 HTTP 服务接入¶
如果不想走 DSH 插件壳,也可以当独立的 JS 库用:
import { createHippocampus } from 'hippocampus-22'
const hip = await createHippocampus({ apiKey: process.env.DEEPSEEK_API_KEY })
// 每条消息进来都走一遍:认人 → 组装提示词块 → 召回
const r = await hip.handleTurn({ channel: 'qq', externalId: msg.user_id, text, reply })
// r.context 塞进系统提示,r.recall 是召回结果
// 每天一次巩固:合并近重复、按情绪衰减、写一句印象
await hip.replay()
这是典型部署方式:消息回调里调 handleTurn(),拿到 context 拼进系统提示;定时任务里调 replay() 做巩固。
服务端部署时还可以起一个 HTTP 服务,任何语言都能接:
import { createMemoryServer } from 'hippocampus-22/http'
await createMemoryServer({ hip, port: 7717, token: 'secret' })
curl -s localhost:7717/context -H 'authorization: Bearer secret' \
-H 'content-type: application/json' \
-d '{"channel":"telegram","externalId":"42","text":"我腿疼"}'
接口很薄,就是取当前这一轮的提示词上下文。上面这个例子把 channel 换成 telegram,说明渠道字段可以随便指定,身份统一靠 externalId 映射。
七、适用场景与边界¶
适合谁:
- 正在写长时运行的陪伴型、私聊型机器人,且需要跨会话记忆的人。
- 希望记忆不离开本机、不想引入向量库和外部数据库的人。
- 需要多用户隔离的 IM 桥接场景。
不太适合的场景:
- 需要严格全文检索或按语义模糊搜索的场景。它召回是词面匹配加图扩散,不提供向量检索,README 里也没有承诺语义召回。
- 需要跨设备实时同步的场景。多设备同步在路线图里,尚未实现。
另外几点需要留意:handleTurn 需要 DEEPSEEK_API_KEY,因为事件编码是用 LLM 抽取的;demo 不需要 key。项目是派生的,署名链在 NOTICE 里,商用或再分发前要看清许可证条款。安装前花几分钟读一下源码,尤其是它会以当前 dsh 进程权限运行这个事实。
八、一句话回顾¶
hippocampus_22 把”陪伴型机器人的记忆”从”存聊天记录”这套做法里拆出来,换成有情绪权重、有确定度、会自动遗忘、会承认自己记不清的一层,存储就是一个本地 SQLite 文件,依赖为零。如果你的机器人需要跨会话的私人记忆,又不想把数据送出去,可以装这个插件试一下。
目录页:https://www.skillhub.cn/plugins/kianajunjie/hippocampus_22
GitHub:https://github.com/kianajunjie/hippocampus_22