kimi-code-memory-mcp-server 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -1
- package/README.en.md +349 -0
- package/README.md +223 -137
- package/assets/contextFlow.svg +144 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.js +13 -0
- package/dist/config.js.map +1 -1
- package/dist/context/wire-context.d.ts +3 -0
- package/dist/context/wire-context.js +20 -50
- package/dist/context/wire-context.js.map +1 -1
- package/dist/dao/constants.d.ts +33 -0
- package/dist/dao/constants.js +17 -0
- package/dist/dao/constants.js.map +1 -0
- package/dist/dao/index-catalog.d.ts +19 -0
- package/dist/dao/index-catalog.js +94 -0
- package/dist/dao/index-catalog.js.map +1 -0
- package/dist/dao/index-reconciler.d.ts +13 -0
- package/dist/dao/index-reconciler.js +162 -0
- package/dist/dao/index-reconciler.js.map +1 -0
- package/dist/dao/index-store.d.ts +31 -0
- package/dist/dao/index-store.js +128 -0
- package/dist/dao/index-store.js.map +1 -0
- package/dist/dao/index.d.ts +12 -31
- package/dist/dao/index.js +50 -404
- package/dist/dao/index.js.map +1 -1
- package/dist/dao/memory-store.js +2 -10
- package/dist/dao/memory-store.js.map +1 -1
- package/dist/dao/memory-tree-renderer.d.ts +22 -0
- package/dist/dao/memory-tree-renderer.js +75 -0
- package/dist/dao/memory-tree-renderer.js.map +1 -0
- package/dist/prompts/index.d.ts +26 -0
- package/dist/prompts/index.js +103 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/refine/adapter.d.ts +6 -0
- package/dist/refine/adapter.js +28 -0
- package/dist/refine/adapter.js.map +1 -0
- package/dist/refine/constants.d.ts +35 -0
- package/dist/refine/constants.js +107 -0
- package/dist/refine/constants.js.map +1 -0
- package/dist/refine/extractor.d.ts +12 -0
- package/dist/refine/extractor.js +122 -0
- package/dist/refine/extractor.js.map +1 -0
- package/dist/refine/store.d.ts +23 -0
- package/dist/refine/store.js +153 -0
- package/dist/refine/store.js.map +1 -0
- package/dist/refine/types.d.ts +56 -0
- package/dist/refine/types.js +5 -0
- package/dist/refine/types.js.map +1 -0
- package/dist/refined-manager.d.ts +14 -56
- package/dist/refined-manager.js +27 -341
- package/dist/refined-manager.js.map +1 -1
- package/dist/resources/index.d.ts +15 -0
- package/dist/resources/index.js +134 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/server.js +46 -2
- package/dist/server.js.map +1 -1
- package/dist/theme-manager.d.ts +1 -0
- package/dist/theme-manager.js +7 -0
- package/dist/theme-manager.js.map +1 -1
- package/dist/tools/context-tools.d.ts +16 -51
- package/dist/tools/context-tools.js +303 -55
- package/dist/tools/context-tools.js.map +1 -1
- package/dist/tools/index.d.ts +5 -827
- package/dist/tools/index.js +23 -354
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/memory-tools.d.ts +4 -60
- package/dist/tools/memory-tools.js +129 -79
- package/dist/tools/memory-tools.js.map +1 -1
- package/dist/tools/system-tools.d.ts +3 -34
- package/dist/tools/system-tools.js +110 -33
- package/dist/tools/system-tools.js.map +1 -1
- package/dist/tools/theme-tools.d.ts +3 -31
- package/dist/tools/theme-tools.js +101 -22
- package/dist/tools/theme-tools.js.map +1 -1
- package/dist/tools/types.d.ts +21 -0
- package/dist/tools/types.js +13 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/types.d.ts +11 -2
- package/dist/utils/action-entities.d.ts +16 -0
- package/dist/utils/action-entities.js +35 -0
- package/dist/utils/action-entities.js.map +1 -0
- package/dist/utils/date.d.ts +11 -0
- package/dist/utils/date.js +13 -0
- package/dist/utils/date.js.map +1 -0
- package/dist/utils/file-helpers.d.ts +10 -0
- package/dist/utils/file-helpers.js +28 -0
- package/dist/utils/file-helpers.js.map +1 -0
- package/dist/utils/headings.d.ts +5 -0
- package/dist/utils/headings.js +21 -0
- package/dist/utils/headings.js.map +1 -0
- package/dist/utils/search.d.ts +17 -0
- package/dist/utils/search.js +60 -0
- package/dist/utils/search.js.map +1 -0
- package/dist/utils/tools.d.ts +5 -0
- package/dist/utils/tools.js +10 -0
- package/dist/utils/tools.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/vis/api.d.ts +117 -0
- package/dist/vis/api.js +426 -0
- package/dist/vis/api.js.map +1 -0
- package/dist/vis/auto-start.d.ts +12 -0
- package/dist/vis/auto-start.js +87 -0
- package/dist/vis/auto-start.js.map +1 -0
- package/dist/vis/server.d.ts +14 -0
- package/dist/vis/server.js +337 -0
- package/dist/vis/server.js.map +1 -0
- package/dist/vis/static/api.js +57 -0
- package/dist/vis/static/app.js +1468 -0
- package/dist/vis/static/index.html +25 -0
- package/dist/vis/static/state.js +26 -0
- package/dist/vis/static/style.css +1553 -0
- package/dist/vis/static/utils/helpers.js +94 -0
- package/dist/vis/static/utils/markdown.js +81 -0
- package/dist/vis-cli.d.ts +7 -0
- package/dist/vis-cli.js +140 -0
- package/dist/vis-cli.js.map +1 -0
- package/docs/0.agent-memory-market-research.md +354 -0
- package/docs/1.memory-system-proposal-for-kimi-code.md +688 -0
- package/docs/2.memory-architecture-overview.md +417 -0
- package/docs/3.memory-skill-prompt-design.md +430 -0
- package/docs/4.kimi-code-native-evolution-roadmap.md +559 -0
- package/docs/5.decision-guard-design-notes.md +500 -0
- package/docs/ARCHITECTURE.md +2 -2
- package/docs/design-story.md +350 -0
- package/docs/three-layer-memory-model.md +153 -0
- package/docs/three-layer-memory-model.zh-CN.md +153 -0
- package/package.json +12 -6
- package/README.zh-CN.md +0 -292
|
@@ -0,0 +1,688 @@
|
|
|
1
|
+
# 建议 kimi-code 采用的记忆系统:三层模型 + Markdown 优先 + 主题追溯
|
|
2
|
+
|
|
3
|
+
> 提交者:Zehee & K2.7 Code thinking
|
|
4
|
+
> 日期:2026-06-23
|
|
5
|
+
> 性质:架构建议 / 讨论稿
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## TL;DR
|
|
10
|
+
|
|
11
|
+
当前 Agent 记忆系统的主流趋势是**越堆越重**:向量数据库、图数据库、embedding 检索、多策略 rerank……这些方案在特定场景下有效,但作为通用编程助手的默认记忆基础设施,它们存在三个根本问题:
|
|
12
|
+
|
|
13
|
+
1. **把记忆当成无差别囤积的数据**,而非经过判断和编排的信息;
|
|
14
|
+
2. **引入沉重的外部依赖**,与 IDE/CLI 工具追求的轻量、本地、离线可用相矛盾;
|
|
15
|
+
3. **模糊了"记忆"与"搜索"的边界**——如果一切都可以靠 web search 或向量检索补回,那记忆系统本身就失去了存在的意义。
|
|
16
|
+
|
|
17
|
+
本文建议 kimi-code 采用一种**更轻、更结构化、更符合工程直觉**的记忆范式:
|
|
18
|
+
|
|
19
|
+
- **三层记忆模型**:持续认知层、持久化知识库、上下文保持与回忆;
|
|
20
|
+
- **Markdown 优先**:用人类可读的 Markdown 文件作为记忆的默认载体;
|
|
21
|
+
- **主题追溯**:把跨 session 的主题关联作为上下文回忆的核心横向能力。
|
|
22
|
+
|
|
23
|
+
这种方案不需要向量数据库或图数据库,却能在绝大多数 coding-agent 场景下提供足够好的记忆体验。
|
|
24
|
+
|
|
25
|
+
**本文不仅提出理论,也分享了我们基于这一理论实现的一个 memory MCP server 的具体数据结构与设计权衡。**
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 一、当前记忆系统的两条歧途
|
|
30
|
+
|
|
31
|
+
### 歧途一:把记忆做成"第二互联网"
|
|
32
|
+
|
|
33
|
+
向量数据库 + 大规模 RAG 的思路,本质上是:
|
|
34
|
+
|
|
35
|
+
> **把所有历史对话都存下来,用的时候靠语义相似度捞一捞。**
|
|
36
|
+
|
|
37
|
+
这有什么问题?
|
|
38
|
+
|
|
39
|
+
- **记忆失去了筛选机制**:互联网已经是全人类的"外脑",如果 Agent 的本地记忆也是无差别的海量数据,那它和 Google 的区别只在于数据来源;
|
|
40
|
+
- **检索质量不可控**:语义相似不等于主题相关,coding 场景中"相似"的代码片段往往是不同上下文下的干扰项;
|
|
41
|
+
- **可解释性差**:模型为什么召回这条记忆?用户很难理解和修正。
|
|
42
|
+
|
|
43
|
+
如果 Agent 的记忆只是一个小号的、私人的互联网,那它就不值得单独做一个系统。用户直接开浏览器搜索即可。
|
|
44
|
+
|
|
45
|
+
### 歧途二:把记忆做成"第二数据库"
|
|
46
|
+
|
|
47
|
+
图数据库(Neo4j)、时序知识图、复杂的关系schema……这些方案在语义建模上很优雅,但对 coding agent 来说:
|
|
48
|
+
|
|
49
|
+
- **运维成本高**:需要额外服务、索引、迁移、备份;
|
|
50
|
+
- **写放大严重**:每条对话都要经过实体抽取、关系链接、冲突消解;
|
|
51
|
+
- **与人类工作流割裂**:开发者不会为了"让 Agent 记住"而先去维护一个知识图谱。
|
|
52
|
+
|
|
53
|
+
记忆系统应该**服务于人的工作流**,而不是反过来要求人为记忆系统建模。
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## 二、记忆的边界:什么是值得记的?
|
|
58
|
+
|
|
59
|
+
在讨论"怎么实现"之前,必须先回答一个更基础的问题:
|
|
60
|
+
|
|
61
|
+
> **Agent 应该记住什么?**
|
|
62
|
+
|
|
63
|
+
我们的答案是:**记忆应该是经过判断、梳理、编排后的信息,而不是原始数据的堆积。**
|
|
64
|
+
|
|
65
|
+
具体来说,只有三类信息值得被持久化:
|
|
66
|
+
|
|
67
|
+
1. **持续认知层**:我是谁、我遵循什么规则、我的核心偏好——这是 Agent 的"人格与底线";
|
|
68
|
+
2. **持久化知识库**:项目的事实、决策、模式、约定——这是 Agent 的"工作笔记";
|
|
69
|
+
3. **上下文保持与回忆**:当前对话的近期状态——这是 Agent 的"工作记忆"。
|
|
70
|
+
|
|
71
|
+
其他的,比如:
|
|
72
|
+
|
|
73
|
+
- 某一次具体提问的完整原文
|
|
74
|
+
- 已经过时的调试过程
|
|
75
|
+
- 可以通过文件系统、git log、web search 重新获得的信息
|
|
76
|
+
|
|
77
|
+
都不应该成为"记忆"。它们应该留在 wire.jsonl 里作为审计痕迹,或者干脆丢弃。
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## 三、三层记忆模型
|
|
82
|
+
|
|
83
|
+
### 3.1 持续认知层:永远在场的人格与规则
|
|
84
|
+
|
|
85
|
+
| 属性 | 说明 |
|
|
86
|
+
|---|---|
|
|
87
|
+
| 作用域 | 跨 project、跨 session、始终激活 |
|
|
88
|
+
| 内容 | 身份、核心价值观、关键规则、语言偏好 |
|
|
89
|
+
| 更新频率 | 低,但支持热加载 |
|
|
90
|
+
| 容量 | 小,必须严格限制 |
|
|
91
|
+
| 载体 | `AGENTS.md` / `CLAUDE.md` / `essence.md` 等 |
|
|
92
|
+
|
|
93
|
+
这一层的典型内容是:
|
|
94
|
+
|
|
95
|
+
- "你是一个全栈开发工程师,负责前后端一体化实现"
|
|
96
|
+
- "始终使用中文回复用户"
|
|
97
|
+
- "禁止执行任何 git 突变,除非用户明确授权"
|
|
98
|
+
- "涉及 IPC 信号变更时,同时维护 Rust struct + TypeScript interface"
|
|
99
|
+
|
|
100
|
+
**设计原则**:
|
|
101
|
+
|
|
102
|
+
- **小而确定**:宁可少记,不可多记。超出容量上限时,必须让用户主动决定替换哪一条;
|
|
103
|
+
- **人类可编辑**:用户应该能直接打开文件查看和修改;
|
|
104
|
+
- **热加载**:修改后下一轮即可生效,不需要重启 session。
|
|
105
|
+
|
|
106
|
+
#### 我们的实践:`essence.md` 作为持续认知层
|
|
107
|
+
|
|
108
|
+
在我们实现的 memory MCP server 中,持续认知层对应 `essence/essence.md`。它的设计约束是:
|
|
109
|
+
|
|
110
|
+
- **大小上限 15KB**:超过则拒绝写入,强制用户精简;
|
|
111
|
+
- **由 `organize_memories` 生成**:从 `memory/` 中的分散笔记提炼浓缩;
|
|
112
|
+
- **人类可编辑**:用户可以直接修改,下次启动时通过 `bootstrap_workspace` 加载;
|
|
113
|
+
- **来源可追溯**:每条关键事实都 inline 引用来源 memory 文件。
|
|
114
|
+
|
|
115
|
+
这实际上就是把"人格与底线"从隐式的 prompt 工程,变成了显式的、受控的、可审计的文件。
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
### 3.2 持久化知识库:结构化工作笔记
|
|
120
|
+
|
|
121
|
+
| 属性 | 说明 |
|
|
122
|
+
|---|---|
|
|
123
|
+
| 作用域 | 按 user / workspace / project 划分 |
|
|
124
|
+
| 内容 | 事实、决策、代码模式、项目约定、历史经验 |
|
|
125
|
+
| 更新频率 | 中 |
|
|
126
|
+
| 容量 | 中等,持续增长但需定期归档 |
|
|
127
|
+
| 载体 | Markdown 文件 + JSON 索引 |
|
|
128
|
+
|
|
129
|
+
这一层不是对话历史的堆积,而是**被提炼过的知识**。例如:
|
|
130
|
+
|
|
131
|
+
- `memory/decisions/persistence-design.md`:持久化架构决策
|
|
132
|
+
- `memory/knowledge/frontend-stack.md`:项目前端技术栈说明
|
|
133
|
+
- `memory/knowledge/hil-refactor.md`:HIL 重构方案记录
|
|
134
|
+
|
|
135
|
+
**为什么用 Markdown?**
|
|
136
|
+
|
|
137
|
+
- 人类可读、可编辑、可版本控制;
|
|
138
|
+
- 天然支持标题、列表、代码块、链接;
|
|
139
|
+
- 与 LLM 的上下文格式高度兼容;
|
|
140
|
+
- 不需要专用客户端,任何文本编辑器都能打开。
|
|
141
|
+
|
|
142
|
+
**为什么用 JSON 索引?**
|
|
143
|
+
|
|
144
|
+
- 只记录文件路径、标题、标签等元数据;
|
|
145
|
+
- 文件内容本身是真相源;
|
|
146
|
+
- 索引可以高效地完成搜索、过滤、列表;
|
|
147
|
+
- 索引损坏时可以通过扫描文件系统重建。
|
|
148
|
+
|
|
149
|
+
#### 我们的实践:memory/ 文件夹 + `index.json` v3-kv
|
|
150
|
+
|
|
151
|
+
我们在 memory MCP 中采用的存储结构如下:
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
store/workspace-110b6be4/
|
|
155
|
+
├── index.json # v3-kv 轻量索引
|
|
156
|
+
├── essence/
|
|
157
|
+
│ └── essence.md # 持续认知层(≤15KB)
|
|
158
|
+
├── memory/
|
|
159
|
+
│ ├── decisions/ # 决策类记忆
|
|
160
|
+
│ ├── knowledge/ # 知识类记忆
|
|
161
|
+
│ ├── rules/ # 规则类记忆
|
|
162
|
+
│ └── agent-memory-three-layer-model.md
|
|
163
|
+
├── notes/
|
|
164
|
+
│ └── ops-current-state.md
|
|
165
|
+
├── themes/ # 横向主题关联图
|
|
166
|
+
│ └── memory-mcp-evolution.json
|
|
167
|
+
└── refined/ # 按需提炼的 turn summaries
|
|
168
|
+
└── <sessionId>.jsonl
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
`index.json` 采用 v3-kv 格式,不是传统的 entries 表,而是**以文件路径为 key 的扁平索引**:
|
|
172
|
+
|
|
173
|
+
```json
|
|
174
|
+
{
|
|
175
|
+
"version": "3-kv",
|
|
176
|
+
"meta": {
|
|
177
|
+
"lastSyncAt": "2026-06-23T03:32:00Z",
|
|
178
|
+
"structureHash": "a1b2c3d4"
|
|
179
|
+
},
|
|
180
|
+
"index": {
|
|
181
|
+
"memory/": { "comment": "完整记忆索引" },
|
|
182
|
+
"memory/decisions/": { "comment": "关键产品/架构决策" },
|
|
183
|
+
"memory/decisions/persistence-design.md": {
|
|
184
|
+
"title": "Persistence Design",
|
|
185
|
+
"tags": ["decision", "architecture", "persistence"]
|
|
186
|
+
},
|
|
187
|
+
"memory/knowledge/agent-memory-three-layer-model.md": {
|
|
188
|
+
"title": "Agent 记忆系统三层模型",
|
|
189
|
+
"tags": ["knowledge", "memory", "architecture"]
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
关键设计:
|
|
196
|
+
|
|
197
|
+
- **文件是真相源**:索引只是缓存,丢失后可扫描重建;
|
|
198
|
+
- **`structureHash`**:扫描 `memory/`、`notes/`、`essence/` 下所有文件路径后计算 MD5,快速判断目录结构是否变化;
|
|
199
|
+
- **DAO 层**:所有工具通过 DAO 读写索引,保证索引与文件系统一致;
|
|
200
|
+
- **无向量、无图数据库**:检索基于路径、标签、标题、BM25/keyword。
|
|
201
|
+
|
|
202
|
+
每条 Markdown 记忆都有 YAML frontmatter:
|
|
203
|
+
|
|
204
|
+
```yaml
|
|
205
|
+
---
|
|
206
|
+
key: agent-memory-three-layer-model
|
|
207
|
+
folder: memory
|
|
208
|
+
tags: [decision, memory, architecture]
|
|
209
|
+
---
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
这让人类能一眼看出这条记忆的分类、用途和归属。
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
### 3.3 上下文保持与回忆:工作记忆 + 主题追溯
|
|
217
|
+
|
|
218
|
+
| 属性 | 说明 |
|
|
219
|
+
|---|---|
|
|
220
|
+
| 作用域 | 单 session 为主,但可横向跨越多个 session |
|
|
221
|
+
| 内容 | 当前对话状态、近期动作、未决问题、主题关联链 |
|
|
222
|
+
| 更新频率 | 高,每轮交互 |
|
|
223
|
+
| 容量 | 受上下文窗口限制 |
|
|
224
|
+
| 载体 | wire.jsonl + 提炼层 + 主题关联图 |
|
|
225
|
+
|
|
226
|
+
传统的上下文管理只关注**纵向**:时间越近越清晰,越久越远越衰减。但这忽略了真实工作的一个核心特征:
|
|
227
|
+
|
|
228
|
+
> **同一个 workspace 中的多次会话,往往不是单一叙事,而是多条主题线交织并行。**
|
|
229
|
+
|
|
230
|
+
例如:
|
|
231
|
+
|
|
232
|
+
- Session A:开发狼人杀法官助手
|
|
233
|
+
- Session B:发现上下文保存不可靠 → 开始设计 memory MCP server
|
|
234
|
+
- Session C:HIL 测试框架重构
|
|
235
|
+
- Session D:kimi web cwd 问题 → 向上游提 PR
|
|
236
|
+
- Session E:讨论 Agent 记忆系统架构
|
|
237
|
+
|
|
238
|
+
如果只看纵向,这些 session 彼此独立。但如果横向扫描,会发现 B、D、E 都属于"memory-mcp-evolution"这一主题。
|
|
239
|
+
|
|
240
|
+
**主题追溯**就是:把时间线上的每个 turn 看作一个圆柱,圆柱的高度代表该 turn 的计算/思考深度,颜色/标签代表主题。Agent 应该能横向扫描,把同色圆柱找出来,建立关联。
|
|
241
|
+
|
|
242
|
+
```text
|
|
243
|
+
▓▓▓ ╔══════════════╗ ▓▓▓▓▓ ▓▓▓
|
|
244
|
+
▓▓▓ ║ memory-mcp ║ ▓▓▓▓▓ ▓▓▓
|
|
245
|
+
▓▓▓ ╚══════════════╝ ▓▓▓▓▓ ▓▓▓ ▓▓▓
|
|
246
|
+
─────▓▓▓────T2──────────────T4─────T5───T6───────T7─────► 时间
|
|
247
|
+
│ │
|
|
248
|
+
T1 T7
|
|
249
|
+
└──────── 狼人杀主线 ────────────────────────┘
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
这种能力让 Agent 可以回答:
|
|
253
|
+
|
|
254
|
+
> "memory MCP server 是怎么发展成现在这样的?"
|
|
255
|
+
|
|
256
|
+
而不是只能回答:
|
|
257
|
+
|
|
258
|
+
> "我们刚才说了什么?"
|
|
259
|
+
|
|
260
|
+
#### 3.3.1 提炼层:wire.jsonl → Refined Turn Summaries
|
|
261
|
+
|
|
262
|
+
`wire.jsonl` 是真相源,但它不是给「横向主题追溯」直接消费的。它里面 90% 是过程噪声:
|
|
263
|
+
|
|
264
|
+
- `Thinking...` 过程
|
|
265
|
+
- 流式输出碎片
|
|
266
|
+
- 重复的 tool result 头部
|
|
267
|
+
- "我来看看这个文件"、"好的,现在改一下"这类废话
|
|
268
|
+
|
|
269
|
+
如果直接对 `wire.jsonl` 做语义聚类,算法会被这些噪声拖垮。因此需要在 `wire.jsonl` 和 `themes/<theme>.json` 之间插入一个**按需提炼层**:
|
|
270
|
+
|
|
271
|
+
```
|
|
272
|
+
Raw Wire Stream
|
|
273
|
+
Turn N Begin
|
|
274
|
+
-> Step 1: Thinking...
|
|
275
|
+
-> Step 1: Tool Call (Read file A)
|
|
276
|
+
-> Step 1: Tool Result (File A content...)
|
|
277
|
+
-> Step 1: Text Output ("I see the issue is in function X...")
|
|
278
|
+
-> Step 2: Tool Call (Edit file B)
|
|
279
|
+
-> Step 2: Tool Result (Diff...)
|
|
280
|
+
Turn N End
|
|
281
|
+
│
|
|
282
|
+
▼
|
|
283
|
+
Per-Turn Refinement Filter (on demand)
|
|
284
|
+
│
|
|
285
|
+
▼
|
|
286
|
+
{
|
|
287
|
+
"turnId": 42,
|
|
288
|
+
"summary": "修复了 MCP 服务器启动时的端口占用问题",
|
|
289
|
+
"facts": [
|
|
290
|
+
"修改了 src/mcp/server.ts 的 listen() 逻辑",
|
|
291
|
+
"增加了 port fallback 机制 (3000 -> 3001)"
|
|
292
|
+
],
|
|
293
|
+
"entities": {
|
|
294
|
+
"files": ["src/mcp/server.ts"],
|
|
295
|
+
"tools": ["edit_file", "bash"],
|
|
296
|
+
"errors": []
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
**Refined Turn 是主题关联的原子单元**。它不是主题的私有财产,而是被多个主题共享引用的公共原子:
|
|
302
|
+
|
|
303
|
+
```text
|
|
304
|
+
refined/<sessionId>.jsonl
|
|
305
|
+
│
|
|
306
|
+
│ 一个 Refined Turn 可被多个主题引用
|
|
307
|
+
│ ┌──────────────────┐
|
|
308
|
+
│ │ themes/A.json │───┐
|
|
309
|
+
│ │ - turn-12 │ │
|
|
310
|
+
│ │ - turn-34 │ │
|
|
311
|
+
│ └──────────────────┘ │
|
|
312
|
+
│ │
|
|
313
|
+
│ ┌──────────────────┐ │
|
|
314
|
+
└───────▶│ themes/B.json │ │
|
|
315
|
+
│ - turn-12 │◄──┘
|
|
316
|
+
│ - turn-57 │
|
|
317
|
+
└──────────────────┘
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
这意味着:
|
|
321
|
+
|
|
322
|
+
- **一份提炼,多处引用**:某轮对话如果同时涉及 "memory-mcp-evolution" 和 "kimi-web-cwd" 两个主题,它只在 `refined/` 中存储一次,但两个主题文件都指向它;
|
|
323
|
+
- **主题是视图,不是容器**:`themes/<theme>.json` 不保存 turn 正文,只保存 `(sessionId, turnId)` 指针;
|
|
324
|
+
- **按 turn 去重**:同一个 turn 无论被多少个主题引用,都只提炼一次,避免重复计算。
|
|
325
|
+
|
|
326
|
+
这个设计让提炼层从「session 级批量产物」变成「turn 级原子库」,是横向主题追溯能低成本扩展的关键。
|
|
327
|
+
|
|
328
|
+
这个提炼层**不是**在每轮结束时自动跑,而是遵循**冷启动 + 持久化复用**策略:
|
|
329
|
+
|
|
330
|
+
1. **冷启动**:当用户首次要求追溯某个主题时,Agent 先向用户索要主题范围和关键词种子;
|
|
331
|
+
2. **粗筛**:用关键词在原始 `wire.jsonl` 中快速召回候选 turns;
|
|
332
|
+
3. **提炼**:仅对候选 turns 运行 `refineTurn()`,结果持久化到 `refined/<sessionId>.jsonl`;
|
|
333
|
+
4. **聚合**:把提炼后的 turns 按实体/事实重叠度聚合成主题,写入 `themes/<theme>.json`;
|
|
334
|
+
5. **深挖**:用户或 Agent 挑选关键 turns,调用 `load_turn_context` 恢复完整对话;
|
|
335
|
+
6. **复用**:后续再查询同一主题时,直接读取已持久化的提炼层,无需重新计算。
|
|
336
|
+
|
|
337
|
+
提炼动作包括:
|
|
338
|
+
|
|
339
|
+
| 动作 | 作用 |
|
|
340
|
+
|---|---|
|
|
341
|
+
| 去水印 | 剔除 Thinking、流式碎片、重复 tool result 头部 |
|
|
342
|
+
| 事实抽取 | 提取 Changed / Reason / Error |
|
|
343
|
+
| 意图压缩 | 5000 tokens → 3-5 bullet points |
|
|
344
|
+
| 实体绑定 | 把概念锚定到文件路径、函数名、错误码 |
|
|
345
|
+
|
|
346
|
+
**关键结论**:横向主题追溯基于按需生成的 `Refined Turn Summaries` 进行。每个 turn 被压缩为结构化的事实单元(`summary` / `facts` / `entities`),主题聚合因此可以通过关键词与实体匹配完成,无需直接解析原始 `wire.jsonl`,也无需依赖向量数据库。
|
|
347
|
+
|
|
348
|
+
例如,要回答 "我们是怎么处理 MCP 端口占用问题的?",只需要:
|
|
349
|
+
|
|
350
|
+
```
|
|
351
|
+
找到所有 entities.files 包含 src/mcp/server.ts 且 facts 包含 "port" 的 refined turns。
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
这用 SQLite + FTS5,甚至简单的 JSON grep 就能秒出结果。
|
|
355
|
+
|
|
356
|
+
#### 3.3.2 我们的实践:按需提炼 + `search_context` + `load_turn_context` 实现主题追溯
|
|
357
|
+
|
|
358
|
+
在我们实现的 memory MCP 中,上下文恢复不再依赖 agent 手动 `save_context`,而是直接解析 Kimi CLI 的 `wire.jsonl`。为了支持横向主题追溯,我们采用**按需提炼层**:
|
|
359
|
+
|
|
360
|
+
- **提炼层**:在用户触发主题追溯时,对候选 turns 生成 `Refined Turn Summary`,包含 `summary` / `facts` / `entities`,并持久化到 `refined/<sessionId>.jsonl`;
|
|
361
|
+
- **`bootstrap_workspace`**:启动时加载当前 workspace 的 `recentContext`、`essence`、`memoryIndexTree`;
|
|
362
|
+
- **`search_context`**:按关键词跨所有 workspace session wires 做粗筛;
|
|
363
|
+
- **`refine_session_turns`**:对粗筛出的候选 turns 进行提炼;
|
|
364
|
+
- **`load_more_context`**:加载某个 session 之前的更多 turn;
|
|
365
|
+
- **`load_turn_context`**:精确加载某几个 turn 的完整内容;
|
|
366
|
+
- **`tag_theme` / `trace_theme`**:把 turns / memories 关联到主题,并按时间线输出。
|
|
367
|
+
|
|
368
|
+
主题追溯的完整链路应该是:
|
|
369
|
+
|
|
370
|
+
- **冷启动确认**:Agent 向用户确认主题范围并索要关键词种子;
|
|
371
|
+
- **`search_context`**:按关键词跨所有 workspace session wires 粗筛候选 turns;
|
|
372
|
+
- **`refine_session_turns`**:仅对候选 turns 做提炼并持久化;
|
|
373
|
+
- **`tag_theme`** / 直接写 `themes/<theme>.json`:把提炼后的 turns 聚合成主题;
|
|
374
|
+
- **`load_turn_context`**:精确加载关键 turns 的完整内容;
|
|
375
|
+
- **`trace_theme`**:展示主题发展脉络。
|
|
376
|
+
|
|
377
|
+
这正是主题追溯的工程实现:
|
|
378
|
+
|
|
379
|
+
```text
|
|
380
|
+
主题追溯按需流水线
|
|
381
|
+
|
|
382
|
+
用户
|
|
383
|
+
│
|
|
384
|
+
│ "memory MCP 是怎么演进的?"
|
|
385
|
+
▼
|
|
386
|
+
┌─────────────────────────────────────────────┐
|
|
387
|
+
│ ① 冷启动确认 │
|
|
388
|
+
│ Agent 向用户确认主题范围,索要关键词种子 │
|
|
389
|
+
│ 例:"mcp-server"、"wire.jsonl"、"上下文保存" │
|
|
390
|
+
└─────────────────────┬─────────────────────────┘
|
|
391
|
+
▼
|
|
392
|
+
┌─────────────────────────────────────────────┐
|
|
393
|
+
│ ② search_context 粗筛 │
|
|
394
|
+
│ 跨 workspace 所有 session 的 wire.jsonl │
|
|
395
|
+
│ 按关键词 / 实体 / 文件路径 召回候选 turns │
|
|
396
|
+
└─────────────────────┬───────────────────────┘
|
|
397
|
+
▼
|
|
398
|
+
┌─────────────────────────────────────────────┐
|
|
399
|
+
│ ③ refine_session_turns 提炼 │
|
|
400
|
+
│ 仅对候选 turns 生成 Refined Summaries │
|
|
401
|
+
│ 持久化到 refined/<sessionId>.jsonl │
|
|
402
|
+
│ (已提炼过的 turn 直接复用) │
|
|
403
|
+
└─────────────────────┬───────────────────────┘
|
|
404
|
+
▼
|
|
405
|
+
┌─────────────────────────────────────────────┐
|
|
406
|
+
│ ④ 主题聚合 │
|
|
407
|
+
│ 按 entities.files / facts 重叠度聚类 │
|
|
408
|
+
│ 写入 themes/<theme>.json │
|
|
409
|
+
└─────────────────────┬───────────────────────┘
|
|
410
|
+
▼
|
|
411
|
+
┌─────────────────────────────────────────────┐
|
|
412
|
+
│ ⑤ load_turn_context 深挖(可选) │
|
|
413
|
+
│ 对关键 turns 恢复完整 user / agent / actions│
|
|
414
|
+
└─────────────────────┬───────────────────────┘
|
|
415
|
+
▼
|
|
416
|
+
┌─────────────────────────────────────────────┐
|
|
417
|
+
│ ⑥ trace_theme 输出 │
|
|
418
|
+
│ 按时间线展示主题发展脉络 + 相关 memories │
|
|
419
|
+
└─────────────────────┬───────────────────────┘
|
|
420
|
+
▼
|
|
421
|
+
"memory-mcp-evolution 主题发展史"
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
在我们的实际经历中,正是通过这个机制,从多个 session 的噪音中提取出了 memory MCP 从问题提出、架构设计、实现验证到上游修复的完整发展史。
|
|
425
|
+
|
|
426
|
+
**主题关联可以只用一个轻量的 JSON 文件维护**:
|
|
427
|
+
|
|
428
|
+
```json
|
|
429
|
+
{
|
|
430
|
+
"theme": "memory-mcp-evolution",
|
|
431
|
+
"displayName": "memory-mcp-evolution",
|
|
432
|
+
"createdAt": "2026-06-22T14:00:00Z",
|
|
433
|
+
"updatedAt": "2026-06-22T14:00:00Z",
|
|
434
|
+
"turns": [
|
|
435
|
+
{"sessionId": "sess-A", "turnId": 12, "timestamp": "2026-06-20T10:00:00Z"},
|
|
436
|
+
{"sessionId": "sess-B", "turnId": 3, "timestamp": "2026-06-21T11:00:00Z"},
|
|
437
|
+
{"sessionId": "sess-C", "turnId": 8, "timestamp": "2026-06-22T12:00:00Z"}
|
|
438
|
+
],
|
|
439
|
+
"memories": [
|
|
440
|
+
{"key": "agent-memory-three-layer-model", "folder": "memory", "title": "Agent 记忆系统三层模型"},
|
|
441
|
+
{"key": "kimi-web-mcp-workspace-parked", "folder": "memory/decisions", "title": "kimi web MCP workspace 问题 parked"}
|
|
442
|
+
]
|
|
443
|
+
}
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
不需要 Neo4j,不需要图数据库,一个 JSON 文件就足以支持主题导航。
|
|
447
|
+
|
|
448
|
+
---
|
|
449
|
+
|
|
450
|
+
## 四、为什么 Markdown + JSON 索引足够好?
|
|
451
|
+
|
|
452
|
+
### 4.1 对编程场景的天然适配
|
|
453
|
+
|
|
454
|
+
编程工作的知识本身就是结构化的:
|
|
455
|
+
|
|
456
|
+
- 架构决策(Decision)
|
|
457
|
+
- 技术栈说明(Knowledge)
|
|
458
|
+
- 代码规范(Rule)
|
|
459
|
+
- 项目历史(Reference)
|
|
460
|
+
- 临时备忘(Note)
|
|
461
|
+
|
|
462
|
+
这些知识用 Markdown 组织,既符合开发者的习惯,也适合 LLM 理解。相比之下,向量数据库把所有知识都压成稠密向量,反而丢失了结构信息。
|
|
463
|
+
|
|
464
|
+
### 4.2 可审计、可修正、可版本控制
|
|
465
|
+
|
|
466
|
+
每条记忆都是一个文件:
|
|
467
|
+
|
|
468
|
+
- 用户可以打开查看;
|
|
469
|
+
- 可以手动编辑修正;
|
|
470
|
+
- 可以用 git 追踪变更;
|
|
471
|
+
- 可以明确地删除或归档。
|
|
472
|
+
|
|
473
|
+
这比黑盒向量库更符合开发者对"可解释性"的要求。
|
|
474
|
+
|
|
475
|
+
### 4.3 轻量、本地、离线
|
|
476
|
+
|
|
477
|
+
不需要:
|
|
478
|
+
|
|
479
|
+
- Docker
|
|
480
|
+
- PostgreSQL / Neo4j / Qdrant
|
|
481
|
+
- embedding 服务
|
|
482
|
+
- 网络连接
|
|
483
|
+
|
|
484
|
+
只需要文件系统。这与 CLI/IDE 工具追求的"本地优先、离线可用"完全一致。
|
|
485
|
+
|
|
486
|
+
### 4.4 检索不必依赖向量搜索
|
|
487
|
+
|
|
488
|
+
对于结构化 Markdown,检索可以是:
|
|
489
|
+
|
|
490
|
+
- **路径搜索**:`memory/decisions/*`
|
|
491
|
+
- **标签过滤**:tag = "architecture"
|
|
492
|
+
- **标题匹配**:文件名包含 "HIL"
|
|
493
|
+
- **BM25/keyword**:在 Markdown 内容中搜索关键词
|
|
494
|
+
- **主题图遍历**:沿着 theme → turn → session 的关联
|
|
495
|
+
|
|
496
|
+
这些方法组合起来,足以覆盖绝大多数 coding-agent 场景,而且更快、更确定、更可解释。
|
|
497
|
+
|
|
498
|
+
---
|
|
499
|
+
|
|
500
|
+
## 五、与 kimi-code 现有架构的契合点
|
|
501
|
+
|
|
502
|
+
kimi-code 已经具备实现这一方案的基础:
|
|
503
|
+
|
|
504
|
+
| 我们的层 | kimi-code 现有基础 | 建议实现 |
|
|
505
|
+
|---|---|---|
|
|
506
|
+
| 持续认知层 | `AGENTS.md`、system prompt | 增加热加载 watcher,支持 global/user/project 多级覆盖 |
|
|
507
|
+
| 持久化知识库 | `SessionStore`、配置文件 | 新增 `MemoryStore`,按 workspace 组织 Markdown + JSON 索引 |
|
|
508
|
+
| 提炼层 | `wire.jsonl`、`ToolManager` | 新增 `TurnRefiner`,用户触发主题追溯时按需提炼候选 turns |
|
|
509
|
+
| 上下文保持与回忆 | `wire.jsonl`、`ContextMemory` | 保留现有机制,基于按需提炼层增加主题关联图 |
|
|
510
|
+
|
|
511
|
+
具体建议:
|
|
512
|
+
|
|
513
|
+
1. **在 `~/.kimi-code/memory/` 下建立 workspace-scoped 的 Markdown 记忆库**;
|
|
514
|
+
2. **为每个 session 创建时加载相关的 Markdown 记忆**到 system prompt 或 injection;
|
|
515
|
+
3. **提供默认记忆 Skill**:教导模型何时、如何、记录什么;
|
|
516
|
+
4. **提供内置工具**:`remember` / `recall` / `list_memories` / `search_context` / `refine_session_turns` / `trace_theme`;
|
|
517
|
+
5. **在 session 结束或 compaction 时,自动提炼关键事实为 Markdown 记忆**;
|
|
518
|
+
6. **新增按需提炼层**:在 `store/<workspace>/refined/<sessionId>.jsonl` 下保存提炼后的 turn summaries,作为主题追溯的输入;
|
|
519
|
+
7. **主题的识别和关联基于按需提炼层完成**:用户确认主题范围并提供关键词种子后,才启动粗筛、提炼与聚合,不阻塞主交互循环。
|
|
520
|
+
|
|
521
|
+
### 5.1 默认记忆 Skill 的作用
|
|
522
|
+
|
|
523
|
+
仅有工具是不够的。模型需要知道:
|
|
524
|
+
|
|
525
|
+
- 什么时候应该调用 `remember`?
|
|
526
|
+
- 什么内容值得记?
|
|
527
|
+
- 记忆应该放在哪个 folder?
|
|
528
|
+
- 什么时候应该调用 `recall` 或 `trace_theme`?
|
|
529
|
+
- 哪些信息**不应该**被保存为记忆?
|
|
530
|
+
|
|
531
|
+
这些规则应该被封装在一个**默认记忆 Skill**中,作为 system prompt 的一部分注入每个 session。
|
|
532
|
+
|
|
533
|
+
一个记忆 Skill 的典型内容如下:
|
|
534
|
+
|
|
535
|
+
```markdown
|
|
536
|
+
# Memory Skill
|
|
537
|
+
|
|
538
|
+
你有权限访问当前 workspace 的长期记忆系统。记忆分为两类:
|
|
539
|
+
|
|
540
|
+
1. **持续认知层**(`AGENTS.md` / `essence.md`):身份、规则、核心偏好。
|
|
541
|
+
- 不要通过 `remember` 修改这一层。
|
|
542
|
+
- 如果你发现认知层需要更新,提示用户手动编辑相关文件。
|
|
543
|
+
|
|
544
|
+
2. **持久化知识库**(`memory/` 下的 Markdown):项目事实、决策、模式、约定。
|
|
545
|
+
- 当用户确认某个决策、方案、架构时,调用 `remember` 保存。
|
|
546
|
+
- 当用户说"记住这个"、"记录下来"、"备案"时,调用 `remember`。
|
|
547
|
+
- 当讨论中需要引用过去决策时,调用 `recall` 或 `trace_theme`。
|
|
548
|
+
|
|
549
|
+
## 何时使用 remember
|
|
550
|
+
|
|
551
|
+
- 用户明确说"记住"、"记录下来"、"保存";
|
|
552
|
+
- 做出了一个需要后续参考的架构/设计决策;
|
|
553
|
+
- 发现项目中的重复模式或约定;
|
|
554
|
+
- 解决了一个棘手的 bug,积累了可复用的调试经验。
|
|
555
|
+
|
|
556
|
+
## 何时不要使用 remember
|
|
557
|
+
|
|
558
|
+
- 临时性的调试过程;
|
|
559
|
+
- 可以在代码、git log、文档中直接找到的信息;
|
|
560
|
+
- 用户没有确认的推测或假设;
|
|
561
|
+
- 过于琐碎的个人偏好(如"我今天心情不好")。
|
|
562
|
+
|
|
563
|
+
## 记忆结构规范
|
|
564
|
+
|
|
565
|
+
调用 `remember` 时:
|
|
566
|
+
- `folder`:分类,如 `decisions`、`knowledge`、`rules`、`reference`;
|
|
567
|
+
- `key`:kebab-case 唯一标识,如 `hil-refactor-2026`;
|
|
568
|
+
- `title`:一句话概括;
|
|
569
|
+
- `tags`:3-5 个关键词;
|
|
570
|
+
- `content`:用 Markdown 清晰书写,包含背景和结论。
|
|
571
|
+
|
|
572
|
+
## 主题追溯
|
|
573
|
+
|
|
574
|
+
当用户问"X 是怎么发展的"、"回顾一下 Y"、"我们之前怎么决定 Z 的"时,调用 `trace_theme(theme)`。
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
这个 Skill 的作用不是替代工具,而是**让工具被正确使用**。没有它,模型要么忘记使用记忆工具,要么把什么都存进记忆库,导致知识库膨胀和噪音。
|
|
578
|
+
|
|
579
|
+
---
|
|
580
|
+
|
|
581
|
+
## 六、我们的实现已经验证了这条路
|
|
582
|
+
|
|
583
|
+
我们基于上述理论实现了一个 memory MCP server,验证了以下关键点:
|
|
584
|
+
|
|
585
|
+
### 6.1 文件系统足以支撑结构化记忆
|
|
586
|
+
|
|
587
|
+
- 35 条记忆、24 个 Markdown 文件、11 个文件夹;
|
|
588
|
+
- `index.json` v3-kv 索引读取和写入延迟都在毫秒级;
|
|
589
|
+
- `structureHash` 机制保证目录结构变化时能快速同步;
|
|
590
|
+
- 从未遇到过性能瓶颈。
|
|
591
|
+
|
|
592
|
+
### 6.2 Markdown + frontmatter 是合理的默认格式
|
|
593
|
+
|
|
594
|
+
- 人类可以直接阅读、编辑、归档;
|
|
595
|
+
- LLM 能直接理解标题、列表、代码块;
|
|
596
|
+
- frontmatter 提供了机器所需的元数据;
|
|
597
|
+
- 与 git 版本控制天然兼容。
|
|
598
|
+
|
|
599
|
+
### 6.3 主题追溯不需要重型数据库
|
|
600
|
+
|
|
601
|
+
- 通过解析 `wire.jsonl` + 提炼层 + 轻量主题 JSON,我们已经能从多个 session 中抽取出清晰的主题发展史;
|
|
602
|
+
- 这个过程的关键不在存储或算法,而在提炼层的质量:只有把原始对话压缩成 `facts` + `entities`,横向聚合才能用简单的关键词/实体匹配完成;
|
|
603
|
+
- 主题识别基于按需提炼层完成,用户触发并确认关键词后才启动,不阻塞主交互。
|
|
604
|
+
|
|
605
|
+
### 6.4 人机共治是必要的
|
|
606
|
+
|
|
607
|
+
- 自动提取的记忆经常有偏差;
|
|
608
|
+
- 重要的决策、规则、架构知识应该由人类确认或撰写;
|
|
609
|
+
- Markdown 文件的透明性让这种共治成为可能。
|
|
610
|
+
|
|
611
|
+
---
|
|
612
|
+
|
|
613
|
+
## 七、对常见质疑的回应
|
|
614
|
+
|
|
615
|
+
### Q1:不用向量数据库,大规模记忆怎么检索?
|
|
616
|
+
|
|
617
|
+
**答**:对于 coding agent,"大规模"本身就是一个需要警惕的信号。如果一个项目需要上万条记忆才能工作,说明知识没有被有效梳理。好的记忆系统应该帮助用户**压缩和结构化**知识,而不是无差别地囤积。
|
|
618
|
+
|
|
619
|
+
如果确实需要向量检索,可以作为可选插件,但不应该成为默认路径。
|
|
620
|
+
|
|
621
|
+
### Q2:不用图数据库,怎么做主题关联?
|
|
622
|
+
|
|
623
|
+
**答**:如第 3.3.1 节所示,主题关联建立在按需提炼层之上。`wire.jsonl` 在用户触发主题追溯时被提炼成 `Refined Turn Summaries`,再按 `entities.files` 等实体交集聚合成轻量的 `themes/<theme>.json`。图数据库对于复杂关系推理有帮助,但不是默认必需。
|
|
624
|
+
|
|
625
|
+
### Q3:自动提取记忆会不会质量很差?
|
|
626
|
+
|
|
627
|
+
**答**:会。所以应该采用**人机共治**:
|
|
628
|
+
|
|
629
|
+
- Agent 可以自动提议记忆;
|
|
630
|
+
- 但重要记忆需要用户确认或手动编辑;
|
|
631
|
+
- 记忆文件对人类透明,随时可以修正。
|
|
632
|
+
|
|
633
|
+
这比完全自动但黑盒的向量记忆更可靠。
|
|
634
|
+
|
|
635
|
+
### Q4:Markdown 不是比数据库慢吗?
|
|
636
|
+
|
|
637
|
+
**答**:读取几个 Markdown 文件到 prompt 中,比向量检索 + rerank 快得多。真正的延迟不在文件读取,而在 LLM 推理。保持记忆库小而精,反而是性能优化。
|
|
638
|
+
|
|
639
|
+
---
|
|
640
|
+
|
|
641
|
+
## 八、给 kimi-code 的具体建议
|
|
642
|
+
|
|
643
|
+
1. **不要把向量数据库作为默认记忆方案**
|
|
644
|
+
- 默认应该是 Markdown + JSON 索引;
|
|
645
|
+
- 向量/图数据库作为高级可选项。
|
|
646
|
+
|
|
647
|
+
2. **优先实现三层记忆 + 提炼层的基础设施**
|
|
648
|
+
- 持续认知层:热加载的 `AGENTS.md` 类文件;
|
|
649
|
+
- 持久化知识库:workspace-scoped Markdown 记忆库;
|
|
650
|
+
- 提炼层:用户触发主题追溯时,对候选 turns 按需生成 `Refined Turn Summary`;
|
|
651
|
+
- 上下文保持:基于提炼层,增加主题关联。
|
|
652
|
+
|
|
653
|
+
3. **提供清晰的记忆边界**
|
|
654
|
+
- 区分"会消失的上下文"和"会被保存的记忆";
|
|
655
|
+
- 区分"人类显式写入的规则"和"Agent 自动提取的事实"。
|
|
656
|
+
|
|
657
|
+
4. **让记忆对人类透明**
|
|
658
|
+
- 用户应该能查看、编辑、删除、归档每条记忆;
|
|
659
|
+
- 记忆应该有来源(来自哪个 session、哪一轮、哪个 tool)。
|
|
660
|
+
|
|
661
|
+
5. **把主题追溯作为杀手级特性**
|
|
662
|
+
- 跨 session 的主题关联是现有竞品没有做好的;
|
|
663
|
+
- 这能让 kimi-code 从"会话内聪明"进化到"理解用户工作脉络"。
|
|
664
|
+
|
|
665
|
+
---
|
|
666
|
+
|
|
667
|
+
## 九、结语
|
|
668
|
+
|
|
669
|
+
Agent 记忆系统的目标不应该是"记住一切",而应该是**"在正确的时间,把经过判断的、结构化的、与人类工作流一致的信息,呈现给模型"**。
|
|
670
|
+
|
|
671
|
+
向量数据库和图数据库是强大的工具,但它们解决的是"海量无组织数据中的相似性检索"问题。而 coding agent 真正需要的记忆,是**梳理过的、清晰结构的、经过判断的、精心编排的信息**。
|
|
672
|
+
|
|
673
|
+
我们已经用一个基于 Markdown + JSON 索引 + 主题追溯的 memory MCP server 验证了这条路。它不是学术玩具,而是一个真实可运行、已经承载了我们多个 session 工作的系统。
|
|
674
|
+
|
|
675
|
+
我们建议 kimi-code 认真考虑这一方向。
|
|
676
|
+
|
|
677
|
+
---
|
|
678
|
+
|
|
679
|
+
## 参考
|
|
680
|
+
|
|
681
|
+
- CoALA: A Cognitive Architecture for Language Agents (Princeton, 2023)
|
|
682
|
+
- Memory in the Age of AI Agents (arXiv:2512.13564, 2025)
|
|
683
|
+
- Letta / MemGPT: Packer et al., 2023
|
|
684
|
+
- Mem0: Chhikara et al., 2025
|
|
685
|
+
- Zep / Graphiti: Rasmussen et al., 2025
|
|
686
|
+
- Hindsight: Latimer et al., 2025
|
|
687
|
+
- ChatGPT Memory reverse engineering: llmrefs.com, 2025
|
|
688
|
+
- Claude Code Auto-Memory / CLAUDE.md: datastudios.org, 2026
|