dsh-work-memory:对话级工作记忆与 seq 原文回放

前言

在 DeepSeek Harness(DSH)里做长会话时,上下文压缩会把早期轮次收成摘要。摘要能省 token,但「当时问了什么、怎么做的、改动了哪些文件」往往不再可读。再做同类任务时,容易重复探索,也难以接续上次进度。

常见补救是手写笔记或让模型总结历史——前者要人工维护,后者仍是二次概括,不是原对话。dsh-work-memory(维护者 metallica360qq-web)走另一条路:把每段工作记成指针(会话 ID、startSeq/endSeq、标题、提问、产物路径),正文不落库,需要时按序号从 DSH 仅追加的会话日志里原样回放。分类属于「记忆」,当前 GitHub 星标为 0,版本 0.1.0,MIT 许可证。

这是什么

一句话:对话级工作记忆索引——记住你提过的需求与产出,命中后回放被压缩掉的那段原文。

插件挂在 DSH 上,向模型暴露三个工具(memory_search、memory_open、memory_write),并在每步按当前用户消息做轻量检索注入(不调用模型)。离线批处理(bootstrap、归块、主题归纳等)可选用 OpenAI 兼容接口;运行时检索与注入为纯本地逻辑。

解决什么问题

长会话压缩后,早期工作只剩摘要。本插件用钩子描述一段工作,例如:

{ "id": "...", "session": "...", "startSeq": 1204, "endSeq": 1288, "ask": "...", "title": "...", "artifacts": [], "ts": "..." }

DSH 会话日志在磁盘上完整保留,压缩只影响界面可见性。按 (session, seq 区间) 即可取回用户提问、助手回复与写过的文件路径。

核心功能

三个模型工具

工具 作用
memory_search(query, limit?, includeSuperseded?) 检索标题、需求、产物路径、时间;不返回正文
memory_open(id, query?, maxChars?) 按 seq 回放原文
memory_write(title, ask?, artifacts?, supersedes?) 手动补记,或标记取代旧记录

自动捕获

监听 session/event:累积本轮用户消息与 write/edit 路径,turn/end 时写入 kind: "auto" 的钩子,并按关键词判主题归属。仅记录有实义轮次(提问总长 ≥ 20 字,或工作区内有产物);%TEMP%、node_modules、.tmp 等路径过滤。

上下文注入

在 systemPrompt.context 中按当前用户消息检索:

  • 能判主题:主题内检索,命中 ≥ 0.45 时最多注入 3 行标题。
  • 不能判主题:全局检索,命中 ≥ 0.6 才注入。
  • 短句(少于 6 字且无主题):不注入。
  • 最高分 ≥ 0.6:额外附 ≤ 300 字原文摘录。

注入总量 ≤ 400 字符;未命中时不追加。

两层颗粒度

level 来源 用途
module 离线 rebuild.js 等模型归块 主索引,检索权重 × 1.15
turn turn/end 自动捕获 细节流水

长会话可能产生大量 turn 钩子;模块级索引需批处理生成,两者并存。可用 cli/autopilot.js 对新会话定时归块。

主题层(可选)

topics.json 定义工程主题与关键词,检索先判主题再搜,减少跨项目噪声。未配置时退化为全局检索。可用 derive-topics.js、tag-topics.js、fix-topics.js 从账本归纳并修正标签。

跨 agent 导入

支持将 zcode、hermes、workbuddy 等历史导入同一账本,用 memory_open 统一回指;DSH 本会话直接读 <DSH_HOME>/sessions。对应 ingest / merge CLI 见 README。

Web 面板

安装后重启 DSH,浏览器访问 http://127.0.0.1:8282/work-memory/:搜索、展开原文、改标题、归档。

记忆治理

时间衰减只影响排序不删条目;supersedes 标记取代关系;dedupe.js 仅报告相似项不自动合并。

安装与启用

DSH 生态采用「一切皆插件」;社区目录 SkillHub 为独立站点,与 DeepSeek / 幻方无官方从属关系。目录页给出的安装指引为:请安装 DSH 插件 metallica360qq-web/dsh-work-memory(完整步骤以目录页与仓库 README 为准)。

依赖与运行环境(来自 package.json):

  • peerDependencies:@deepseek-ai/cordis >=4.0.1 <5
  • engines.node:^22.19.0 || >=24.0.0

插件在当前 DSH 进程权限下运行,可访问会话目录与账本路径。安装前建议阅读源码与 MIT 许可证,确认与本机数据路径、模型 key 使用方式一致。

典型用法

首次 bootstrap(历史入账)

装好后建议先跑 bootstrap,把本机历史对话建成账本:

node cli/bootstrap.js --dry-run          # 预演:看会做什么、扫描到多少会话
node cli/bootstrap.js --all              # 全跑(需要模型 key)
node cli/bootstrap.js --all --skip-llm   # 只跑不需要模型的步骤
node cli/bootstrap.js --all --max-sessions 50   # 限制归块数量,控制成本

阶段包括 scan、ingest、rebuild、topics、alts、doctor;中间文件在 <DSH_HOME>/work-memory/.bootstrap/,支持断点续跑。

不依赖运行时的 CLI 查询

node cli/query.js stats
node cli/query.js search "关键词"
node cli/query.js open <hookId>
node cli/query.js open <hookId> "过滤词"

数据位置

<DSH_HOME>/work-memory/hooks.jsonl      # 账本(append-only)
<DSH_HOME>/work-memory/topics.json      # 主题定义(可选)

写入通过 .lock 互斥,写前备份并轮转(最近 7 天、最多 10 份)。

会话中的工具调用

模型侧典型流程:用 memory_search 定位钩子 → 需要过程细节时 memory_open(id) 拉取 seq 区间原文 → 重要结论可 memory_write 补记或 supersedes 更新关系。

配置(环境变量,均可选)

变量 作用 默认
DSH_WM_LLM_BASE_URL 离线批处理模型端点 智谱 coding plan
DSH_WM_LLM_MODEL 模型名 glm-5.3-flash
DSH_WM_LLM_API_KEY 模型 key 读 ~/.dsh/.credentials.yaml 的 ZAI_CODING_CN_API_KEY
DSH_WM_LLM_THINKING 是否开思考 off
DSH_WM_ZCODE_DB / _HERMES_DB / _WORKBUDDY_DB 各源数据库路径 各自默认
DSH_WORK_MEMORY_DIR 账本目录 <DSH_HOME>/work-memory
DSH_WM_SEED 首次启动复制为账本的种子文件 无

适用场景与注意

适合谁: 长期在 DSH 上做同一仓库或多项目切换、依赖上下文压缩、又需要「找回当时原话与产物路径」的开发者。

注意:

  1. 运行时检索与注入不总结对话、不调模型;bootstrap、rebuild、主题归纳等离线步骤会消耗模型 token,可用 --skip-llm、--max-sessions 控制成本。
  2. 账本与回放依赖本机会话日志;刚拉取仓库未 bootstrap 时,多数 CLI 自测会失败,需先建账本。
  3. 评估脚本自带的 Hit@k 数字来自作者自建评估集与同义改写实验,说明召回优化方向有效,不应等同于对所有真人提问的绝对准确率。
  4. 插件版本 0.1.0,API 与面板路由以当前 README 为准;升级后可跑 node cli/doctor.js 做全链路体检。

结尾

dsh-work-memory 用「指针 + seq 回放」代替二次摘要,让压缩后的长会话仍可检索、可还原。目录页:SkillHub - dsh-work-memory;源码与完整 CLI 说明:GitHub - metallica360qq-web/dsh-work-memory。

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

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

小夜