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
data/docs/user_guide.md
ADDED
|
@@ -0,0 +1,546 @@
|
|
|
1
|
+
# SmartBrain + SmartRAG 用户指南
|
|
2
|
+
|
|
3
|
+
> SmartBrain v0.1.4 · 记忆运行时 + 上下文编排器
|
|
4
|
+
> 配套 SmartRAG · 资源 RAG 后端(向量 + FTS + RRF + rerank)
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 1. 这是什么
|
|
9
|
+
|
|
10
|
+
**SmartBrain** 是一个 **Agent Memory Runtime(记忆运行时)+ Context Composer(上下文调度器)**:把对话事件、工具结果、结构化记忆转化为**可检索、可治理、可解释**的长期记忆,并在每轮对话前为模型装配「最小充分上下文」。
|
|
11
|
+
|
|
12
|
+
**SmartRAG** 是它的**资源知识库后端**:对文档/网页/仓库做分块、embedding、FTS、混合检索与 rerank。
|
|
13
|
+
|
|
14
|
+
两者分工清晰:
|
|
15
|
+
|
|
16
|
+
| | SmartBrain 管 | SmartRAG 管 |
|
|
17
|
+
|---|---|---|
|
|
18
|
+
| 对话记忆 | ✅ turn / message / tool_call / refs | — |
|
|
19
|
+
| 结构化记忆 | ✅ decisions / tasks / goals / entities / profile / cases / patterns | — |
|
|
20
|
+
| 知识治理 | ✅ 思维分层 + 生命周期 + KG + Fact-check + Brief | — |
|
|
21
|
+
| 资源检索 | 通过 adapter 调用 SmartRAG | ✅ 文档/网页/仓库 RAG |
|
|
22
|
+
|
|
23
|
+
SmartBrain 有三种用法,**共享同一套能力**:
|
|
24
|
+
1. **Ruby 库**(嵌进任意 Ruby/Agent 进程)
|
|
25
|
+
2. **CLI**(`smart_brain` 命令,shell 或 `! smart_brain ...`)
|
|
26
|
+
3. **MCP / HTTP**(Claude Code、Cursor 等 agent 原生调用)
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 2. 安装
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
cd /root/smart_brain
|
|
34
|
+
bundle install # 装依赖(sequel/pg/sinatra/puma/...)
|
|
35
|
+
bundle exec ruby -Ilib -e "require 'smart_brain'; puts SmartBrain::VERSION"
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
可选能力按需开启(默认零外部依赖即可运行):
|
|
39
|
+
|
|
40
|
+
| 能力 | 需要 | 开启方式 |
|
|
41
|
+
|---|---|---|
|
|
42
|
+
| 持久化(跨重启记忆) | PostgreSQL | `SMARTBRAIN_BACKEND=postgres` |
|
|
43
|
+
| LLM 真摘要 / rerank | Ollama(或 OpenAI 兼容端点) | `SMARTBRAIN_LLM_PROVIDER=ollama` |
|
|
44
|
+
| 资源 RAG | SmartRAG 实例 | `SmartBrain.configure(smart_rag_client: ...)` |
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## 3. 三十秒快速开始
|
|
49
|
+
|
|
50
|
+
### 3.1 Ruby 库
|
|
51
|
+
|
|
52
|
+
```ruby
|
|
53
|
+
require 'smart_brain'
|
|
54
|
+
SmartBrain.configure
|
|
55
|
+
|
|
56
|
+
# 1) 提交一轮对话(写记忆)
|
|
57
|
+
SmartBrain.commit_turn(
|
|
58
|
+
session_id: 'demo',
|
|
59
|
+
turn_events: {
|
|
60
|
+
messages: [{ role: 'user', content: '我们用 Postgres 做持久化' }],
|
|
61
|
+
decisions: [{ key: 'decision:db:storage', decision: '默认用 Postgres' }],
|
|
62
|
+
entities: [{ key: 'entity:db:pg', name: 'Postgres', canonical: 'postgres', kind: 'db', remember: true }]
|
|
63
|
+
}
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
# 2) 下一轮前,装配上下文(带证据、可解释)
|
|
67
|
+
context = SmartBrain.compose_context(
|
|
68
|
+
session_id: 'demo',
|
|
69
|
+
user_message: '持久化方案是什么?'
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
puts context[:working_summary] # 滚动摘要
|
|
73
|
+
puts context[:evidence].size # 召回的证据(memory + 可选 resource)
|
|
74
|
+
puts context.dig(:debug, :trace) # request_id → plan_id → context_id 全链路
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### 3.2 多 Scope 调用
|
|
78
|
+
|
|
79
|
+
跨会话共享项目记忆时,显式传入 domain 和读写 scope:
|
|
80
|
+
|
|
81
|
+
```ruby
|
|
82
|
+
scope_context = {
|
|
83
|
+
read: [
|
|
84
|
+
{ type: 'global', id: 'default' },
|
|
85
|
+
{ type: 'project', id: 'project-001' },
|
|
86
|
+
{ type: 'task', id: 'task-030' }
|
|
87
|
+
],
|
|
88
|
+
write: [{ type: 'project', id: 'project-001' }, { type: 'task', id: 'task-030' }],
|
|
89
|
+
default_write: { type: 'task', id: 'task-030' }
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
SmartBrain.commit_turn(
|
|
93
|
+
domain_id: 'tenant-a', session_id: 'conversation-1', scope_context: scope_context,
|
|
94
|
+
turn_events: { decisions: [{ key: 'decision:db', decision: 'use PostgreSQL' }] }
|
|
95
|
+
)
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
`write` 必须属于 `read`,`default_write` 必须属于 `write`。单条结构化记忆的 `scope_ref` 只能指向 `write` 中的 scope。传 `scope_context` 时不能省略 `domain_id`;旧调用同时省略二者时,仍映射到隔离的 `legacy/session:<session_id>`。
|
|
99
|
+
|
|
100
|
+
### 3.3 CLI
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
# 写记忆
|
|
104
|
+
smart_brain commit --data '{
|
|
105
|
+
"session_id": "demo",
|
|
106
|
+
"turn_events": {
|
|
107
|
+
"messages": [{"role":"user","content":"用 Postgres"}],
|
|
108
|
+
"decisions": [{"key":"decision:db:storage","decision":"默认用 Postgres"}]
|
|
109
|
+
}
|
|
110
|
+
}'
|
|
111
|
+
|
|
112
|
+
# 召回 + 装配上下文
|
|
113
|
+
smart_brain compose --data '{"session_id":"demo","user_message":"持久化方案?"}'
|
|
114
|
+
|
|
115
|
+
# 直接搜记忆
|
|
116
|
+
smart_brain search --data '{"session_id":"demo","query":"Postgres"}'
|
|
117
|
+
|
|
118
|
+
# 状态
|
|
119
|
+
smart_brain status
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
> 提示:`--data` 也可省略,从 stdin 读 JSON:`echo '{...}' | smart_brain search`。
|
|
123
|
+
|
|
124
|
+
### 3.4 MCP(接 Claude Code / Cursor)
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
smart_brain mcp # stdio JSON-RPC,19 个工具
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Claude Code 配置(`~/.config/claude/claude_desktop_config.json` 或项目 `.mcp.json`):
|
|
131
|
+
|
|
132
|
+
```json
|
|
133
|
+
{
|
|
134
|
+
"mcpServers": {
|
|
135
|
+
"smart_brain": {
|
|
136
|
+
"command": "/path/to/smart_brain/exe/smart_brain",
|
|
137
|
+
"args": ["mcp"],
|
|
138
|
+
"env": { "SMARTBRAIN_BACKEND": "postgres" }
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
详见 [`docs/mcp.md`](mcp.md)。
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## 4. 核心工作流:commit → compose 循环
|
|
149
|
+
|
|
150
|
+
每个 session 是一个「记忆宫殿」。**每轮对话两步**:
|
|
151
|
+
|
|
152
|
+
```
|
|
153
|
+
用户消息
|
|
154
|
+
│
|
|
155
|
+
├──(读)──► compose_context(session_id, user_message)
|
|
156
|
+
│ │
|
|
157
|
+
│ ├─ Plan:RetrievalPlanner 生成检索计划(是否需要资源检索)
|
|
158
|
+
│ ├─ Retrieve:memory FTS + relational + (可选) SmartRAG
|
|
159
|
+
│ ├─ Fuse:去重 + rerank + diversity + token 预算
|
|
160
|
+
│ └─ Compose:产出 ContextPackage
|
|
161
|
+
│
|
|
162
|
+
▼ 模型回复
|
|
163
|
+
│
|
|
164
|
+
└──(写)──► commit_turn(session_id, turn_events)
|
|
165
|
+
│
|
|
166
|
+
├─ EventStore:记录真相(turn/messages/refs)
|
|
167
|
+
├─ Extract:抽取结构化记忆(门控)
|
|
168
|
+
├─ KG:抽取三元组(turn_events[:edges])
|
|
169
|
+
└─ Consolidate:更新 working_summary(可走 LLM)
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
- **`compose_context` 之前调用**,把证据喂给模型;
|
|
173
|
+
- **`commit_turn` 在助手回复之后调用**,沉淀本轮。
|
|
174
|
+
|
|
175
|
+
### ContextPackage 结构
|
|
176
|
+
|
|
177
|
+
| 字段 | 含义 |
|
|
178
|
+
|---|---|
|
|
179
|
+
| `working_summary` | 滚动摘要(模板或 LLM) |
|
|
180
|
+
| `recent_turns` | 最近窗口对话 |
|
|
181
|
+
| `evidence` | 召回证据(memory/resource/graph,带 source/score/tier/mode) |
|
|
182
|
+
| `constraints` | token 预算、diversity、截断配置 |
|
|
183
|
+
| `debug.trace` | `context_id / request_id / plan_id` 全链路 |
|
|
184
|
+
| `debug.why_selected` | 每条证据为何入选 |
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## 5. `turn_events`:每轮可以写入什么
|
|
189
|
+
|
|
190
|
+
`commit_turn` 的 `turn_events` 是一个 hash,支持以下键(**全部可选**,按需传):
|
|
191
|
+
|
|
192
|
+
| 键 | 类型 | 说明 | 写入门控 |
|
|
193
|
+
|---|---|---|---|
|
|
194
|
+
| `messages` | `[{role, content}]` | 对话消息(user/assistant/tool) | 必写(事件层) |
|
|
195
|
+
| `tasks` | `[{key, title, status}]` | 任务(todo/doing/done/blocked) | 必写 |
|
|
196
|
+
| `decisions` | `[{key, decision}]` | 决策/承诺 | 必写 |
|
|
197
|
+
| `goals` | `[{key, goal}]` | 长期目标 | 条件写 |
|
|
198
|
+
| `events` | `[{key, title}]` | 里程碑/异常 | 条件写 |
|
|
199
|
+
| `preferences` | `[{key, value, confirmed}]` | 偏好(需 `confirmed:true`) | 条件写 |
|
|
200
|
+
| `profile` | `[{key, facts:[...]}]` | 用户/主体画像 | 条件写 |
|
|
201
|
+
| `cases` | `[{key, problem, solution, outcome}]` | 案例/经验 | 条件写 |
|
|
202
|
+
| `patterns` | `[{key, rule}]` | 归纳出的模式/规则 | 条件写 |
|
|
203
|
+
| `entities` | `[{key, name, canonical, kind, remember}]` | 实体(频率/结构/显式门控) | 条件写 |
|
|
204
|
+
| `retractions` | `[{type, key, reason}]` | 撤回旧事实 | 覆盖旧条目为 retracted |
|
|
205
|
+
| `refs` | `[{ref_type, ref_uri, ref_meta_json}]` | 引用(file/url/artifact) | 必写(事件层) |
|
|
206
|
+
| `edges` | `[{subject, predicate, object}]` | **KG 三元组** | 写入 kg_edges |
|
|
207
|
+
|
|
208
|
+
**key 规则**(保证同一事实落到同一 key):`<type>:<scope>:<name>`,如 `decision:smartbrain:storage`、`task:mvp:bootstrap`、`entity:db:postgres`。
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## 6. 记忆模型:类型、分层、生命周期
|
|
213
|
+
|
|
214
|
+
### 6.1 九种记忆类型
|
|
215
|
+
|
|
216
|
+
`profile / preferences / goals / tasks / decisions / entities / events / cases / patterns`(见 `docs/memory_types.md`)。
|
|
217
|
+
|
|
218
|
+
### 6.2 思维分层(Mind Model)
|
|
219
|
+
|
|
220
|
+
每条记忆带一个 `tier`,context 装配按优先级 `dao_tian → dao_ren → shu → qi → evidence`:
|
|
221
|
+
|
|
222
|
+
| Tier | 含义 | 默认 type 映射 |
|
|
223
|
+
|---|---|---|
|
|
224
|
+
| `dao_tian` 天道 | 不可变根本原则(**仅手动钉入**) | — |
|
|
225
|
+
| `dao_ren` 人道 | 经验规则/架构决策 | decisions / patterns / profile |
|
|
226
|
+
| `shu` 术 | 工具/任务技巧 | tasks / goals |
|
|
227
|
+
| `qi` 器 | 具体示例/配置 | cases / preferences |
|
|
228
|
+
| `evidence` 证据 | 原始观察 | entities / events |
|
|
229
|
+
|
|
230
|
+
### 6.3 两个正交的状态轴
|
|
231
|
+
|
|
232
|
+
- **`status`(冲突轴)**:`active / superseded / retracted` —— preferences/goals/tasks 覆盖旧值;retraction 撤回。
|
|
233
|
+
- **`lifecycle_status`(治理轴)**:`raw / candidate / promoted / demoted` —— 知识生命周期。
|
|
234
|
+
|
|
235
|
+
### 6.4 知识生命周期(Stage-1)
|
|
236
|
+
|
|
237
|
+
```
|
|
238
|
+
evidence ──distill──► candidate ──gate──► promote(promoted) ──demote──► demoted
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
- **distill**:从 evidence 提炼一条候选知识(仅 `dao_ren`/`qi` 层可蒸馏)。
|
|
242
|
+
- **gate**:只读检查是否达 promote 门槛(默认 ≥ `lifecycle.min_supporting_refs` 条支撑,或 reviewer=human)。
|
|
243
|
+
- **promote**:gate 强制,提升为 `promoted`(写入 `knowledge_events` 审计)。
|
|
244
|
+
- **demote**:evidence-backed 降级(`reason_type`: contradicted/obsolete/superseded)。
|
|
245
|
+
|
|
246
|
+
默认 `candidate`/`demoted` 不进自动 context(只有 `raw`/`promoted` 进)。
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## 7. 知识图谱(KG)
|
|
251
|
+
|
|
252
|
+
三元组 `subject-predicate-object` + **时态有效性**(`valid_from`/`valid_to`),与 memory_items 正交。
|
|
253
|
+
|
|
254
|
+
```ruby
|
|
255
|
+
# 写入(commit_turn 时随 edges 传入,或单独加)
|
|
256
|
+
SmartBrain.kg_add(session_id: 'demo', subject: 'postgres', predicate: 'uses', object: 'jsonb')
|
|
257
|
+
|
|
258
|
+
# 查询(支持 subject/predicate/object 过滤,默认仅 active)
|
|
259
|
+
SmartBrain.kg_query(session_id: 'demo', subject: 'postgres')
|
|
260
|
+
|
|
261
|
+
# 失效(置 valid_to + status=invalidated)
|
|
262
|
+
SmartBrain.kg_invalidate(edge_id: id, reason: 'obsolete')
|
|
263
|
+
|
|
264
|
+
SmartBrain.kg_stats(session_id: 'demo') # {total:, active:, invalidated:}
|
|
265
|
+
SmartBrain.kg_timeline(session_id: 'demo', subject: 'postgres')
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
KG 会自动**反馈到检索**:`compose_context` 时若 query 提到某 entity,其相关边会作为 `mode:'graph'` 证据出现。
|
|
269
|
+
|
|
270
|
+
CLI:`smart_brain kg <add|query|invalidate|stats> --data '{...}'`。
|
|
271
|
+
|
|
272
|
+
---
|
|
273
|
+
|
|
274
|
+
## 8. 事实核查(Fact-check)
|
|
275
|
+
|
|
276
|
+
**离线、零 LLM、零网络**的矛盾检测,扫描一段文本 vs session 的 entities + KG:
|
|
277
|
+
|
|
278
|
+
| 类型 | 触发 |
|
|
279
|
+
|---|---|
|
|
280
|
+
| `SimilarNameConflict` | 文本 token 与已知 entity 的 Levenshtein 距离 ≤ 阈值(默认 2) |
|
|
281
|
+
| `RelationContradiction` | 文本提到某 active triple 的两端 + 否定 cue(stopped/不再/弃用…) |
|
|
282
|
+
| `StaleFact` | 文本引用了已失效(`valid_to < now`)的 triple |
|
|
283
|
+
|
|
284
|
+
```ruby
|
|
285
|
+
SmartBrain.fact_check(session_id: 'demo', text: '我们停用了 postgres 的 jsonb')
|
|
286
|
+
# => {findings:[...], counts:{total:, similar_name:, relation_contradiction:, stale_fact:}}
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
CLI:`echo '{"session_id":"demo","text":"..."}' | smart_brain fact-check`。
|
|
290
|
+
建议在 assert 新关系前先 `fact_check`(MCP `instructions` 已内置此规则)。
|
|
291
|
+
|
|
292
|
+
---
|
|
293
|
+
|
|
294
|
+
## 9. Brief / wake-up / resume
|
|
295
|
+
|
|
296
|
+
**确定性、citation-first、不写 DB、不调 LLM**(默认)的认知快照:
|
|
297
|
+
|
|
298
|
+
```ruby
|
|
299
|
+
# 完整快照(每条 key_fact 带 memory_item_id + source_turn_id 引用)
|
|
300
|
+
SmartBrain.brief(session_id: 'demo', query: '当前状态')
|
|
301
|
+
# => {summary, key_facts, evidence, entities, unresolved, uncertainty, next_actions}
|
|
302
|
+
|
|
303
|
+
# 最小恢复负载(会话重启时用)
|
|
304
|
+
SmartBrain.wake_up(session_id: 'demo')
|
|
305
|
+
# => {l0:{identity, principles, preferences}, l1:{goals_decisions, summary}}
|
|
306
|
+
|
|
307
|
+
# 模糊找会话
|
|
308
|
+
SmartBrain.resume(query: 'demo') # => [{session_id, recent_decisions, next_actions}]
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
CLI:`smart_brain brief --data '{...}'`、`smart_brain wake-up --data '{...}'`。
|
|
312
|
+
|
|
313
|
+
---
|
|
314
|
+
|
|
315
|
+
## 10. 存储后端
|
|
316
|
+
|
|
317
|
+
| | memory(默认) | postgres |
|
|
318
|
+
|---|---|---|
|
|
319
|
+
| 持久化 | 进程内,重启丢 | ✅ 跨进程/重启 |
|
|
320
|
+
| FTS | 子串匹配 | ✅ `memory_chunks` GIN 索引(中文按字符 unigram 命中) |
|
|
321
|
+
| 适用 | 开发/测试/纯库 | 生产 / agent 工具 |
|
|
322
|
+
|
|
323
|
+
切换:
|
|
324
|
+
|
|
325
|
+
```bash
|
|
326
|
+
# 方式一:环境变量
|
|
327
|
+
export SMARTBRAIN_BACKEND=postgres
|
|
328
|
+
export SMARTBRAIN_DB_NAME=smart_brain_development # 其余 SMARTBRAIN_DB_{HOST,PORT,USER,PASSWORD}
|
|
329
|
+
|
|
330
|
+
# 方式二:config/brain.yml
|
|
331
|
+
# storage:
|
|
332
|
+
# backend: postgres
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
**首次使用 Postgres**:建角色与库(一次性):
|
|
336
|
+
|
|
337
|
+
```bash
|
|
338
|
+
sudo -u postgres createuser -d smart_brain
|
|
339
|
+
sudo -u postgres psql -c "ALTER USER smart_brain PASSWORD 'smart_brain';"
|
|
340
|
+
sudo -u postgres createdb -O smart_brain smart_brain_development
|
|
341
|
+
smart_brain migrate # 自动建表(幂等)
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
> SmartBrain 在 `backend=postgres` 启动时会**自动 migrate**(幂等),无需手动建表;`smart_brain migrate` 用于单独执行。
|
|
345
|
+
|
|
346
|
+
---
|
|
347
|
+
|
|
348
|
+
## 11. LLM 集成(可选)
|
|
349
|
+
|
|
350
|
+
默认 `provider: stub`(确定性、零网络):summary 走模板、rerank 走词法。切到真实 LLM 后:
|
|
351
|
+
|
|
352
|
+
| 能力 | stub | ollama/openai |
|
|
353
|
+
|---|---|---|
|
|
354
|
+
| working_summary | 模板 | ✅ 真摘要(带模板兜底,`summary_method` 标注) |
|
|
355
|
+
| Fusion rerank | 词法 | ✅ LLM-as-judge(`rerank_enabled` 开启时) |
|
|
356
|
+
| distill 起草 | 直接存传入文本 | ✅ 可由 LLM 从 evidence 起草 |
|
|
357
|
+
|
|
358
|
+
```bash
|
|
359
|
+
# 本地 Ollama(已装 qwen3 / llama2 等)
|
|
360
|
+
export SMARTBRAIN_LLM_PROVIDER=ollama
|
|
361
|
+
# config/brain.yml 的 model_provider.model 改成你的模型名
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
```yaml
|
|
365
|
+
# config/brain.yml
|
|
366
|
+
model_provider:
|
|
367
|
+
provider: ollama # stub | ollama | openai
|
|
368
|
+
model: qwen3
|
|
369
|
+
base_url: http://localhost:11434
|
|
370
|
+
rerank_enabled: false # compose 每轮都跑,默认关;改 true 启用 LLM rerank
|
|
371
|
+
think: false # 关思维链(支持的 ollama 版本更快更干净)
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
> 思维链模型(qwen3/deepseek-r1)同步调用较慢;SmartBrain 会自动剥离 `<think>` 块,并在超时/截断时**优雅降级**到模板/词法。摘要只在触发时(每 N 轮或阶段事件)才跑,不影响每轮延迟。
|
|
375
|
+
|
|
376
|
+
---
|
|
377
|
+
|
|
378
|
+
## 12. 与 SmartRAG 集成(资源检索)
|
|
379
|
+
|
|
380
|
+
SmartBrain 在 `compose_context` 时由 `RetrievalPlanner` 判断**是否需要资源检索**(命中「查资料/引用/标准/论文」等意图,或 refs 中有相关 URL),命中则调用挂载的 SmartRAG client。
|
|
381
|
+
|
|
382
|
+
### 12.1 进程内直连(推荐)
|
|
383
|
+
|
|
384
|
+
```ruby
|
|
385
|
+
require 'smart_rag'
|
|
386
|
+
require 'smart_brain/adapters/smart_rag/direct_client'
|
|
387
|
+
|
|
388
|
+
rag = SmartRAG::SmartRAG.new(database: {...}, llm: {...}, embedding: {...})
|
|
389
|
+
scope_mapper = lambda do |domain_id:, scopes:|
|
|
390
|
+
{ filters: { topic_ids: scopes.map { |scope| "#{domain_id}:#{scope[:type]}:#{scope[:id]}" } } }
|
|
391
|
+
end
|
|
392
|
+
rag_client = SmartBrain::Adapters::SmartRag::DirectClient.new(rag: rag, scope_mapper: scope_mapper)
|
|
393
|
+
|
|
394
|
+
SmartBrain.configure(smart_rag_client: rag_client)
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
### 12.2 HTTP 直连
|
|
398
|
+
|
|
399
|
+
```ruby
|
|
400
|
+
require 'smart_brain/adapters/smart_rag/http_client'
|
|
401
|
+
|
|
402
|
+
# transport 是任意响应 call(plan, timeout_seconds:) 的对象,转发到 SmartRAG HTTP 端点
|
|
403
|
+
rag_client = SmartBrain::Adapters::SmartRag::HttpClient.new(
|
|
404
|
+
transport: my_transport, timeout_seconds: 5, scope_mapper: scope_mapper
|
|
405
|
+
)
|
|
406
|
+
SmartBrain.configure(smart_rag_client: rag_client)
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
Mapper 返回 `{ filters: ... }`,adapter 将其放入 RetrievalPlan 的 `scope_filters`。当请求包含 project/expert/task/global scope 时,SmartRAG 响应必须确认 `scope_filter_applied: true`。默认 `fail_closed: true`:mapper 缺失、映射失败或后端未确认都会清空资源证据,并返回 warning,避免跨 domain/scope 泄漏。
|
|
410
|
+
|
|
411
|
+
### 12.3 不挂载
|
|
412
|
+
|
|
413
|
+
不传 `smart_rag_client` 时用 `NullClient`(返回空证据),SmartBrain 仍正常工作(memory-only)。
|
|
414
|
+
|
|
415
|
+
资源证据与记忆证据在 `Fusion::Merger` 里**统一去重 + rerank + diversity**(resource 按 document+section+chunk 去重,memory 按 item_id 或 turn+message),按 `memory_resource_ratio`(默认 40/60)切分预算。
|
|
416
|
+
|
|
417
|
+
---
|
|
418
|
+
|
|
419
|
+
## 13. Agent 工具面(MCP / HTTP / CLI 全清单)
|
|
420
|
+
|
|
421
|
+
### 13.1 MCP 工具(19 个)
|
|
422
|
+
|
|
423
|
+
`commit_turn` · `compose_context` · `search_memory` · `status`
|
|
424
|
+
· `knowledge_distill` · `knowledge_gate` · `knowledge_promote` · `knowledge_demote`
|
|
425
|
+
· `knowledge_promote_to_scope` · `knowledge_retract` · `knowledge_lineage`
|
|
426
|
+
· `kg_add` · `kg_query` · `kg_invalidate` · `kg_timeline` · `kg_stats`
|
|
427
|
+
· `fact_check` · `brief` · `wake_up`
|
|
428
|
+
|
|
429
|
+
`initialize` 时返回 `instructions`(轻量 MEMORY_PROTOCOL),客户端连上即学。
|
|
430
|
+
|
|
431
|
+
### 13.2 HTTP API
|
|
432
|
+
|
|
433
|
+
| 方法 | 路径 | 入参 |
|
|
434
|
+
|---|---|---|
|
|
435
|
+
| POST | `/commit` | `{domain_id?, session_id, scope_context?, turn_events}` |
|
|
436
|
+
| POST | `/compose` | `{domain_id?, session_id, scope_context?, user_message, agent_state?}` |
|
|
437
|
+
| POST | `/search` | `{domain_id?, session_id, scope_context?, query, limit?}` |
|
|
438
|
+
| GET | `/status` | — |
|
|
439
|
+
| POST | `/migrate` | — |
|
|
440
|
+
| POST | `/knowledge/{distill\|gate\|promote\|demote\|retract\|promote-to-scope\|lineage\|events}` | 见对应方法 |
|
|
441
|
+
| POST | `/kg/{add\|query\|timeline\|invalidate\|stats}` | 见 §7 |
|
|
442
|
+
| POST | `/fact-check`、`/brief`、`/wake-up` | 均支持 `domain_id` 和 `scope_context` |
|
|
443
|
+
| POST | `/fact-check` | `{session_id, text}` |
|
|
444
|
+
| POST | `/brief` | `{session_id, query?}` |
|
|
445
|
+
| POST | `/wake-up` | `{session_id}` |
|
|
446
|
+
|
|
447
|
+
```bash
|
|
448
|
+
smart_brain serve --host 0.0.0.0 --port 9292 # Puma
|
|
449
|
+
curl -s localhost:9292/status
|
|
450
|
+
curl -XPOST localhost:9292/commit -H 'Content-Type: application/json' -d '{...}'
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
### 13.3 CLI 全命令
|
|
454
|
+
|
|
455
|
+
```
|
|
456
|
+
smart_brain status | migrate
|
|
457
|
+
smart_brain commit | compose | search | fact-check | brief | wake-up --data JSON | stdin
|
|
458
|
+
smart_brain knowledge <distill|gate|promote|demote|events> --data JSON
|
|
459
|
+
smart_brain kg <add|query|invalidate|stats> --data JSON
|
|
460
|
+
smart_brain serve [--host H] [--port P]
|
|
461
|
+
smart_brain mcp
|
|
462
|
+
smart_brain --version | --config PATH
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
---
|
|
466
|
+
|
|
467
|
+
## 14. 可观测性
|
|
468
|
+
|
|
469
|
+
```ruby
|
|
470
|
+
SmartBrain.diagnostics
|
|
471
|
+
# => {
|
|
472
|
+
# backend: 'postgres',
|
|
473
|
+
# metrics: { compose_p95_ms:, memory_resource_ratio: '3/5', token_over_budget_rate: },
|
|
474
|
+
# turns:, summaries:,
|
|
475
|
+
# compose_logs:, commit_logs:
|
|
476
|
+
# }
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
- **全链路追踪**:`request_id → plan_id → context_id` 贯穿 Plan→Retrieve→Fuse→Compose。
|
|
480
|
+
- **P95 延迟**、**memory/resource 命中比**、**token 超预算率**。
|
|
481
|
+
- 每次 commit/compose 的 explain 都记录「为何写入 / 为何选中证据 / 哪些被丢弃」。
|
|
482
|
+
|
|
483
|
+
---
|
|
484
|
+
|
|
485
|
+
## 15. 端到端示例(Ruby + SmartRAG + 真实 LLM)
|
|
486
|
+
|
|
487
|
+
```ruby
|
|
488
|
+
require 'smart_rag'
|
|
489
|
+
require 'smart_agent'
|
|
490
|
+
require 'smart_brain'
|
|
491
|
+
require 'smart_brain/adapters/smart_rag/direct_client'
|
|
492
|
+
|
|
493
|
+
# 1) 资源后端
|
|
494
|
+
rag = SmartRAG::SmartRAG.new(database: { adapter:'postgresql', host:'127.0.0.1', ... },
|
|
495
|
+
llm: { provider:'openai', endpoint:'...', model:'...' })
|
|
496
|
+
SmartBrain.configure(smart_rag_client: SmartBrain::Adapters::SmartRag::DirectClient.new(rag: rag))
|
|
497
|
+
|
|
498
|
+
session = "proj-#{Time.now.to_i}"
|
|
499
|
+
loop do
|
|
500
|
+
print 'you> '; msg = $stdin.gets&.strip or break
|
|
501
|
+
|
|
502
|
+
ctx = SmartBrain.compose_context(session_id: session, user_message: msg)
|
|
503
|
+
# 把 ctx[:working_summary] / ctx[:evidence] / ctx[:recent_turns] 拼给 LLM ...
|
|
504
|
+
reply = call_your_llm(ctx, msg)
|
|
505
|
+
|
|
506
|
+
SmartBrain.commit_turn(session_id: session, turn_events: {
|
|
507
|
+
messages: [{ role:'user', content: msg }, { role:'assistant', content: reply }],
|
|
508
|
+
decisions: extract_decisions(msg, reply), # 你的结构化抽取
|
|
509
|
+
edges: extract_edges(msg, reply)
|
|
510
|
+
})
|
|
511
|
+
end
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
> 结构化抽取(decisions/entities/edges)可以由你自己的逻辑或 LLM 完成;SmartBrain 只负责**存储、门控、检索、治理**,不强制抽取方式。
|
|
515
|
+
|
|
516
|
+
---
|
|
517
|
+
|
|
518
|
+
## 16. 测试与运维
|
|
519
|
+
|
|
520
|
+
```bash
|
|
521
|
+
bundle exec rspec # 默认套件(memory 后端,零网络)
|
|
522
|
+
SMARTBRAIN_PG=1 SMARTBRAIN_DB_NAME=smart_brain_test \
|
|
523
|
+
bundle exec rspec # 含 PG 持久化/FTS/lifecycle/KG 集成
|
|
524
|
+
SMARTBRAIN_LLM=1 bundle exec rspec spec/smoke_ollama_spec.rb # 真实 Ollama 冒烟
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
常用 env 开关:`SMARTBRAIN_BACKEND` / `SMARTBRAIN_DB_*` / `SMARTBRAIN_LLM_PROVIDER` / `SMARTBRAIN_LLM_BASE_URL` / `SMARTBRAIN_LLM_API_KEY`。
|
|
528
|
+
|
|
529
|
+
---
|
|
530
|
+
|
|
531
|
+
## 17. 能力边界(当前不支持)
|
|
532
|
+
|
|
533
|
+
- **多 Agent Cowork**(bus/channel/handoff)、**Phase-3 自进化**(runtime adoption)、**AAAK 格式化**、**Bench/评估** —— 未实现(P3)。
|
|
534
|
+
- **跨项目命名空间**(wing/room)—— 暂只有 `session_id`;`resume` 按 session_id 模糊匹配。
|
|
535
|
+
- **记忆侧向量检索** —— 当前是 FTS + 子串,无 embedding(资源侧向量检索由 SmartRAG 提供)。
|
|
536
|
+
- **LLM 自动三元组抽取 / planner 全量 LLM 化** —— KG 由 `turn_events[:edges]` 显式传入。
|
|
537
|
+
|
|
538
|
+
---
|
|
539
|
+
|
|
540
|
+
## 18. 进阶文档
|
|
541
|
+
|
|
542
|
+
- 设计与契约:`docs/smartbrain_design.md`、`docs/policies.md`、`docs/memory_types.md`
|
|
543
|
+
- 策略与治理:`docs/retrieval_plan.md`、`docs/evidence_pack.md`、`docs/context_package.md`
|
|
544
|
+
- MCP 接入:`docs/mcp.md`
|
|
545
|
+
- 差距与路线:`docs/gap_vs_mempal.md`
|
|
546
|
+
- 示例:`example.rb`、`conversation_demo.rb`
|