前言¶
DeepSeek Harness(DSH)会在对话占用上下文达到阈值时压缩旧对话,被压缩的原文会被丢弃,无法再查回。如果只是想保留关键片段,可以手动摘抄,但完整会话的上下文一旦被压缩就再也找不回来。
记忆回廊插件在 DSH 压缩之前,先把会话按轮次归档到当前工作区的 memory-palace/ 目录,按类别分成多个文件,供后续会话按需检索。它不会改写或截断原文,只负责把一轮轮对话落盘,成为工作区本地的一份长期记忆。
核心功能¶
把会话原文按「一轮对话」为单位,分类归档到当前工作区的 memory-palace/ 目录。目的是在 DSH 自动压缩之前,先把较早的完整原文落到磁盘,压缩后还能查回原话。
归档前会检查两个条件:
- 压力门:上下文占用 ≥ triggerPressure(默认 60%)× 窗口
- 批量门:可归档轮数 ≥ minBatchTurns(默认 10),或者可归档文本量 ≥ 无需归档量 × batchByteFraction(默认 50%)
只有两个条件都满足时,插件才会注入归档提示。
归档时,模型逐轮决定每轮属于哪个类别,用 segments 提交:[{category, fromTurn, toTurn}, …]。同一类别可以拆成多段,最后合并成一个文件;每个 turn 只能归一类,区间不许重叠。
归档后,插件会按年月组织文件,每个类别在当月的目录下生成一个文件(超 maxFileBytes 才分卷)。同一类别的所有轮次进同目录下的一个文件,不同类别 = 不同文件。
安装与启用¶
在 DSH 插件目录下执行:
dsh plugin add github:dafantong01/dsh-memory-palace
安装后,在会话页的「记忆回廊」页签里打开开关。页签会显示当前会话的归档状态和配置项,包括开关、记忆命名、触发阈值、检查频率、单文件上限等。
配置项¶
插件在全局和会话级都支持配置,会话配置优先级高于全局默认。
| 项 | 默认 | 说明 |
|---|---|---|
enabled |
true | 全局总闸 |
triggerPressure |
0.6 | 压力门:历史估算 ÷ 窗口 |
retainFraction |
0.12 | 无需归档比例,占窗口比例(0.02–0.5,建议 < 16%) |
batchByteFraction |
0.5 | 批量门兜底:可归档量达到无需归档量的该比例即放行 |
minBatchTurns |
10 | 批量门:可归档轮数 |
checkEveryTurns |
5 | 每几轮检查一次 |
maxFileBytes |
5000000 | 单文件上限(十进制 MB,5,000,000 = 5.0 MB),超出按轮分卷 |
selfNameSlug |
assistant | 文件名前缀(与「记忆命名」无关) |
rootDirName |
memory-palace | 根目录名 |
includeReasoning |
true | 归档是否收录思考原文 |
compactAfterArchive |
false | 归档后是否触发压缩(默认关) |
enableSteer |
true | 是否注入归档提醒 |
injectNotice |
true | 是否注入提示 |
recallStrength |
low | 回忆强度:off / low / medium / high / forced |
searchTurnLimit |
12 | palace_search 按轮聚合时默认返回多少轮(1–30 整数) |
工具¶
插件提供了几个工具,用于归档、查看和检索记忆。
palace_archive¶
归档轮次。未命名会话会拒绝。用 segments 逐段给类别:[{category, fromTurn, toTurn}, …];并用 summaries=[{category, text}, …] 给每个类别写一段只概述该类别本次轮次的话(逐段追加到当月 _summary.md)。单类别时可用 summary 代替。可传 selfName 作文件名前缀。
palace_turns¶
列出轮次清单:turn 号 + 发言者 + 开头 70 字,用于归档前确认每轮内容。turn 是日志事件序号(含系统指令/插件 steer/纯工具轮),不要用「第几条消息」换算。
palace_summary¶
读月度摘要。不指定 month 时列出最近几个月(摘要末尾预览 + 归档文件数);month=YYYY-MM 返回该月摘要全文;category 只看该月某类段落;append + fromTurn/toTurn 可给还没归档的近况补写一段摘要。
palace_search¶
检索归档。默认只查本会话;namespace 查别的会话、all:true 扫全部命名空间(结果标来源)、category 只查某类。keyword 支持空格分隔的多关键词(AND,引号包短语)。默认按轮聚合(每轮一条代表命中 + 该轮命中数),limitTurns 控制轮数(默认取 searchTurnLimit=12);groupByTurn=false 回原始命中行(旧 limit 语义)。片段约 220 字符,总输出上限 8K,文件读失败会跳过并注明。只搜归档正文,不搜 _summary.md(摘要里的概述性说法要用 palace_summary 读);但原文 0 命中时会自动回查摘要并标注「摘要不是轮次」,可用 includeSummary:true 强制追加。
palace_read¶
读归档。fromTurn/toTurn 返完整原文;path 可省略(按轮次自动找文件),也接受 search 的「文件夹/…」路径;可传 namespace。末尾附一行回链(提取 turn 引用/文件名/工具名,自动提取仅供参考)。
palace_config¶
查看/修改本会话配置(get 会同时返回 effective / 工作区默认 / 本会话配置)。
检索四步法¶
为节省 token,插件提供了四步检索法:
- 不知道在哪个月:
palace_summary(limit=6)→ 每月摘要末尾预览;找到大致年月 - 指定月份:
palace_summary(month="2026-10")→ 该月全部摘要段落(哪次归档、讲了什么) - 搜索关键词:
palace_search(keyword="事故教训", limit=3)→ 约 1 千字符:命中位置 + 轮次 + 行号 + 文件路径 - 读取原文:
palace_read(fromTurn=48, toTurn=48)→ 该轮完整原文(思考、工具调用、返回都在)
单次读取默认上限 60,000 字符(约一本书的三分之一),硬上限也是 6 万。单轮超过 6 万字符时,返回前 6 万并提示 用 offset=N 继续,可分段读完整个大轮。
回忆强度¶
回忆强度有五档:
off关:只归档,不读记忆;不注入任何回忆/摘要提示low低:默认行为,优先读摘要,模型觉得必要时才读原文;不递归medium中:走正常路线:年月 → 摘要 → 检索 → 原文;不递归high高:在中基础上允许模型主动递归检索,受recallBudgetRounds/Keywords预算约束(预算只是建议,插件不强制执行)forced强制:高 + 每条用户消息后都发一条检索指令;没有归档时插件返回「归档记忆为空」,模型必须如实回答,不得编造;检索后简短说明回忆到了什么
启动时不注入归档摘要,只在压缩后注入一次「去读哪份摘要」的指引(硬触发)。
目录结构¶
归档后的文件按会话隔离,存储在 <当前工作区>/memory-palace/ 目录下:
<当前工作区>/
memory-palace/
.namespaces.json # 会话ID → 文件夹名 的映射
config.json # 新会话的默认值
<文件夹>/ # 记忆名:英文(大小写均可)+数字/空格/下划线/连字符
config.json # 本会话自己的开关/参数/记忆名
.state.json # 本会话水位、已归档区间
index.jsonl # 本会话的归档索引
<YYYY-MM>/ # 月份容器
_summary.md # 该月摘要:只追加,每段对应一次归档里的一个类别
<category>/
<前缀>-<category>-<YYYYMMDD-HHmmss>.md
文件夹名 = 页签里填的「记忆命名」,英文(大小写均可)、数字、空格、下划线、连字符,≤32 位;首尾不能有空格,中文与路径分隔符会被拒绝。没命名时用会话ID,且不产生任何记忆文件。
适用场景¶
适合需要在 DSH 中长期保存会话上下文、按类别检索的智能体开发场景。插件以当前 DSH 进程权限运行,安装前应检查源码与许可证。
短结尾¶
记忆回廊把会话原文按轮次和类别归档到本地,在 DSH 压缩前保存完整上下文,支持按月份摘要、关键词检索、原文读取。如果你需要在 DSH 中长期保存和检索对话历史,这个插件可以作为工作区本地记忆的补充方案。
目录页:https://www.skillhub.cn/plugins/dafantong01/dsh-memory-palace
GitHub:https://github.com/dafantong01/dsh-memory-palace