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/policies.md
ADDED
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
## 0. 总览:策略对象与生效点
|
|
2
|
+
|
|
3
|
+
SmartBrain 的主要运行时接口:
|
|
4
|
+
- `commit_turn(session_id, turn_events)`:写入真相(EventStore),抽取与巩固(MemoryStore)
|
|
5
|
+
- `compose_context(session_id, user_message, agent_state)`:检索与装配(ContextPackage)
|
|
6
|
+
|
|
7
|
+
策略分为四类:
|
|
8
|
+
1) **Retention(写入门控)**:在 `commit_turn` 生效
|
|
9
|
+
2) **Consolidation(摘要/巩固)**:在 `commit_turn` 生效
|
|
10
|
+
3) **Retrieval(检索策略)**:在 `compose_context` 生效
|
|
11
|
+
4) **Composition(上下文装配策略)**:在 `compose_context` 生效
|
|
12
|
+
|
|
13
|
+
所有策略都必须满足:
|
|
14
|
+
- **可配置**:支持 brain.yml 覆盖默认值
|
|
15
|
+
- **可解释**:每次执行可输出 explain/ignored
|
|
16
|
+
- **可回归**:关键参数变化可对比输出差异(日志中保存 plan + context_id)
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 1. Retention Policy(写入门控)
|
|
21
|
+
|
|
22
|
+
### 1.1 原则
|
|
23
|
+
- **事件全收**:EventStore 记录每轮对话、工具调用、refs(文件/URL/产物)
|
|
24
|
+
- **长期记忆精炼**:MemoryStore 只存高价值、可复用、较稳定的信息
|
|
25
|
+
- **来源可追溯**:每条 memory_item 必须带 source_turn_id(可选 source_message_id)
|
|
26
|
+
|
|
27
|
+
### 1.2 记忆类型的写入优先级
|
|
28
|
+
按 `memory_types.md` 的 type:
|
|
29
|
+
|
|
30
|
+
**A. 必写(默认)**
|
|
31
|
+
- `tasks`:新增/更新/完成/阻塞(含状态流转)
|
|
32
|
+
- `decisions`:明确的决策/选择/承诺
|
|
33
|
+
- `refs`(事件层必写):所有 file/url/artifact 引用
|
|
34
|
+
- `entities`:当满足“重要实体”条件(见 1.3)
|
|
35
|
+
|
|
36
|
+
**B. 条件写(默认)**
|
|
37
|
+
- `preferences`:明确偏好且具有稳定性/复用价值
|
|
38
|
+
- `goals`:明确长期目标或项目目标
|
|
39
|
+
- `events`:里程碑/异常/发布等高价值事件
|
|
40
|
+
- `cases/patterns`:当出现可复用结构(通常由工具/项目输出驱动)
|
|
41
|
+
|
|
42
|
+
**C. 不写入长期记忆(仅事件层)**
|
|
43
|
+
- 闲聊、情绪宣泄、一次性寒暄
|
|
44
|
+
- 纯推测、未确认事实
|
|
45
|
+
- 模型自我输出的“臆测偏好”(除非用户明确确认)
|
|
46
|
+
|
|
47
|
+
### 1.3 “重要实体”判定(Entity Gate)
|
|
48
|
+
实体进入 `entities`/`entity_mentions` 的条件(满足任一):
|
|
49
|
+
- 出现频率:最近 `N_turns` 内出现 ≥ `freq_threshold`
|
|
50
|
+
- 明确指代:用户用“这个项目/那个仓库/上次那个链接”等指代并要求继续
|
|
51
|
+
- 结构性信号:出现在 URL、repo、文件路径、任务/决策中
|
|
52
|
+
- 用户声明:用户说“记住 X / 以后都按 X”
|
|
53
|
+
|
|
54
|
+
默认参数(可配置):
|
|
55
|
+
- `N_turns = 20`
|
|
56
|
+
- `freq_threshold = 2`
|
|
57
|
+
|
|
58
|
+
### 1.4 稳定性与置信度(Confidence Policy)
|
|
59
|
+
每条 memory_item 写入时应计算 `confidence`(0..1),最低要求:
|
|
60
|
+
- 明确陈述(用户直接说):≥ 0.8
|
|
61
|
+
- 由工具结果/结构化产物得出:≥ 0.9
|
|
62
|
+
- 由模型推断/总结得出:≤ 0.6(除非用户确认)
|
|
63
|
+
|
|
64
|
+
建议为每条 memory_item 记录:
|
|
65
|
+
- `confidence`
|
|
66
|
+
- `evidence_refs`(可选:指向 tool_calls 或 resources)
|
|
67
|
+
|
|
68
|
+
### 1.5 冲突与撤回(Conflict Policy)
|
|
69
|
+
- 覆盖型(overwrite):`preferences/goals/tasks`
|
|
70
|
+
- 新值写入后:旧值 `status=superseded`
|
|
71
|
+
- 多版本并存(versioned):`decisions/events/cases/patterns`
|
|
72
|
+
- 保留历史,标注 `made_at/updated_at`
|
|
73
|
+
- 撤回(retracted):用户明确否认或修正
|
|
74
|
+
- 将旧条目 `status=retracted`,并写入新事实(同 key 或新 key)
|
|
75
|
+
|
|
76
|
+
**冲突检测最低要求:**
|
|
77
|
+
- 同 `type+key` 新写入时,若 value 的关键字段变化显著,则视为冲突
|
|
78
|
+
- 冲突处理必须写入 explain(commit 输出)
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## 2. Consolidation Policy(摘要与巩固)
|
|
83
|
+
|
|
84
|
+
### 2.1 两层摘要
|
|
85
|
+
- `working_summary`:滚动摘要(服务上下文装配,压缩历史)
|
|
86
|
+
- `core_memory`:稳定记忆块(system_blocks 的候选)
|
|
87
|
+
|
|
88
|
+
### 2.2 触发时机(Summarize Trigger)
|
|
89
|
+
默认触发(满足任一):
|
|
90
|
+
- `turn_count_since_last_summary >= summarize_after_turns`(默认 12)
|
|
91
|
+
- 当前上下文估算 token 超过阈值(例如 70% budget)
|
|
92
|
+
- 检测到阶段性事件:task 完成、decision 形成、重大 tool 结果
|
|
93
|
+
|
|
94
|
+
### 2.3 摘要风格(Summary Style)
|
|
95
|
+
`working_summary` 建议格式固定,便于模型引用:
|
|
96
|
+
|
|
97
|
+
- 当前目标/任务状态
|
|
98
|
+
- 已确定的决策
|
|
99
|
+
- 关键实体与资源链接
|
|
100
|
+
- 未解决问题/下一步
|
|
101
|
+
|
|
102
|
+
示例结构(建议):
|
|
103
|
+
- Goals:
|
|
104
|
+
- Decisions:
|
|
105
|
+
- Tasks:
|
|
106
|
+
- Key References:
|
|
107
|
+
- Open Questions:
|
|
108
|
+
|
|
109
|
+
### 2.4 摘要输入边界
|
|
110
|
+
摘要的输入来源应包含:
|
|
111
|
+
- 最近窗口对话(可包含更长窗口用于摘要生成)
|
|
112
|
+
- tool_calls 结果摘要(避免塞入原始大 JSON)
|
|
113
|
+
- refs(URL/file)元信息(标题/摘要)
|
|
114
|
+
|
|
115
|
+
摘要不应直接包含大段原文或长工具输出。
|
|
116
|
+
|
|
117
|
+
### 2.5 摘要的可追溯性
|
|
118
|
+
建议保存:
|
|
119
|
+
- `summary_version`
|
|
120
|
+
- `summary_source_turn_range`
|
|
121
|
+
- `summary_generated_at`
|
|
122
|
+
用于回放与调试。
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## 3. Retrieval Policy(检索策略:SmartBrain + SmartRAG)
|
|
127
|
+
|
|
128
|
+
### 3.1 触发“资源检索”(SmartRAG)条件
|
|
129
|
+
SmartBrain 在 `compose_context` 时决定是否调用 SmartRAG。默认触发条件(满足任一):
|
|
130
|
+
- 用户请求:查资料/对比方案/引用来源/“了解一下 X”
|
|
131
|
+
- 当前问题涉及外部事实或长文档内容(如标准、论文、仓库文档)
|
|
132
|
+
- refs 中存在相关 URL/file 且问题要求引用它们
|
|
133
|
+
- planner 判断需要 evidence 才能回答(intent=research/qa/debug)
|
|
134
|
+
|
|
135
|
+
默认关闭条件:
|
|
136
|
+
- 纯闲聊
|
|
137
|
+
- 仅与最近窗口强相关、无需外部资源
|
|
138
|
+
|
|
139
|
+
### 3.2 RetrievalPlan 生成默认值(v0.1)
|
|
140
|
+
默认启用模式:
|
|
141
|
+
- 对话侧:`exact + relational`(semantic 可选)
|
|
142
|
+
- 资源侧(SmartRAG):`hybrid` 优先
|
|
143
|
+
|
|
144
|
+
默认 budget(可配置):
|
|
145
|
+
- `top_k = 30`
|
|
146
|
+
- `candidate_k = 200`
|
|
147
|
+
- `per_mode_k`:exact 10 / semantic 10 / hybrid 30(资源侧)
|
|
148
|
+
- diversity:by_document 3 / by_source 10
|
|
149
|
+
|
|
150
|
+
### 3.3 Query Expansion(联想的可控实现)
|
|
151
|
+
联想只扩展检索,不生成事实。默认:
|
|
152
|
+
- 扩展 query 数量:3~8 条
|
|
153
|
+
- 扩展方式(任一/组合):
|
|
154
|
+
- 同义/别名(entity aliases)
|
|
155
|
+
- 子主题(topic decomposition)
|
|
156
|
+
- 关键词抽取(从 user_message 与 recent_turns)
|
|
157
|
+
- 每条扩展 query 权重 < 1.0(例如 0.5~0.8)
|
|
158
|
+
|
|
159
|
+
### 3.4 多源融合与统一重排(Cross-Source Rerank)
|
|
160
|
+
SmartBrain 推荐做“跨源统一 rerank”,即使 SmartRAG 内部已经 rerank:
|
|
161
|
+
- 输入:用户 query + 候选 snippets(memory + resource)
|
|
162
|
+
- 输出:统一 `rerank_score`,实现可比较排序
|
|
163
|
+
|
|
164
|
+
默认去重规则:
|
|
165
|
+
- resource:`document_id + section_id (+chunk_index)`
|
|
166
|
+
- memory:`memory_item_id` 或 `turn_id + message_id`
|
|
167
|
+
|
|
168
|
+
### 3.5 过滤策略(Filters)
|
|
169
|
+
默认建议:
|
|
170
|
+
- 若 user_message 明确指定范围(“在 smart_rag 里”):`source_uri_prefix` 或 `document_ids`
|
|
171
|
+
- 若涉及近期进展:设置 `time_range`(资源侧看文档更新时间,对话侧看 turn 时间)
|
|
172
|
+
- 若多语言混杂:按语言过滤(可选)
|
|
173
|
+
|
|
174
|
+
执行方(SmartRAG)若不支持某过滤字段,必须在 EvidencePack.explain.ignored_fields 中声明。
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## 4. Composition Policy(上下文装配:ContextPackage)
|
|
179
|
+
|
|
180
|
+
### 4.1 固定槽位(Slot-Based Composition)
|
|
181
|
+
装配顺序固定(强烈建议):
|
|
182
|
+
1) `system_blocks`:core_profile / preferences / policies
|
|
183
|
+
2) `developer_blocks`:tooling/format rules(如需要)
|
|
184
|
+
3) `working_summary`
|
|
185
|
+
4) `recent_turns`(窗口)
|
|
186
|
+
5) `evidence`(来自 memory + resource)
|
|
187
|
+
6) `user_message`
|
|
188
|
+
|
|
189
|
+
### 4.2 Token 预算(Budgeting)
|
|
190
|
+
关键约束(可配置):
|
|
191
|
+
- `token_limit`:例如 8k/16k(取决于你的本地模型上下文)
|
|
192
|
+
- `system_blocks_max_tokens`:例如 800
|
|
193
|
+
- `summary_max_tokens`:例如 600
|
|
194
|
+
- `recent_turns_max`:例如 8 轮
|
|
195
|
+
- `evidence_max_items`:例如 12
|
|
196
|
+
- `max_snippet_chars`:例如 800
|
|
197
|
+
|
|
198
|
+
优先级(从高到低):
|
|
199
|
+
1) system_blocks
|
|
200
|
+
2) top evidence(高 rerank_score 且覆盖关键意图/实体)
|
|
201
|
+
3) working_summary
|
|
202
|
+
4) recent_turns
|
|
203
|
+
5) 长尾 evidence(联想扩展)
|
|
204
|
+
|
|
205
|
+
### 4.3 覆盖度(Coverage)
|
|
206
|
+
ContextComposer 必须保证:
|
|
207
|
+
- 至少包含 1 条覆盖当前问题核心实体/概念的 evidence(如果检索到)
|
|
208
|
+
- evidence 不应全部来自同一 document/source(受 diversity 约束)
|
|
209
|
+
|
|
210
|
+
### 4.4 多样性(Diversity)
|
|
211
|
+
默认:
|
|
212
|
+
- 同一 `document_id` 最多 3 条 evidence
|
|
213
|
+
- 同一 `source_uri` 最多 2 条
|
|
214
|
+
- memory/resource evidence 比例默认 40/60(可配置;若 memory 命中更高可自适应)
|
|
215
|
+
|
|
216
|
+
### 4.5 引用格式(Evidence Formatting)
|
|
217
|
+
为了让模型更可靠引用证据,建议把 evidence 注入时使用稳定格式:
|
|
218
|
+
|
|
219
|
+
- [E1] title — source_uri
|
|
220
|
+
snippet…
|
|
221
|
+
(mode=hybrid, score=0.88)
|
|
222
|
+
|
|
223
|
+
并在 debug 里保留:
|
|
224
|
+
- 哪些 evidence 被截断/丢弃及原因(budget/diversity)
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## 5. 可观测与审计(Observability)
|
|
229
|
+
|
|
230
|
+
### 5.1 必要日志
|
|
231
|
+
每次 `compose_context` 建议记录:
|
|
232
|
+
- `context_id/session_id`
|
|
233
|
+
- RetrievalPlan(完整)
|
|
234
|
+
- evidence 选择结果(id + score + source)
|
|
235
|
+
- token 预算统计(limit/used/trimmed)
|
|
236
|
+
- ignored_fields(后端不支持)
|
|
237
|
+
|
|
238
|
+
每次 `commit_turn` 建议记录:
|
|
239
|
+
- 写入的 memory_items(type/key/confidence/status)
|
|
240
|
+
- 冲突处理结果(superseded/retracted)
|
|
241
|
+
- 摘要更新(是否触发、输入范围)
|
|
242
|
+
|
|
243
|
+
### 5.2 Debug 输出开关
|
|
244
|
+
开发期建议默认 `debug.trace=true`,上线后可配置关闭或仅保留采样。
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
## 6. 配置建议(brain.yml 对应)
|
|
249
|
+
|
|
250
|
+
示例配置映射(仅示意):
|
|
251
|
+
|
|
252
|
+
```yaml
|
|
253
|
+
policies:
|
|
254
|
+
retention:
|
|
255
|
+
summarize_after_turns: 12
|
|
256
|
+
entity_gate:
|
|
257
|
+
window_turns: 20
|
|
258
|
+
freq_threshold: 2
|
|
259
|
+
confidence:
|
|
260
|
+
user_asserted: 0.8
|
|
261
|
+
tool_derived: 0.9
|
|
262
|
+
inferred: 0.6
|
|
263
|
+
|
|
264
|
+
retrieval:
|
|
265
|
+
enable_resource_retrieval: auto
|
|
266
|
+
top_k: 30
|
|
267
|
+
candidate_k: 200
|
|
268
|
+
query_expansion:
|
|
269
|
+
enabled: true
|
|
270
|
+
max_queries: 8
|
|
271
|
+
|
|
272
|
+
composition:
|
|
273
|
+
token_limit: 8192
|
|
274
|
+
system_blocks_max_tokens: 800
|
|
275
|
+
summary_max_tokens: 600
|
|
276
|
+
recent_turns_max: 8
|
|
277
|
+
evidence_max_items: 12
|
|
278
|
+
max_snippet_chars: 800
|
|
279
|
+
diversity:
|
|
280
|
+
by_document: 3
|
|
281
|
+
by_source_uri: 2
|
|
282
|
+
memory_resource_ratio: "40/60"
|
|
283
|
+
|
|
284
|
+
observability:
|
|
285
|
+
trace: true
|
|
286
|
+
store_plans: true
|
|
287
|
+
store_contexts: true
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
---
|
|
291
|
+
|
|
292
|
+
## 7. 最低验收标准(v0.1)
|
|
293
|
+
|
|
294
|
+
* commit_turn:
|
|
295
|
+
|
|
296
|
+
* EventStore 全量记录 turn/tool/refs
|
|
297
|
+
* memory_items 写入门控生效(闲聊不进入长期记忆)
|
|
298
|
+
* 冲突覆盖与撤回可工作(至少 preferences/tasks)
|
|
299
|
+
|
|
300
|
+
* compose_context:
|
|
301
|
+
|
|
302
|
+
* 按槽位输出 ContextPackage
|
|
303
|
+
* 资源检索按条件触发并能调用 SmartRAG.retrieve(plan)
|
|
304
|
+
* 多样性与 token 预算可工作(至少 evidence 截断/条数限制)
|
|
305
|
+
|
|
306
|
+
* 可观测:
|
|
307
|
+
|
|
308
|
+
* 至少保存 plan、evidence 选择、budget 统计与 ignored_fields
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
## 1. 目的
|
|
2
|
+
|
|
3
|
+
RetrievalPlan 用于把“本轮需要检索什么、怎么检索、取多少、如何控制噪声”表达为结构化对象,避免:
|
|
4
|
+
- 调用方隐式依赖 SmartRAG 内部策略(不可控)
|
|
5
|
+
- 多模式检索无法复现与调试(不可观测)
|
|
6
|
+
- 上下文装配缺少预算与多样性约束(易被噪声淹没)
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 2. 顶层结构
|
|
11
|
+
|
|
12
|
+
RetrievalPlan 是一个 JSON/Ruby Hash 对象(可序列化入日志)。
|
|
13
|
+
|
|
14
|
+
```json
|
|
15
|
+
{
|
|
16
|
+
"version": "0.1",
|
|
17
|
+
"request_id": "uuid",
|
|
18
|
+
"purpose": "qa|continue_task|debug|summarize|research|other",
|
|
19
|
+
"queries": [],
|
|
20
|
+
"global_filters": {},
|
|
21
|
+
"budget": {},
|
|
22
|
+
"ranking": {},
|
|
23
|
+
"output": {},
|
|
24
|
+
"debug": {}
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
字段说明:
|
|
29
|
+
|
|
30
|
+
* `version`:协议版本(必填)
|
|
31
|
+
* `request_id`:调用方生成,用于贯穿日志与可追溯(建议必填)
|
|
32
|
+
* `purpose`:检索目的,用于策略默认值(可选)
|
|
33
|
+
* `queries`:检索 query 列表(必填,至少 1 条)
|
|
34
|
+
* `global_filters`:对所有 queries 生效的过滤(可选)
|
|
35
|
+
* `budget`:数量预算与多样性约束(可选但强烈建议)
|
|
36
|
+
* `ranking`:融合与重排设置(可选)
|
|
37
|
+
* `output`:返回内容控制(可选)
|
|
38
|
+
* `debug`:调试信息(可选)
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## 3. queries(必填)
|
|
43
|
+
|
|
44
|
+
### 3.1 Query 对象
|
|
45
|
+
|
|
46
|
+
```json
|
|
47
|
+
{
|
|
48
|
+
"text": "string",
|
|
49
|
+
"mode": "exact|semantic|hybrid|relational|associative",
|
|
50
|
+
"weight": 1.0,
|
|
51
|
+
"filters": { },
|
|
52
|
+
"hints": { }
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
字段说明:
|
|
57
|
+
|
|
58
|
+
* `text`:查询文本(必填)
|
|
59
|
+
* `mode`:
|
|
60
|
+
|
|
61
|
+
* `exact`:关键词/短语精确查找(FTS/BM25)
|
|
62
|
+
* `semantic`:语义召回(embedding)
|
|
63
|
+
* `hybrid`:exact + semantic(由执行方融合)
|
|
64
|
+
* `relational`:关联检索(实体/链接/任务链)
|
|
65
|
+
* `associative`:联想检索(通常表示“扩展 query”,执行方应按策略调用 exact/semantic 再融合)
|
|
66
|
+
* `weight`:该 query 的相对权重(默认 1.0)
|
|
67
|
+
* `filters`:只对该 query 生效的过滤(覆盖/补充 global_filters)
|
|
68
|
+
* `hints`:提示执行策略的附加信息(可选)
|
|
69
|
+
|
|
70
|
+
> 建议:SmartBrain 的“联想”实现为生成多个 `associative` 或多条 `semantic/exact` 扩展 queries,而不是让执行方自由发挥。
|
|
71
|
+
|
|
72
|
+
### 3.2 queries 最小示例
|
|
73
|
+
|
|
74
|
+
```json
|
|
75
|
+
{
|
|
76
|
+
"version": "0.1",
|
|
77
|
+
"request_id": "c2b2f7d6-7c3b-4d53-8f8b-6f1f3a8c2a10",
|
|
78
|
+
"purpose": "qa",
|
|
79
|
+
"queries": [
|
|
80
|
+
{ "text": "OpenViking retrieval design", "mode": "hybrid", "weight": 1.0 }
|
|
81
|
+
]
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### 3.3 queries(扩展/联想)示例
|
|
86
|
+
|
|
87
|
+
```json
|
|
88
|
+
{
|
|
89
|
+
"version": "0.1",
|
|
90
|
+
"request_id": "b7b1b1ce-2330-4f72-9f7b-92a6a1a2e12a",
|
|
91
|
+
"purpose": "research",
|
|
92
|
+
"queries": [
|
|
93
|
+
{ "text": "RAG memory runtime design", "mode": "hybrid", "weight": 1.0 },
|
|
94
|
+
{ "text": "MemGPT hierarchical memory", "mode": "semantic", "weight": 0.7 },
|
|
95
|
+
{ "text": "Letta archival memory blocks", "mode": "semantic", "weight": 0.7 },
|
|
96
|
+
{ "text": "context composer token budget diversity", "mode": "exact", "weight": 0.5 }
|
|
97
|
+
]
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## 4. global_filters(可选)
|
|
104
|
+
|
|
105
|
+
对所有 queries 生效。执行方必须支持“只过滤不改变语义”的行为。
|
|
106
|
+
|
|
107
|
+
```json
|
|
108
|
+
{
|
|
109
|
+
"document_ids": ["..."],
|
|
110
|
+
"tag_ids": ["..."],
|
|
111
|
+
"topic_ids": ["..."],
|
|
112
|
+
"source_type": ["url","file","manual","memory_snapshot"],
|
|
113
|
+
"source_uri_prefix": ["https://...", "file://..."],
|
|
114
|
+
"language": ["zh","en"],
|
|
115
|
+
"time_range": { "from": "2026-01-01T00:00:00Z", "to": "2026-02-20T00:00:00Z" }
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
说明:
|
|
120
|
+
|
|
121
|
+
* `document_ids/tag_ids/topic_ids`:知识库内过滤
|
|
122
|
+
* `source_type`:资源类型过滤(建议 SmartRAG 支持)
|
|
123
|
+
* `source_uri_prefix`:按 URI 前缀过滤(适合域名/路径范围)
|
|
124
|
+
* `language`:语言过滤(可选)
|
|
125
|
+
* `time_range`:时间过滤(可按 documents.created_at 或 sections.created_at 实现)
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## 5. budget(可选但强烈建议)
|
|
130
|
+
|
|
131
|
+
```json
|
|
132
|
+
{
|
|
133
|
+
"top_k": 30,
|
|
134
|
+
"per_mode_k": { "exact": 10, "semantic": 10, "hybrid": 10, "relational": 10, "associative": 10 },
|
|
135
|
+
"candidate_k": 200,
|
|
136
|
+
"diversity": {
|
|
137
|
+
"by_document": 3,
|
|
138
|
+
"by_source": 10,
|
|
139
|
+
"by_section": 1
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
说明:
|
|
145
|
+
|
|
146
|
+
* `top_k`:最终返回条数
|
|
147
|
+
* `per_mode_k`:各模式配额(执行方可按存在的模式取 min)
|
|
148
|
+
* `candidate_k`:召回候选池规模(用于 rerank)
|
|
149
|
+
* `diversity`:多样性约束(避免单文档/单来源垄断)
|
|
150
|
+
|
|
151
|
+
> 实施建议:如果执行方不支持某一 diversity 维度,应忽略并在 explain 中声明。
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## 6. ranking(可选)
|
|
156
|
+
|
|
157
|
+
用于约束融合与重排。
|
|
158
|
+
|
|
159
|
+
```json
|
|
160
|
+
{
|
|
161
|
+
"fusion": { "method": "rrf|weighted_sum|none", "rrf_k": 60, "weights": { "exact": 1.0, "semantic": 1.0 } },
|
|
162
|
+
"rerank": { "enabled": true, "model": "qwen3-reranker", "top_n": 50 },
|
|
163
|
+
"tie_breaker": "recency|source_priority|none",
|
|
164
|
+
"source_priority": { "url": 0.9, "file": 1.0, "manual": 0.8, "memory_snapshot": 0.7 }
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
说明:
|
|
169
|
+
|
|
170
|
+
* `fusion.method`:默认建议 `rrf`
|
|
171
|
+
* `rerank.enabled`:是否启用 reranker
|
|
172
|
+
* `tie_breaker`:分数相近时的决策
|
|
173
|
+
* `source_priority`:来源优先级(可选)
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## 7. output(可选)
|
|
178
|
+
|
|
179
|
+
控制返回内容形态,便于 token 控制与调试。
|
|
180
|
+
|
|
181
|
+
```json
|
|
182
|
+
{
|
|
183
|
+
"include_snippets": true,
|
|
184
|
+
"snippet_policy": "l2|l1|l0|auto",
|
|
185
|
+
"include_signals": true,
|
|
186
|
+
"include_provenance": true,
|
|
187
|
+
"include_raw": false,
|
|
188
|
+
"max_snippet_chars": 800
|
|
189
|
+
}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
说明:
|
|
193
|
+
|
|
194
|
+
* `snippet_policy`:建议未来支持 L0/L1/L2(如 OpenViking 分层)
|
|
195
|
+
* `max_snippet_chars`:用于截断(执行方应保证不超)
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## 8. debug(可选)
|
|
200
|
+
|
|
201
|
+
```json
|
|
202
|
+
{
|
|
203
|
+
"trace": true,
|
|
204
|
+
"notes": "free text",
|
|
205
|
+
"caller": { "app": "smart_bot", "session_id": "..." }
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## 9. 执行方最低合规要求(SmartRAG/SmartBrain)
|
|
212
|
+
|
|
213
|
+
执行方至少要做到:
|
|
214
|
+
|
|
215
|
+
1. 支持 `queries.text + mode` 的基本执行(exact/semantic/hybrid 至少两种)
|
|
216
|
+
2. 支持 `top_k` 与基本 filters(document_ids/tag_ids/topic_ids)
|
|
217
|
+
3. 返回结果时能提供最少的 explain(见下)
|
|
218
|
+
|
|
219
|
+
建议执行方在返回 EvidencePack 时包含:
|
|
220
|
+
|
|
221
|
+
* `plan_id/request_id`
|
|
222
|
+
* `stats`(候选数、耗时、返回数)
|
|
223
|
+
* `explain`(融合方式、是否 rerank、忽略了哪些字段)
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## 10. 变更策略
|
|
228
|
+
|
|
229
|
+
* v0.1:新增字段只能“可选”,不得破坏现有字段含义
|
|
230
|
+
* v0.x:执行方必须忽略未知字段并在 explain 中声明(可选)
|
|
231
|
+
* v1.0:如需破坏性变更,另起 major 版本并提供迁移说明
|