记忆系统
deepcode 会在会话之间记住东西:你是谁、你纠正过它什么、这个项目有哪些约束。一条记忆一个 .md 文件,纯文本,你随时可以自己看、自己改、自己删。
三层
| 层 | 位置 | 作用 |
|---|---|---|
| 项目记忆 | ~/.deepcode/projects/<项目键>/memory/ | 这个项目独有的决策与约束 |
| 全局抽屉 | ~/.deepcode/memory/ | 跨项目的东西:你的偏好、你的工作方式 |
| 会话摘要 | ~/.deepcode/projects/<键>/<会话 id>/session-memory/summary.md | 当前会话的滚动摘要 |
项目键按仓库根目录(有 .git 的那一级)解析,所以同一个仓库在不同路径下打开,用的是同一份 记忆。
一条记忆长什么样
---
name: prefers-tabs
description: 用户在这个项目里用 tab 缩进,不用空格
metadata:
type: feedback
---
这个项目统一用 tab 缩进。**为什么:**历史代码全是 tab,混用会让 diff 变脏。
**怎么用:**新文件也用 tab,不要「顺手改成空格」。type 四选一:
| type | 记什么 |
|---|---|
user | 用户是谁——角色、专长、偏好 |
feedback | 用户对工作方式的纠正或明确指导(要写清「为什么」) |
project | 项目的关键决策或约束,且是从代码和 git 历史里看不出来的 |
reference | 外部资源指针:URL、看板、工单 |
索引文件 MEMORY.md 每条记忆一行,每次会话开头整份加载进上下文——所以它是索引,不是内容仓库。
什么会被记下来
不是每轮都记。 有一道门控:一个小模型判断这段对话是否包含「值得长期记住的持久信息」, 只输出 yes/no。
| 算 yes | 算 no |
|---|---|
| 用户本人的事实或长期偏好 | 日常寒暄 |
| 用户对工作方式的纠正或指导 | 一次性任务的执行细节 |
| 项目的关键决策或约束 | 代码 / 命令的具体内容 |
| 它自己的分析或总结、临时上下文 |
为什么要这道门
不加门控的话,每轮都跑一次提取模型——又贵又会把一堆一次性细节写成「长期记忆」,几周后 索引里全是噪声。门控只在真有持久信息时才放行提取。
会话摘要
长会话会滚动维护一份摘要,避免压缩历史时把早期的关键信息丢掉。触发有三个阈值:
| 配置 | 缺省 | 含义 |
|---|---|---|
minInitTokens | 10000 | 会话累计到这么多 token 才首次生成摘要 |
minUpdateTokens | 5000 | 之后每再增加这么多才更新一次 |
toolCallsBetween | 3 | 两次更新之间至少要隔这么多次工具调用 |
三个阈值一起挡掉「短会话也去生成摘要」这种纯浪费。
dream:后台归纳
积累到一定量之后,deepcode 会在后台把零散记忆归纳成更概括的条目。门槛刻意设得高:
| 配置 | 缺省 | 含义 |
|---|---|---|
minHours | 24 | 距上次归纳至少这么多小时 |
minSessions | 5 | 至少积累这么多个新会话 |
两条都满足才跑。归纳会调模型、要花钱,跑太勤既贵又容易把还没稳定的观察固化成「结论」。
全局抽屉的注入预算
全局抽屉默认 maxBytes: 8192——这是全文注入的预算,不是存储上限。
抽屉内容总量在预算内时全文注入上下文;超了就降级成索引清单(只给标题和一句话摘要), 模型需要细节时再用 SearchMemory 检索、用 Read 读全文。
这样设计是因为全局抽屉每次会话都要注入——不设上限的话,它会随着时间推移悄悄吃掉越来越多 上下文预算。
检索
SearchMemory 工具在项目记忆 + 全局抽屉里做全文检索(SQLite FTS5,零外部依赖),返回 最相关的片段与文件键。
用法上的分工:索引(MEMORY.md)负责「知道有这么回事」,检索负责「找到具体在哪」, Read 负责「看全文」。模型被要求拿到片段后要读全文再据此作答,不能只凭片段下结论。
配置
settings 里的 memory 字段,全部可选:
{
"memory": {
"enabled": true, // 总开关
"extractEveryTurns": 1, // 每几轮过一次门控
"sessionMemory": {
"enabled": true,
"minInitTokens": 10000,
"minUpdateTokens": 5000,
"toolCallsBetween": 3
},
"dream": { "enabled": true, "minHours": 24, "minSessions": 5 },
"global": { "enabled": true, "maxBytes": 8192 },
"indexConsolidation": { "enabled": true }
}
}非法值不会让配置整体失效——每个字段各自回落到缺省(正整数字段收到负数或字符串,就用默认值)。
相关命令
| 命令 | 作用 |
|---|---|
/memory | 查看当前生效的记忆文件 |
/pause-memory | 会话级暂停记忆提取(别名 /memory-pause、/toggle-memory) |
/init | 生成项目的 DEEPCODE.md 指令文件 |
记忆 ≠ 指令文件
DEEPCODE.md 是你写给它的规矩,每次都完整注入、优先级高。记忆是它自己攒下来的观察, 可能过时、可能记错。两者不是一回事——发现记忆里有错的,直接改那个 .md 文件就行。
相关:工具总览 · 子代理 · settings 参考