kimi-code-memory-mcp-server 0.1.1 → 0.1.2
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 +14 -1
- package/README.en.md +342 -0
- package/README.md +214 -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 +19 -0
- package/dist/refine/store.js +139 -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 +10 -56
- package/dist/refined-manager.js +22 -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/tools/context-tools.d.ts +16 -51
- package/dist/tools/context-tools.js +247 -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 +86 -32
- package/dist/tools/system-tools.js.map +1 -1
- package/dist/tools/theme-tools.d.ts +3 -31
- package/dist/tools/theme-tools.js +78 -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 +4 -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/vis/api.d.ts +82 -0
- package/dist/vis/api.js +212 -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 +103 -0
- package/dist/vis/server.js.map +1 -0
- package/dist/vis/static/app.js +395 -0
- package/dist/vis/static/index.html +95 -0
- package/dist/vis/static/style.css +707 -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
package/dist/vis-cli.js
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CLI entry point for `npx kimi-memory-vis`.
|
|
4
|
+
*
|
|
5
|
+
* Launches a local web dashboard that visualizes the workspace memory.
|
|
6
|
+
*/
|
|
7
|
+
import fs from 'fs';
|
|
8
|
+
import path from 'path';
|
|
9
|
+
import open from 'open';
|
|
10
|
+
import { getStoreRoot } from './config.js';
|
|
11
|
+
import { computeWorkspaceId } from './utils/paths.js';
|
|
12
|
+
import { IndexDao } from './dao/index.js';
|
|
13
|
+
import { MemoryStore } from './dao/memory-store.js';
|
|
14
|
+
import { ThemeManager } from './theme-manager.js';
|
|
15
|
+
import { RefinedManager } from './refined-manager.js';
|
|
16
|
+
import { startVisServer } from './vis/server.js';
|
|
17
|
+
const MCP_SERVER_PORT = 58627;
|
|
18
|
+
const DEFAULT_VIS_PORT = 58628;
|
|
19
|
+
function parseArgs(argv) {
|
|
20
|
+
let port = DEFAULT_VIS_PORT;
|
|
21
|
+
let openBrowser = true;
|
|
22
|
+
let workspaceOverride;
|
|
23
|
+
for (let i = 0; i < argv.length; i++) {
|
|
24
|
+
const arg = argv[i];
|
|
25
|
+
if (arg === '--port' || arg === '-p') {
|
|
26
|
+
const next = argv[++i];
|
|
27
|
+
if (next) {
|
|
28
|
+
const parsed = parseInt(next, 10);
|
|
29
|
+
if (!isNaN(parsed))
|
|
30
|
+
port = parsed;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else if (arg === '--no-open') {
|
|
34
|
+
openBrowser = false;
|
|
35
|
+
}
|
|
36
|
+
else if (arg === '--workspace' || arg === '-w') {
|
|
37
|
+
const next = argv[++i];
|
|
38
|
+
if (next)
|
|
39
|
+
workspaceOverride = next;
|
|
40
|
+
}
|
|
41
|
+
else if (arg === '--help' || arg === '-h') {
|
|
42
|
+
printHelp();
|
|
43
|
+
process.exit(0);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return { port, openBrowser, workspaceOverride };
|
|
47
|
+
}
|
|
48
|
+
function printHelp() {
|
|
49
|
+
console.log(`kimi-memory-vis — Visualize your workspace memory.
|
|
50
|
+
|
|
51
|
+
Usage:
|
|
52
|
+
npx kimi-memory-vis [options]
|
|
53
|
+
|
|
54
|
+
Options:
|
|
55
|
+
--port <number> Port to run the dashboard on (default: ${DEFAULT_VIS_PORT})
|
|
56
|
+
--no-open Do not open the browser automatically
|
|
57
|
+
--workspace <path> Use a different workspace directory instead of the current one
|
|
58
|
+
-h, --help Show this help message
|
|
59
|
+
`);
|
|
60
|
+
}
|
|
61
|
+
function resolveWorkspace(args) {
|
|
62
|
+
const cwd = args.workspaceOverride
|
|
63
|
+
? path.resolve(args.workspaceOverride).replace(/\\/g, '/')
|
|
64
|
+
: process.cwd().replace(/\\/g, '/');
|
|
65
|
+
const workspaceId = computeWorkspaceId(cwd);
|
|
66
|
+
const storeRoot = path.join(getStoreRoot(), workspaceId);
|
|
67
|
+
return { cwd, workspaceId, storeRoot };
|
|
68
|
+
}
|
|
69
|
+
async function detectMcpServer(port) {
|
|
70
|
+
try {
|
|
71
|
+
const controller = new AbortController();
|
|
72
|
+
const timeout = setTimeout(() => controller.abort(), 500);
|
|
73
|
+
const res = await fetch(`http://127.0.0.1:${port}`, { signal: controller.signal });
|
|
74
|
+
clearTimeout(timeout);
|
|
75
|
+
return res.ok;
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function createContext(cwd, workspaceId, storeRoot) {
|
|
82
|
+
for (const dir of ['memory', 'notes', 'essence', 'themes', 'refined']) {
|
|
83
|
+
fs.mkdirSync(path.join(storeRoot, dir), { recursive: true });
|
|
84
|
+
}
|
|
85
|
+
const indexDao = new IndexDao(storeRoot);
|
|
86
|
+
const memoryStore = new MemoryStore(storeRoot);
|
|
87
|
+
const themeManager = new ThemeManager(path.join(storeRoot, 'themes'));
|
|
88
|
+
const refinedManager = new RefinedManager(path.join(storeRoot, 'refined'));
|
|
89
|
+
return {
|
|
90
|
+
cwd,
|
|
91
|
+
workspaceId,
|
|
92
|
+
storeRoot,
|
|
93
|
+
indexDao,
|
|
94
|
+
memoryStore,
|
|
95
|
+
themeManager,
|
|
96
|
+
refinedManager,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
async function main() {
|
|
100
|
+
const args = parseArgs(process.argv.slice(2));
|
|
101
|
+
const { cwd, workspaceId, storeRoot } = resolveWorkspace(args);
|
|
102
|
+
if (!fs.existsSync(storeRoot)) {
|
|
103
|
+
fs.mkdirSync(storeRoot, { recursive: true });
|
|
104
|
+
}
|
|
105
|
+
const ctx = createContext(cwd, workspaceId, storeRoot);
|
|
106
|
+
await ctx.indexDao.reconcileIndex();
|
|
107
|
+
const mcpRunning = await detectMcpServer(MCP_SERVER_PORT);
|
|
108
|
+
const server = startVisServer({
|
|
109
|
+
ctx,
|
|
110
|
+
port: args.port,
|
|
111
|
+
hostname: '127.0.0.1',
|
|
112
|
+
onReady: (url) => {
|
|
113
|
+
console.log(`\n kimi-memory-vis running at ${url}`);
|
|
114
|
+
console.log(` Workspace: ${cwd}`);
|
|
115
|
+
console.log(` Store: ${storeRoot}`);
|
|
116
|
+
if (mcpRunning) {
|
|
117
|
+
console.log(` MCP server detected at http://127.0.0.1:${MCP_SERVER_PORT}`);
|
|
118
|
+
}
|
|
119
|
+
if (args.openBrowser) {
|
|
120
|
+
open(url).catch((err) => {
|
|
121
|
+
console.error(` Could not open browser: ${err.message}`);
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
process.on('SIGINT', () => {
|
|
127
|
+
console.log('\n Shutting down...');
|
|
128
|
+
ctx.refinedManager.close();
|
|
129
|
+
server.close(() => process.exit(0));
|
|
130
|
+
});
|
|
131
|
+
process.on('SIGTERM', () => {
|
|
132
|
+
ctx.refinedManager.close();
|
|
133
|
+
server.close(() => process.exit(0));
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
main().catch((err) => {
|
|
137
|
+
console.error(`Fatal error: ${err instanceof Error ? err.message : String(err)}`);
|
|
138
|
+
process.exit(1);
|
|
139
|
+
});
|
|
140
|
+
//# sourceMappingURL=vis-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vis-cli.js","sourceRoot":"","sources":["../src/vis-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
# Agent 记忆系统:主流实现与理论调研
|
|
2
|
+
|
|
3
|
+
> 版本:v1.0
|
|
4
|
+
> 作者:Zehee & Kimi
|
|
5
|
+
> 日期:2026-06-23
|
|
6
|
+
> 范围:学术理论、开源框架、商业产品
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 一、调研动机
|
|
11
|
+
|
|
12
|
+
我们在设计自己的 Agent 记忆系统(三层模型 + 主题追溯)时,需要回答一个问题:
|
|
13
|
+
|
|
14
|
+
> **我们是在闭门造车,还是这些想法与业界主流方向一致?市场上有哪些值得借鉴的实现?**
|
|
15
|
+
|
|
16
|
+
本报告汇总了当前主流的理论框架、开源/商业记忆系统,并与我们的设计进行对比,找出共识、差异和潜在的创新空间。
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 二、学术理论框架
|
|
21
|
+
|
|
22
|
+
### 2.1 CoALA 框架:认知科学四分类
|
|
23
|
+
|
|
24
|
+
Princeton 2023 年提出的 CoALA 框架(arXiv:2309.02427)是当前最权威的理论基础,将 Agent 记忆分为四类:
|
|
25
|
+
|
|
26
|
+
| 记忆类型 | 人类类比 | 存储内容 | Agent 实现 |
|
|
27
|
+
|---|---|---|---|
|
|
28
|
+
| **Working(工作记忆)** | 前额叶皮层 | 当前任务上下文 | Context window / prompt |
|
|
29
|
+
| **Episodic(情景记忆)** | 海马体 | 具体事件、交互记录 | Event log + vector index |
|
|
30
|
+
| **Semantic(语义记忆)** | 大脑皮层 | 事实、知识、关系 | Knowledge graph / vector DB |
|
|
31
|
+
| **Procedural(程序记忆)** | 小脑 | 技能、流程、行为规则 | System prompt / tool definitions |
|
|
32
|
+
|
|
33
|
+
**关键洞察**:
|
|
34
|
+
- 不同类型的信息有不同的访问模式、相关性衰减曲线和存储成本
|
|
35
|
+
- 不能用单一机制(如向量库)同时服务所有记忆类型
|
|
36
|
+
- Procedural memory 在现阶段生产工具中覆盖最差,是"关键缺口"
|
|
37
|
+
|
|
38
|
+
### 2.2 "Memory in the Age of AI Agents" 三维分类
|
|
39
|
+
|
|
40
|
+
2025 年 12 月,47 位研究者发表的大型综述(arXiv:2512.13564)提出了更工程化的三维分类:
|
|
41
|
+
|
|
42
|
+
- **Forms(形式)**:token-level、parametric、latent(embeddings / hidden states)
|
|
43
|
+
- **Functions(功能)**:factual、experiential、working、procedural
|
|
44
|
+
- **Dynamics(动态)**:formation、evolution、retrieval
|
|
45
|
+
|
|
46
|
+
该综述指出的生产工具覆盖情况:
|
|
47
|
+
|
|
48
|
+
| 功能 | 代表系统 | 成熟度 |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| Factual | Mem0, Memori, pgvector | 高 |
|
|
51
|
+
| Experiential | MemPalace, Zep, LangMem | 中-高 |
|
|
52
|
+
| Working | PRIME, MemGPT paging | 中 |
|
|
53
|
+
| **Procedural** | **几乎无生产工具** | **关键缺口** |
|
|
54
|
+
|
|
55
|
+
### 2.3 对我们的映射
|
|
56
|
+
|
|
57
|
+
我们的三层模型与 CoALA + 三维分类的对应关系:
|
|
58
|
+
|
|
59
|
+
| 我们的层 | 对应学术分类 | 说明 |
|
|
60
|
+
|---|---|---|
|
|
61
|
+
| 持续认知层 | Procedural memory + 高优先级 Semantic | 身份、规则、行为框架,始终注入 |
|
|
62
|
+
| 持久化知识库 | Semantic memory + Factual memory | 事实、决策、项目知识,随用随查 |
|
|
63
|
+
| 上下文保持与回忆 | Working memory + Episodic memory | 当前对话 + 历史交互记录 |
|
|
64
|
+
| 主题追溯(横向能力) | **跨 Episodic/Semantic 的关联图** | 学术界尚未充分强调的维度 |
|
|
65
|
+
|
|
66
|
+
**结论**:我们的三层模型与主流理论高度一致,但**主题追溯**是一个尚未被充分理论化的创新点。
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## 三、开源框架实现
|
|
71
|
+
|
|
72
|
+
### 3.1 LangChain / LangGraph Memory
|
|
73
|
+
|
|
74
|
+
**历史演进**:
|
|
75
|
+
- LangChain 0.3.1(2024 年 9 月)弃用了经典 memory class
|
|
76
|
+
- 新范式:`RunnableWithMessageHistory` + LangGraph checkpointing + LangGraph stores
|
|
77
|
+
|
|
78
|
+
**经典 memory 类型(仍有参考价值)**:
|
|
79
|
+
|
|
80
|
+
| 类型 | 机制 | 适用场景 |
|
|
81
|
+
|---|---|---|
|
|
82
|
+
| ConversationBufferMemory | 完整保存近期消息 | 短对话 |
|
|
83
|
+
| ConversationSummaryMemory | LLM 总结长对话 | 长会话 |
|
|
84
|
+
| ConversationBufferWindowMemory | 滑动窗口保留最近 k 轮 | 固定预算 |
|
|
85
|
+
| ConversationEntityMemory | 提取实体关系 | CRM、关系跟踪 |
|
|
86
|
+
| VectorStoreRetrieverMemory | 向量库存储 + 语义检索 | 大规模知识库 |
|
|
87
|
+
|
|
88
|
+
**最佳实践**:组合使用 buffer + vector(hybrid memory)。
|
|
89
|
+
|
|
90
|
+
**对我们的启示**:
|
|
91
|
+
- 短期 buffer + 长期向量检索是行业共识
|
|
92
|
+
- 但我们还需要**主题图**来超越单纯的时间/语义检索
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
### 3.2 Letta(原 MemGPT)
|
|
97
|
+
|
|
98
|
+
**核心思想**:LLM-as-OS,把 context window 当作 RAM,外部存储当作磁盘。
|
|
99
|
+
|
|
100
|
+
**三层记忆**:
|
|
101
|
+
|
|
102
|
+
| 层级 | 类比 | 内容 |
|
|
103
|
+
|---|---|---|
|
|
104
|
+
| Core Memory | RAM | 始终在上下文中的小块(persona、关键用户事实) |
|
|
105
|
+
| Recall Memory | 磁盘缓存 | 可搜索的近期对话历史 |
|
|
106
|
+
| Archival Memory | 冷存储 | 长期存储,按需检索 |
|
|
107
|
+
|
|
108
|
+
**关键设计**:
|
|
109
|
+
- Agent **自己决定**什么该记住、什么该归档、什么该删除
|
|
110
|
+
- 通过 tool calls 管理记忆(`memory_insert/replace/rethink`)
|
|
111
|
+
- 上下文快满时,系统提示 agent 进行"换页"决策
|
|
112
|
+
|
|
113
|
+
**对我们的启示**:
|
|
114
|
+
- 我们的"持续认知层" ≈ Letta 的 Core Memory
|
|
115
|
+
- 我们的"持久化知识库" ≈ Letta 的 Archival Memory
|
|
116
|
+
- 但 Letta 的问题是**锁入成本高**,它拥有整个 agent loop
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
### 3.3 Mem0
|
|
121
|
+
|
|
122
|
+
**定位**:最广泛部署的 Agent 记忆层(40K+ GitHub stars)。
|
|
123
|
+
|
|
124
|
+
**架构**:
|
|
125
|
+
- **提取阶段**:LLM 从对话中提取原子化事实
|
|
126
|
+
- **管理阶段**:新事实与已有记忆对比,决定 add/update/delete/none
|
|
127
|
+
- **检索阶段**:基于 embedding 的语义搜索,返回 top-k 记忆
|
|
128
|
+
|
|
129
|
+
**特点**:
|
|
130
|
+
- 写入时较重(需要 LLM 提取和冲突消解)
|
|
131
|
+
- 读取时轻量(向量搜索)
|
|
132
|
+
- 2026 年 4 月发布"token-efficient memory algorithm",LongMemEval 达到 93.4%
|
|
133
|
+
|
|
134
|
+
**对我们的启示**:
|
|
135
|
+
- Mem0 证明了**提取 + 向量检索**在大规模用户记忆中的有效性
|
|
136
|
+
- 但它的存储是 flat facts,缺乏主题关联和演变追溯
|
|
137
|
+
- 我们的记忆 MCP 可以借鉴其提取/冲突消解机制
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
### 3.4 Zep / Graphiti
|
|
142
|
+
|
|
143
|
+
**核心**:时序知识图(temporal knowledge graph)。
|
|
144
|
+
|
|
145
|
+
**设计**:
|
|
146
|
+
- 每个 episode 被分解为 entities、edges、temporal attributes
|
|
147
|
+
- 每个事实有 validity window(何时为真、何时失效)
|
|
148
|
+
- 支持多跳遍历和时序过滤
|
|
149
|
+
|
|
150
|
+
**优势**:
|
|
151
|
+
- 擅长回答"Q3 时客户对产品的情感如何"
|
|
152
|
+
- 实体关系和时序推理强
|
|
153
|
+
|
|
154
|
+
**劣势**:
|
|
155
|
+
- 需要图数据库(Neo4j/FalkorDB/Kuzu)
|
|
156
|
+
- 检索策略相对单一
|
|
157
|
+
|
|
158
|
+
**对我们的启示**:
|
|
159
|
+
- 我们的"主题追溯"可以借鉴时序知识图的思想
|
|
160
|
+
- 但不需要一开始就上 Neo4j,可以先用 JSONL + 轻量图索引
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
### 3.5 Hindsight
|
|
165
|
+
|
|
166
|
+
**核心**:Retain → Recall → Reflect 三操作。
|
|
167
|
+
|
|
168
|
+
**存储层**:四个逻辑网络
|
|
169
|
+
- **World**:外部世界客观事实
|
|
170
|
+
- **Experience**:Agent 自身经历
|
|
171
|
+
- **Observation**:实体中性摘要
|
|
172
|
+
- **Opinion**:带置信度的主观信念
|
|
173
|
+
|
|
174
|
+
**检索**:四策略并行
|
|
175
|
+
1. Semantic search
|
|
176
|
+
2. BM25 keyword
|
|
177
|
+
3. Entity graph traversal
|
|
178
|
+
4. Temporal filtering
|
|
179
|
+
|
|
180
|
+
然后 RRF 融合 + cross-encoder rerank。
|
|
181
|
+
|
|
182
|
+
**优势**:
|
|
183
|
+
- LongMemEval 94.6%(当前 SOTA 级别)
|
|
184
|
+
- 区分事实、信念、观点,支持信念演化
|
|
185
|
+
|
|
186
|
+
**对我们的启示**:
|
|
187
|
+
- 多策略检索是高级记忆系统的标配
|
|
188
|
+
- 区分"事实"和"观点/信念"值得借鉴
|
|
189
|
+
- 我们的记忆 MCP 未来可引入 confidence / contradiction 机制
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## 四、商业产品实现
|
|
194
|
+
|
|
195
|
+
### 4.1 OpenAI ChatGPT Memory
|
|
196
|
+
|
|
197
|
+
**架构(2025 年逆向工程结果)**:
|
|
198
|
+
|
|
199
|
+
ChatGPT 上下文窗口实际上有四层:
|
|
200
|
+
1. **Session Metadata**:设备、位置、订阅等级等临时信息
|
|
201
|
+
2. **User Memory**:永久保存的用户事实(显式保存或确认)
|
|
202
|
+
3. **Recent Conversations Summary**:近期对话的简要总结(非 RAG)
|
|
203
|
+
4. **Current Session Messages**:当前对话完整记录
|
|
204
|
+
|
|
205
|
+
**关键发现**:
|
|
206
|
+
- **没有使用向量数据库或 RAG**
|
|
207
|
+
- 使用预计算的对话摘要 + 显式保存的事实
|
|
208
|
+
- 记忆存储是**显式的**,不是暗中学习用户画像
|
|
209
|
+
- 当 token 不足时,先裁剪当前会话消息,永久事实和近期摘要保留
|
|
210
|
+
|
|
211
|
+
**对我们的启示**:
|
|
212
|
+
- 简单有时打败复杂:摘要 + 显式记忆可以创造很好的个性化体验
|
|
213
|
+
- 我们的"持续认知层"应该借鉴这种"小而确定"的设计
|
|
214
|
+
- 不要过度工程化,先保证核心体验
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
### 4.2 Anthropic Claude Memory / Claude Code Auto-Memory
|
|
219
|
+
|
|
220
|
+
**Claude 消费级 Memory**:
|
|
221
|
+
- 单一文档累积用户相关笔记
|
|
222
|
+
- 用户可查看、编辑、删除单条记忆
|
|
223
|
+
- 2026 年 5 月测试 **Memory Files**:按主题/项目/上下文分多个结构化文档
|
|
224
|
+
|
|
225
|
+
**Claude Code Auto-Memory**:
|
|
226
|
+
- 本地项目目录下生成 `MEMORY.md`
|
|
227
|
+
- 前 200 行自动加载到新 session
|
|
228
|
+
- 可生成主题特定的记忆文件
|
|
229
|
+
- proactively 捕捉重复命令、解决方案、设计决策
|
|
230
|
+
- `CLAUDE.md` 是人类撰写的持久指令层,与 `MEMORY.md` 互补
|
|
231
|
+
|
|
232
|
+
**对我们的启示**:
|
|
233
|
+
- Anthropic 的设计验证了我们的三层模型:
|
|
234
|
+
- `CLAUDE.md` ≈ 持续认知层
|
|
235
|
+
- `MEMORY.md` + topic files ≈ 持久化知识库
|
|
236
|
+
- 当前会话上下文 ≈ 上下文保持与回忆
|
|
237
|
+
- **Memory Files 按主题分文档**,与我们的"主题追溯"方向一致
|
|
238
|
+
- 但 Claude Code 仍按 session 加载,没有显式的跨 session 主题图
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## 五、市场空白与创新机会
|
|
243
|
+
|
|
244
|
+
### 5.1 已充分覆盖的领域
|
|
245
|
+
|
|
246
|
+
- **Factual / Semantic memory**:Mem0、pgvector、知识图等成熟方案
|
|
247
|
+
- **Conversation buffer / working memory**:LangChain、LlamaIndex 等框架内置
|
|
248
|
+
- **Episodic storage**:MemPalace、Zep 等专注此领域
|
|
249
|
+
|
|
250
|
+
### 5.2 尚未充分覆盖的领域
|
|
251
|
+
|
|
252
|
+
| 空白领域 | 说明 | 我们的机会 |
|
|
253
|
+
|---|---|---|
|
|
254
|
+
| **Procedural memory 生产工具** | 目前多靠手写 prompt / 工具定义 | 我们的"持续认知层"可以发展成版本化的 procedural memory |
|
|
255
|
+
| **跨 session 主题追溯** | 主流系统按 session 或按事实组织,缺乏主题演进视图 | 这是我们的核心创新点 |
|
|
256
|
+
| **记忆来源审计** | 大多数系统不强调记忆来自哪轮对话、哪个 tool | 我们可以在 memory MCP 中强制记录 provenance |
|
|
257
|
+
| **人机共治的记忆管理** | 自动提取 + 人工确认/修正的混合模式 | 我们的人工+AI 协作经验可以复用 |
|
|
258
|
+
| **记忆置信度与矛盾消解** | 只有少数系统(Hindsight)支持 | 未来可扩展 |
|
|
259
|
+
|
|
260
|
+
### 5.3 我们的差异化定位
|
|
261
|
+
|
|
262
|
+
> **一个同时支持认知层、知识库、上下文回忆,并以"主题追溯"作为核心横向能力的记忆系统。**
|
|
263
|
+
|
|
264
|
+
这与市场上的主要玩家形成差异:
|
|
265
|
+
- 比 Mem0 多了主题图和来源审计
|
|
266
|
+
- 比 Zep 更轻量,不依赖图数据库
|
|
267
|
+
- 比 Letta 更少侵入,不拥有 agent loop
|
|
268
|
+
- 比 ChatGPT Memory 更结构化,支持项目/工作区作用域
|
|
269
|
+
- 比 Claude Code Memory 多了跨 session 主题关联
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## 六、设计建议调整
|
|
274
|
+
|
|
275
|
+
基于调研,对我们的三层模型提出以下调整建议:
|
|
276
|
+
|
|
277
|
+
### 6.1 持续认知层
|
|
278
|
+
|
|
279
|
+
- 借鉴 ChatGPT 的"显式事实"和 Claude 的 `CLAUDE.md`
|
|
280
|
+
- 保持小而确定,设置硬性上限
|
|
281
|
+
- 支持热加载和版本控制
|
|
282
|
+
- 可细分为:global / user / workspace / project 四级覆盖
|
|
283
|
+
|
|
284
|
+
### 6.2 持久化知识库
|
|
285
|
+
|
|
286
|
+
- 借鉴 Mem0 的提取-管理-检索流程
|
|
287
|
+
- 借鉴 Hindsight 的多策略检索(BM25 + semantic + graph + temporal)
|
|
288
|
+
- 借鉴 Zep 的时序知识图思想,但用轻量实现
|
|
289
|
+
- 强制记录 provenance:来源 session / turn / tool
|
|
290
|
+
|
|
291
|
+
### 6.3 上下文保持与回忆
|
|
292
|
+
|
|
293
|
+
- 借鉴 LangChain 的 buffer + summary 组合
|
|
294
|
+
- 主题追溯作为核心能力:
|
|
295
|
+
- 自动识别主题
|
|
296
|
+
- 建立 turn → theme → session 的图
|
|
297
|
+
- 支持 `trace_theme` 和 `summarize_theme_evolution`
|
|
298
|
+
|
|
299
|
+
### 6.4 新增:记忆生命周期管理
|
|
300
|
+
|
|
301
|
+
- 萌芽 → 活跃 → 沉淀 → 归档 → 再激活
|
|
302
|
+
- 借鉴 MemGPT 的"换页"思想:当某层记忆过大时,主动进行压缩/迁移
|
|
303
|
+
- 借鉴 Claude Dreaming:后台"睡眠"阶段整理、合并、反思记忆
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
## 七、关键共识与我们的验证
|
|
308
|
+
|
|
309
|
+
通过这次调研,我们发现我们的很多直觉与业界共识一致:
|
|
310
|
+
|
|
311
|
+
| 我们的想法 | 市场验证 |
|
|
312
|
+
|---|---|
|
|
313
|
+
| 记忆应分层 | ✅ CoALA、三维分类、Letta、ChatGPT 都分层 |
|
|
314
|
+
| 持续认知层应始终注入 | ✅ Letta Core Memory、ChatGPT User Memory |
|
|
315
|
+
| 持久化知识库应随用随查 | ✅ Mem0、Zep、Hindsight |
|
|
316
|
+
| 上下文不应只是线性衰减 | ✅ 学界/工业界都在探索超越线性的方法 |
|
|
317
|
+
| 主题/项目组织优于纯 session 组织 | ✅ Claude Memory Files 正在做这个方向 |
|
|
318
|
+
| 人机共治的记忆管理 | ✅ ChatGPT 显式确认记忆、Claude 可编辑记忆 |
|
|
319
|
+
| 记忆应有来源可追溯 | ⚠️ 只有部分系统(Hindsight、Eywa)强调,是差异化点 |
|
|
320
|
+
|
|
321
|
+
---
|
|
322
|
+
|
|
323
|
+
## 八、结论
|
|
324
|
+
|
|
325
|
+
**我们不是闭门造车。**
|
|
326
|
+
|
|
327
|
+
我们的三层模型与学术界(CoALA、三维分类)和工业界(Letta、ChatGPT、Claude Code)的主流方向高度一致。但我们在两个方向上有明显的创新空间:
|
|
328
|
+
|
|
329
|
+
1. **主题追溯**:把跨 session 的主题关联作为上下文回忆的核心能力,这是当前主流系统尚未充分探索的。
|
|
330
|
+
2. **来源审计 + 人机共治**:结合我们的协作流程经验,让记忆系统不仅自动提取,还能被人类审查、修正、追溯。
|
|
331
|
+
|
|
332
|
+
如果我们要把 memory MCP 做成有竞争力的产品,建议路线:
|
|
333
|
+
|
|
334
|
+
1. **第一阶段**:实现稳定的三层记忆 + 基础主题识别
|
|
335
|
+
2. **第二阶段**:加入 Mem0 式的自动提取和冲突消解
|
|
336
|
+
3. **第三阶段**:加入 Hindsight 式的多策略检索和信念网络
|
|
337
|
+
4. **第四阶段**:加入主题图的可视化和人机审查界面
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
## 参考来源
|
|
342
|
+
|
|
343
|
+
- CoALA: A Cognitive Architecture for Language Agents (Princeton, 2023)
|
|
344
|
+
- Memory in the Age of AI Agents (arXiv:2512.13564, Dec 2025)
|
|
345
|
+
- Anatomy of Agentic Memory: Taxonomy and Empirical Analysis (arXiv:2602.19320, Feb 2026)
|
|
346
|
+
- MemGPT / Letta: Packer et al., 2023; letta.com blog, 2025
|
|
347
|
+
- Mem0: Chhikara et al., 2025; arXiv:2504.19413
|
|
348
|
+
- Zep / Graphiti: Rasmussen et al., 2025; arXiv:2501.13956
|
|
349
|
+
- Hindsight: Latimer et al., 2025; arXiv:2512.12818
|
|
350
|
+
- ChatGPT Memory reverse engineering: llmrefs.com, 2025; shloked.com, 2025
|
|
351
|
+
- Claude Memory Files: claudeainews.com, 2026
|
|
352
|
+
- Claude Code Auto-Memory / CLAUDE.md: datastudios.org, 2026
|
|
353
|
+
- LangChain Memory: langchain docs; jetthoughts.com, 2025
|
|
354
|
+
- LlamaIndex Memory: llamaindex.ai blog, 2025
|