dsh-qq-memory:为 qq-bridge 把 QQ 对话落表并按需注入记忆

前言

用 DeepSeek Harness 接 qq-bridge 时,模型每轮看到的往往是桥接拼好的唤醒提示和工具结果里的近期消息。桥接侧 recentMessages 通常只保留最近一百到两百条,更早的内容既进不了 prompt,也很难在本地按会话检索。若再靠额外模型做摘要或向量库,还要考虑 qq-chat-v2 里 qq-tool-restrict 白名单是否允许新工具。下面介绍维护者 Gentaine 的 dsh-qq-memory:从 qq-bridge 的 state/social-v2.json 同步入站/出站消息到 SQLite,在 DSH 每轮第一步按关键词与时间窗自动召回旧片段,并记录回忆次数与对话轮次,再按规则定期清理低价值旧行。插件不调用额外模型、不注册新工具,因此不会被上述白名单挡住,也无需改 qq-bridge 本身。

这是什么

dsh-qq-memory(GitHub:Gentaine/dsh-qq-memory,社区目录:skillhub 条目)是 DeepSeek Harness 的「记忆」类插件:把 QQ 桥接对话当作可查询、可衰减的表,而不是一次性塞进 system 的长文本。当前 package 版本为 0.2.1,许可证 MIT,依赖 Node.js >= 24(使用内置 node:sqlite),在 DeepSeek Harness 0.2.x(README 注明在 0.2.1-rc.3 上开发测试)下使用。

核心功能

资料中明确的能力如下。

落表与隔离
读取 qq-bridge 的 state/social-v2.json,将入站/出站消息一行一条写入 SQLite;按 qq_key(群或私聊)隔离,不会把 A 群的旧消息带进 B 群或私聊。去重优先级为 message_id → seq → 内容哈希。

自动回忆(注入)
在 DSH 每轮第一步,从旧消息里按关键词与时间窗挑选 1–8 条(默认上限见配置),以 user 角色、source.kind = "qq-table-memory" 的上下文追加给模型,而不是改 system prompt,也不会被 transcript 当成群友发言。

回忆计数与轮次
消息真正进入 prompt 时对应行 recall_count + 1;按「对方发起 → 我回应」规则维护 turn_no,连续同方向多条仍算同一轮。清理时的「交流次数」只统计该轮里对方发的条数。

定期清理
默认每 6 小时检查(启动约 10 秒后也会检查);仅当单会话超过默认 5000 条等条件满足时,按年龄、被回忆次数、轮次交流次数加权优先级删除旧消息,并保留最近若干轮与足够新的消息。

导出与回填
提供 list、search 及 Markdown / CSV / JSON 导出;可选脚本从 DSH 会话日志回填更早的 qq_get_* 快照(桥接本身只保留有限条数)。

前置条件

  1. 已安装并运行 qq-bridge。
  2. qq-bridge 处于 reserved2 模式,且 state/social-v2.json 在持续更新。
  3. DeepSeek Harness 0.2.x 与 Node.js >= 24。

安装与启用

官方 README 的安装方式是本地 clone 后通过 profile 的 link: 依赖挂进 bundle,而不是凭插件名拼接 dsh plugin add。下面步骤与仓库说明一致。

1. 放到本机

git clone https://github.com/Gentaine/dsh-qq-memory.git `
  "$HOME\.dsh\plugins\dsh-qq-memory"

也可放在任意目录,后续把路径换成实际绝对路径。

2. 注册到 DSH profile

编辑 ~/.dsh/profiles/<profile>/package.json:

{
  "dependencies": {
    "dsh-qq-memory": "link:<绝对路径>/dsh-qq-memory"
  },
  "dsh": {
    "profile": {
      "bundles": [
        "@deepseek-ai/dsh-base",
        "@deepseek-ai/dsh-web-app",
        "dsh-qq-memory"
      ]
    }
  }
}

在 profile 的 node_modules 里建立链接:

# Windows
New-Item -ItemType Junction `
  -Path "$HOME\.dsh\profiles\<profile>\node_modules\dsh-qq-memory" `
  -Target "<绝对路径>\dsh-qq-memory"

# Linux / macOS
ln -s "<绝对路径>/dsh-qq-memory" "$HOME\.dsh\profiles/<profile>/node_modules/dsh-qq-memory"

若 profile 存在 pnpm-lock.yaml,需让 lock 指向同一本地路径,否则 DSH 启动可能按旧 lock 重装;无 lock 时改完重启即可。

3. 配置路径

插件 cordis.patch.yml 默认:

  • bridgeStateDir:./qq-bridge/state(相对 DSH 进程 cwd)
  • databasePath:~/.dsh/qq-memory/conversations.sqlite3

qq-bridge 不在工作区 qq-bridge/ 下时,在 dsh-qq-memory/cordis.patch.yml 中取消注释并改为绝对路径;Windows 路径建议用单引号包裹。

4. 重启并确认

插件在 bundle 装配阶段加载,修改后必须重启 DSH。确认表是否就绪:

node dsh-qq-memory/scripts/qq-memory.mjs stats `
  --db "$HOME/.dsh/qq-memory/conversations.sqlite3"

输出中有消息数、会话数、总回忆次数、最大轮次即表示 SQLite 已正常工作。

典型用法

命令行查看与导出

在插件目录或指定脚本路径下(以下 DB 与 README 一致):

DB="$HOME/.dsh/qq-memory/conversations.sqlite3"
node scripts/qq-memory.mjs stats --db "$DB"
node scripts/qq-memory.mjs list --db "$DB" --limit 30
node scripts/qq-memory.mjs search --db "$DB" --query '训练集'
node scripts/qq-memory.mjs export --db "$DB" --format markdown --out ./exports/对话表.md

list 与导出结果包含 turn_no、recall_count。CSV 写文件默认带 UTF-8 BOM;管道输出需纯净 UTF-8 时可加 --no-bom。

预览或执行清理

$db = "$HOME\.dsh\qq-memory/conversations.sqlite3"
node scripts/qq-memory.mjs cleanup --db $db `
  --dry-run --max 100 --min-age-days 0 --keep-turns 0
node scripts/qq-memory.mjs cleanup --db $db

默认规则下,只有会话超过 5000 条、消息早于 14 天且不在最近 30 轮等条件同时满足时,才会进入删除候选。

回填更早日志

node scripts/backfill-session-logs.mjs --db $db --dry-run
node scripts/backfill-session-logs.mjs --db $db

脚本只读 ~/.dsh/sessions 与桥接 sessions.json,不改桥接状态;重复执行不会重复翻倍。

常用配置项

主要项在 cordis.patch.yml 的 config 块,改后需重启 DSH。例如:minAgeHours(默认 3,只把更早消息当「旧记忆」)、maxInjectedMessages(默认 8)、maxInjectedChars(默认 1800)、queryLookbackMinutes(默认 120)、minScore(默认 2.2),以及 cleanup.* 下清理间隔、保留轮数、单会话上限等。完整表格见仓库 README。

适用场景与注意

适合谁
已在 DSH 0.2.x 上跑 qq-bridge、希望 QQ 侧对话在本地可检索、并在多轮对话里自动带上相关旧片段,同时用回忆次数和轮次控制表体积的开发者。

运行与信任边界
插件以当前 DSH 进程权限读取桥接状态、写入 SQLite,并在每轮向模型注入上下文。安装前应自行审阅源码与 MIT 许可证;聊天内容明文落盘,数据库目录应按隐私数据处理。清理为硬删除,需要留档请定期备份 conversations.sqlite3。

已知限制(仓库原文)
历史来源受桥接 recentMessages 与可选回填范围限制;检索为纯词法,无向量/同义词语义;不生成人物摘要;默认不跨群/跨私聊共享记忆。

DeepSeek Harness 生态强调「一切皆插件」;skillhub.cn 为社区目录,与 DeepSeek / 幻方无官方从属关系。

结尾

经过上面的步骤,dsh-qq-memory 把 qq-bridge 的对话流变成带回忆计数与轮次元数据的 SQLite 表,并在不增工具的前提下为模型提供 qq-table-memory 上下文。若要查看说明与 issue,见 GitHub 仓库 与 目录页。

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

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

小夜