dsh-context-graph:DSH 的会话记忆插件

前言

在 DSH(DeepSeek Harness)里做开发的人常会遇到一个成本与质量两难的问题:每发一条消息,当前这次对话的完整上下文都要重发一遍;新开一个会话,模型对上一个会话做过的决定一无所知。于是你要么重新解释一遍背景,要么把上下文整段贴过去,两种情况下都要为重复的输入 token 买单。

下面介绍的 william20100221/dsh-context-graph 就是这个方向上的一个插件。它把会话里做过的决定索引成一张小话题图,之后的会话只追加几行指向性内容,模型确认需要细节时再按 id 取回原文。

这是什么

dsh-context-graph 是维护者 William20100221 提交到社区目录的插件,分类为「记忆」,在 GitHub 上目前为 1 stars。它面向 DSH 插件生态:DSH 的理念是「一切皆插件」,会话、记忆、工具都以插件形式挂载在当前进程上,这个插件属于其中给聊天提供长期记忆的一类。

它要解决的问题是上面说的重复上下文:不是靠摘要压缩,而是把「已经决定过的事」以话题为单位存下来,其他会话只看到几行提示,需要原文再取。

核心功能

插件默认开启记忆。它会在每个会话里,每 4 个人类轮次索引一次,把会话里已定事项写进一张由话题组成的图,话题与原始消息一起保存。索引落在工作区的 .context-graph/chats/<chat>/ 目录,内含该会话的图、逐字原文和一个记录标题、日期和标志位的 meta.json。

对同工作区的其他会话,插件最多在消息后追加几行指向内容,例如:

[context-graph] Related past context from yesterday (by chat). Call recall(id) for the verbatim source.
- c3n12 builder timeout: builderMaxTokens raised to 8192 after the 524s (2026-11-01)
- c3n4 publish flow: npm version patch, npm publish (2FA), git push --follow-tags (2026-11-01)

这几行只是指向。当摘要不够精确时,模型调用 recall("c3n12") 取回逐字原文,而不是把整段历史预先塞进上下文。插件的设计原则是:每条消息只加几行,按需取原文,省输入 token 但不牺牲质量。

记忆开关分两档:在 Plugins 页面关掉插件,所有会话不再索引也不再注入任何内容;只想停某个会话,在该会话里执行 /context-graph off,目录保留,之后用 on 即可从断点继续。

安装与启用

安装有两种官方途径,都写在项目 README 里。

图形界面方式:在 Plugins 页面选择 Add plugin,用官方 npm registry,类型填 dsh-context-graph,安装后完全重启应用(新加的 slash 命令需要重启才能用)。

命令行方式,桌面应用使用 desktop profile:

dsh plugin --profile desktop add dsh-context-graph

装完正常聊天即可,插件会按每 4 轮的节律自行索引。想立刻索引一次,输入 /context-graph,从菜单选中后接 build。

命令集

所有命令都是 /context-graph <word>:先输入 /context-graph 从菜单选中,再输入关键字。结果出现在 DSH 自身的命令卡片里,首行摘要可展开为详情,不带关键字时等同 stats。

常用命令:

  1. on — 恢复当前会话的记忆,先索引一次,之后每 4 个人类轮次索引一次。每索引一次需要一次小型辅助模型调用,默认使用该会话自己的 model route。
  2. off — 只停当前会话的索引与注入,图目录仍留在磁盘上。
  3. share / unshare — 会话默认共享给同工作区的其他会话,unshare 转为私有,share 撤销。共享不复制也不合并,图仍在各自目录,话题 id 带会话编号(如 c3n12),命中可回溯来源。
  4. stats — 默认命令。首行给出记忆开关、当前会话话题数、共享状态、可见的共享会话数、等待索引的轮次;正文给出版本、记忆目录,以及自应用启动以来的构建次数与构建消耗的 token、注入块数与体积、recall 次数,并把主会话的输入拆为 uncached、cache-read、cache-write 三部分并给出缓存命中率。
  5. build — 立即索引当前会话,不等下一个 4 轮节点。需要记忆处于开启状态。若模型返回不可读,原始输出会保存在该会话目录的 last-builder-output.txt,卡片会说明原因。
  6. map — 列出工作区内所有已索引会话,按新到旧,含会话 id、起始日期、标题、话题数和标志(this chat、memory on、shared/private),并附每个会话关联度最高的话题及其 id。这是图的文本形式,可视化页面尚在计划中。
  7. find <words> — 用与插件运行时相同的匹配器搜索共享会话,可以直接看到模型将看到的内容。

匹配与回溯机制

匹配是词法层面的,不做语义改写。消息会被拆成单词、标识符(clear_conversation 同时产出 clear 和 conversation)以及中文字符二元组。话题标签与别名权重加倍,gist 权重单倍,关联度高的话题有小幅加成;只有标签或别名命中时该话题才会被计入。最多返回 5 条命中;当某条命中明显领先且来源较短时,会直接附带逐字原文,省掉一次 recall 往返。被更新的决定会通过 supersedes 边指向替代项,命中旧决定时会显示新决定。

时间是第一层过滤。消息里出现时间词时,先在该时间段内搜索,无果再扩大范围:

输入 优先搜索范围
yesterday、昨天 昨日活跃的会话
3 days ago、3天前 当天
last week、上周 / this week、本周 周一到周一
last month、上个月 该自然月
2026-11-01、11月1日 当天

若时间片和全局都没有命中,插件会退而列出该时段的会话,保证「昨天我们做了什么」这类问题仍有可用回答。

回溯 id 形如 c3n12,即会话 3 的主题 12,返回该话题对应的逐字原文。

一个实际对照:先在一个会话里定下流程,再到同工作区新开会话提问,插件会先用几行提示命中话题,模型判断摘要不够精确时再 recall 取原文。

适用场景与注意

适合常在多会话间切换、需要让新会话快速接上旧结论的 DSH 使用者,尤其是工作区里同时开着多个并行任务、又不希望每次带全量历史的人。stats 里的缓存命中率可作为判断收益的参考:命中率高,说明记忆在省输入;反之则要检查话题数与共享范围是否合理。

需要留意几点。插件以当前 DSH 进程的权限运行,安装前应查看源码与许可证(该项目为 MIT),确认 .context-graph/ 目录的读写范围符合预期。索引依赖辅助模型调用,会消耗少量 token,默认每 4 轮一次。共享默认开启,涉及敏感结论的会话建议执行 unshare 转为私有。

结语

dsh-context-graph 的价值在于把「要不要带历史」拆成两步:默认只给几行方向,需要时按 id 取原文。它减轻了重复上下文带来的输入开销,同时不靠摘要牺牲完整性。目录页见 https://www.skillhub.cn/plugins/William20100221/dsh-context-graph ,源码见 https://github.com/William20100221/dsh-context-graph 。

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

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

小夜