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.
Files changed (129) hide show
  1. package/CHANGELOG.md +28 -1
  2. package/README.en.md +349 -0
  3. package/README.md +223 -137
  4. package/assets/contextFlow.svg +144 -0
  5. package/dist/config.d.ts +13 -0
  6. package/dist/config.js +13 -0
  7. package/dist/config.js.map +1 -1
  8. package/dist/context/wire-context.d.ts +3 -0
  9. package/dist/context/wire-context.js +20 -50
  10. package/dist/context/wire-context.js.map +1 -1
  11. package/dist/dao/constants.d.ts +33 -0
  12. package/dist/dao/constants.js +17 -0
  13. package/dist/dao/constants.js.map +1 -0
  14. package/dist/dao/index-catalog.d.ts +19 -0
  15. package/dist/dao/index-catalog.js +94 -0
  16. package/dist/dao/index-catalog.js.map +1 -0
  17. package/dist/dao/index-reconciler.d.ts +13 -0
  18. package/dist/dao/index-reconciler.js +162 -0
  19. package/dist/dao/index-reconciler.js.map +1 -0
  20. package/dist/dao/index-store.d.ts +31 -0
  21. package/dist/dao/index-store.js +128 -0
  22. package/dist/dao/index-store.js.map +1 -0
  23. package/dist/dao/index.d.ts +12 -31
  24. package/dist/dao/index.js +50 -404
  25. package/dist/dao/index.js.map +1 -1
  26. package/dist/dao/memory-store.js +2 -10
  27. package/dist/dao/memory-store.js.map +1 -1
  28. package/dist/dao/memory-tree-renderer.d.ts +22 -0
  29. package/dist/dao/memory-tree-renderer.js +75 -0
  30. package/dist/dao/memory-tree-renderer.js.map +1 -0
  31. package/dist/prompts/index.d.ts +26 -0
  32. package/dist/prompts/index.js +103 -0
  33. package/dist/prompts/index.js.map +1 -0
  34. package/dist/refine/adapter.d.ts +6 -0
  35. package/dist/refine/adapter.js +28 -0
  36. package/dist/refine/adapter.js.map +1 -0
  37. package/dist/refine/constants.d.ts +35 -0
  38. package/dist/refine/constants.js +107 -0
  39. package/dist/refine/constants.js.map +1 -0
  40. package/dist/refine/extractor.d.ts +12 -0
  41. package/dist/refine/extractor.js +122 -0
  42. package/dist/refine/extractor.js.map +1 -0
  43. package/dist/refine/store.d.ts +23 -0
  44. package/dist/refine/store.js +153 -0
  45. package/dist/refine/store.js.map +1 -0
  46. package/dist/refine/types.d.ts +56 -0
  47. package/dist/refine/types.js +5 -0
  48. package/dist/refine/types.js.map +1 -0
  49. package/dist/refined-manager.d.ts +14 -56
  50. package/dist/refined-manager.js +27 -341
  51. package/dist/refined-manager.js.map +1 -1
  52. package/dist/resources/index.d.ts +15 -0
  53. package/dist/resources/index.js +134 -0
  54. package/dist/resources/index.js.map +1 -0
  55. package/dist/server.js +46 -2
  56. package/dist/server.js.map +1 -1
  57. package/dist/theme-manager.d.ts +1 -0
  58. package/dist/theme-manager.js +7 -0
  59. package/dist/theme-manager.js.map +1 -1
  60. package/dist/tools/context-tools.d.ts +16 -51
  61. package/dist/tools/context-tools.js +303 -55
  62. package/dist/tools/context-tools.js.map +1 -1
  63. package/dist/tools/index.d.ts +5 -827
  64. package/dist/tools/index.js +23 -354
  65. package/dist/tools/index.js.map +1 -1
  66. package/dist/tools/memory-tools.d.ts +4 -60
  67. package/dist/tools/memory-tools.js +129 -79
  68. package/dist/tools/memory-tools.js.map +1 -1
  69. package/dist/tools/system-tools.d.ts +3 -34
  70. package/dist/tools/system-tools.js +110 -33
  71. package/dist/tools/system-tools.js.map +1 -1
  72. package/dist/tools/theme-tools.d.ts +3 -31
  73. package/dist/tools/theme-tools.js +101 -22
  74. package/dist/tools/theme-tools.js.map +1 -1
  75. package/dist/tools/types.d.ts +21 -0
  76. package/dist/tools/types.js +13 -0
  77. package/dist/tools/types.js.map +1 -0
  78. package/dist/types.d.ts +11 -2
  79. package/dist/utils/action-entities.d.ts +16 -0
  80. package/dist/utils/action-entities.js +35 -0
  81. package/dist/utils/action-entities.js.map +1 -0
  82. package/dist/utils/date.d.ts +11 -0
  83. package/dist/utils/date.js +13 -0
  84. package/dist/utils/date.js.map +1 -0
  85. package/dist/utils/file-helpers.d.ts +10 -0
  86. package/dist/utils/file-helpers.js +28 -0
  87. package/dist/utils/file-helpers.js.map +1 -0
  88. package/dist/utils/headings.d.ts +5 -0
  89. package/dist/utils/headings.js +21 -0
  90. package/dist/utils/headings.js.map +1 -0
  91. package/dist/utils/search.d.ts +17 -0
  92. package/dist/utils/search.js +60 -0
  93. package/dist/utils/search.js.map +1 -0
  94. package/dist/utils/tools.d.ts +5 -0
  95. package/dist/utils/tools.js +10 -0
  96. package/dist/utils/tools.js.map +1 -0
  97. package/dist/version.d.ts +1 -1
  98. package/dist/version.js +1 -1
  99. package/dist/vis/api.d.ts +117 -0
  100. package/dist/vis/api.js +426 -0
  101. package/dist/vis/api.js.map +1 -0
  102. package/dist/vis/auto-start.d.ts +12 -0
  103. package/dist/vis/auto-start.js +87 -0
  104. package/dist/vis/auto-start.js.map +1 -0
  105. package/dist/vis/server.d.ts +14 -0
  106. package/dist/vis/server.js +337 -0
  107. package/dist/vis/server.js.map +1 -0
  108. package/dist/vis/static/api.js +57 -0
  109. package/dist/vis/static/app.js +1468 -0
  110. package/dist/vis/static/index.html +25 -0
  111. package/dist/vis/static/state.js +26 -0
  112. package/dist/vis/static/style.css +1553 -0
  113. package/dist/vis/static/utils/helpers.js +94 -0
  114. package/dist/vis/static/utils/markdown.js +81 -0
  115. package/dist/vis-cli.d.ts +7 -0
  116. package/dist/vis-cli.js +140 -0
  117. package/dist/vis-cli.js.map +1 -0
  118. package/docs/0.agent-memory-market-research.md +354 -0
  119. package/docs/1.memory-system-proposal-for-kimi-code.md +688 -0
  120. package/docs/2.memory-architecture-overview.md +417 -0
  121. package/docs/3.memory-skill-prompt-design.md +430 -0
  122. package/docs/4.kimi-code-native-evolution-roadmap.md +559 -0
  123. package/docs/5.decision-guard-design-notes.md +500 -0
  124. package/docs/ARCHITECTURE.md +2 -2
  125. package/docs/design-story.md +350 -0
  126. package/docs/three-layer-memory-model.md +153 -0
  127. package/docs/three-layer-memory-model.zh-CN.md +153 -0
  128. package/package.json +12 -6
  129. package/README.zh-CN.md +0 -292
@@ -0,0 +1,559 @@
1
+ > 本文档基于此前向 kimi-code 提交的架构建议:
2
+ > - `memory-system-proposal-for-kimi-code.md`:三层模型 + Markdown 优先 + 主题追溯
3
+ > - `memory-architecture-overview.md`:原生集成四层架构
4
+ > - `memory-skill-prompt-design.md`:Memory Skill Prompt 设计
5
+ >
6
+ > 本文性质:架构建议 / 讨论稿,与具体项目无关。
7
+
8
+ ---
9
+
10
+ ## 一、从最小入侵到原生内化
11
+
12
+ 此前向 kimi-code 提交的建议采用了一种**最小入侵**路线:不改动核心代码,通过外部工具层 + Skill Prompt 提供记忆能力,以 Markdown 为载体,以 `wire.jsonl` 做对话追溯,以 `themes/` 做主题关联。
13
+
14
+ 这条路线的价值在于**可逆、可实验、低风险**。但它的天花板也很明显:复杂流程压在 Prompt 上,检索与生成脱节,无法利用 kimi-code 主进程的计算和存储优势。
15
+
16
+ 如果 kimi-code 将记忆能力原生内化,最值得深入探讨的是两个方向:
17
+
18
+ 1. **记忆蒸馏服务化**:用 Orchestrator + 权重机制,把 `organize_memories` 从 Prompt 驱动升级为规则驱动的服务
19
+ 2. **主题检索基础设施化**:在 compaction 时预计算 refined turns 和 buckets,让主题追溯从 LLM 驱动变为基础设施驱动
20
+
21
+ 这两个方向共享同一个底层目标:**让 LLM 负责语义判断和语言生成,把规则化、可缓存、可索引的工作交给 kimi-code 原生基础设施**。
22
+
23
+ > 关于主题检索低成本化后可能催生的决策守卫机制,详见 [`decision-guard-design-notes.md`](./decision-guard-design-notes.md)。
24
+
25
+ ---
26
+
27
+ ## 二、方向一:记忆蒸馏服务化
28
+
29
+ ### 2.1 当前困境:Prompt 在同时做太多事
30
+
31
+ 当前 `organize_memories` 的工作方式是:
32
+
33
+ ```text
34
+ memory/ (N 个文件,可能远超上下文窗口)
35
+
36
+
37
+ Prompt: "在 15KB 内重新组织,不丢失语义,自己决定权重"
38
+
39
+
40
+ LLM 一次性输出 essence.md
41
+ ```
42
+
43
+ LLM 被迫同时承担:理解、筛选、压缩、改写、格式控制。这导致:
44
+ - 不可解释:为什么这条进了 essence,那条没进?
45
+ - 不可复现:换模型结果不同
46
+ - 不可优化:用户说"这条很重要",系统无法响应
47
+ - 容量受限:记忆量大时无法一次处理
48
+
49
+ ### 2.2 核心思想:把蒸馏拆成"评分"与"编排"
50
+
51
+ 未来的 `organize_memories` 应该分为两层:
52
+
53
+ ```text
54
+ memory/
55
+
56
+
57
+ Scoring Engine(Orchestrator 内部)
58
+
59
+ ├── 统计工具调用次数
60
+ ├── 读取用户显式反馈
61
+ ├── 评估 folder/tag/age/update 频率
62
+ └── 输出每条记忆的 score
63
+
64
+
65
+ Tiering
66
+
67
+ ├── core-memory (score > 0.9)
68
+ ├── essence-tier (score 0.5-0.9)
69
+ ├── memory-only (score 0.15-0.5)
70
+ └── archive-tier (score < 0.15)
71
+
72
+
73
+ LLM 负责语言编排
74
+
75
+
76
+ 候选 essence.md → diff → commit
77
+ ```
78
+
79
+ **关键转变**:LLM 不再决定"留什么",只决定"怎么表达"。
80
+
81
+ ### 2.3 实现方式:权重从何而来
82
+
83
+ 权重由三类信号共同决定:
84
+
85
+ | 信号类型 | 具体维度 | 采集方式 |
86
+ |---------|---------|---------|
87
+ | 行为信号 | recall_count、search_hit、bootstrap_exposure、trace_theme_hit、tag_theme_association | 每次工具调用时计数 |
88
+ | 用户信号 | user_rating、pinned、archived | 用户显式操作 |
89
+ | 结构信号 | folder、tag、age、update_frequency、cross_reference | 文件元数据和引用关系 |
90
+
91
+ **计数实现**:
92
+
93
+ ```text
94
+ 每次记忆工具调用
95
+
96
+
97
+ 更新内存热计数器(零 IO)
98
+
99
+
100
+ 触发 flush 条件时写入 index.json:
101
+ - 累计 N 次调用
102
+ - 经过 M 分钟
103
+ - 调用 organize_memories 前
104
+ - 进程关闭前
105
+ ```
106
+
107
+ `index.json` 中每条记忆增加 `weights` 字段,成为 organize 时的一站式来源。
108
+
109
+ ### 2.4 演化可能性
110
+
111
+ #### Stage 1:轻量权重
112
+ 只统计 recall_count 和 folder/tag 类型,作为 organize 的提示线索。
113
+
114
+ #### Stage 2:完整评分
115
+ 引入多维度权重公式:
116
+
117
+ ```
118
+ score = log1p(recall_count) * 0.25
119
+ + log1p(search_hit_count) * 0.10
120
+ + (user_rating / 5) * 0.20
121
+ + (pinned ? 0.30 : 0)
122
+ + folder_weight * 0.10
123
+ + content_type_weight * 0.15
124
+ + exp(-age_days / 90) * 0.10
125
+ + log1p(update_frequency) * 0.05
126
+ + log1p(cross_reference_count) * 0.05
127
+ ```
128
+
129
+ #### Stage 3:动态学习
130
+ 根据 organize 后的实际效果反馈,自动调整权重系数。例如:
131
+ - 某条记忆被组织进 essence 后频繁被 recall → 提升其 folder_weight 或 content_type_weight 的系数
132
+ - 用户经常手动把 archive-tier 记忆恢复 → 降低 age 衰减速度
133
+
134
+ #### Stage 4:个性化权重
135
+ 不同用户/团队对同一类记忆的重视程度不同。系统可以学习:
136
+ - 某团队非常重视 `rules/`
137
+ - 某用户经常忽略 `knowledge/`
138
+ - 自动微调个人/团队的权重模型
139
+
140
+ ### 2.5 想象空间
141
+
142
+ **想象一:记忆健康仪表盘**
143
+ Agent 可以告诉用户:
144
+ > "你的 memory/ 里有 12 条 archive-tier 记忆,3 个月未被访问,建议归档。"
145
+
146
+ **想象二:自动记忆手术**
147
+ 每周自动生成一份"记忆诊断报告":
148
+ - 这 5 条记忆重复了,建议合并
149
+ - 这条决策已 6 个月未更新,但最近被频繁引用,建议 review
150
+ - 这条知识与 essence.md 中的结论矛盾
151
+
152
+ **想象三:协作记忆治理**
153
+ 多人协作时,不同成员对同一决策的评分可以聚合:
154
+ - 3 人 pinned → 权重显著上升
155
+ - 1 人 archive → 权重轻微下降
156
+ - 形成团队共识驱动的记忆优先级
157
+
158
+ ### 2.6 与方向二的衔接
159
+
160
+ 权重机制不仅影响 `memory/` 的蒸馏,也影响 `refined/` 和 `buckets/` 的处理:
161
+ - 高频引用的 refined turn 应该被优先保留和索引
162
+ - 与用户高评分 memory 相关的 bucket 应该在主题追溯时优先返回
163
+
164
+ ---
165
+
166
+ ## 三、方向二:主题检索基础设施化
167
+
168
+ ### 3.1 Turn Cluster:主题追溯的基本单位
169
+
170
+ 主题追溯不是对单条 turn 的检索,而是对**决策/事件/争论单元**的检索。
171
+
172
+ 对话中的基本单位是 **turn**(一轮对话),但一个真正的决策或讨论往往不是一条 turn 能说完的,而是由一小波连续或相关的 turns 组成。我们把这样的一小波 turns 称为 **Turn Cluster**。
173
+
174
+ ```text
175
+ Turn 12: "我觉得 Auth 应该走 JWT 方案"
176
+ Turn 13: "但 refresh token 怎么存?"
177
+ Turn 14: "我们决定用 httpOnly cookie 存 refresh"
178
+ Turn 15: "好的,前端只存 access token"
179
+
180
+
181
+ Turn Cluster: "JWT + httpOnly cookie 方案确定"
182
+ ```
183
+
184
+ 基于这个基本认识,主题追溯涉及四层材料:
185
+
186
+ | 层级 | 本质 | 作用 |
187
+ |------|------|------|
188
+ | **Turn** | 单轮对话 | 原始记录 |
189
+ | **Turn Cluster** | 语义单元,对应一个决策/事件/争论 | 主题追溯的基本单位 |
190
+ | **Bucket** | 相似 cluster 的集合 | 主题候选材料 |
191
+ | **Theme** | 命名的长期概念 | 跨 session 的主题追踪结果 |
192
+
193
+ 一个 Theme 通常由多个 Turn Clusters 组成。例如 "auth-flow" 主题可能包含 "JWT 方案确定"、"refresh token 存储"、"登录页面改造"等 clusters。
194
+
195
+ ### 3.2 当前实现:LLM 驱动下的约束与问题
196
+
197
+ 当前主题追溯的工作方式是:
198
+
199
+ ```text
200
+ User: "auth 主题怎么发展的?"
201
+
202
+
203
+ search_context("auth") 粗筛 candidate turns
204
+
205
+
206
+ refine_session_turns(LLM 逐条提炼)
207
+
208
+
209
+ tag_theme + trace_theme(LLM 聚类、命名、生成主题)
210
+
211
+
212
+ (数秒后)返回结果
213
+ ```
214
+
215
+ `search_context` 已经能基于简单关键词做粗筛,用户不需要一开始就给出精准关键词。
216
+
217
+ **为什么当前实现会这样设计**:
218
+
219
+ 这主要是由客观条件决定的。当前方案依赖 LLM 进行语义理解,而 LLM 调用成本高、延迟高。在这种约束下,系统把语义加工尽可能延后到用户查询时,只做一次性的 turn 原子级别提炼,而把 cluster 发现、bucket 归桶、theme 生成这些更上层的语义加工合并到同一个 LLM 调用中完成。
220
+
221
+ 换句话说,不是设计上的疏忽,而是在 LLM 作为唯一语义处理工具的前提下,为了控制成本和复杂度而做出的合理折中。
222
+
223
+ **这种设计带来的问题**:
224
+
225
+ - **提炼发生在查询时**:每次主题追溯都要重新调用 LLM 提炼 turns
226
+ - **延迟高、成本高**:涉及多次 LLM 调用(粗筛理解 + 逐条提炼 + 主题聚合/生成)
227
+ - **提炼结果难以跨主题复用**:按需提炼时,LLM 会在当前主题上下文中生成摘要,导致同一条 turn 的提炼产物带有主题倾向。例如一条同时涉及 auth-flow 和 security 的 turn,为 auth-flow 提炼时会突出 JWT 方案,为 security 提炼时会突出 secret 存储约束
228
+ - **关键词质量仍影响召回上限**:关键词太宽泛会召回大量噪声 turns,增加提炼负担
229
+ - **无法预计算 cluster 和 bucket**:由于 LLM 成本高,无法在 compaction 时就把 turns 组织成语义单元,导致查询时必须从零开始做聚类判断
230
+
231
+ ### 3.3 原生实现:语义分析预计算 + LLM 主题生成
232
+
233
+ 如果 kimi-code 原生引入一个低成本的语义分析服务,上述约束就可以被打破。
234
+
235
+ **触发时机**:
236
+
237
+ 语义分析服务在 **Context Compaction** 时触发,而不是在用户查询时触发。每次会话 compaction 时,系统都会对本次会话的 turns 进行 native 语义加工。
238
+
239
+ **会发生什么**:
240
+
241
+ ```text
242
+ Turn 产生
243
+
244
+
245
+ Context Compaction
246
+
247
+ ├── 提炼 turn → refined/<sessionId>.jsonl
248
+ ├── 语义分析发现 cluster → clusters/
249
+ └── 相似 cluster 归桶 → buckets/
250
+
251
+
252
+ User: "auth"
253
+
254
+
255
+ nativeQuery("auth")(毫秒级)
256
+
257
+
258
+ 返回 candidateBuckets / clusters
259
+
260
+
261
+ LLM 做主题生成:
262
+ ├── 并桶 / 拆桶
263
+ ├── 剔除不相关 clusters
264
+ ├── 从 cluster 中提取关键 turns
265
+ ├── 命名主题
266
+ └── 生成 theme 内容
267
+ ```
268
+
269
+ **怎么做**:
270
+
271
+ 语义分析服务可以采用分层实现:
272
+
273
+ - **规则层**:关键词共现、决策信号词、争论-收敛模式
274
+ - **模型层**:small model 判断讨论单元边界、生成 cluster summary
275
+ - **向量层**:embedding + 聚类,用于 bucket 归桶
276
+
277
+ 这些方法的共同特点是成本远低于 LLM(毫秒级、本地运行),因此可以在 compaction 时频繁调用。
278
+
279
+ **达到什么效果**:
280
+
281
+ - **turn、cluster、bucket 三层都预计算完成**,用户查询时不需要再提炼和聚类
282
+ - **nativeQuery 毫秒级返回候选材料**
283
+ - **LLM 只在最后一步介入**,做语义判断、编辑筛选和主题内容生成
284
+ - **同一条 turn 的中性摘要可以被多个主题复用**,避免主题偏向性
285
+
286
+ **与当前方案的对比**:
287
+
288
+ | 阶段 | 当前方案(LLM 驱动) | 原生方案(语义分析 + LLM) |
289
+ |------|---------------------|---------------------------|
290
+ | Turn 提炼 | 查询时 LLM 提炼 | compaction 时 native 提炼 |
291
+ | Cluster 发现 | 查询时 LLM 一并完成 | compaction 时 native 语义分析 |
292
+ | Bucket 归桶 | 查询时 LLM 一并完成 | compaction 时 native 聚类 |
293
+ | Theme 生成 | 查询时 LLM 完成全部工作 | 查询时 LLM 做最终主题生成(编辑、命名、关联 memory) |
294
+
295
+ **关键转变**:主题不是"查询时临时提炼"出来的,而是"从预计算材料中生成"出来的。
296
+
297
+ ### 3.4 核心概念:四层材料模型
298
+
299
+ 主题追溯涉及四层材料,每层职责清晰:
300
+
301
+ ```text
302
+ Layer 0: 原始会话记录
303
+ ┌─────────────────────────────────────────────────────────────┐
304
+ │ sessions/ │
305
+ │ ├── session-A/wire.jsonl ──► 原始 turns(含完整对话) │
306
+ │ ├── session-B/wire.jsonl │
307
+ │ └── session-C/wire.jsonl │
308
+ └─────────────────────────────────────────────────────────────┘
309
+
310
+ ▼ Context Compaction
311
+ Layer 1: 单轮摘要
312
+ ┌─────────────────────────────────────────────────────────────┐
313
+ │ refined/ │
314
+ │ ├── session-A.jsonl │
315
+ │ │ ├── turn-12: "我觉得 Auth 应该走 JWT 方案" │
316
+ │ │ ├── turn-13: "但 refresh token 怎么存?" │
317
+ │ │ ├── turn-14: "我们决定用 httpOnly cookie 存 refresh" │
318
+ │ │ └── turn-15: "好的,前端只存 access token" │
319
+ │ ├── session-B.jsonl │
320
+ │ └── session-C.jsonl │
321
+ └─────────────────────────────────────────────────────────────┘
322
+
323
+ ▼ 语义分析
324
+ Layer 2: 语义单元(决策/事件/争论)
325
+ ┌─────────────────────────────────────────────────────────────┐
326
+ │ clusters/ │
327
+ │ ├── cluster-3.json ──► turns: [A-12, A-13, A-14, A-15] │
328
+ │ │ summary: "JWT + cookie 方案确定" │
329
+ │ │ decision: true │
330
+ │ ├── cluster-8.json ──► "登录错误处理" │
331
+ │ └── cluster-12.json ──► "token 过期策略" │
332
+ └─────────────────────────────────────────────────────────────┘
333
+
334
+ ▼ 机器归桶
335
+ Layer 3: 候选材料桶
336
+ ┌─────────────────────────────────────────────────────────────┐
337
+ │ buckets/ │
338
+ │ └── bucket-7.json ──► [cluster-3, cluster-8, cluster-12] │
339
+ │ keywords: ["auth", "jwt", "cookie"] │
340
+ └─────────────────────────────────────────────────────────────┘
341
+
342
+ ▼ 用户触发 + LLM 生成主题
343
+ Layer 4: 长期主题
344
+ ┌─────────────────────────────────────────────────────────────┐
345
+ │ themes/ │
346
+ │ └── auth-flow.json ──► clusters: [3, 8, 12] │
347
+ │ memories: [memory/decisions/...] │
348
+ │ createdAt: ... │
349
+ └─────────────────────────────────────────────────────────────┘
350
+ ```
351
+
352
+ **生成链路**:
353
+
354
+ ```text
355
+ wire.jsonl
356
+
357
+ ▼ compaction
358
+ refined/<sessionId>.jsonl
359
+
360
+ ▼ 语义分析(发现决策/事件单元)
361
+ clusters/<clusterId>.json
362
+
363
+ ▼ 机器归桶(相似 cluster 分组)
364
+ buckets/<bucketId>.json
365
+
366
+ ▼ 用户触发主题追溯 + LLM 生成主题
367
+ themes/<theme>.json
368
+ ```
369
+
370
+ **四层定位表**:
371
+
372
+ | 层级 | 本质 | 生成方式 | 作用 |
373
+ |------|------|---------|------|
374
+ | **Refined Turn** | 单轮摘要 | compaction 时 native 提炼 | 保留 turn 关键信息,保持主题中性 |
375
+ | **Turn Cluster** | 语义单元,对应一个决策/事件/争论 | 语义分析从 turns 中发现 | 避免单条 turn 孤立,呈现"一波一波"的讨论节奏 |
376
+ | **Bucket** | 机器归桶,无名字 | 按 cluster 语义相似度分组 | 主题候选材料集合 |
377
+ | **Theme** | LLM/用户命名的长期概念 | 用户触发时 LLM 生成 | 跨 session 的长期主题追踪 |
378
+
379
+ ### 3.5 LLM 的角色:主题生成者
380
+
381
+ native query 返回的是**候选材料**,不是最终主题。LLM 在生成 theme 时既做编辑判断,也做内容生成:
382
+
383
+ | 操作 | 说明 | 例子 |
384
+ |------|------|------|
385
+ | **并桶** | 两个 candidate buckets 其实讲的是同一个主题 | 把 "jwt" bucket 和 "auth" bucket 合并 |
386
+ | **剔簇** | 某个 cluster 与主题无关,予以排除 | bucket 里有 "登录错误处理",但主题是 "jwt 方案",剔除 |
387
+ | **抽 turn** | 一个 cluster 里只有部分 turns 真正相关 | 从 cluster 中提取 turn-14、turn-15 写入 theme |
388
+ | **拆簇** | 一个 cluster 其实包含两个独立决策 | 把 "JWT 方案 + 登录页面改造" 拆成两个 clusters |
389
+ | **命名** | 给 theme 一个准确、稳定的名称 | 命名为 `auth-flow` 而非 `jwt-stuff` |
390
+ | **生成内容** | 把筛选后的 clusters/turns 组织成可读的主题时间线 | 输出 theme 文件,含摘要、时间线、关联 memory |
391
+
392
+ 预计算时的 turn 摘要不知道未来会被哪个主题引用,因此会尽量保持**中性、全面**,覆盖 turn 中的多个关键信息点。查询时 LLM 只需要基于这个中性摘要,按当前主题角度做**精修与组织**,而不是从头提炼。这样同一条 turn 可以服务于 auth-flow、security、frontend 等多个主题,而不会因主题偏向性损失信息。
393
+
394
+ ### 3.6 实现方式:两档预计算模式
395
+
396
+ #### 轻量模式(默认)
397
+
398
+ - **Turn 摘要**:关键词提取 + 命名实体识别 + 关键句抽取
399
+ - **Cluster 发现**:规则匹配连续 turns、决策信号词、争论-收敛模式
400
+ - **Bucket 归桶**:TF-IDF / 关键词共现 / 简单规则
401
+ - **LLM 最终生成**:并桶、剔簇、抽 turn、命名主题、关联 memory
402
+ - **资源开销**:+5 MB RAM,+0.5 KB/turn
403
+ - **延迟**:< 2ms per turn
404
+
405
+ 适合大多数 coding agent 场景。
406
+
407
+ #### 语义模式(可选)
408
+
409
+ - **Turn 摘要**:轻量 seq2seq 模型
410
+ - **Cluster 发现**:small model 判断讨论单元边界
411
+ - **Bucket 归桶**:small embedding 模型 + 向量聚类
412
+ - **LLM 最终生成**:并桶、剔簇、抽 turn、命名主题、关联 memory
413
+ - **资源开销**:+200 MB RAM(lazy mmap),+1.5 KB/turn
414
+ - **延迟**:< 5ms per turn
415
+
416
+ 适合术语复杂、历史对话量大、对召回质量要求高的场景。
417
+
418
+ **性能指标**:
419
+
420
+ | 指标 | 轻量模式 | 语义模式 | 备注 |
421
+ |------|---------|---------|------|
422
+ | Per-Turn Latency | < 2ms | < 5ms | 远低于 LLM |
423
+ | RAM Overhead | +5 MB | +200 MB (Lazy) | mmap 按需加载 |
424
+ | Disk Usage | +0.5 KB/turn | +1.5 KB/turn | `.emb.bin` 可 gitignore |
425
+ | LLM Calls (Cold Start) | 1 | 1 | 仅最终主题生成 |
426
+
427
+ ### 3.7 演化可能性
428
+
429
+ #### Stage 1:基础预计算
430
+ compaction 时生成:
431
+ - `refined/<sessionId>.jsonl`:每条 turn 的摘要、关键词、时间戳
432
+ - `clusters/<sessionId>/`:语义分析发现的决策/事件单元
433
+ - `buckets/<sessionId>/`:相似 cluster 的归桶
434
+
435
+ #### Stage 2:跨 session 聚合
436
+ 把多个 session 的 buckets / clusters 合并成 workspace 级别的主题候选池:
437
+ - 相似 clusters 跨 session 合并
438
+ - 识别跨 session 的同一个决策/争论的延续
439
+ - 生成 workspace 级别的 term → clusters 倒排索引
440
+ - 支持毫秒级 `nativeQuery(keyword)`
441
+
442
+ #### Stage 3:主动主题发现
443
+ 系统不再等用户说"追溯主题",而是自动发现值得关注的主题:
444
+ - "最近 3 个 session 都在讨论 Auth,是否生成 auth-flow 主题?"
445
+ - "PlayerState 相关讨论在增加,是否需要整理?"
446
+
447
+ #### Stage 4:主题演进分析
448
+ 不仅返回主题时间线,还能分析:
449
+ - 主题什么时候开始热起来?
450
+ - 主题下有哪些争论和决策转折?
451
+ - 哪些 memory 决策与这个主题相关?
452
+
453
+ ### 3.8 想象空间
454
+
455
+ **想象一:对话搜索引擎**
456
+ 用户可以随时问:
457
+ > "我们之前在哪次讨论里提过 factory pattern?"
458
+
459
+ 系统毫秒级返回相关 turns,而不是让用户翻历史。
460
+
461
+ **想象二:主题自动归档**
462
+ 某个主题下的讨论已经 3 个月没有更新,系统可以提示:
463
+ > "auth-flow 主题已稳定,是否归档到 memory/decisions/auth-flow?"
464
+
465
+ **想象三:冲突预警**
466
+ 当用户新提出的方案与某个历史主题的结论矛盾时:
467
+ > "你现在的方案与 2 个月前 auth-flow 主题中的决策冲突,是否查看?"
468
+
469
+ **想象四:项目回忆录**
470
+ 项目 milestone 时,自动生成:
471
+ > "这是 Auth 模块从提出到定案的完整演进:…"
472
+
473
+ ### 3.9 三个关键设计点
474
+
475
+ #### 三层材料:Bucket / Turn Cluster / Theme
476
+
477
+ 生成顺序:`turns → 语义分析 → clusters → 归桶 → buckets → 用户触发 → theme`。
478
+
479
+ 一个 Theme 可能是 "auth-flow",它下面有 "JWT 方案确定"、"refresh token 存储"、"登录页面改造"等多个 Turn Clusters。
480
+
481
+ #### 关键词从"召回条件"变为"导航入口"
482
+
483
+ 预计算之前,关键词既要负责召回,又要帮助 LLM 理解主题范围。预计算之后,关键词只负责"指向哪个方向",native query 通过同义词扩展、cluster 摘要和 bucket 归桶自动召回相关材料。即使用户只说 `auth`,系统也能把 `login`、`jwt`、`token`、`refresh` 等相关 clusters 一起带回。
484
+
485
+ #### LLM 是主题生成者
486
+
487
+ native query 返回的是**候选材料**,不是最终主题。LLM 在生成 theme 时既做编辑判断(并桶、剔簇、抽 turn、拆簇),也做内容生成(命名主题、撰写时间线、关联 memory)。这种设计让 LLM 专注于**语义判断、编辑筛选和语言生成**,而不用从零整理材料。
488
+
489
+ ---
490
+
491
+ ## 四、两个方向的协同
492
+
493
+ ```text
494
+ memory/
495
+
496
+
497
+ Orchestrator + 权重评分
498
+
499
+ ├──► essence.md
500
+
501
+ └──► core-memory
502
+
503
+
504
+ 指导 refined turn 的保留优先级
505
+
506
+
507
+ compaction 预计算 refined + clusters + buckets
508
+
509
+
510
+ nativeQuery 毫秒级返回材料
511
+
512
+
513
+ LLM 编辑主题(并桶/剔簇/抽 turn)+ 命名 + 关联 memory
514
+
515
+
516
+ themes/
517
+
518
+
519
+ 反馈更新权重(recall_count、trace_theme_hit)
520
+ ```
521
+
522
+ **协同点**:
523
+ - 权重机制决定哪些 memory 会影响主题生成时的上下文
524
+ - 主题追溯的命中次数会反过来提升相关 memory 的权重
525
+ - 高频主题可以沉淀为新的 memory/ 条目
526
+ - 形成"记忆使用 → 权重更新 → 蒸馏优化 → 主题更准确"的正循环
527
+
528
+ ---
529
+
530
+ ## 五、结论
531
+
532
+ 最小入侵方案已经验证了记忆系统对 coding agent 一致性的价值。原生内化后的下一步,不是堆砌更多功能,而是把两个核心流程做深:
533
+
534
+ 1. **记忆蒸馏服务化**:让 `organize_memories` 从"Prompt 压榨 LLM"进化为"Orchestrator 基于权重做材料准备 + LLM 做语言编排"
535
+ 2. **主题检索基础设施化**:让主题追溯从"查询时 LLM 提炼"进化为"compaction 时预计算材料 + 查询时 native 召回 + LLM 做主题生成"
536
+
537
+ 这两个方向共同指向一个目标:**让 LLM 负责语义判断和语言生成,把规则化、可缓存、可索引的工作交给 kimi-code 原生基础设施**。
538
+
539
+ 主题检索基础设施化也为更高阶的能力(如决策守卫)提供了数据基础。关于决策守卫的深入探讨,详见 [`decision-guard-design-notes.md`](./decision-guard-design-notes.md)。
540
+
541
+ 最现实的落地路径:
542
+
543
+ ```text
544
+ 现在: 最小入侵方案(Prompt 驱动)
545
+
546
+ Phase 1: Orchestrator + 权重评分 + 热计数器
547
+
548
+ Phase 2: compaction 预计算 refined turns + clusters + buckets(轻量模式)
549
+
550
+ Phase 3: 语义模式可选 + 跨 session bucket 聚合 + 主动主题发现
551
+
552
+ Phase 4: 记忆健康仪表盘 + 主题演进分析 + 协作记忆治理
553
+ ```
554
+
555
+ ---
556
+
557
+ *文档性质:架构建议 / 讨论稿*
558
+ *生成时间:2026-06-23*
559
+ *与任何具体项目无关*