dsh-memory-retrieval:在 DSH 里用本地关键词召回「差点忘掉的」上下文

前言

在 DSH 里和 Agent 连续协作时,对话会不断变长、会话也会拆成很多个。模型每轮只能看到当前窗口里的内容,三天前查过的结论、上周踩过的坑、或者角色设定里从没在当轮对话里出现过的私事,往往不会再被主动带上。常见做法是手写 memory.jsonl、靠 compaction 摘要,或让模型每轮自己去「记笔记」——这些要么要人维护,要么摘要会丢细节,要么成本高、噪声大。

dsh-memory-retrieval(维护者 TASHKENT-SN,分类:记忆)做的是另一件事:按当前用户消息做本地关键词匹配,把可能相关的旧片段当作「线索」附在 system prompt 后面,由模型决定用不用、要不要追问出处。全量在本地建索引,但一次只注入千余字量级的候选块;不调 embedding、不调外部 API,默认零额外依赖。社区目录页:skillhub.cn 插件页。

这是什么

一句话定位:在 DeepSeek Harness 进程内,对笔记、会话集合、本会话较早历史、memory.jsonl、以及可选的角色全量记忆卡做字面检索,把 top-k 片段注入提示词,并可选提供 memory_recall / memory_note 工具。

当前资料中的包版本为 0.9.71(package.json),许可证 MIT;要求 engines.dsh 为 >=0.2.2-rc.1 <0.3.0,@deepseek-ai/cordis 与 @deepseek-ai/dsh-tools 为对等依赖。GitHub 仓库星标在目录线索中为 0,以页面为准。

设计上有三条原则(改行为前值得对齐):召回优先于精确(假阳性便宜、假阴性贵);全量索引 ≠ 全量注入;默认零依赖(内置近义词组是加分项,不是运行前提)。

五种召回来源与主路径

下面五种来源共用同一条注入通道:按当前消息关键词匹配 → 取 top-k → 附在 system prompt 后 → 模型判断是否采用。

来源 检索什么 默认
笔记 模型通过 memory_note 写下的结论(带出处) 开
会话集合 GUI 拖成一组的多个会话,彼此可检索 开(配置了集合即有)
自己的历史 本会话更早内容(约 15 分钟前,避免与当前上下文重复) 开
全量记忆卡 角色独立的 memory-card 文件(非会话日志部分) 需配置路径
memory.jsonl 手写记忆条目 有文件才用

注入块会标明类型与出处,例如「集合记忆」「自己的历史」「笔记 · 我自己记下的」。模型拿到的是线索,不是被断言的「事实」;块内也写明不相关可忽略。

主路径是被动联想(开口时按消息匹配注入)。可选工具 memory_recall 供模型主动查旧账,支持 scope=collections | self | card | notes | all;README 强调主动检索是补充,不是主路径。纯本地运行;默认单次注入候选约 1400 字上限(集合相关配置里 collectionMaxChars: 1400 等与之一致)。

笔记层:结论写入与出处

从 0.9.54 起,笔记是「已经判断过的结论」,在注入优先级上排在其他来源之前(order: 0)。插件不在后台偷偷抽记忆;模型理解上下文后可调用 memory_note 写入 ~/.dsh/dsh-memory-retrieval/notes.jsonl(append-only)。重复内容按哈希去重;作废用 retire 追加记录,不物理删行。

典型调用形式(摘自 README):

memory_note(text="这个项目用 pnpm 不用 npm", kind="decision")
memory_note(text="用户偏好:先给结论,再给理由", kind="preference")
memory_note(list=true)
memory_note(origin="a3f9")
memory_note(retire="a3f9")
memory_recall(query="pnpm 相关", scope="notes")

可见范围跟着来源会话走:本会话 + 同集合内会话;集合外看不见。无相关笔记时仍可注入最近 1–2 条 preference/decision(notesAlwaysInject 等配置,默认 true)。

相关配置项包括:notesEnabled(默认 true)、notesTopK(3)、notesMaxChars(600)、notesAlwaysInject(true)。

会话集合与记忆卡

会话集合适合不想手维护 memory.jsonl 的场景:在设置页把多个会话拖进同一集合,集合内每个会话的完整正文进索引(user/assistant 文本块与 compaction 摘要等),检索时只注入最相关片段。每个集合可独立开关;设置页提供「试检索」与真实注入同一套逻辑。

全量记忆卡读角色插件目录下的 memory-card-full.jsonl(或 0.9.66 起支持的 .json / .jsonl)。memoryCardSessionIds 是访问白名单:只有名单内会话能注入或通过 memory_recall(scope=card) 读取,没有「全局可读」。若 memoryCardPath 指到被裁剪的 memory-card.json 而非全量 .jsonl,表现为「记忆总差一点」——README 建议用 wc -l 核对条数,或直接让角色汇报读到的条数。

集合索引的是对话日志里出现过的内容;记忆卡里从未出现在对话中的条目,加入集合不会让其他会话自动读到卡。

匹配方式

检索为关键词 + 可选近义词,不做向量语义(未改词表时,「网速慢」与「网络卡顿」不会自动等同)。minHits(默认 2)要求查询至少命中多个词以压泛词假阳性;极短查询会放宽到 1。近义词表可放 ~/.dsh/dsh-memory-retrieval/synonyms.json 或由 synonymPath 指定;否则用内置 55 组。另有 synonymWeight(默认 0.7)等参数,详见仓库配置示例。

配置项 recallMidTask:false 只在开口时联想一次;true 任务中途也继续注入新片段(更拟人,也更容易跑题)。

安装与启用

官方 README 给出的安装方式是本地路径加入 profile,并写入 bundles,而非凭名称拼接 dsh plugin add github:...:

# 1) 把本目录加入 profile 依赖(示例:web profile)
dsh plugin --profile web add <你的本地路径>\dsh-memory-retrieval

# 2) 在 profile 的 package.json 里把包加入 bundles
#    "dsh": { "profile": { "bundles": [ ..., "dsh-memory-retrieval" ] } }

# 3) 重启 DSH

也可以把仓库中的 cordis.patch.yml 合并进 profile 的 cordis.patch.yml。

若使用作者发布的插件市场索引(仓库 market/index.json,经 GitHub Pages 发布):

  1. 插件 → 实验性插件 → 打开「自定义插件市场」
  2. 发现 → 添加索引源 → 粘贴 https://tashkent-sn.github.io/dsh-memory-retrieval/market/index.json
  3. 在卡片上安装(索引锁定 commit,与 engines.dsh 一致)

默认手写记忆文件路径:

~/.dsh/dsh-memory-retrieval/memory.jsonl

不存在会自动创建空文件;可复制仓库内 memory.example.jsonl 试用。

典型配置片段

在 profile 的 cordis.patch.yml 中,README 给出如下结构(节选,完整字段以仓库为准):

- insert:
    - id: dsh-memory-retrieval
      name: 'dsh-memory-retrieval'
      config:
        enabled: true
        label: 'Memory'
        topK: 5
        maxChars: 800
        minScore: 1
        perRecordChars: 180
        askWhenUnsure: true
        includeSessionPatterns: []
        excludeSessionPatterns: []
        collectionRetrieval: true
        collectionTopK: 5
        collectionMaxChars: 1400
        collections: []
        recallMidTask: false

memoryPath 可显式指定;includeSessionPatterns / excludeSessionPatterns 控制会话级启用范围;workspaceGlobalRetrieval、sessionOverrides 等可由 GUI 写入。

适用场景与注意

适合:长期在 DSH Web 或多会话里做项目协作、需要「被当前一句话勾起」旧结论或跨会话上下文,且希望离线、可控 token 的开发者。

务必注意:

  • 插件随 当前 DSH 进程权限运行,安装前请阅读源码与 MIT 许可证,自行评估会话日志与记忆路径的隐私范围。
  • 匹配偏宽松,有意换回复召率;注入块已提示模型可忽略不相关项。
  • 角色私人记忆卡通过白名单隔离;不要把敏感路径配到不应访问的会话。
  • DSH 生态是「一切皆插件」;SkillHub 目录 为社区站点,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-memory-retrieval 把「全量本地索引」和「每轮少量线索注入」拆开,用关键词召回让 Agent 有机会想起笔记、集合会话、较早轮次与记忆卡里的内容,并用 memory_note 把结论沉淀成可再召回的一层。若要核对行为与版本,以仓库 README 与 cordis.patch.yml 为准。

  • 目录页:https://www.skillhub.cn/plugins/TASHKENT-SN/dsh-memory-retrieval
  • GitHub:https://github.com/TASHKENT-SN/dsh-memory-retrieval
羽毛球分组比赛记分
小程序二维码

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

小夜