前言¶
在构建基于 DSH 的智能体时,对话上下文会随会话结束而丢失。要让模型在不同会话中保持连续记忆,需要一套可持久化、可编辑、可检索的方案。dsh-memory 是一个专为 DeepSeek Harness 设计的跨会话持久记忆插件,基于 Grok Build 的记忆模型实现,提供全局与工作区两个作用域、结构化笔记、会话日志捕获与检索能力。
插件定位与维护者¶
dsh-memory 是一个 Host-only 插件包,依赖仅限于 Node.js 内置模块。它将持久化记忆存储为 Markdown 文件,支持全局共享与工作区隔离,通过工具与命令接口提供检索、写入与遗忘能力。插件由 douglarek 维护,目前分类为「记忆」。
核心能力¶
作用域与存储结构¶
- 全局作用域:存储在
$DSH_HOME/memory/global/,每个项目共享 - 工作区作用域:存储在
$DSH_HOME/memory/workspaces/<slug>-<hash8>/,每个仓库独立 - 目录结构:
topics/<topic>.md:人工整理的笔记,按主题分文件observations/_inbox/*.md:待处理或临时观察笔记sessions/:会话日志,按日期与会话 ID 分文件MEMORY.md:由系统生成的索引,在写入后重建
会话捕获与索引注入¶
- 每完成一轮对话,记录会话日志(若满足最小字符数等条件)
- 第一轮对话时注入一份紧凑的记忆索引,作为持久化的用户角色消息
- 在
compaction/end后刷新索引,保证索引与最新写入同步 - 检索时基于 BM25 全文检索,支持时间衰减、来源权重与可选 MMR
模型工具与用户命令¶
- 模型工具:
memory_search、memory_get、memory_list、memory_remember、memory_forget - 用户命令:
/memory、/remember、/forget、/dream、/flush - 提示中包含
<memory>系统提示段,说明工具使用时机与方法
检索与中文支持¶
- 使用 BM25 全文检索,支持时间衰减与来源权重
- 可选 MMR 进行多样性与相关性的平衡
- 中文检索使用 CJK 单字与双字分词,无需额外分词器即可匹配
安装与启用¶
通过 plugin_manager(推荐)¶
plugin_manager { action: "install_bundle", target: "github:douglarek/dsh-memory" }
安装完成后,使用 memory_list 验证。若工具不可用,重启 DSH 或开启新会话。
通过 CLI(非 desktop profile)¶
dsh plugin --profile "$DSH_PROFILE" add github:douglarek/dsh-memory
若 DSH_PROFILE 未设置,请先询问用户获取配置文件名称。
本地检出¶
plugin_manager { action: "install_bundle", target: "/absolute/path/to/dsh-memory" }
注意:不要手动修改 profile 的 package.json 或 cordis.patch.yml,也不要在 profile 目录中运行 pnpm。
配置示例¶
在 profile 的 patch 中添加或修改插件行:
- id: dsh-memory
name: 'dsh-memory'
config:
enabled: true
memoryDir: '' # 默认 $DSH_HOME/memory
scopeGlobal: true
scopeWorkspace: true
toolsEnabled: true
promptEnabled: true
commandsEnabled: true
captureEnabled: true
injectEnabled: true
配置项说明¶
核心配置¶
enabled:总开关,设为 false 时不注册任何功能memoryDir:记忆根目录,空值则使用$DSH_HOME/memory,~会展开scopeGlobal:启用全局作用域scopeWorkspace:启用工作区作用域toolsEnabled:注册五个记忆工具promptEnabled:添加<memory>系统提示段commandsEnabled:注册用户命令(需命令服务挂载)promptInstructions:替换默认<memory>提示段
捕获配置¶
captureEnabled:是否将完成的对话轮次追加到会话日志captureSubagents:是否捕获子代理会话captureMinTurnChars:最小轮次字符数阈值captureMaxUserChars、captureMaxAssistantChars:单轮用户/助手文本上限captureMaxEntryChars:单条会话日志上限captureMaxFileBytes:达到上限后轮转日志文件
注入配置¶
injectEnabled:是否注入记忆索引injectSubagents:是否注入到子代理会话injectAlways:当记忆为空时是否注入提示injectAfterCompaction:在compaction/end后刷新索引injectMaxBytes、injectMaxTopics、injectMaxObservations、injectMaxSessions:索引大小与条目上限
检索与索引配置¶
searchMaxResults:默认结果数searchMinScore:默认分数阈值searchHalfLifeDays:时间衰减半衰期(0 禁用)searchMmrEnabled、searchMmrLambda:是否启用 MMR 及平衡系数searchMaxFiles、searchMaxFileBytes、searchMaxChunks:文件扫描与索引上限searchStalenessDays:对超过指定天数的会话结果添加陈旧提示searchIncludeIndex:是否索引生成的MEMORY.mdsearchSourceWeights:各来源分数乘数chunkMaxChars、chunkOverlapChars:索引分块大小与重叠量indexMaxBytes、indexMaxEntries:生成索引大小与条目上限skipTemporaryWorkspaces:是否对临时目录工作区禁用记忆
典型用法¶
- 安装插件并启用默认配置
- 在会话中使用
/memory命令或工具memory_remember记录关键事实 - 使用
memory_search检索历史笔记 - 通过 Markdown 文件手动编辑
topics/与observations/_inbox/中的内容 - 会话结束后,日志自动写入
sessions/目录
适用场景与注意¶
- 适合需要跨会话保持上下文连续性的 DSH 工作流,如长期项目助手、知识库整理与代码审查场景
- 插件以当前 DSH 进程权限运行,安装前建议检查源码与许可证
- 不包含 UI 面板,记忆浏览与编辑需通过工具与命令或直接修改文件完成
小结¶
dsh-memory 为 DeepSeek Harness 提供了一套可持久化、可编辑、可检索的记忆方案。通过全局与工作区作用域、会话日志捕获、检索索引注入以及工具与命令接口,让模型在多次会话中保持一致性与可追溯性。插件目录:https://www.skillhub.cn/plugins/douglarek/dsh-memory | 代码仓库:https://github.com/douglarek/dsh-memory