smart_brain 0.1.2 → 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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +15 -0
- data/MEMPAL_GUIDE.md +1074 -0
- data/README.en.md +173 -173
- data/README.md +467 -173
- data/config/brain.yml +69 -1
- data/conversation_demo.rb +438 -438
- data/db/migrate/002_turn_events_payload.sql +9 -0
- data/db/migrate/003_tiers_and_lifecycle.sql +28 -0
- data/db/migrate/004_kg_edges.sql +30 -0
- data/db/migrate/005_domains_and_memory_scopes.sql +163 -0
- data/docs/coding_todo.md +139 -0
- data/docs/context_package.md +220 -0
- data/docs/evidence_pack.md +190 -0
- data/docs/gap_vs_mempal.md +161 -0
- data/docs/mcp.md +93 -0
- data/docs/memory_types.md +278 -0
- data/docs/multi_scope_memory_refactor_plan.md +483 -0
- data/docs/multi_scope_migration.md +65 -0
- data/docs/policies.md +308 -0
- data/docs/retrieval_plan.md +231 -0
- data/docs/smartbrain_design.md +299 -0
- data/docs/user_guide.md +546 -0
- data/example.rb +91 -91
- data/examples/01_memory_basic.rb +57 -0
- data/examples/02_governance.rb +63 -0
- data/examples/03_postgres_persistence.rb +63 -0
- data/examples/04_ollama_llm.rb +69 -0
- data/examples/05_smart_rag_integration.rb +79 -0
- data/examples/06_multi_scope_memory.rb +50 -0
- data/examples/README.md +49 -0
- data/exe/smart_brain +168 -0
- data/lib/smart_brain/adapters/smart_rag/direct_client.rb +16 -5
- data/lib/smart_brain/adapters/smart_rag/http_client.rb +16 -5
- data/lib/smart_brain/adapters/smart_rag/null_client.rb +7 -2
- data/lib/smart_brain/adapters/smart_rag/scope_filter.rb +60 -0
- data/lib/smart_brain/configuration.rb +57 -0
- data/lib/smart_brain/consolidator/working_summary.rb +80 -12
- data/lib/smart_brain/context_composer/composer.rb +40 -3
- data/lib/smart_brain/contracts/retrieval_plan.rb +10 -0
- data/lib/smart_brain/contracts/scope_context.rb +46 -0
- data/lib/smart_brain/contracts/scope_ref.rb +25 -0
- data/lib/smart_brain/db.rb +109 -0
- data/lib/smart_brain/event_store/in_memory.rb +6 -2
- data/lib/smart_brain/event_store/postgres.rb +199 -0
- data/lib/smart_brain/fusion/merger.rb +31 -2
- data/lib/smart_brain/governance/briefing.rb +146 -0
- data/lib/smart_brain/governance/fact_check.rb +110 -0
- data/lib/smart_brain/governance/knowledge_graph.rb +60 -0
- data/lib/smart_brain/governance/lifecycle.rb +225 -0
- data/lib/smart_brain/governance/tiers.rb +60 -0
- data/lib/smart_brain/memory_extractor/extractor.rb +25 -7
- data/lib/smart_brain/memory_store/in_memory.rb +202 -17
- data/lib/smart_brain/memory_store/postgres.rb +500 -0
- data/lib/smart_brain/model_provider/base.rb +87 -0
- data/lib/smart_brain/model_provider/factory.rb +49 -0
- data/lib/smart_brain/model_provider/ollama.rb +60 -0
- data/lib/smart_brain/model_provider/openai.rb +60 -0
- data/lib/smart_brain/model_provider/stub.rb +26 -0
- data/lib/smart_brain/model_provider.rb +7 -0
- data/lib/smart_brain/observability/tracker.rb +39 -1
- data/lib/smart_brain/retrievers/exact_retriever.rb +6 -0
- data/lib/smart_brain/retrievers/memory_retriever.rb +59 -5
- data/lib/smart_brain/runtime.rb +288 -16
- data/lib/smart_brain/scopes/conflict_resolver.rb +67 -0
- data/lib/smart_brain/scopes/registry.rb +133 -0
- data/lib/smart_brain/scopes/resolver.rb +32 -0
- data/lib/smart_brain/server/http_app.rb +143 -0
- data/lib/smart_brain/server/mcp_server.rb +385 -0
- data/lib/smart_brain/server/service.rb +129 -0
- data/lib/smart_brain/support/levenshtein.rb +35 -0
- data/lib/smart_brain/version.rb +5 -5
- data/lib/smart_brain.rb +80 -35
- metadata +88 -36
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
## 1. 定位与总体目标
|
|
2
|
+
|
|
3
|
+
### 1.1 SmartBrain 定位
|
|
4
|
+
SmartBrain 是 **Agent Memory Runtime(记忆运行时)+ Context Composer(上下文调度器)**,负责把“对话事件、工具调用结果、引用的资源”转化为可检索、可治理、可解释的长期记忆,并在每轮对话前生成模型所需的最小充分上下文。
|
|
5
|
+
|
|
6
|
+
SmartBrain 的核心职责:
|
|
7
|
+
- 事件真相层:记录每轮对话与工具调用(可回放、可审计)
|
|
8
|
+
- 记忆抽取与巩固:从事件中抽取 profile/preferences/tasks/decisions/entities 等结构化记忆,并维护滚动摘要
|
|
9
|
+
- 检索计划:理解当前对话意图,生成 `RetrievalPlan`(多模式、预算、过滤)
|
|
10
|
+
- 多源检索与融合:从 **SmartBrain MemoryStore** 与 **SmartRAG ResourceStore** 召回证据,统一重排
|
|
11
|
+
- 上下文装配:产出 `ContextPackage`(system blocks + summary + recent turns + evidence + user_message)
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 2. 与 SmartRAG 的关系(必须清晰的边界)
|
|
16
|
+
|
|
17
|
+
### 2.1 两种“记忆”的严格分工
|
|
18
|
+
SmartBrain 将 Agent 的可用信息分为两类:
|
|
19
|
+
|
|
20
|
+
1) **Conversation Memory(对话记忆)** — SmartBrain 自己负责
|
|
21
|
+
- 原始事件:turn/messages/tool_calls/refs
|
|
22
|
+
- 结构化记忆:profile/preferences/tasks/decisions/entities/events
|
|
23
|
+
- 滚动摘要:working_summary
|
|
24
|
+
特点:强时序、强语境、更新频繁、需要写入门控与冲突管理。
|
|
25
|
+
|
|
26
|
+
2) **Resource Memory(资源记忆)** — SmartRAG 负责
|
|
27
|
+
- 文档/网页/仓库资料/规范等长期资源
|
|
28
|
+
- 分块、embedding、FTS、混合检索与(可选)rerank
|
|
29
|
+
特点:相对静态、内容大、需要高质量检索与证据定位。
|
|
30
|
+
|
|
31
|
+
> 结论:**SmartRAG 是 SmartBrain 的“资源知识库后端”**。SmartBrain 不复制 SmartRAG 的索引能力,只通过契约调用它。
|
|
32
|
+
|
|
33
|
+
### 2.2 SmartBrain 如何使用 SmartRAG(调用链)
|
|
34
|
+
SmartBrain 在 `compose_context` 时执行:
|
|
35
|
+
|
|
36
|
+
1) **意图分析**(LLM,本地 Qwen3):判定本轮是否需要资源检索(Resource Retrieval)以及检索模式与范围
|
|
37
|
+
2) 生成 `RetrievalPlan`(同一份 plan 可分发给两类检索器):
|
|
38
|
+
- 子计划 A:面向 SmartBrain MemoryStore(对话记忆库)
|
|
39
|
+
- 子计划 B:面向 SmartRAG(资源知识库)
|
|
40
|
+
3) **调用 SmartRAG**:`SmartRAG.retrieve(plan)` → `EvidencePack`(资源证据)
|
|
41
|
+
4) SmartBrain 自身检索:Exact/Semantic/Relational(对话记忆证据)
|
|
42
|
+
5) **多源融合与统一 rerank**:合并证据 → 去重 → rerank(qwen3-reranker)→ diversity 约束
|
|
43
|
+
6) **上下文装配**:形成 `ContextPackage`
|
|
44
|
+
|
|
45
|
+
### 2.3 资源写入:SmartBrain 如何把“refs/产物”送进 SmartRAG(可选但推荐)
|
|
46
|
+
SmartBrain 在 `commit_turn` 处理 refs/产物时,按策略决定是否写入 SmartRAG:
|
|
47
|
+
|
|
48
|
+
- URL:抓取快照(或保存摘要)→ `SmartRAG.ingest(...)`
|
|
49
|
+
- 文件:保存文件摘要/元信息(必要时保存副本)→ `SmartRAG.ingest(...)`
|
|
50
|
+
- 工具产物:如生成的 spec/文档/代码片段 → 作为 `memory_snapshot` 或 `manual` 资源导入 SmartRAG
|
|
51
|
+
|
|
52
|
+
> 原则:SmartRAG 只收“值得长期引用的资源”;对话流水账不进入 SmartRAG。
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 3. 存储与部署选型(默认 Postgres,SQLite 仅可选)
|
|
57
|
+
|
|
58
|
+
### 3.1 默认:PostgreSQL(推荐)
|
|
59
|
+
原因:
|
|
60
|
+
- 事件与记忆数据天然关系型(会话/轮次/引用/实体)
|
|
61
|
+
- 便于做审计、查询、迁移
|
|
62
|
+
- 可与 SmartRAG 共用同一 Postgres 实例(不同 schema 或不同数据库)
|
|
63
|
+
- 如果未来需要 pgvector,也能统一(即使 SmartBrain 自身不一定需要 pgvector)
|
|
64
|
+
|
|
65
|
+
**推荐部署拓扑:**
|
|
66
|
+
- Postgres 实例:
|
|
67
|
+
- `smart_rag` schema/db:由 SmartRAG 管理(documents/sections/fts/vector)
|
|
68
|
+
- `smart_brain` schema/db:由 SmartBrain 管理(events/memory/entities/summary)
|
|
69
|
+
- SmartBrain 通过 SmartRAG 的 Ruby API 或 HTTP endpoint 调用检索(两者择一)
|
|
70
|
+
|
|
71
|
+
### 3.2 可选:SQLite(开发/单机轻量模式)
|
|
72
|
+
SQLite 仅建议用于:
|
|
73
|
+
- 本地快速开发与 demo
|
|
74
|
+
- 轻量 CLI、无需并发、多会话规模小
|
|
75
|
+
|
|
76
|
+
**注意**:SQLite 不是设计依赖;任何 SQLite-only 的能力都必须能迁移到 Postgres。
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## 4. 总体架构(模块)
|
|
81
|
+
|
|
82
|
+
### 4.1 核心模块
|
|
83
|
+
1) **EventStore(Postgres)**
|
|
84
|
+
记录真相:turn/messages/tool_calls/refs,可回放。
|
|
85
|
+
|
|
86
|
+
2) **MemoryExtractor(LLM + 规则)**
|
|
87
|
+
从事件抽取结构化记忆(profile/preferences/tasks/decisions/entities/events)。
|
|
88
|
+
|
|
89
|
+
3) **Consolidator(摘要与冲突管理)**
|
|
90
|
+
- working_summary(滚动摘要)
|
|
91
|
+
- core memory(可钉住的稳定记忆块)
|
|
92
|
+
- 冲突合并/版本管理(superseded/retracted)
|
|
93
|
+
|
|
94
|
+
4) **RetrievalPlanner(LLM)**
|
|
95
|
+
生成 `RetrievalPlan`(多模式、预算、过滤、query expansion)。
|
|
96
|
+
|
|
97
|
+
5) **Memory Retrievers(SmartBrain 自己的检索)**
|
|
98
|
+
- ExactRetriever:FTS/BM25(messages + memory_chunks)
|
|
99
|
+
- SemanticRetriever:可选(若不想引入向量可先不做;推荐后续用 pgvector 或外部 embedding 索引)
|
|
100
|
+
- RelationalRetriever:entity_mentions 聚合(关联分析)
|
|
101
|
+
|
|
102
|
+
6) **ResourceRetriever(SmartRAG Adapter)**
|
|
103
|
+
- `retrieve(plan)`:调用 SmartRAG,得到 EvidencePack(资源证据)
|
|
104
|
+
|
|
105
|
+
7) **Fusion + Rerank**
|
|
106
|
+
- 合并多路候选 → 去重 → rerank(qwen3-reranker)→ diversity 约束
|
|
107
|
+
|
|
108
|
+
8) **ContextComposer**
|
|
109
|
+
- 按槽位装配上下文(system blocks / summary / recent turns / evidence / user)
|
|
110
|
+
|
|
111
|
+
9) **ModelProvider(本地 ollama)**
|
|
112
|
+
- complete(planner/extractor/summary)
|
|
113
|
+
- rerank(统一重排)
|
|
114
|
+
- embedding(可选:若 SmartBrain 自身做 semantic retriever)
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## 5. 数据模型(Postgres 优先)
|
|
119
|
+
|
|
120
|
+
### 5.1 EventStore
|
|
121
|
+
- `sessions(id, created_at, metadata_json)`
|
|
122
|
+
- `turns(id, session_id, seq, created_at)`
|
|
123
|
+
- `messages(id, turn_id, role, content, model, created_at, meta_json)`
|
|
124
|
+
- `tool_calls(id, turn_id, name, args_json, result_json, status, created_at)`
|
|
125
|
+
- `refs(id, turn_id, ref_type[file|url|artifact], ref_uri, ref_meta_json, created_at)`
|
|
126
|
+
|
|
127
|
+
### 5.2 MemoryStore(结构化)
|
|
128
|
+
- `memory_items(id, type, key, value_json, confidence, status, source_turn_id, updated_at)`
|
|
129
|
+
- `memory_chunks(id, memory_item_id, text, tsv, meta_json)`
|
|
130
|
+
- `tsv` 用于 FTS(中文可用 pg_jieba)
|
|
131
|
+
- embedding 字段 **不是必须**(如果引入 semantic retriever 再加)
|
|
132
|
+
|
|
133
|
+
### 5.3 Entities(关联检索)
|
|
134
|
+
- `entities(id, name, kind, canonical_id)`
|
|
135
|
+
- `entity_mentions(id, entity_id, turn_id, message_id, span_json, created_at)`
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## 6. 核心接口与运行时链路
|
|
140
|
+
|
|
141
|
+
### 6.1 compose_context
|
|
142
|
+
```ruby
|
|
143
|
+
SmartBrain.compose_context(
|
|
144
|
+
session_id:,
|
|
145
|
+
user_message:,
|
|
146
|
+
agent_state: {}
|
|
147
|
+
) => ContextPackage
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
执行步骤(建议固定顺序):
|
|
151
|
+
|
|
152
|
+
1. Load:读取 core memory + working_summary + recent_turns window
|
|
153
|
+
2. Plan:RetrievalPlanner 生成 RetrievalPlan(含是否调用 SmartRAG)
|
|
154
|
+
3. Retrieve:
|
|
155
|
+
|
|
156
|
+
* 从 SmartBrain MemoryStore 检索(exact/relational,semantic 可选)
|
|
157
|
+
* 调用 SmartRAG.retrieve(plan) 获取资源 EvidencePack(如需要)
|
|
158
|
+
4. Fuse:合并候选证据 → 去重 → rerank → diversity
|
|
159
|
+
5. Compose:输出 ContextPackage(带 debug explain,开发期强烈建议打开)
|
|
160
|
+
|
|
161
|
+
### 6.2 commit_turn
|
|
162
|
+
|
|
163
|
+
```ruby
|
|
164
|
+
SmartBrain.commit_turn(
|
|
165
|
+
session_id:,
|
|
166
|
+
turn_events:
|
|
167
|
+
) => CommitResult
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
turn_events 至少包含:
|
|
171
|
+
|
|
172
|
+
* user message
|
|
173
|
+
* assistant message(含 tool calls)
|
|
174
|
+
* tool results
|
|
175
|
+
* refs(文件、URL、artifact)
|
|
176
|
+
|
|
177
|
+
执行步骤:
|
|
178
|
+
|
|
179
|
+
1. Persist:写入 EventStore(真相层)
|
|
180
|
+
2. Extract:MemoryExtractor 抽取 memory_items(写入门控)
|
|
181
|
+
3. Consolidate:更新 working_summary / core memory / 冲突版本
|
|
182
|
+
4. Optional Ingest:按策略把 refs/产物导入 SmartRAG(作为资源知识)
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## 7. 多源检索与融合策略(关键)
|
|
187
|
+
|
|
188
|
+
### 7.1 召回来源
|
|
189
|
+
|
|
190
|
+
* **对话记忆召回**(SmartBrain):
|
|
191
|
+
|
|
192
|
+
* exact:FTS/BM25(messages/memory_chunks)
|
|
193
|
+
* relational:entities/refs 聚合
|
|
194
|
+
* semantic:可选(引入 pgvector/embedding 后开启)
|
|
195
|
+
* **资源证据召回**(SmartRAG):
|
|
196
|
+
|
|
197
|
+
* exact/semantic/hybrid:由 SmartRAG 执行
|
|
198
|
+
* 返回 EvidencePack(包含 signals)
|
|
199
|
+
|
|
200
|
+
### 7.2 融合与去重
|
|
201
|
+
|
|
202
|
+
合并候选后去重建议按以下 key:
|
|
203
|
+
|
|
204
|
+
* resource:`document_id + section_id (+chunk_index)`
|
|
205
|
+
* memory:`memory_item_id` 或 `turn_id + message_id`
|
|
206
|
+
|
|
207
|
+
去重后保留最高 `rerank_score` 或融合分。
|
|
208
|
+
|
|
209
|
+
### 7.3 统一 rerank(推荐)
|
|
210
|
+
|
|
211
|
+
即使 SmartRAG 自己有 rerank,SmartBrain 仍建议做一次“跨源统一 rerank”:
|
|
212
|
+
|
|
213
|
+
* 输入:query(用户当前问题)+ 候选 snippets
|
|
214
|
+
* 输出:统一排序分
|
|
215
|
+
好处:避免“资源证据”与“记忆证据”无法比较。
|
|
216
|
+
|
|
217
|
+
### 7.4 多样性(diversity)约束
|
|
218
|
+
|
|
219
|
+
* 同一 document 不超过 N 条
|
|
220
|
+
* 同一 source_uri/domain 不超过 M 条
|
|
221
|
+
* memory/resource 证据比例可配置(例如 40/60)
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## 8. 上下文装配(ContextPackage)
|
|
226
|
+
|
|
227
|
+
槽位推荐固定为:
|
|
228
|
+
|
|
229
|
+
1. `system_blocks`:core profile + preferences + policies
|
|
230
|
+
2. `working_summary`:滚动摘要
|
|
231
|
+
3. `recent_turns`:最近窗口
|
|
232
|
+
4. `evidence`:检索证据(资源 + 记忆,带来源)
|
|
233
|
+
5. `user_message`
|
|
234
|
+
|
|
235
|
+
SmartBrain 必须承担 token 预算责任:
|
|
236
|
+
|
|
237
|
+
* snippet 长度限制
|
|
238
|
+
* 证据条数限制
|
|
239
|
+
* recent window 轮数限制
|
|
240
|
+
* summary 长度限制
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## 9. 本地模型调用(ollama + Qwen3-*)
|
|
245
|
+
|
|
246
|
+
* Planner/Extractor/Summarizer:`qwen3`
|
|
247
|
+
* Reranker:`qwen3-reranker`
|
|
248
|
+
* Embedding(可选):`qwen3-embedding`
|
|
249
|
+
|
|
250
|
+
> 注意:SmartBrain 不需要强制自己做 embedding 检索;资源语义检索主要依赖 SmartRAG。
|
|
251
|
+
|
|
252
|
+
---
|
|
253
|
+
|
|
254
|
+
## 10. MVP 路线(与 SmartRAG 强绑定)
|
|
255
|
+
|
|
256
|
+
### MVP-1(先跑通主链路)
|
|
257
|
+
|
|
258
|
+
* EventStore(Postgres)+ commit_turn
|
|
259
|
+
* working_summary + recent window
|
|
260
|
+
* RetrievalPlanner(只生成 exact/hybrid,且“是否调用 SmartRAG”)
|
|
261
|
+
* ResourceRetriever:调用 SmartRAG.retrieve(plan) 并拿到 EvidencePack
|
|
262
|
+
* ContextComposer:输出 ContextPackage(含 evidence)
|
|
263
|
+
|
|
264
|
+
> 此阶段 SmartBrain **可以不做自身 semantic 检索**,只做 exact + relational(对话侧) + SmartRAG(资源侧)。
|
|
265
|
+
|
|
266
|
+
### MVP-2(提升对话侧检索与关联)
|
|
267
|
+
|
|
268
|
+
* memory_chunks + FTS
|
|
269
|
+
* entities + mentions(关联分析)
|
|
270
|
+
* 跨源统一 rerank + diversity
|
|
271
|
+
|
|
272
|
+
### MVP-3(精细化治理)
|
|
273
|
+
|
|
274
|
+
* 写入门控可配置化(brain.yml)
|
|
275
|
+
* 冲突与撤回
|
|
276
|
+
* refs/产物 ingest 到 SmartRAG 的策略成熟化
|
|
277
|
+
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
## 11. 交付物清单(SmartBrain)
|
|
281
|
+
|
|
282
|
+
* `docs/smartbrain_design.md`(本文)
|
|
283
|
+
* `docs/retrieval_plan.md`(契约:SmartBrain ↔ SmartRAG)
|
|
284
|
+
* `docs/context_package.md`(契约:SmartBrain → SmartBot/SmartPrompt)
|
|
285
|
+
* `docs/memory_types.md`(记忆分类与 key 规则)
|
|
286
|
+
* `docs/policies.md`(retention/summary/conflict/diversity)
|
|
287
|
+
* 代码模块:
|
|
288
|
+
|
|
289
|
+
* `lib/smart_brain/event_store/*`
|
|
290
|
+
* `lib/smart_brain/memory_extractor/*`
|
|
291
|
+
* `lib/smart_brain/retrieval_planner/*`
|
|
292
|
+
* `lib/smart_brain/retrievers/*`(含 SmartRAG adapter)
|
|
293
|
+
* `lib/smart_brain/context_composer/*`
|
|
294
|
+
* `lib/smart_brain/model_provider/*`
|
|
295
|
+
* 测试:
|
|
296
|
+
|
|
297
|
+
* `spec/compose_context_spec.rb`
|
|
298
|
+
* `spec/commit_turn_spec.rb`
|
|
299
|
+
* `spec/integration_smart_rag_adapter_spec.rb`
|