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

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

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

小夜