@smyslenny/agent-memory 4.2.0 → 4.3.1
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/README.md +1 -1
- package/dist/bin/agent-memory.js +66 -9
- package/dist/bin/agent-memory.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +65 -9
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.js +66 -9
- package/dist/mcp/server.js.map +1 -1
- package/package.json +2 -2
- package/docs/design/.next-id +0 -1
- package/docs/design/0004-agent-memory-integration.md +0 -316
- package/docs/design/0005-reranker-api-integration.md +0 -276
- package/docs/design/0006-multi-provider-embedding.md +0 -196
- package/docs/design/0014-memory-core-dedup.md +0 -722
- package/docs/design/0015-v4-overhaul.md +0 -631
- package/docs/design/0016-v41-warm-boot-surface-emotion.md +0 -228
- package/docs/design/TEMPLATE.md +0 -67
- package/docs/roadmap/integration-plan-v1.md +0 -139
- package/docs/roadmap/memory-architecture.md +0 -168
- package/docs/roadmap/warm-boot.md +0 -135
|
@@ -1,631 +0,0 @@
|
|
|
1
|
-
# DD-0015: AgentMemory v4 Overhaul —— 从 OpenClaw 补充层到通用 AI Agent 记忆层
|
|
2
|
-
|
|
3
|
-
**Status:** Draft
|
|
4
|
-
**Author:** Noah (GPT-5.4 sub-agent)
|
|
5
|
-
**Date:** 2026-03-09
|
|
6
|
-
**Repo:** agent-memory
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## 1. Background / 背景
|
|
11
|
-
|
|
12
|
-
agent-memory 当前发布版本为 `@smyslenny/agent-memory@3.1.0`。它已经具备一套很有辨识度的记忆模型:
|
|
13
|
-
|
|
14
|
-
- 类型化记忆:`identity / emotion / knowledge / event`
|
|
15
|
-
- Ebbinghaus 衰减模型:`R = e^(-t/S)` + recall 续期
|
|
16
|
-
- URI 路径寻址
|
|
17
|
-
- Write Guard 四准则门控(specificity / novelty / relevance / coherence)
|
|
18
|
-
- `boot` 叙事格式
|
|
19
|
-
- 多 agent 隔离
|
|
20
|
-
- SQLite + MCP + CLI 的本地优先架构
|
|
21
|
-
|
|
22
|
-
这些能力让 agent-memory 在“结构化写入”和“生命周期管理”上已经有了可用基础,但它在日常高频使用中仍然没有成为 AI agent 的**主力记忆层**。核心原因不是“不会存”,而是“搜不准、去不掉、连不顺、接不广”。
|
|
23
|
-
|
|
24
|
-
### 1.1 真实使用中的核心痛点
|
|
25
|
-
|
|
26
|
-
| 优先级 | 痛点 | 当前症状 | 根因 |
|
|
27
|
-
|---|---|---|---|
|
|
28
|
-
| P0 | BM25 检索太弱,语义搜索缺失 | 搜“喜欢什么风格”找不到“禁止蓝紫渐变、玻璃拟态” | 仅靠 FTS5/BM25;ROADMAP 中 `search/semantic.ts` 只停留在占位 |
|
|
29
|
-
| P0 | Write Guard 去重粗糙 | 近义重复反复写入,浪费 200 条槽位 | 相似度只看 BM25 排名与 `token_count * 1.5` 阈值 |
|
|
30
|
-
| P1 | `reflect` 周期脆弱 | 外部 cron 调 `reflect` 时中途失败,恢复依赖重试 | 当前缺少 job log、phase checkpoint、端到端原子性 |
|
|
31
|
-
| P1 | `surface` 只会按 vitality 排序 | 不能根据当前对话/任务动态浮现相关记忆 | 只读浮现没有上下文建模 |
|
|
32
|
-
| P1 | 只有 stdio MCP + CLI,没有 HTTP API | mcporter 每次 spawn 进程,延迟高 | transport 只有 stdio,缺少常驻服务接口 |
|
|
33
|
-
| P2 | README / 文档不够 OSS 友好 | 看起来像 OpenClaw 专用配件,不像通用组件 | 文档定位、示例、benchmark 都过度依赖当前使用场景 |
|
|
34
|
-
|
|
35
|
-
### 1.2 次要但持续累积的问题
|
|
36
|
-
|
|
37
|
-
- 200 条硬上限的淘汰策略过于粗糙,主要靠最低 vitality 清理
|
|
38
|
-
- recall / surface 缺少“是否真的有用”的反馈信号
|
|
39
|
-
- ingest watcher 因重复过多而被关闭,说明自动摄取与去重策略不匹配
|
|
40
|
-
- 中文分词虽然接了 jieba,但与 FTS5 的协同仍偏浅层
|
|
41
|
-
|
|
42
|
-
### 1.3 为什么这是 v4 的转折点
|
|
43
|
-
|
|
44
|
-
v3 的定位更像“OpenClaw memory-core 的结构化补充层”。这在单一宿主内是成立的,但如果目标是把 agent-memory 做成**独立可用的通用 AI agent 记忆层**,那就必须满足下面三个条件:
|
|
45
|
-
|
|
46
|
-
1. **检索必须足够好用**:至少让 agent 愿意优先调用 `recall`
|
|
47
|
-
2. **写入必须足够节制**:不能让近义重复快速挤满配额
|
|
48
|
-
3. **接口必须足够通用**:不能只适配 stdio MCP + OpenClaw 工作流
|
|
49
|
-
|
|
50
|
-
因此,v4 不是一次“小修小补”,而是一次**产品定位回正**:
|
|
51
|
-
|
|
52
|
-
> 让 agent-memory 从“依赖宿主生态才好用的结构化索引层”,升级为“脱离 OpenClaw 也成立的通用 AI Agent Memory Layer”。
|
|
53
|
-
|
|
54
|
-
### 1.4 需要保留并增强的部分
|
|
55
|
-
|
|
56
|
-
以下能力已经是 agent-memory 的差异化资产,v4 不应推翻,而应作为新能力的稳定地基:
|
|
57
|
-
|
|
58
|
-
- Ebbinghaus 衰减模型与 recall 续期
|
|
59
|
-
- 类型化记忆与 priority 分层
|
|
60
|
-
- URI 路径系统
|
|
61
|
-
- Write Guard 的四准则门控框架
|
|
62
|
-
- `boot` 的叙事性输出
|
|
63
|
-
- 多 agent 隔离
|
|
64
|
-
- SQLite-first、本地优先的部署体验
|
|
65
|
-
|
|
66
|
-
---
|
|
67
|
-
|
|
68
|
-
## 2. Goals / 目标
|
|
69
|
-
|
|
70
|
-
1. **让 agent-memory 成为独立可用的通用 AI agent 记忆层**,不再依赖 OpenClaw 才能成立
|
|
71
|
-
2. **优先解决 recall 检索质量问题**,补齐 optional semantic retrieval,使 `recall` 再次成为主入口
|
|
72
|
-
3. **升级 Write Guard 为 semantic-aware 去重与合并系统**,减少近义重复与槽位浪费
|
|
73
|
-
4. **提升 lifecycle 可靠性**,让 `reflect` 具备 job 级可恢复性、明确的职责边界和可观测性
|
|
74
|
-
5. **新增 HTTP/SSE API**,降低进程桥接开销,支持更多 agent 框架直接集成
|
|
75
|
-
6. **把 `surface` 从静态排序升级为 context-aware surfacing**,让记忆能按当前任务浮现,而不是只按存量分数堆叠
|
|
76
|
-
7. **重写 README / 文档 / benchmark / examples**,把 OpenClaw 从“默认前提”降级为“一个集成示例”
|
|
77
|
-
8. **保持向后兼容的迁移路径**:未启用 semantic layer 的用户,仍能保留 BM25-only 运行方式
|
|
78
|
-
|
|
79
|
-
---
|
|
80
|
-
|
|
81
|
-
## 3. Non-Goals / 非目标
|
|
82
|
-
|
|
83
|
-
- **不做多模态记忆**:不在 v4 引入 image/audio/video embedding 或 multimodal recall
|
|
84
|
-
- **不做分布式存储**:不把 v4 设计成需要独立向量集群或远程数据库才能运行
|
|
85
|
-
- **不改核心衰减模型**:Ebbinghaus `R = e^(-t/S)`、priority 分层和 recall 续期保持不变
|
|
86
|
-
- **不把 agent-memory 重构成完整 workflow engine**:job/log 只服务于 memory lifecycle,不扩展为通用调度系统
|
|
87
|
-
- **不把 OpenClaw 集成彻底删除**:只是去耦并降级为 optional integration,而不是移除支持
|
|
88
|
-
- **不在 v4 恢复或扩展多跳知识图谱/多模态 graph reasoning**:优先级低于检索、去重、API 通用化
|
|
89
|
-
|
|
90
|
-
---
|
|
91
|
-
|
|
92
|
-
## 4. Proposal / 方案
|
|
93
|
-
|
|
94
|
-
### 4.1 方案概述
|
|
95
|
-
|
|
96
|
-
v4 采用**分阶段重构**,先修“检索”和“去重”这两个最影响日常体验的核心问题,再补 transport、surface 和文档生态。
|
|
97
|
-
|
|
98
|
-
整体原则:
|
|
99
|
-
|
|
100
|
-
1. **Optional semantics**:语义检索是可选增强,不是强制依赖
|
|
101
|
-
2. **SQLite-first**:默认仍然单机可运行,不要求外部向量服务
|
|
102
|
-
3. **One application core, many transports**:记忆逻辑与 MCP / CLI / HTTP 解耦
|
|
103
|
-
4. **Backward-compatible by default**:未配置 embedding 时自动退回 BM25-only
|
|
104
|
-
5. **Observability over magic**:每一步去重、合并、reflect 都要能解释、能追踪、能回退
|
|
105
|
-
|
|
106
|
-
### 4.2 方案对比
|
|
107
|
-
|
|
108
|
-
| 维度 | 方案 A:继续 BM25-only,微调 tokenizer | 方案 B:可选向量层 + 语义去重 + HTTP/SSE(本方案) | 方案 C:强制外部向量 DB + 全面服务化 |
|
|
109
|
-
|---|---|---|---|
|
|
110
|
-
| 检索提升 | 低 | **高** | 高 |
|
|
111
|
-
| 部署复杂度 | 低 | **中** | 高 |
|
|
112
|
-
| 对现有用户冲击 | 低 | **可控** | 高 |
|
|
113
|
-
| 通用性 | 中 | **高** | 高 |
|
|
114
|
-
| 本地优先 | 高 | **高** | 低 |
|
|
115
|
-
| 实施节奏 | 快,但收益有限 | **分阶段,收益最大** | 慢且风险高 |
|
|
116
|
-
|
|
117
|
-
选择**方案 B**。
|
|
118
|
-
|
|
119
|
-
理由:
|
|
120
|
-
|
|
121
|
-
- 仅靠 tokenizer 和 BM25 阈值微调,无法解决“近义表达搜不到 / 去不掉”的根问题
|
|
122
|
-
- 强制外部向量库会破坏 agent-memory 的 SQLite-first 特性,也会显著抬高接入门槛
|
|
123
|
-
- 可选向量层 + 默认本地运行,可以兼顾检索效果、部署体验与通用性
|
|
124
|
-
|
|
125
|
-
### 4.3 目标架构
|
|
126
|
-
|
|
127
|
-
```text
|
|
128
|
-
┌───────────────────────────────┐
|
|
129
|
-
│ Clients │
|
|
130
|
-
│ CLI | MCP stdio | HTTP | SSE │
|
|
131
|
-
└──────────────┬────────────────┘
|
|
132
|
-
│
|
|
133
|
-
┌──────────────▼────────────────┐
|
|
134
|
-
│ Application Core │
|
|
135
|
-
│ remember | recall | surface │
|
|
136
|
-
│ guard | reflect | boot | stats │
|
|
137
|
-
└───────┬───────────┬───────────┘
|
|
138
|
-
│ │
|
|
139
|
-
┌───────────────▼───┐ ┌──▼────────────────────┐
|
|
140
|
-
│ Retrieval Core │ │ Lifecycle Core │
|
|
141
|
-
│ BM25 + Vector + │ │ decay / tidy / govern │
|
|
142
|
-
│ Hybrid Fusion │ │ job log / checkpoint │
|
|
143
|
-
└───────────────┬───┘ └──┬────────────────────┘
|
|
144
|
-
│ │
|
|
145
|
-
┌─────────────▼───────────▼─────────────┐
|
|
146
|
-
│ SQLite │
|
|
147
|
-
│ memories / paths / embeddings / jobs │
|
|
148
|
-
│ feedback / schema_meta │
|
|
149
|
-
└─────────────┬───────────┬─────────────┘
|
|
150
|
-
│ │
|
|
151
|
-
┌──────────────▼───┐ ┌───▼─────────────────┐
|
|
152
|
-
│ EmbeddingProvider │ │ VectorIndexAdapter │
|
|
153
|
-
│ OpenAI-compatible │ │ sqlite-blob default │
|
|
154
|
-
│ local-http │ │ optional ANN later │
|
|
155
|
-
└───────────────────┘ └─────────────────────┘
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
### 4.4 Phase 1:可选向量检索层(优先级最高)
|
|
159
|
-
|
|
160
|
-
#### 4.4.1 目标
|
|
161
|
-
|
|
162
|
-
在不破坏现有 BM25 路径的前提下,为 `recall` 增加 **optional semantic retrieval**,支持:
|
|
163
|
-
|
|
164
|
-
- OpenAI / OpenAI-compatible embedding provider
|
|
165
|
-
- local embedding provider(如 Ollama / 本地兼容 HTTP 服务)
|
|
166
|
-
- BM25 + vector hybrid ranking
|
|
167
|
-
- lazy backfill / reindex
|
|
168
|
-
- 未配置 provider 时自动退回 BM25-only
|
|
169
|
-
|
|
170
|
-
#### 4.4.2 设计要点
|
|
171
|
-
|
|
172
|
-
**(1) Provider 抽象**
|
|
173
|
-
|
|
174
|
-
```ts
|
|
175
|
-
interface EmbeddingProvider {
|
|
176
|
-
id: string;
|
|
177
|
-
model: string;
|
|
178
|
-
dimension: number;
|
|
179
|
-
embed(texts: string[]): Promise<number[][]>;
|
|
180
|
-
healthcheck?(): Promise<void>;
|
|
181
|
-
}
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
首批支持两类 provider:
|
|
185
|
-
|
|
186
|
-
- `openai-compatible`:OpenAI、兼容 OpenAI 的 embedding endpoint
|
|
187
|
-
- `local-http`:本地 embedding 服务(例如 Ollama 或自建兼容接口)
|
|
188
|
-
|
|
189
|
-
这比硬编码具体厂商更通用,也更符合“独立 AI agent 记忆层”的目标。
|
|
190
|
-
|
|
191
|
-
**(2) VectorIndex 选型**
|
|
192
|
-
|
|
193
|
-
Phase 1 默认**不引入外部向量数据库**。
|
|
194
|
-
|
|
195
|
-
默认实现:
|
|
196
|
-
|
|
197
|
-
- 复用现有 `embeddings` 表存储向量(BLOB)
|
|
198
|
-
- 采用 in-process cosine similarity 扫描作为默认 vector search
|
|
199
|
-
- 仅在数据规模进一步放大后,预留 `sqlite-vec` / ANN adapter 接口
|
|
200
|
-
|
|
201
|
-
原因:
|
|
202
|
-
|
|
203
|
-
- agent-memory 的目标数据规模仍然偏“小而精”,默认场景没有必要为了向量搜索引入独立服务
|
|
204
|
-
- 这样可以把 semantic retrieval 做成真正的 optional capability,而不是新的运维负担
|
|
205
|
-
|
|
206
|
-
**(3) Hybrid Ranking**
|
|
207
|
-
|
|
208
|
-
`recall` 查询流程从:
|
|
209
|
-
|
|
210
|
-
```text
|
|
211
|
-
query -> BM25 -> priority/vitality weighting -> recordAccess
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
升级为:
|
|
215
|
-
|
|
216
|
-
```text
|
|
217
|
-
query
|
|
218
|
-
├─ lexical path -> BM25 topK
|
|
219
|
-
├─ semantic path -> vector topK (if enabled)
|
|
220
|
-
└─ fusion -> Weighted RRF + business priors
|
|
221
|
-
-> final rerank
|
|
222
|
-
-> recordAccess
|
|
223
|
-
```
|
|
224
|
-
|
|
225
|
-
融合策略采用 **Weighted Reciprocal Rank Fusion (WRRF)**,避免直接混合 BM25 score 与 cosine score 的尺度问题。
|
|
226
|
-
|
|
227
|
-
建议公式:
|
|
228
|
-
|
|
229
|
-
```text
|
|
230
|
-
fusion_score = 0.45 / (60 + bm25_rank)
|
|
231
|
-
+ 0.45 / (60 + vector_rank)
|
|
232
|
-
+ 0.05 * priority_prior
|
|
233
|
-
+ 0.05 * vitality
|
|
234
|
-
```
|
|
235
|
-
|
|
236
|
-
其中:
|
|
237
|
-
|
|
238
|
-
- `bm25_rank` / `vector_rank` 缺失时视为 0 贡献
|
|
239
|
-
- `priority_prior` 归一化到 `[0,1]`
|
|
240
|
-
- `vitality` 直接作为轻量业务先验,不覆盖检索主排序
|
|
241
|
-
|
|
242
|
-
**(4) Embedding 生命周期**
|
|
243
|
-
|
|
244
|
-
- `remember` / `ingest` 成功写入后,仅标记“embedding dirty”
|
|
245
|
-
- 实际 embedding 生成可同步执行,也可 lazy/job 化
|
|
246
|
-
- `recall` 发现缺 embedding 时,不阻塞主查询;仅对已有向量做 semantic branch
|
|
247
|
-
- 提供 `reindex` CLI / HTTP API 做全量或增量重建
|
|
248
|
-
|
|
249
|
-
**(5) CJK 检索基线继续保留**
|
|
250
|
-
|
|
251
|
-
v4 不废弃当前 jieba + FTS5 方案,而是把它从“唯一召回路径”降为“lexical branch”。这意味着:
|
|
252
|
-
|
|
253
|
-
- 中文分词与 BM25 仍然重要
|
|
254
|
-
- 但 recall 的上限不再被 tokenizer 质量单点限制
|
|
255
|
-
|
|
256
|
-
#### 4.4.3 模块变更建议
|
|
257
|
-
|
|
258
|
-
| 模块 | 变更 |
|
|
259
|
-
|---|---|
|
|
260
|
-
| `src/search/semantic.ts` | 从占位文件升级为真实语义检索入口 |
|
|
261
|
-
| `src/search/hybrid.ts` | 新增 Hybrid recall / WRRF 融合逻辑 |
|
|
262
|
-
| `src/search/providers.ts` | 统一 openai-compatible / local-http provider |
|
|
263
|
-
| `src/core/memory.ts` | 增加 embedding dirty / content hash 对齐逻辑 |
|
|
264
|
-
| `src/mcp/server.ts` | `recall` 调用共享 retrieval service,不再内联 BM25-only 逻辑 |
|
|
265
|
-
| `src/bin/agent-memory.ts` | 新增 `reindex` / provider healthcheck 命令 |
|
|
266
|
-
|
|
267
|
-
#### 4.4.4 预期收益
|
|
268
|
-
|
|
269
|
-
- 解决“关键词不重合但语义相近”的 recall 失效问题
|
|
270
|
-
- 让 agent-memory 的 `recall` 再次具备主力价值
|
|
271
|
-
- 为后续 semantic dedup、context-aware surface 提供统一底座
|
|
272
|
-
|
|
273
|
-
### 4.5 Phase 2:Write Guard 升级(语义去重 + 更智能合并)
|
|
274
|
-
|
|
275
|
-
#### 4.5.1 目标
|
|
276
|
-
|
|
277
|
-
把当前“BM25 排名 + 动态阈值”的粗粒度去重,升级为 **semantic-aware dedup & merge pipeline**。
|
|
278
|
-
|
|
279
|
-
要解决的问题不是“纯重复”,而是:
|
|
280
|
-
|
|
281
|
-
- 同义改写
|
|
282
|
-
- 轻微扩写
|
|
283
|
-
- 同一知识点的不同表达
|
|
284
|
-
- 同一事件的重复记录
|
|
285
|
-
- 同一偏好的不同措辞
|
|
286
|
-
|
|
287
|
-
#### 4.5.2 新的 Guard Pipeline
|
|
288
|
-
|
|
289
|
-
```text
|
|
290
|
-
1. exact hash dedup
|
|
291
|
-
2. URI conflict check
|
|
292
|
-
3. hybrid candidate recall (topN)
|
|
293
|
-
4. semantic dedup scoring
|
|
294
|
-
5. merge policy selection
|
|
295
|
-
6. four-criterion gate
|
|
296
|
-
7. add / skip / update / merge
|
|
297
|
-
```
|
|
298
|
-
|
|
299
|
-
其中第 3~5 步是 v4 核心升级。
|
|
300
|
-
|
|
301
|
-
**候选召回**:
|
|
302
|
-
|
|
303
|
-
- 优先在同 `agent_id`、同 `type`、同 URI domain 内召回候选
|
|
304
|
-
- 使用 Phase 1 的 hybrid retrieval 作为 Guard 的候选集入口
|
|
305
|
-
- 对 `event` 类型额外参考时间窗口(例如 24h / 7d)
|
|
306
|
-
|
|
307
|
-
**去重得分建议公式**:
|
|
308
|
-
|
|
309
|
-
```text
|
|
310
|
-
dedup_score = 0.50 * semantic_similarity
|
|
311
|
-
+ 0.20 * lexical_overlap
|
|
312
|
-
+ 0.15 * uri_scope_match
|
|
313
|
-
+ 0.10 * entity_overlap
|
|
314
|
-
+ 0.05 * time_proximity
|
|
315
|
-
```
|
|
316
|
-
|
|
317
|
-
建议阈值:
|
|
318
|
-
|
|
319
|
-
- `>= 0.93`:视为 near-exact duplicate,`skip` 或 `update metadata`
|
|
320
|
-
- `0.82 ~ 0.93`:进入 `merge` 分支
|
|
321
|
-
- `< 0.82`:默认 `add`
|
|
322
|
-
|
|
323
|
-
#### 4.5.3 Merge 策略不能再是简单字符串拼接
|
|
324
|
-
|
|
325
|
-
当前 merge 近似:
|
|
326
|
-
|
|
327
|
-
```text
|
|
328
|
-
旧内容 + "\n\n[Updated] " + 新内容
|
|
329
|
-
```
|
|
330
|
-
|
|
331
|
-
这对 `knowledge` 和 `identity` 基本不可读,也会不断恶化检索质量。v4 需要按类型做 merge policy:
|
|
332
|
-
|
|
333
|
-
| 类型 | 默认策略 | 说明 |
|
|
334
|
-
|---|---|---|
|
|
335
|
-
| `identity` | canonical replace / patch | 保持单一权威表述,旧措辞作为 alias/source 留痕 |
|
|
336
|
-
| `emotion` | append evidence | 保留情绪时间线,但避免同义重复刷屏 |
|
|
337
|
-
| `knowledge` | synthesize canonical statement | 合并同义表达、保留关键约束词与 alias |
|
|
338
|
-
| `event` | time-window compact | 同一事件窗口内合并;不同时间的相似事件应分开保存 |
|
|
339
|
-
|
|
340
|
-
建议引入 `merge.ts` 或 `guard/merge-policy.ts`,输出结构化 `MergePlan`:
|
|
341
|
-
|
|
342
|
-
```ts
|
|
343
|
-
interface MergePlan {
|
|
344
|
-
strategy: "replace" | "append_evidence" | "synthesize" | "compact_timeline";
|
|
345
|
-
content: string;
|
|
346
|
-
aliases?: string[];
|
|
347
|
-
notes?: string[];
|
|
348
|
-
}
|
|
349
|
-
```
|
|
350
|
-
|
|
351
|
-
#### 4.5.4 reflect 可靠性一起修,不再让维护链条继续脆弱
|
|
352
|
-
|
|
353
|
-
虽然本 Phase 的主题是 Write Guard,但去重、合并、归档本质上都属于“写入质量与生命周期可靠性”的同一问题,因此 v4 应该在这里同步补上 reflect 的 job 化能力。
|
|
354
|
-
|
|
355
|
-
新增:
|
|
356
|
-
|
|
357
|
-
- `maintenance_jobs` 表:记录 `job_id / phase / status / checkpoint / error / started_at / finished_at`
|
|
358
|
-
- `reflect.ts` 编排器:统一驱动 `decay / tidy / govern`
|
|
359
|
-
- phase checkpoint:`all` 模式下支持从失败点恢复
|
|
360
|
-
- 职责边界明确化:
|
|
361
|
-
- `tidy`:压缩、合并、归档
|
|
362
|
-
- `govern`:配额治理、孤儿清理、策略淘汰
|
|
363
|
-
|
|
364
|
-
这可以直接解决:
|
|
365
|
-
|
|
366
|
-
- `reflect` 中途失败只能靠外部盲重试的问题
|
|
367
|
-
- `tidy` / `govern` 角色重叠的问题
|
|
368
|
-
- 200 条上限下只按最低 vitality 粗暴清理的问题
|
|
369
|
-
|
|
370
|
-
#### 4.5.5 配额淘汰策略升级
|
|
371
|
-
|
|
372
|
-
当容量接近上限时,治理不应只看 vitality,而应看“保留价值”。
|
|
373
|
-
|
|
374
|
-
建议引入 eviction score:
|
|
375
|
-
|
|
376
|
-
```text
|
|
377
|
-
eviction_score = 0.40 * (1 - vitality)
|
|
378
|
-
+ 0.20 * redundancy_score
|
|
379
|
-
+ 0.20 * age_score
|
|
380
|
-
+ 0.10 * low_feedback_penalty
|
|
381
|
-
+ 0.10 * low_priority_penalty
|
|
382
|
-
```
|
|
383
|
-
|
|
384
|
-
高 `eviction_score` 的候选优先被 compact / archive / drop。
|
|
385
|
-
|
|
386
|
-
这样可以把“重复但活得还行”的垃圾记忆排到更靠前的位置,而不是只砍最老最弱的 event。
|
|
387
|
-
|
|
388
|
-
### 4.6 Phase 3:HTTP/SSE API + 更好的 surface(上下文感知浮现)
|
|
389
|
-
|
|
390
|
-
#### 4.6.1 目标
|
|
391
|
-
|
|
392
|
-
让 agent-memory 从“只能通过 stdio MCP 桥接调用的本地工具”,升级为“可被任意 agent runtime 直接接入的通用服务”。
|
|
393
|
-
|
|
394
|
-
同时,把 `surface` 从静态 top-N 排序升级为 **context-aware surfacing**。
|
|
395
|
-
|
|
396
|
-
#### 4.6.2 Transport 重构
|
|
397
|
-
|
|
398
|
-
v4 应拆出共享 application service,避免 `mcp/server.ts` 继续承担全部业务逻辑。
|
|
399
|
-
|
|
400
|
-
建议结构:
|
|
401
|
-
|
|
402
|
-
```text
|
|
403
|
-
src/app/
|
|
404
|
-
remember.ts
|
|
405
|
-
recall.ts
|
|
406
|
-
surface.ts
|
|
407
|
-
reflect.ts
|
|
408
|
-
status.ts
|
|
409
|
-
|
|
410
|
-
src/transports/
|
|
411
|
-
mcp.ts
|
|
412
|
-
http.ts
|
|
413
|
-
sse.ts
|
|
414
|
-
```
|
|
415
|
-
|
|
416
|
-
MCP、CLI、HTTP 三个入口只做:
|
|
417
|
-
|
|
418
|
-
- 参数校验
|
|
419
|
-
- 调用 app service
|
|
420
|
-
- 格式化返回
|
|
421
|
-
|
|
422
|
-
而不是各自实现一套业务。
|
|
423
|
-
|
|
424
|
-
#### 4.6.3 HTTP API 设计
|
|
425
|
-
|
|
426
|
-
建议新增:
|
|
427
|
-
|
|
428
|
-
| 方法 | 路径 | 用途 |
|
|
429
|
-
|---|---|---|
|
|
430
|
-
| `GET` | `/health` | 健康检查 |
|
|
431
|
-
| `GET` | `/v1/status` | 统计信息 |
|
|
432
|
-
| `POST` | `/v1/memories` | `remember` |
|
|
433
|
-
| `POST` | `/v1/recall` | 语义/混合检索 |
|
|
434
|
-
| `POST` | `/v1/surface` | 上下文浮现 |
|
|
435
|
-
| `POST` | `/v1/reflect` | 触发 lifecycle job |
|
|
436
|
-
| `POST` | `/v1/reindex` | 触发 embedding backfill |
|
|
437
|
-
| `POST` | `/v1/feedback` | 记录 recall/surface 是否有用 |
|
|
438
|
-
| `GET` | `/v1/jobs/:id` | 查看 job 状态 |
|
|
439
|
-
|
|
440
|
-
SSE 主要用于:
|
|
441
|
-
|
|
442
|
-
- `reflect` 长任务进度
|
|
443
|
-
- `reindex` 进度
|
|
444
|
-
- watcher / ingest / maintenance 事件流(可选)
|
|
445
|
-
|
|
446
|
-
#### 4.6.4 surface 升级为 context-aware
|
|
447
|
-
|
|
448
|
-
当前 `surface` 主要依赖关键词 OR 命中和 `priority × vitality` 排序。v4 需要让它理解“当前正在做什么”。
|
|
449
|
-
|
|
450
|
-
建议新输入:
|
|
451
|
-
|
|
452
|
-
```ts
|
|
453
|
-
interface SurfaceInput {
|
|
454
|
-
query?: string;
|
|
455
|
-
task?: string;
|
|
456
|
-
recent_turns?: string[];
|
|
457
|
-
intent?: "factual" | "preference" | "temporal" | "planning" | "design";
|
|
458
|
-
types?: Array<"identity" | "emotion" | "knowledge" | "event">;
|
|
459
|
-
limit?: number;
|
|
460
|
-
record_feedback?: boolean;
|
|
461
|
-
}
|
|
462
|
-
```
|
|
463
|
-
|
|
464
|
-
新排序建议:
|
|
465
|
-
|
|
466
|
-
```text
|
|
467
|
-
surface_score = 0.35 * semantic_score
|
|
468
|
-
+ 0.20 * lexical_score
|
|
469
|
-
+ 0.15 * task_match
|
|
470
|
-
+ 0.10 * vitality
|
|
471
|
-
+ 0.10 * priority_prior
|
|
472
|
-
+ 0.10 * feedback_score
|
|
473
|
-
```
|
|
474
|
-
|
|
475
|
-
关键差异:
|
|
476
|
-
|
|
477
|
-
- `surface` 默认仍然**不记录 access**,避免污染衰减模型
|
|
478
|
-
- 但可以单独记录 `feedback`,区分“被展示过”和“真的有用过”
|
|
479
|
-
- 返回结果需要附带 `reason codes`,例如:
|
|
480
|
-
- `semantic:ui-style`
|
|
481
|
-
- `type:knowledge`
|
|
482
|
-
- `task:design`
|
|
483
|
-
- `feedback:reinforced`
|
|
484
|
-
|
|
485
|
-
这样 `surface` 才能真正服务于:
|
|
486
|
-
|
|
487
|
-
- 对话上下文注入
|
|
488
|
-
- 任务导向提示
|
|
489
|
-
- 设计偏好浮现
|
|
490
|
-
- 长期偏好/身份记忆的动态补全
|
|
491
|
-
|
|
492
|
-
### 4.7 Phase 4:文档/README 大修 + 通用化
|
|
493
|
-
|
|
494
|
-
#### 4.7.1 目标
|
|
495
|
-
|
|
496
|
-
把 agent-memory 从“作者自己会用”的项目,升级为“别人看一眼就知道怎么接、值不值得接”的 OSS 项目。
|
|
497
|
-
|
|
498
|
-
#### 4.7.2 文档重构方向
|
|
499
|
-
|
|
500
|
-
**README 首页应该回答 5 个问题:**
|
|
501
|
-
|
|
502
|
-
1. 这个项目是什么?
|
|
503
|
-
2. 它和向量数据库/普通 RAG/记忆摘要有什么不同?
|
|
504
|
-
3. 什么时候应该用它?
|
|
505
|
-
4. 最短 5 分钟如何跑起来?
|
|
506
|
-
5. 怎么接入我的 agent runtime?
|
|
507
|
-
|
|
508
|
-
**文档结构建议:**
|
|
509
|
-
|
|
510
|
-
```text
|
|
511
|
-
docs/
|
|
512
|
-
architecture/
|
|
513
|
-
overview.md
|
|
514
|
-
retrieval.md
|
|
515
|
-
lifecycle.md
|
|
516
|
-
integrations/
|
|
517
|
-
openclaw.md
|
|
518
|
-
langchain.md
|
|
519
|
-
autogen.md
|
|
520
|
-
crewai.md
|
|
521
|
-
benchmarks/
|
|
522
|
-
retrieval.md
|
|
523
|
-
dedup.md
|
|
524
|
-
lifecycle.md
|
|
525
|
-
examples/
|
|
526
|
-
node-http/
|
|
527
|
-
python-http/
|
|
528
|
-
mcp-stdio/
|
|
529
|
-
```
|
|
530
|
-
|
|
531
|
-
#### 4.7.3 必须补齐的内容
|
|
532
|
-
|
|
533
|
-
- 架构图(写路径、读路径、生命周期路径)
|
|
534
|
-
- benchmark:
|
|
535
|
-
- 中文/英文 recall benchmark
|
|
536
|
-
- paraphrase dedup benchmark
|
|
537
|
-
- reflect/reindex reliability benchmark
|
|
538
|
-
- examples:
|
|
539
|
-
- 纯 HTTP 接入
|
|
540
|
-
- MCP stdio 接入
|
|
541
|
-
- LangChain / AutoGen / CrewAI 最小示例
|
|
542
|
-
- migration guide:`v3 -> v4`
|
|
543
|
-
- OpenClaw 集成文档单独下沉,不再挤占首页叙事
|
|
544
|
-
|
|
545
|
-
#### 4.7.4 通用化原则
|
|
546
|
-
|
|
547
|
-
- README 默认不再假设用户使用 OpenClaw
|
|
548
|
-
- “memory/*.md + MEMORY.md” 模式从产品定义改为一个 optional workflow
|
|
549
|
-
- 所有环境变量、命令示例优先使用通用 naming 与 generic runtime 场景
|
|
550
|
-
- OpenClaw 只作为一个“实践良好的宿主示例”保留
|
|
551
|
-
|
|
552
|
-
### 4.8 Schema / 兼容性建议
|
|
553
|
-
|
|
554
|
-
为降低 v4 风险,数据库变更应尽量采取**增量迁移**:
|
|
555
|
-
|
|
556
|
-
| 表 / 字段 | 变更 |
|
|
557
|
-
|---|---|
|
|
558
|
-
| `embeddings` | 增加 `content_hash` / `provider_id` / `status`(或等价元数据) |
|
|
559
|
-
| `maintenance_jobs` | 新增,记录 `reflect/reindex` 等后台任务 |
|
|
560
|
-
| `feedback_events` | 新增,记录 recall/surface 的 usefulness 信号 |
|
|
561
|
-
| `memories` | 如需保留 canonical/alias 信息,可优先走附表而不是直接改 content 主结构 |
|
|
562
|
-
|
|
563
|
-
兼容策略:
|
|
564
|
-
|
|
565
|
-
- 原有 MCP tool 名保持可用
|
|
566
|
-
- 原有 CLI 基础命令保持可用
|
|
567
|
-
- 若无 embedding provider,语义检索路径自动禁用
|
|
568
|
-
- 新 HTTP/SSE API 为 additive,不替代现有 MCP
|
|
569
|
-
- 旧库升级后不强制全量 reindex,可 lazy backfill
|
|
570
|
-
|
|
571
|
-
---
|
|
572
|
-
|
|
573
|
-
## 5. Risks / 风险
|
|
574
|
-
|
|
575
|
-
| 风险 | 影响 | 缓解措施 |
|
|
576
|
-
|---|---|---|
|
|
577
|
-
| Embedding 依赖增加复杂度 | 增加配置、网络、成本与故障面 | 语义层保持 optional;默认仍可 BM25-only 运行;提供 provider healthcheck 与 clear fallback |
|
|
578
|
-
| 向量存储选型失误 | 过早引入重型基础设施,破坏 SQLite-first 体验 | Phase 1 默认采用 SQLite BLOB + in-process cosine;ANN/外部向量库延后为可选 adapter |
|
|
579
|
-
| Backward compatibility 破坏现有 MCP/CLI 调用 | 现有用户升级困难 | 保持现有工具名与基础参数;新增能力尽量 additive;提供 `v3 -> v4` migration guide |
|
|
580
|
-
| 语义去重误判导致“该保留的被合并/覆盖” | 数据质量受损,用户失去信任 | merge 采用 explainable score + typed policy;高风险 merge 提供 conservative fallback;保留 audit log |
|
|
581
|
-
| Hybrid retrieval 提高延迟 | recall 变慢,影响在线 agent 交互 | provider timeout、query cache、topK 限制、lazy semantic branch;provider 不可用时即时降级 |
|
|
582
|
-
| reflect job 化后实现复杂度上升 | 生命周期逻辑更难维护 | 引入单独 `reflect.ts` 编排层和 job state machine,避免把恢复逻辑塞进 transport 层 |
|
|
583
|
-
| feedback 信号被滥用或稀疏 | 排序被噪声污染 | feedback 只作为轻量辅助特征,不覆盖 semantic/lexical 主分数;支持过期衰减 |
|
|
584
|
-
| 文档大修投入大但短期不显眼 | 影响开发节奏 | 文档 Phase 4 独立推进,不阻塞 Phase 1/2 的核心价值修复 |
|
|
585
|
-
|
|
586
|
-
---
|
|
587
|
-
|
|
588
|
-
## 6. Test Plan / 测试方案
|
|
589
|
-
|
|
590
|
-
- [ ] **Unit:** `EmbeddingProvider` 抽象支持 openai-compatible / local-http,两者在 provider 不可用时能正确 fallback
|
|
591
|
-
- [ ] **Unit:** Hybrid retrieval 的 WRRF 融合逻辑在 BM25-only / vector-only / dual-path 三种模式下结果稳定
|
|
592
|
-
- [ ] **Unit:** `recall` 对中文近义查询能命中语义相关 memory(包含“风格”→“蓝紫渐变/玻璃拟态”类用例)
|
|
593
|
-
- [ ] **Unit:** `Write Guard` 对 near-duplicate paraphrase 正确判定 `skip` / `merge` / `add`
|
|
594
|
-
- [ ] **Unit:** typed merge policy 对 `identity` / `knowledge` / `event` 输出不同 merge 行为
|
|
595
|
-
- [ ] **Unit:** eviction score 能优先清理“高冗余低价值”记忆,而不是只看最低 vitality
|
|
596
|
-
- [ ] **Integration:** `remember -> embedding dirty -> reindex -> recall` 全链路可用
|
|
597
|
-
- [ ] **Integration:** `reflect phase=all` 在中途故障后可通过 job checkpoint 恢复
|
|
598
|
-
- [ ] **Integration:** MCP 与 HTTP API 使用同一 app service,返回语义保持一致
|
|
599
|
-
- [ ] **Integration:** SSE 能持续输出 `reflect` / `reindex` 进度与最终状态
|
|
600
|
-
- [ ] **Benchmark:** 中文/英文 recall benchmark(关键词不重合、语义相近场景)
|
|
601
|
-
- [ ] **Benchmark:** paraphrase dedup benchmark(偏好、风格、约束、事件四类)
|
|
602
|
-
- [ ] **Benchmark:** `reflect` reliability benchmark(注入失败、重复执行、恢复执行)
|
|
603
|
-
- [ ] **Manual:** LangChain / AutoGen / CrewAI / OpenClaw 四类示例均可跑通最小集成
|
|
604
|
-
- [ ] **Manual:** 无 embedding provider 环境下,v4 仍可作为 BM25-only + MCP/CLI 运行
|
|
605
|
-
|
|
606
|
-
---
|
|
607
|
-
|
|
608
|
-
## 7. Rollback Plan / 回滚方案
|
|
609
|
-
|
|
610
|
-
1. **语义层可一键关闭**:若 embedding provider 不稳定或效果不佳,关闭 semantic feature flag 后自动退回 BM25-only
|
|
611
|
-
2. **HTTP/SSE 可独立关闭**:保留现有 MCP stdio 作为稳定回退路径
|
|
612
|
-
3. **Schema 采用增量迁移**:新增表/字段不破坏旧数据;必要时可忽略新表继续运行核心功能
|
|
613
|
-
4. **Guard 策略可降级**:若 semantic dedup 误判,回退到 conservative 模式(仅 exact hash + URI conflict + 四准则)
|
|
614
|
-
5. **Lifecycle 编排可回退**:保留单 phase 手动执行能力,在 job 编排出问题时仍能单独跑 `decay/tidy/govern`
|
|
615
|
-
6. **Git 回滚清晰**:v4 各 Phase 尽量拆分提交,便于按阶段 `git revert`
|
|
616
|
-
|
|
617
|
-
---
|
|
618
|
-
|
|
619
|
-
## 8. Decision Log / 决策变更记录
|
|
620
|
-
|
|
621
|
-
| 日期 | 变更 | 原因 |
|
|
622
|
-
|------|------|------|
|
|
623
|
-
| 2026-03-09 | 语义检索采用 optional layer,而不是强制外部向量服务 | 保持 SQLite-first、本地优先与低接入门槛 |
|
|
624
|
-
| 2026-03-09 | Hybrid retrieval 融合默认选 Weighted RRF,而非直接混合 BM25/cosine 原始分数 | 避免不同打分尺度难以校准,提升实现稳定性 |
|
|
625
|
-
| 2026-03-09 | Write Guard 升级与 reflect job 化放在同一阶段统筹设计 | 去重、合并、归档、治理本质上属于同一条“写入质量/生命周期可靠性”链路 |
|
|
626
|
-
| 2026-03-09 | HTTP/SSE 与 MCP 共享 application core,不在 transport 层复制业务逻辑 | 避免多接口并存后逻辑漂移 |
|
|
627
|
-
| 2026-03-09 | 文档 Phase 明确把 OpenClaw 从“默认前提”降级为“集成示例” | 目标是让 agent-memory 成为独立可用的通用 AI agent 记忆层 |
|
|
628
|
-
|
|
629
|
-
---
|
|
630
|
-
|
|
631
|
-
_Generated by DD workflow · GPT-5.4 sub-agent_
|