xiaowei
1516fe5bc8
fix: add clusters_found/noise_points/quality_score to consolidate API response
2026-06-08 10:35:10 +08:00
xiaowei
f286348ad8
fix: gap auto-close + conflict_muchen handler
...
- GapDetector.RecordHit(topic): recall 命中后自动关闭该 topic 的 open gap
- GapDetector.ClearMisses(topic): 清除 miss 计数,避免重复触发
- SetGlobalGapDetector / GetGlobalGapDetector: 全局实例注册,供 recall 回调使用
- recall handler (core.go): 命中时调用 RecordHit + ClearMisses 实现 gap auto-close
- conflict_muchen handler (server.go): 注册处理器,自动裁决 pending conflict(latest_wins / primary_wins / dismiss)
- fix: server_sqlite_nowindows.go 修复 osGetenv → os.Getenv (pre-existing)
2026-06-08 00:54:40 +08:00
xiaowei
82652ab489
storage/embedder: 支持 MODEL_NAME 环境变量指定 embedding 模型
...
- Embedder.modelName 替代硬编码的 bge-m3
- 默认值仍是 bge-m3(兼容本机 vLLM)
- Ollama 等第三方服务可通过 MODEL_NAME 覆盖
- encodeRemote 和 fallback 均使用 e.modelName
2026-06-06 18:22:40 +08:00
xiaowei
3d054e7590
自验证机制:consolidate 聚类下限 + timestamp 前置检查 + 启动数据目录检查 + 修复图谱扩展字段名
...
1. consolidation_pipe.go:
- 前置:抽样检查记忆时间戳(< 2024-01-01 视为可疑 epoch-0)
- 后置:clusters <= 1 时记录 ERROR + patterns 标记异常
2. server.go: runStartupChecks() 启动时检测废弃路径 + socket 可达性
3. graph_expander.go: Navigate 返回字段从 "target"/"source" 修正为 "to"/"from"
2026-06-03 12:44:31 +08:00
xiaowei
612d915eec
fix: 移除 episodes 直接写入 recall 结果
...
问题:commit 时直接 InsertMemory,原始对话未蒸馏就出现在 recall 结果
修复:
- recall.go: Step 2.5 过滤 episodes/对话类别(filterRecallRawCategories)
- recall.go: cache hit 路径同步加 filter,防止旧缓存污染
- core.go: 移除 commit 时的 InsertMemory,蒸馏完成后由 callback 写入 memories
- engine.go: 蒸馏 prompt 改为结构化提取(decisions/conclusions/actions_taken/open_questions)
- engine.go: max_tokens 300→600,truncate 500→1000
验证:recall('牧尘 小唯 obsidian') → 仅 distilled/system_fact/用户偏好,无 episodes
2026-06-03 01:36:45 +08:00
xiaowei
7ec0642b9d
feat: E1.1-E1.7 图谱 BFS 扩展全部完成
...
E1.1: InMemoryGraph.NavigateBiDir 真正双向 BFS(替代伪实现)
E1.2: 无相遇节点返回 {unreachable:true} 而非降级单向
E1.3: 规则 NER(extractEntitiesWithNER, 7个正则模式)
E1.4: relationFilter 支持(buildRelationFilterClause, SQL注入)
E1.5: API 层 relation_filter 参数(navigate 端点)
E1.6: API 层 relation_filter 参数(同上,已在 navigate 中支持)
E1.7: 环路检测(seenEdges map,同一边不在单次 BFS 中重复访问)
同时修复: graph_expander.go Navigate 调用加 relFilter=nil
2026-06-02 20:26:57 +08:00
xiaowei
48e33039a0
fix: SQLite WAL mode 解决图谱导航超时问题
...
- 启用 PRAGMA journal_mode=WAL(写操作不阻塞读)
- busy_timeout 从 10s 降至 3s(WAL 模式下锁竞争大幅减少)
- 更新 eval_results.md 缺陷状态(P0 已修复)
2026-06-02 19:10:03 +08:00
xiaowei
40a8c9edee
feat: E1 BFS 扩展 + 生产部署完整套件
...
E1 图谱导航:
- Add ExpandWithSummary (BFS 扩展 + LLM 汇总)
- Add GraphBFSResult/ExpandedRelation 模型
- Fix NavigateBiDir 伪实现问题 (docs/BFS_GRAPH_EXPANSION_DESIGN.md)
生产部署:
- README.md: 完整安装/配置/API 文档
- INSTALL.md: systemd 手动安装指南
- docker-compose.yml: 一键部署 (zhiyid + redis + bge-m3)
- Makefile: VERSION/version/build-web/install-all/docker-* 目标
- systemd: MemoryMax/CPUQuota 限制,完善环境变量
集成支持:
- eval_results.md: 性能基准测试报告
- scripts/benchmark.sh / benchmark.py: 可重复性能测试
- tests/integration_test.sh: 端到端集成测试
已知问题: graph/navigate 超时 (P0),见 eval_results.md
2026-06-02 18:58:38 +08:00
xiaowei
0bda9a8420
fix: 静态文件路径 / 在 Auth 白名单中放行(供 Web UI 直接访问)
2026-06-02 17:34:28 +08:00
xiaowei
4501d93717
E5.3 Web UI: React 单文件 + 静态文件中间件
...
- web-ui/index.html: 4页 SPA(记忆/图谱/搜索/蒸馏),Babel standalone JSX
- Go 静态文件中间件: catch-all handler 检查 web-ui 目录
- Makefile: build-web / install-all 目标
2026-06-02 17:10:28 +08:00
xiaowei
420b48ae72
E5.2 增强 CLI: zhiyi stats/tree/recall/graph/entity 命令
...
- 零外部依赖,纯 Go stdlib flag 实现
- stats: 系统状态 + 蒸馏配额
- tree: 按 category 分组显示记忆
- recall: 语义搜索(/api/v1/recall)
- graph: ASCII 图谱(/api/v1/graph/navigate)
- entity: 实体详情(邻居数 + 关联记忆)
- Makefile 新增 build-cli 目标
2026-06-02 16:32:18 +08:00
xiaowei
abef38cb05
E5.1 Obsidian 插件: CORS中间件 + 记忆面板 + 图谱视图 + 搜索模态框
...
- 新增 CORS 中间件 (middleware/cors.go): 支持 app://obsidian.md 跨域
- 新增 Obsidian 插件: MemoryView(分页记忆列表) + GraphView(D3力导向图) + SearchModal(语义搜索)
- Go API CORS: Access-Control-Allow-Origin: app://obsidian.md
- Makefile 新增 build-obsidian / install-obsidian 目标
- 插件安装至 ~/.obsidian/plugins/zhiyi-memory/
2026-06-02 15:42:54 +08:00
xiaowei
f93da87a97
fix: distill端点 /status /queue /quota(Engine新增导出方法);WORKLOG同步
2026-06-02 12:28:00 +08:00
xiaowei
8db0138b06
G8: Restore+ListBackups 端点;G9: SearchCache 双级缓存(内存+Redis L2)
2026-06-02 11:43:34 +08:00
xiaowei
b0059166a2
fix G7 E3: crystallize路由路径+GetSkillCandidates通过Rust IPC查LanceDB
...
- server.go: 修复mux路由路径(去掉"POST "前缀)
- skill_crystallize.go: 添加POST方法检查
- models/memory.go: 添加safeTime类型避免空字符串解析报错
- lancedb_ipc.go: GetSkillCandidates改用Rust IPC的lancedb_query
- Rust lancedb_ops.rs: 新增query_memories()支持min_recall过滤
- Rust main.rs: 新增lancedb_query IPC handler
2026-06-02 04:19:58 +08:00
xiaowei
243a2066a4
G7.3: skill execute + quality_score fix
...
G7.3 — Skill执行+遗忘联动:
- skill_execute.go: ExecuteSkill handler, applyForgettingLinkage
- /api/v1/skills/{name}/execute: 返回 enriched_prompt + linked memories
- Trial feedback 联动: success → degree保护, failure → decay加速
Fix quality_score=0 (Step 2):
- main.rs: stratified_sample 用 tier 字段,但 memories 全为 "normal"
- 改为 r.freshness(默认为 "fresh"),匹配 stratified_sample 期望的 tier 值
G7.1+G7.2 已在运行(skill persistence + crystallize API 验证通过)
2026-06-02 00:48:36 +08:00
xiaowei
43286dd2d7
G7.1+G7.2: skill persistence + crystallize API
...
G7.1 — Skill 持久化:
- BetaSkill: prompt_template, linked_memory_ids, linked_entities, created_at
- BayesianSkillManager: EnableRedisPersistence(), loadFromRedis(), persistSkill()
- Redis HASH (zhiyi:skills) 持久化,重启不丢 skills
- Skill CRUD API: POST/GET/DELETE /api/v1/skills/{name}
- auto_distill skill: ETA=0.93, status=active after 12 trials ✓
G7.2 — Skill 结晶:
- GetSkillCandidates(minRecalls, limit): storage.LanceDB 接口扩展
- SQLiteClient: SQL 查询候选(recall_count>=5, quality_score>=0.7)
- RustLanceDBClient/MemLanceClient: stub 实现
- /api/v1/crystallize/candidates: 获取候选记忆
- /api/v1/crystallize/memory/{id}: 对记忆执行 LLM 结晶
- callSkillLLM(): LLM 生成 prompt 模板(带降级)
- RegisterLDBGetter(): routes 包访问 LanceDB 实例
2026-06-02 00:01:59 +08:00
xiaowei
137c25f16f
G7.1 fix: skillByNameHandler method dispatch, Redis persistence verified
...
- skillByNameHandler: GET/DELETE on same pattern via r.Method switch
- EnableRedisPersistence at startup: confirmed working via logs + curl
- Redis HGET zhiyi:skills: full skill state persisted correctly
- Trial feedback: ETA 0.5 → 0.67 after 1 success (Bayesian update ✓)
2026-06-01 23:48:51 +08:00
xiaowei
4f2c0fe769
G7.1: skill persistence - BayesianSkillManager Redis + CRUD API
...
- BetaSkill extended: PromptTemplate, LinkedMemoryIDs, LinkedEntities, CreatedAt
- BayesianSkillManager: EnableRedisPersistence(), loadFromRedis(), persistSkill()
- Skill CRUD API: POST/GET/DELETE /api/v1/skills/{name}
- Skill Manager: Register(), Get(), Delete(), Stats()
- redis.go: added HDel method
- triggers.go: removed duplicate Skill/SkillManager (now in skill_bayes.go)
- server.go: EnableRedisPersistence() at startup + new routes
2026-06-01 23:44:36 +08:00
xiaowei
df2b648973
fix E4.3: extract entities from content instead of namespace
...
E4.3 bug: admin.go used mem["namespace"] which is empty (LanceDB
map keys are different from struct field names). Fixed by:
- Replace namespace lookup with content-based entity extraction
- Reuse distill/engine.go heuristic: capitalized words, Chinese
entities (2-20 chars), tech tokens (alphanumeric/digits)
- Get max graph degree across all extracted entities
- Add isStopWord, stripNonChinese, isTechToken, isAllDigits helpers
Fixes: degree always 0 in ShouldForget call, graph integration broken.
2026-06-01 22:49:50 +08:00
xiaowei
525b5f2bb2
fix E4.3: 回退 FileGraph,恢复 SQLiteGraphStore(数据在 graph.db)
...
切换 FileGraph 导致 9.9MB 历史图谱数据丢失。
恢复 NewSQLiteGraphStore,GetEntityDegree 加到 SQLiteGraphStore。
验证:1720 节点,32983 边。
2026-06-01 01:16:31 +08:00
xiaowei
2d0923a85c
E4.3: 图谱度参与遗忘决策(完整接入)
...
- GraphStore 接口添加 GetEntityDegree(entity) int
- InMemoryGraph + FileGraph 实现(复用 EvidenceCount 逻辑)
- GetCandidatesForForgetting 返回 namespace + content 字段(存储层)
- AdminAPI 添加 GraphStore 字段,admin.go 的 Forget 接入
- server.go decay 循环接入:namespace 作为实体查图谱度
- 修复预存在错误:SQLiteGraphStore → FileGraph(无 SQLite 图谱)
- 修复预存在错误:consolidation_pipe PageRank 类型断言删掉(FileGraph 自更新)
2026-05-31 22:29:28 +08:00
xiaowei
51eec76f1f
fix E4.1: IsContradiction 中文感知修复(字符级切分+否定词检测)
...
问题:原 IsContradiction 使用 strings.Fields(),中文无空格时整句为一个词,
导致 overlap 始终为 0,矛盾检测永远失败。
修复:
- 新增 splitWordsCN:中文按 unicode.Han 字符级切分,英文按空格分词
- 新增 containsNegCN:检测中文否定词(不是/没有/不/没/莫/别)
- IsContradiction 合并中文/英文两种检测逻辑,阈值调至 0.3
验证:Test 2 返回 {"conflicts": ["小唯是牧尘的女朋友"]} ✅
2026-05-31 16:22:35 +08:00
xiaowei
a6403dd088
E4 图谱推理:E4.1 矛盾检测+E4.2 跨agent recall+E4.3 遗忘参考图谱度
...
E4.1: ConflictDetector 注入 core.go:API, Commit 时对相似记忆运行矛盾检测(IsContradiction),有冲突时在响应中返回 conflicts 字段
E4.2: Recall 结果 < 3 时自动补充搜索 shared namespace,合并跨 agent 结果
E4.3: Forgetter.ShouldForget 加 graphDegree 可选参数,节点度 > 5 时每度 +0.03 保留分
2026-05-31 16:03:21 +08:00
xiaowei
cbe4026834
E1: remove debug fmt.Printf from ExpandFromResults, update WORKLOG
...
- Remove 5 residual fmt.Printf("[E1] ...") debug statements from
SQLiteGraphStore.ExpandFromResults (graph_sqlite.go)
- Recall pipeline already has graph expansion wired via server.go:112
(SetGraphExpander(graphStore)) — feature was implemented previously
- ExpandFromResults trigger: len(results) < 5, BFS 1-hop, dedup by ID
- Update WORKLOG: E1 completed, G6.1 cluster_only mode explained,
G6.2/G6.3 consolidated, add cd0f898/cc615c5 commits, update 下一步
2026-05-31 14:50:56 +08:00
xiaowei
cd0f898829
fix: eps=1.0 (19 clusters from 1486 items), add col_vector() for FixedSizeListArray reading
...
- eps: 0.1 → 1.0 (p50=1.011, meaningful semantic clustering)
- col_vector(): parse FixedSizeListArray and Float32Array for LanceDB vector column
- search() and scan_all() now read actual vectors instead of vec![]
- client.go: remove duplicate Epsilon field, eps=1.0
2026-05-31 14:35:29 +08:00
xiaowei
1fa8349e48
fix: mode propagation, eps=0.1, BGE connectivity check, vector storage, WriteTimeout 60s
...
Key fixes:
- Go task mode now correctly propagates to Rust sidecar via IPC (RunWithMode)
- DBSCAN eps lowered from 1.5 to 0.1 (cosine threshold 0.995)
- Add BGE HTTP connectivity check (TcpStream 2s timeout) before Step 4 quality backtrace
- Fix LanceDB insert_batch: use Float32Array::from_iter_values + try_new with None validity
- Fix embed.rs: add .timeout(10s) on encode request
- Fix consolidation_pipe.go: nil guards on report
- Fix main.go: WriteTimeout 60s (was 10s, causing exit 52 on full mode)
- Add vector zero detection + debug logging (norms, sample distances)
- Log warning when BGE HTTP unreachable (skip quality backtrace instead of hanging)
2026-05-31 11:46:59 +08:00
xiaowei
7ac626e847
fix: useful_count type + revert resp.Result (use report_json)
...
1. Feedback端点 类型修复 (core.go)
- 之前传 map[string]int,Update() 只处理 map[string]string/map[string]interface{}
- int 被当作 string case 处理, 被丢弃
- 修复: map[string]interface{}{"": 1}
2. IPC 搜索字段名 (lancedb_ipc.go)
- Rust send_ok 用 report_json,不是 result
- 错误改用 resp.Result 导致 IPC 结果永远为空
- 回退到 resp.ReportJSON (这是正确的)
- 加 Result 字段只是为了日志可见性(不被 Rust 填充)
验证: recall_count=6, useful_count=1 确认写入 LanceDB
2026-05-31 07:43:42 +08:00
xiaowei
8d3582046c
fix: IPC 字段名 + recall_count 持久化 + feedback 端点
...
1. IPC 字段名修复 (lancedb_ipc.go)
- Rust lancedb_search 返回 'result' 字段,Go ipcResp 用 'report_json'
- 两边字段名不匹配导致 ReportJSON 永远为空,Search() 降级到 localSearch
- 后果:recall_count 只写 Go 缓存,不写 LanceDB,重启后丢失
- 修复:ipcResp 加 'Result' 字段 (json:"result"),Search() 改用 resp.Result
2. Update 扩展 支持 (lancedb_ipc.go)
- 原来只有 recall_count 支持 ,useful_count/not_useful_count 被丢弃
- 新增 getIncCachedValue() 统一处理所有 counter 字段
- 加日志:Update OK / Update FAILED 可见
- 修复 Feedback 端点 传递问题(map[string]int 而非 map[string]string)
3. /api/v1/feedback 端点 (core.go + server.go)
- POST memory_id + useful/not_useful,通过 LanceDB.Update() 持久化
- 之前返回 404
破坏性:无(Search 降级是隐式行为,原代码已有 fallback)
2026-05-31 07:36:31 +08:00
xiaowei
09c2319d7e
fix(G6): recall_count 并发递增 + cache population
...
问题:
1. recall goroutine 通过 id 查 _local.memories 总是 cache miss(cache key 格式不匹配)
2. Update() 用 defer unlock,IPC 调用在锁外,并发时丢失递增
3. 缓存命中时跳过 incrementRecallCount
修复:
1. recall.go: 结果写入 _local.memories(cache key=id)
2. lancedb_ipc.go: 移除 defer unlock,整个 IPC 调用在锁内
3. lancedb_ipc.go: Update 发送 cache 当前值(不是硬编码 "1")
4. lancedb_ipc.go: 支持 map[string]string 和 map[string]interface{} 两类
2026-05-31 02:14:56 +08:00
xiaowei
eac0dfc889
docs: 更新服务拓扑信息,WORKLOG.md补全进程/存储/API/环境变量
2026-05-31 01:56:35 +08:00
xiaowei
0ef3f2f0ba
fix(G6.2): LLM model换qwen3.5-122b,deploy service同步更新
2026-05-31 01:25:51 +08:00
xiaowei
3b031ed2e7
fix(G7): skill trial路由 + LLM API key 传递到 Rust sidecar + Authorization header
2026-05-30 23:55:43 +08:00
xiaowei
e95ae36236
G7.1 skill修复: trial路由{name} capture + Beta-Bernoulli后端统一
...
- Fix /api/v1/skills/{name}/trial route: was '/skills/' (no capture) → '/skills/{name}/trial'
- Skills.Trial now delegates to BayesianSkills.RecordTrial (was broken simple ETA)
- Skills.List now reads from BayesianSkills (was reading from wrong store)
- 3 successful trials → η=0.8, status=active (Beta-Bernoulli verified)
2026-05-30 23:21:34 +08:00
xiaowei
51a0747324
fix(G6): 修复 Rust IPC 字段名映射 + cluster_only 模式 + consolidation timeout
...
- client.go: Result 字段名从 clusters/noise 改为 clusters_found/noise_points(匹配 Rust)
- consolidation_pipe.go: 使用 cluster_only 避免 LLM 阻塞;GraphPruned 改为 0(cluster_only 不做 pruning)
- server.go: consolidation handler 加 30s timeout,避免 HTTP 挂起
2026-05-30 22:58:27 +08:00
xiaowei
d4c13e7377
feat(G5): eval 评估框架完整实现
...
G5.1 - eval/run namespace 支持 + 完整 IR 指标
G5.2 - eval/generate 生成 12 条金标(4类×3级),recall 自动获取 expected_ids
G5.3 - vprop 反向传播端点 + V 值查询接口(/trace/vprop, /vvalue/memory/)
2026-05-30 22:26:20 +08:00
xiaowei
93671dc1d6
feat: 接入 WSPrefetchAdapter 到 recall 管线
...
- 新增 WSPrefetchAdapter 实现 storage.PrefetchPusher 接口
- 当 agentID 为空时使用 WSBus.Broadcast(支持多 Agent)
- 在 NewAPI 中通过 SetPrefetchPusher 注入
- WebSocket prefetch.push 事件在 CO_OCCURS 权重 > 0.6 时触发
2026-05-30 21:58:26 +08:00
xiaowei
928468042f
fix: MMRSelect 使用字符 bigram Jaccard 相似度替代空向量 cosineSimilarity
...
原问题:Rust LanceDB IPC search 不返回 vector,导致 cosineSimilarity 永远为 0,
MMR 退化为纯相关性排序(无多样性去重效果)。
修复:改用 Content 字段的字符 bigram Jaccard 相似度,并修正 MMR 公式
(从 (1-λ)*rel - λ*maxSim 改为 (1-λ)*rel + λ*(1-maxSim),
使 maxSim 高时 MMR 降低,符合设计文档 §2.6)
2026-05-30 20:57:16 +08:00
xiaowei
69d41c3087
fix: E1 extractPotentialEntities 使用 utf8.RuneCountInString 而非 len() 计算中文字符数
...
- len(string) 返回字节数而非字符数,导致所有 2-8 字中文词被错误过滤
- 原始代码用 continue,现已恢复正确迭代逻辑
- 添加 unicode/utf8 导入
2026-05-30 20:33:22 +08:00
xiaowei
31712986de
fix(graph_sqlite): fix ExpandFromResults - wrong field access + Chinese entity extraction
...
Root causes fixed:
1. ExpandFromResults accessed p["to"] but SQLiteGraphStore.Navigate
returns {"source","target","relation","weight"} - field name mismatch
caused graph expansion to always return empty
2. Original logic checked seen[r.ID] (memory ID) against entity name
(neighbor string), which never matched - removed stale logic
Also improved extractPotentialEntities:
- Now handles Chinese continuous character sequences (2-8 chars)
- Chinese entities extracted as whole words, not split by spaces
- English capitalized words preserved with original casing
Changes:
- ExpandFromResults: correct field access (source/target/relation),
bidirectional neighbor detection (forward + reverse edges),
separate seenEntities map for entity dedup
- extractPotentialEntities: full rewrite for Chinese + better English
word tokenization without space-based splitting
2026-05-30 19:17:12 +08:00
xiaowei
5927f7d740
fix(selfoptimize): repair 3 dashboard metrics that were stuck at 0
...
1. gap_closure_rate: RecordMiss now increments Dash.TotalGaps; Close
calls Dash.RecordGapClosed(). Previously denominator was never written.
2. auto_resolve_rate: scanConflicts now calls Dash.RecordConflictResolved
after each AutoResolve. Previously consolidation path bypassed Dashboard.
3. avg_distill_loss: merge-count heuristic scaled from 0.01 to 0.002
with 0.05 cap. Previously 50 merges = 0.50 loss (same weight as 50 LLM
distillations), corrupting the average.
2026-05-30 18:03:49 +08:00
xiaowei
05c4a2d32e
fix(metrics): sync Prometheus zhiyi_total_memories from LanceDB stats
...
- Stats handler now updates TotalMemories/TotalEpisodes gauges on each call
- Startup goroutine initializes metrics 1s after boot (waits for Rust sidecar)
- Fixes zhiyi_total_memories showing 0 instead of actual count
2026-05-30 17:39:38 +08:00
xiaowei
daabd54649
fix(graph_sqlite): add busy_timeout + stale WAL/SHM cleanup on startup
...
Root cause: No busy_timeout set → immediate 'database is locked' on restart
when stale WAL/SHM/journal files remain from crashed previous instance.
Fix:
- On open(): clean stale -wal/-shm/-journal files (only if main db exists)
- After sqlite3_open(): set busy_timeout=10000ms (10s wait for locks)
- This eliminates the InMemoryGraph fallback on restart
2026-05-30 17:35:29 +08:00
xiaowei
cd49a2801a
fix(ws): add per-conn mutex to prevent concurrent WriteJSON panic
...
Root cause: Broadcast() and Push() launched multiple goroutines
writing to the same websocket.Conn simultaneously. Gorilla websocket
does not support concurrent WriteMessage/WriteJSON.
Fix: add connMu sync.Map (*websocket.Conn → *sync.Mutex) to WSManager.
Each WriteJSON now goes through writeWithLock() which acquires the
per-conn mutex. Unregister() also acquires the lock before Close()
to prevent write/close races.
No functional changes to API surface.
2026-05-30 17:15:19 +08:00
xiaowei
1337f2e21a
feat: 自优化第二轮 — 待办5项全部补齐
...
1. ✅ PassiveValidator: 已在 commit path 实现 (写入 ← 验证 前已存在)
2. ✅ Consolidate报告→Dashboard: 合并数/冲突数/quality解析注入Dashboard
3. ✅ VProp自动记录recall: 命中→success V决策, 空结果→failure
4. ✅ DBSCAN eps调优: 0.5→0.3, 更适应1024d高维向量
5. ✅ Gap repair证据: repair时写evidence日志, 注入LanceDB引用
总计: +120/-15行, 4个Go文件, 已部署重启
2026-05-30 12:44:50 +08:00
xiaowei
9d2bae3324
feat: 自优化7项全部补齐
...
P0: avg_distill_loss 接入 Dashboard
- RecordDistillLoss(loss) 在蒸馏回调中写入 Dash
- loss = 1 - Overall, 归一化 0-1
P1: V 值反哺召回排序
- storage.VValueProvider 注入(server.go → VProp.GetMemVValue)
- lancedb_ipc.go Search() 排序公式:30%V值+30%importance+40%QL
P1: PassiveValidator 写回 quality_score
- 蒸馏回调中 GetRecords() 遍历并 ldb.Update quality_score
P2: CausalTracker Redis 持久化 + 自动触发
- EnableCausalRedisPersistence() 启动加载
- persistCausal() 每次 RecordVersion/AddDependency 后同步
- commit 路径自动 RecordVersion(memID, content, agent, 'commit')
P2: GapDetector 自动 repair
- t_gap 触发器除关闭过期缺口外,对开放缺口调用 AutoRepair
- 修复成功后 RecordGapClosed
P3: Skill 结晶接入
- RecordTrial(name, success) 程序化接口
- 蒸馏/合并触发器中 RecordTrial('auto_distill', true)
P3: 指标采集 6h → 30min
测试: 全部重启持久化验证通过
2026-05-30 12:08:16 +08:00
xiaowei
945e5dfc66
feat: 自优化5项全链路补齐
...
P1: GapDetector Redis 持久化
- 13个缺口字段序列化为 JSON 写入 zhiyi:gaps HASH
- misses 计数器写入 zhiyi:gap_misses
- RecordMiss/Close 后自动 persist + 启动时 loadFromRedis
- 重启不丢缺口记录
P2: VPropagator Redis 持久化 + useful/not-useful 接入
- 决策记录写入 zhiyi:vprop_decisions HASH
- V 值写入 zhiyi:vprop_values HASH
- RecordDecision 后自动 persist
- feedback/useful → success, feedback/not-useful → failure
P3: 中文分类改进
- classifyGap 降级时检测中文同义词标记(又称/别名/aka)
- 含标记的 query 归为 GapSynonym(B) 而非 GapUnknown(A)
P4: QualityDropMonitor 阈值 5→2 + 蒸馏质量分
- minFeedbacks 从 5 降至 2,更早触发质量监控
P5: CoOccurTracker Redis 持久化
- RedisCoOccurPersist() 写入 zhiyi:cooccur HASH
- RecordRecall 中调用 ct.persist() 持久化每条边
- recall pipeline 中独立 goroutine 触发共访追踪
- LoadCoOccurFromRedis() 启动时加载
测试: 全部 5 项重启验证通过
2026-05-30 12:01:37 +08:00
xiaowei
c861171031
fix: PassiveValidator GetRecords 返回 [] 而非 null
2026-05-30 11:53:42 +08:00
xiaowei
bceb5fb059
feat: 自优化4大链路补齐
...
1. GapDetector 自动接入 recall 路径
- MissRecorder callback → RecallPipeline
- 0 结果时自动 RecordMiss(query)
- server.go 中 gapDetector 初始化后挂载
2. Dashboard 持久化到 Redis
- EnableRedisPersistence() 启动时加载
- persist() 每次 mutate 后同步 13 个计数器到 Redis HASH
- 重启不丢指标
3. PassiveValidator 接入 commit 路径
- 新记忆提交后自动 P1/P2/P3 匹配验证
- 复用 Validator.Validate 逻辑
4. VPropagator 接入 feedback/correct
- 用户修正时记录决策 V 值
- 使用 user_correct 来源 + success 结果
Closes: 10% 缺失代码 + 40% 缺失链路
2026-05-30 11:27:27 +08:00
xiaowei
064046f6da
fix: 7维置信度评分打通 — IPC持久化 + 时间衰减 + QualityScore融合
...
Rust sidecar:
- 新增 lancedb_update IPC 处理器 + update() 函数
- 使用 LanceDB 0.15 table.update() + SQL 表达式实现字段级更新
Go service:
- Update() 方法双写:本地内存缓存 + Rust IPC 持久化
- RecallCount 和 LastRecalledAt 通过 IPC 写入 LanceDB(不再重启归零)
- Dash.RecordRecall 加入 recall 回调 → recall_hit_rate 正常采集
- Search 返回时实时计算重要性得分(7维融合):
1. RecallCount → log(1+count) 对数缩放
2. LastRecalledAt → recency_factor(<7d=1, 7-30d=0.5, >30d=0.2)
3. QualityScore → 蒸馏 LLM 5维评分
4. VolatileFlag → true 时降权 50%
5. Tier 分层(core 永不衰减,预留)
6. PageRank(SQLite 图谱端,暂未连通)
7. CoOccur(内存追踪器,暂未持久化)
- 召回排序权重: rerank_score×0.7 + quality_score×0.3
待处理(需跨库协调):
- PageRank → Importance 联通(consolidation 周期写入)
- CoOccur 持久化(SQLite 存储)
2026-05-30 11:06:28 +08:00