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 倉庫 與 目錄頁。

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

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

小夜