kianajunjie/hippocampus_22:给陪伴型机器人加一个会遗忘的情感记忆层

前言

做 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”,跨渠道也能认出来。

接下来的流程是:

  1. handleTurn() 认人,组装上下文,做一次召回。
  2. 记忆落在 events、relations、facts、chapters、skills、gaps 这几层里。
  3. 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

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜