docs(wiki): 记录跨会话记忆链路 + 管家Tab记忆展示架构
Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
- memory.md: 添加"跨会话记忆完整链路"章节,覆盖初始化/写入/读取/展示/数据库架构/关键文件地图 - butler.md: 添加"管家Tab记忆展示"章节,记录MemorySection数据源和组件结构
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
---
|
||||
title: 管家模式
|
||||
updated: 2026-04-21
|
||||
updated: 2026-04-22
|
||||
status: active
|
||||
tags: [module, butler, interaction]
|
||||
---
|
||||
@@ -72,6 +72,38 @@ idle → (检测新用户) → greeting_sent → waiting_response → completed
|
||||
简洁侧边栏: `desktop/src/components/SimpleSidebar.tsx`
|
||||
管家面板: `desktop/src/components/ButlerPanel.tsx` (3 区: 洞察/方案/记忆 + 行业专长卡片)
|
||||
|
||||
### 管家Tab记忆展示(2026-04-22 增强)
|
||||
|
||||
> ButlerPanel 的 MemorySection 组件负责向用户展示管家了解的信息。
|
||||
|
||||
```
|
||||
ButlerPanel (index.tsx)
|
||||
├── InsightsSection — 痛点洞察
|
||||
├── ProposalsSection — 方案建议
|
||||
├── MemorySection — 记忆 + 用户画像 (增强后)
|
||||
│ ├── 用户画像卡片 — agent_get → UserProfileStore (data.db)
|
||||
│ │ ├── 行业/角色/沟通风格 (profile_store.update_field)
|
||||
│ │ ├── 近期话题标签 (profile_store.add_recent_topic, 上限10)
|
||||
│ │ └── 常用工具标签 (profile_store.add_preferred_tool, 上限10)
|
||||
│ └── 记忆分组列表 — viking_ls + viking_read(L1) (memories.db)
|
||||
│ ├── 偏好 (preferences) — 默认展开
|
||||
│ ├── 知识 (knowledge) — 默认展开
|
||||
│ ├── 经验 (experience) — 折叠
|
||||
│ └── 会话 (sessions) — 折叠
|
||||
└── 行业专长卡片 — industryStore
|
||||
|
||||
数据源:
|
||||
记忆列表: listVikingResources("agent://{agent_id}/") → viking_ls
|
||||
记忆摘要: readVikingResource(uri, "L1") → viking_read → L1 摘要 (并行加载)
|
||||
用户画像: agent_get(agentId) → kernel.memory() → UserProfileStore.get() → data.db
|
||||
|
||||
关键文件:
|
||||
desktop/src/components/ButlerPanel/MemorySection.tsx 记忆+画像展示组件
|
||||
desktop/src/components/ButlerPanel/index.tsx 管家面板主组件
|
||||
desktop/src/lib/viking-client.ts viking_ls/viking_read 客户端
|
||||
desktop/src/lib/kernel-types.ts AgentInfo.userProfile 类型
|
||||
```
|
||||
|
||||
### 行业配置 (V13 已接通)
|
||||
|
||||
- `desktop/src/store/industryStore.ts` — 行业配置 Zustand Store (persist, 离线缓存)
|
||||
@@ -168,7 +200,10 @@ desktop/src-tauri/src/intelligence/
|
||||
| `desktop/src/hooks/use-cold-start.ts` | 冷启动 4 阶段 |
|
||||
| `desktop/src/store/uiModeStore.ts` | 双模式切换 |
|
||||
| `desktop/src/components/SimpleSidebar.tsx` | 简洁模式侧边栏 |
|
||||
| `desktop/src/components/ButlerPanel.tsx` | 管家面板 (洞察/方案/记忆) |
|
||||
| `desktop/src/components/ButlerPanel/index.tsx` | 管家面板主组件 (洞察/方案/记忆/行业) |
|
||||
| `desktop/src/components/ButlerPanel/MemorySection.tsx` | 记忆展示+用户画像卡片 (viking_read L1 + agent_get) |
|
||||
| `desktop/src/components/ButlerPanel/InsightsSection.tsx` | 痛点洞察列表 |
|
||||
| `desktop/src/components/ButlerPanel/ProposalsSection.tsx` | 方案建议列表 |
|
||||
|
||||
## 已知问题
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
title: 记忆管道
|
||||
updated: 2026-04-21
|
||||
updated: 2026-04-22
|
||||
status: active
|
||||
tags: [module, memory, growth]
|
||||
---
|
||||
@@ -66,6 +66,84 @@ tags: [module, memory, growth]
|
||||
→ 插入到 system prompt 中
|
||||
```
|
||||
|
||||
### 跨会话记忆完整链路(2026-04-22 验证通过)
|
||||
|
||||
> **重要:修改任何环节前请先阅读此链路,避免引入断裂。**
|
||||
|
||||
```
|
||||
[初始化] kernel_init (desktop/src-tauri/src/kernel_commands/lifecycle.rs)
|
||||
① viking_commands::init_storage() → 初始化 SqliteStorage → memories.db
|
||||
② Kernel::boot(config) → 创建 MemoryStore (data.db) + in-memory VikingAdapter
|
||||
③ viking_commands::get_storage() → SqliteStorage 包装为 VikingAdapter → kernel.set_viking()
|
||||
↑ 此时 GrowthIntegration 缓存被清除
|
||||
④ TauriExtractionDriver::new(driver, model) → kernel.set_extraction_driver()
|
||||
↑ GrowthIntegration 缓存再次清除
|
||||
⑤ [首次聊天时] create_middleware_chain() 重建 GrowthIntegration:
|
||||
- GrowthIntegration::new(self.viking.clone()) ← 持久化 SqliteStorage
|
||||
- .with_llm_driver(extraction_driver) ← LLM 提取能力
|
||||
- .with_profile_store(UserProfileStore::new(memory.pool())) ← data.db 画像持久化
|
||||
- .configure_embedding(embedding_client) ← 语义检索(可选)
|
||||
→ 缓存到 kernel.growth (Mutex<Arc<GrowthIntegration>>)
|
||||
→ MemoryMiddleware::new(growth) 注册到中间件链 (priority=150)
|
||||
|
||||
[写入] after_completion — 记忆提取 (crates/zclaw-runtime/src/middleware/memory.rs)
|
||||
MemoryMiddleware.after_completion(ctx)
|
||||
→ 30秒去重: should_extract(agent_id) — 同一 agent 30秒内跳过
|
||||
→ growth.extract_combined(agent_id, messages, session_id)
|
||||
→ MemoryExtractor.extract_combined() (crates/zclaw-growth/src/extractor.rs)
|
||||
→ LLM 单次调用 (COMBINED_EXTRACTION_PROMPT + 对话文本)
|
||||
→ 返回 CombinedExtraction { memories, experiences, profile_signals }
|
||||
→ extractor.store_memories(agent_id, memories)
|
||||
→ VikingAdapter → SqliteStorage.store() → memories.db (FTS5 索引)
|
||||
→ experience_extractor.persist_experiences(agent_id, combined)
|
||||
→ agent://{agent_id}/experience/... URI
|
||||
→ profile_updater.collect_updates(combined)
|
||||
→ UserProfileStore.update_field/add_recent_topic/add_pain_point/add_preferred_tool
|
||||
→ 写入 data.db.user_profiles 表 (user_id = agent_id)
|
||||
|
||||
[读取] before_completion — 记忆检索+注入 (每个新请求)
|
||||
MemoryMiddleware.before_completion(ctx)
|
||||
→ growth.enhance_prompt(agent_id, system_prompt, user_input)
|
||||
→ retriever.retrieve(agent_id, user_input)
|
||||
→ 按 agent_id 构建搜索范围: agent://{agent_id}/{type}
|
||||
→ QueryAnalyzer 意图分析 + IdentityRecall 43+ 模式匹配
|
||||
→ FTS5 全文搜索 + TF-IDF 评分 + 语义重排序
|
||||
→ 弱身份 fallback: <3 结果 + weak_identity → 补充 broad retrieval
|
||||
→ injector.inject_with_format(system_prompt, memories)
|
||||
→ 按 token 预算注入结构化上下文
|
||||
|
||||
[展示] 管家Tab — 前端读取 (desktop/src/components/ButlerPanel/)
|
||||
MemorySection.tsx:
|
||||
→ listVikingResources("agent://{agent_id}/") → viking_ls → memories.db
|
||||
→ readVikingResource(uri, "L1") → viking_read → L1 摘要
|
||||
→ 按类型分组: 偏好/知识/经验/会话
|
||||
→ agent_get(agentId) → kernel.memory() → UserProfileStore.get() → data.db
|
||||
→ 用户画像卡片: 行业/角色/沟通风格/近期话题/常用工具
|
||||
|
||||
[数据库架构]
|
||||
memories.db (SqliteStorage, viking_commands 管理)
|
||||
→ memories 表: URI + memory_type + content + FTS5 索引
|
||||
→ memories_fts 虚拟表: FTS5 trigram tokenizer (CJK 支持)
|
||||
data.db (MemoryStore, kernel 管理)
|
||||
→ user_profiles 表: user_id + industry + role + recent_topics(JSON) + ...
|
||||
→ agents 表: agent 配置
|
||||
→ sessions 表: 会话数据
|
||||
|
||||
[关键文件地图]
|
||||
crates/zclaw-kernel/src/kernel/mod.rs create_middleware_chain() + memory()
|
||||
crates/zclaw-runtime/src/middleware/memory.rs MemoryMiddleware before/after
|
||||
crates/zclaw-runtime/src/growth.rs GrowthIntegration 闭环编排
|
||||
crates/zclaw-growth/src/extractor.rs extract_combined() LLM 提取
|
||||
crates/zclaw-growth/src/retriever.rs retrieve() FTS5+TF-IDF 检索
|
||||
crates/zclaw-growth/src/injector.rs inject_with_format() prompt 注入
|
||||
crates/zclaw-growth/src/storage/sqlite.rs SqliteStorage (memories.db)
|
||||
crates/zclaw-memory/src/user_profile_store.rs UserProfileStore (data.db)
|
||||
desktop/src-tauri/src/viking_commands.rs viking_ls/viking_read Tauri 命令
|
||||
desktop/src-tauri/src/kernel_commands/agent.rs agent_get (读取 UserProfile)
|
||||
desktop/src-tauri/src/kernel_commands/lifecycle.rs kernel_init (初始化链路)
|
||||
desktop/src/components/ButlerPanel/MemorySection.tsx 前端展示
|
||||
```
|
||||
|
||||
### 经验存储 (ExperienceStore)
|
||||
|
||||
Hermes 管线 Chunk1 新增:
|
||||
|
||||
Reference in New Issue
Block a user