小唯
|
199608a7d3
|
feat(intention-ttl): 意图 TTL — intention 类 + expires_at 跨五层落盘 + 过期负分降档(非删除,ZHIYI_INTENTION_TTL 门控)
- Go model/IPC/FTS 通道/SQLite/API 写入(RFC3339 严判 400)+ Rust struct/schema/builder/6×读侧 col_str
- recall 降档块在 MMR 之前(选择与展示共用同一套分数),过期 intention rerank 分置 -1 → 展示分 -0.445
- 关态 intentionExpired 恒 false ⇒ 降档块零赋值;AC2 HEAD vs 新版同库同 sidecar 现采基线 fresh 逐位一致
- 单测:关态逐位/开态下沉且在场/负分压过全部正常分/纯度(他类、未过期、空=永久)
- 回滚:env 置 0 或 unset(每调用读 env,无需重启);磁盘列 additive 保留不删
t_88cc9cb8
|
2026-11-07 04:09:06 +08:00 |
|
小唯
|
0a05014a35
|
feat(memory-raw): 原文层下钻 — GET /api/v1/memory/{id}/raw + GetRecordByID 三层后端 + Rust get_by_id IPC + 插件 memory_raw 工具 (t_0f1d7be9)
- recall 响应带 derived_from 指针(既有列已直通,补回归闸门防回退)
- 新端点三态:200+raw_text / 200+no_provenance / 200+episode_missing / 404 memory_not_found / 503 存储故障(禁静默空)
- LanceDB 接口加 GetRecordByID(table,id):Rust IPC(lancedb_get_by_id 单行读,旧 sidecar 未升级=显式 error 不冒充不存在)/ SQLite / 内存三后端
- 旧实例同库同查询对比:recall 字段集合与结果顺序逐位不变(只多 derived_from 键)
- raw_text 4000 rune 截断标注;插件 memory_raw(id) 2000 字符截断标注,旧服务端 unsupported 显式区分
- 测试:memory_raw 路由 6 例 + IPC 契约 3 例(旧 sidecar 防静默 no-op)+ E2E 模板(ZHIYI_RAW_E2E_SOCK)+ 字段集合闸门
- 量化:30 条带指针样本经新端点取回 28/30(2 条=episode_missing 真实缺原文);28/28 原文含结论所无的数字/标识符
|
2026-11-06 23:56:22 +08:00 |
|
xiaoyi
|
dc2b9db683
|
feat(distill,recall): 蒸馏粒度三档 + skill 分节召回增强(t_afacc477,本地未部署)
- distill: ZHIYI_DISTILL_MODE 三档(current/context/merged)+ ZHIYI_DISTILL_CAP 可配
- distill: 信息密度灰度门 ZHIYI_DISTILL_DENSITY(默认关,关态 prompt 逐字节不变)
- recall: skillref 方案二,skill 文档进召回(新增 routes/skillref.go)
- memory: DerivedFrom 原文指针(derived_from 列),供回溯原始 episode
- 验证: go build ./... 通过 / go test storage+distill+routes 全 ok
- gitea 推送暂缓(家里服务器维修中)
|
2026-11-06 21:25:46 +08:00 |
|
小唯
|
0b2b4f01d8
|
fix(storage): recall_seen_count 批更新加 COALESCE —— NULL 行不再吞召回观测值 (t_5aa7cb77)
批路径 .column("recall_seen_count", "recall_seen_count + delta") 下推 DataFusion,
SQL 语义 NULL+n=NULL ⇒ 17717 行(43.8%)观测值静默丢失。改 COALESCE(recall_seen_count,0)+delta。
逐条 fallback 路径本就 NULL-aware(读现值 unwrap_or(0))且其 split_whitespace 3 段
解析不容 COALESCE,故不动并加注释防后人误改。
|
2026-10-27 04:34:48 +08:00 |
|
小唯
|
a293f7b784
|
feat(storage): A10 拆出人工有用 human_useful_count 单独列(t_d618dc7c)
- Rust lance schema 追加 human_useful_count (Int64, nullable);open() 自动加列
迁移,存量回填 NULL(与 confidence/human_not_useful_count 迁移模式一致)
- MemoryRecord 读侧接线(get_by_id/search/scan_all/scan_deleted/record_from_batch)
走 col_i64_opt(NULL 读回 None,区别于 0)
- insert_batch 写入侧:未声明/NULL → 写 NULL;显式整数 → 写值(与 confidence 同款)
- update() $inc 基数改 col_i64_opt(NULL 行按 0 起算,首次人工 useful NULL→1)
- Go IncrementUseful 同一次 Update 三 $inc:useful_count + recall_verified_count
+ human_useful_count(只有人工 feedback 路径调用,机器自评路径不写此列)
- Go MemoryRecord/memEntry 加 *int 字段(nil=NULL)
- 新增 human_useful_count_test.go:人工 useful 同时 +1、机器路径不动反例
- 排序公式/权重零改动(AC#6 排序零变化)
|
2026-10-19 19:42:29 +08:00 |
|
小唯
|
1f30474cf3
|
feat(storage): t_789898bd importance 温度计 — 写入侧规则化 importance + env 回滚开关 + 存量回填工具
AC1 lancedb_ipc.go:159/:200 硬编码 importance 1.0 改为规则调用:
EffectiveMemoryImportance(m) 显式值优先; 规则开⇒档位; 关(默认)⇒回落1.0(零行为变化)
EffectiveEpisodeImportance() episode 原始日志 规则开⇒0.3 预留档; 关⇒1.0
AC2 规则档位(全库实测标定, 每档>=1%, 无值==1.0): core=0.9(4.11%) / normal×wiki,llm_distill=0.7(70.06%) /
normal×legacy,unknown=0.4(25.84%) / normal×recovery=0.3(预留档)
未纳入: 内容深度(78.1%<50字⇒切档违反>=1%) / 时间衰减(排序已有运行时recency项, 避免双衰减) / 图谱连接度(红线不碰图谱)
AC3 存量回填: rust bin importance_backfill(仅写 importance 一列, id IN 组提交 25 版本,
提交冲突有界退避, verify 逐行复算, rollback=整表1.0 一个版本)。
生产执行: 46,930 行全部回填, 恒1.0 行数 46,930 -> 0 (verify mismatch=0)
备份: ~/.hermes/state/t_789898bd-importance-backup/memories-id-importance.csv (46,913 行, 全部 1.0)
AC4 golden 集合 before/after: mrr 0.4345→0.4345, ndcg 0.4722→0.4722, keyword 14/14 不变(差 0%, <±10%)
AC5 回滚开关 ZHIYI_IMPORTANCE_RULE(off=默认, 逐位等同改动前); 回滚命令:
importance_backfill --data-dir /var/lib/memoryweave --mode rollback
单测: go test ./internal/storage/ 全过(5 个新 importance 用例); 回归: storage+models+api/routes 全过
|
2026-10-18 21:27:17 +08:00 |
|
小唯
|
941b7eec32
|
fix(storage): t_20bfbd9a 边车线程风暴根治 — Rust 连接并发上限+RSS护栏降级串行;命中事件重试跨commit指数退避+积压上限
AC1 Rust accept 循环对每连接 thread::spawn 无上限,Go 侧每 rpc 新 dial ⇒
IPC 洪泛线程线性涨到 736。加 AtomicUsize 连接门(默认64, env ZHIYI_CONN_MAX),
超限回 heavy_conn_busy;RSS 超上限(默认3000MB, env ZHIYI_RSS_LIMIT_MB)降级串行。
AC3 usage_recall 加 retry_count/next_retry_at:持久失败行指数退避(1s..600s)不再
每 commit 热重扫;积压超 ZHIYI_USAGE_BACKLOG_MAX(默认500)本轮跳过扫描。
AC4 新增 usageBackoff/backlog 单测。Go 全仓测试通过。
|
2026-10-18 02:19:03 +08:00 |
|
小唯
|
c015febb49
|
zhiyi: 单次重读行数上限 + Go IPC 读 deadline + 每 rpc 新 dial (t_576714de)
N=2 准入只拦并发堆叠、不拦单请求自身内存:一次 top_k 大 / scan_all
仍能把单条 zhiyi-consolidate 顶到 1~2GB+ 致 swap thrash(t_eedb2d39 根因)。
改动:
- rust/main.rs: ZHIYI_HEAVY_READ_MAX_ROWS(默认 20000,可覆盖)clamp
lancedb_search top_k + scan_all/scan_deleted;响应体加 truncated:bool
(#[serde(default)] 向后兼容旧 Go 客户端);zhiyi_ping 暴露当前 cap。
- rust/lancedb_ops.rs: scan_all/scan_deleted 的 .limit(200_000) 参数化为 max_rows。
- go/lancedb_ipc.go: ipcReq/ipcResp 加 Truncated;rpc() 用 SetWriteDeadline(30s)/
SetReadDeadline(120s)(原 io.ReadFull 无 deadline = 侧车挂死永久阻塞的根源);
Search/ScanAll/ScanDeleted 截断时打日志(不静默)。
- go/ipc_reconnect_test.go: TestIPCReadDeadlineBoundsHungSidecar(纯 Go,挂死侧车
被读 deadline 兜住 ~801ms)+ TestIPCReconnectAfterSidecarRestart(env 门控,
真 sidecar 杀→快速失败 37µs→重启→重连成功)。
隔离副本 /tmp 实测:封顶 20k peak RSS ~1.17GB vs 不封顶 200k ~1.60GB/80s。
不部署(部署另批,需小怡终审 + 牧尘放行)。
|
2026-10-17 21:52:06 +08:00 |
|
小唯
|
c3747755b6
|
feat(rust): t_690cc333 重读准入信号量 N=2 — search>1000/forget_window/scan_all/scan_deleted 计数门限并发内存(3×search10000吞1.5G swap⇒OOM⇒3800写失败的放大器);无许可有界等待100ms后拒heavy_read_busy(不排队不占内存),轻op(ping/insert/update/stats)永不门控;写路径零改动;env ZHIYI_HEAVY_READ_CONCURRENCY可调;zhiyi_ping增heavy_read_in_flight观测。AtomicUsize门(本机toolchain无std::sync::Semaphore)
|
2026-10-17 01:09:47 +08:00 |
|
小唯
|
4bbf59dabe
|
feat(rust): t_89d22fc8 风暴守卫(AtomicBool+ConsolidatingGuard)+zhiyi_ping健康探针 —— 全量consolidate独占槽防线程堆积OOM;探针判据connect≤3s+ping往返≤5s
|
2026-10-17 00:06:40 +08:00 |
|
小唯
|
bdc18f6177
|
fix(recall): t_1a30330b scan_all 读侧漏接 last_recalled_at(恒 String::new() ⇒ 误诊全库为空)+ ZHIYI_LAST_RECALLED_WRITE 冲突重试门控(默认关=现状)
根因:本体审计用 scan_all 计数 last_recalled_at,而 rust/lancedb_ops.rs 的 scan_all/search/query_memories 三处均硬编码 last_recalled_at: String::new() ⇒ 全库看似 0 非空 ⇒ 误判「写入缺失、遗忘判据退化」。实际 forget_window(遗忘循环真正读侧)读到 78.8% 非空、含当日 321 条写入 ⇒ 写入工作正常。
修复:
1. 三处读侧接线 last_recalled_at: col_str(&batch,i,"last_recalled_at") —— 根治误诊,审计/列表/测量现可见真实值。
2. env 门控 ZHIYI_LAST_RECALLED_WRITE(默认关=现状):开=对 update_recall_batch 的 Commit conflict 重试一次(重开表拿新 read_version),提高并发下 last_recalled_at 落盘率。默认关 ⇒ 生产零行为变化。
|
2026-10-15 21:08:39 +08:00 |
|
小唯
|
d0558e1fd5
|
fix(zhiyi): t_763e8701 返修 bi-temporal 三列未落 LanceDB — 补齐 Go payload+读回 & Rust schema+builder+读侧 5 层
根因:t_3ada332b 只改了 models 结构体 + server.go 算值,LanceDB 边界三层缺失
(Go lancedb_ipc.go 写 payload + 读回解包、Rust arrow_schema + struct + builder + col_str)
⇒ valid_to 永不持久化 ⇒ validityExpired("") 恒 false ⇒ 失效降权生产 no-op。
本次(照 t_3e98b65a 给 superseded_by 的 5 层模式逐一对齐):
1. Go lancedb_ipc.go 写侧 payload 补 valid_from/valid_to/provenance 三键
2. Go 读侧补三处:Search 解包struct+输出映射 / Scan 解包struct+输出映射 / GetSkillCandidates mapStr 路径
3. Rust lancedb_ops.rs struct 字段(#[serde(default)],存量行不报错)
4. Rust arrow_schema Field::new 三列(nullable,存量由 open() 迁移补列)
5. Rust 写 builder col vec + push + StringArray + 5 处读侧 col_str
新增 e2e 回归闸门 bitemporal_e2e_test.go:经真实 LanceDB sidecar 写一条 valid_to 已过期记忆
→ 读回断言三列非空且等于写入值(ZHIYI_BITEMPORAL_SOCK 门控,未设跳过)。
单测(AC1/AC2/AC3/AC4)+e2e 全 PASS;全量 go test 仅既有 flaky TestCommitConflictGate_E2E(clean baseline 同败)。
|
2026-10-14 05:01:27 +08:00 |
|
小唯
|
f8ffcde0f4
|
feat(distill): t_3e98b65a 写时四操作(ADD/UPDATE/NOOP/CONFLICT-MARK)+写前哈希去重——Mem0血统
影子默认(ZHIYI_WRITE_OPS=shadow,零行为变化;=apply才真改库):
- 新 distill/write_ops.go: 归一化+MD5哈希去重(ContentHash)、规则基四操作判定
(defaultJudge可注入JudgeFunc/ContradictionFunc,生产可接governance矛盾检测)、
shadow日志JSONL(/var/lib/memoryweave/write-ops-shadow.log)
- 四操作: ADD新建/UPDATE旧条标superseded_by+新条active/NOOP丢弃记log/
CONFLICT-MARK双方标conflict交人工(永不自动删)
- server.go OnDistillComplete 写路径挂四操作判定(影子只记不改库)
- schema: models+sqlite.go+lancedb_ipc.go+rust 加 superseded_by 反向指针列(additive)
- 顺手: engine.go Weights/echoScoreVectors 补 MemOS 血统出处注释(借鉴溯源全清单§2.1)
- 报告生成器 scripts/tools/zhiyi-writeops-report.py(影子48h后出分布+误判抽样)
AC: 四操作各1单测+哈希去重+影子零变更全PASS; go build全过;
Rust release build 0; 除既有flaky TestCommitConflictGate_E2E(干净HEAD同败)外go test全绿
|
2026-10-14 03:18:13 +08:00 |
|
小唯
|
1cfb17ac5e
|
chore(git): 停止跟踪 13 个 *.bak.* 改动前快照 + .gitignore 加规则防复发
这些 .bak.<topic>-<ts> 是各卡改动前的备份快照,被多张卡(proofchain/timedecay/standing)
陆续 commit 进版本库,累计约 4800 行纯垃圾,且会随历史永久保留。
git 本身就是版本历史,备份快照不属于版本库。
做法:git rm --cached(磁盘文件保留,不动内容)+ .gitignore 加 *.bak.* 。
本 commit 不触碰任何源码。
|
2026-10-14 01:57:18 +08:00 |
|
小唯
|
8364ff1b36
|
feat(standing-answers): t_e9a4d18f P2 常设答案(mental models)——standing_answers表(SQLite+Rust schema)+读写存储+API直读(/api/v1/standing-answers)+注册表(3问)+生成脚本zhiyi-standing-answers.py(复用本地2B); 单测4/4 PASS; 默认不注入行为零变化
|
2026-10-14 01:47:58 +08:00 |
|
小唯
|
ae39e1ce8a
|
feat(evidence-chain): t_e9a4d18f P1 证据链+proof_count——SourceEvents(多证据列)+ProofCount派生+QualityFromProof(饱和x/(x+K),ZHIYI_PROOF_FALLBACK门控兜底)+Supersedes矛盾保留列; 单测5/5 PASS; Go+Rust build通过; 默认关行为零变化
|
2026-10-14 00:52:29 +08:00 |
|
小唯
|
13ced12ce9
|
feat(memoryweave): GA-P0-4 落 hits+/hits− 双计数器——独立语义的 outcome 信号(禁部署)
新增 append-only 事件表 hit_events(sqlite/Rust-LanceDB/memvector 三后端同步),
带 created_at 时间戳可按周窗口聚合,只由真实 outcome 写入(人工反馈/矛盾/取代/
下游引用);dedup 降权/单纯召回出现**不算**(P0-1/P0-2 拆出的假信号,见 hit_event.go
排除项 + docs/hit-outcome-signal.md y 判据)。修正 已办.md:16623 的 hits+=useful_count
错误等同并标注更正依据。
写入点接线 feedback.go(/feedback/useful→pos, /not-useful→neg)。单测 5 例 PASS(含
dedup 降权不计入 hits− 反例 + sqlite 关库重开 read-back);Rust cargo build 通过;
LanceDB 真实 sidecar IPC append/count/get read-back 取证(count 时区归一修掉跨时区错位)。
禁部署:未动运行中二进制、未碰 live 库。
|
2026-10-12 19:50:58 +08:00 |
|
小唯
|
cb450e9c9d
|
feat(memoryweave): GA-P0-3 拆分 is_deleted 删除原因 → delete_reason 枚举(禁部署)
- 新增 delete_reason 固定枚举列(merge_dup/contradiction/manual/retention/unknown)
- LanceDB(Rust arrow_schema+MemoryRecord+read/insert) 与 sqlite 双侧 additive 同步
- 所有软删写入点统一归一化写 delete_reason:
SoftDelete(manual/merge_dup/contradiction/retention) · SoftDeleteBatch(unknown)
· PurgeInvalid(retention) · Rust soft_delete_batch(unknown)/purge_invalid(retention)
- 新增 lancedb_scan_deleted IPC + Go ScanDeleted:存量已删行回填工具枚举用
- 回填工具 go/cmd/backfill_deletereason(dry-run 默认)+ 单测 7 例(每 reason≥1 写入用例)
- 直方图(副盘真跑):N=11240 全 unknown(tombstones 无 provenance,按 AC 判不出写 unknown)
- 禁部署/禁真删/禁改已删记录其它字段:live 库零改动
|
2026-10-12 18:52:09 +08:00 |
|
小唯
|
28f6951061
|
feat(memoryweave): GA-P0-2 拆分 recall_count → recall_seen_count / recall_verified_count(禁部署)
背景:recall_count 被当成 V 值喂给衰减/遗忘逻辑,但每次召回命中都 ++,
造成「被召回 500+ 次所以永不遗忘」的虚高保命。实测 11576 条 recall_count>0、
2732 条 >=10,全是「出现在结果里」而非「被真正用上」。t_268b0353 注释早已
点明「被召回 ≠ 被验证」。
改法(AC1-6,禁部署):
- LanceDB(arrow_schema) + sqlite(create/alter) 两侧同步新增
recall_seen_count / recall_verified_count(additive,不删旧列 recall_count)
- 拆分两个写入点:召回命中(缓冲 Record→UpdateRecallBatch / 兜底 incrementRecallCount)
→ 写 recall_seen_count;正反馈(IncrementUseful)→ 写 recall_verified_count + useful_count
- recall_count 冻结不再增长,保留只读(deprecated),衰减/遗忘只认 recall_verified_count
- 排序去偏(lancedb_ipc Search importance)改用 recall_seen_count(观测/选择信号);
技能候选筛选(query_memories / GetSkillCandidates)改用 recall_seen_count
- 单测 TestRecallSeenVerifiedIsolation / TestRecallCountFrozen:一次召回 seen++
verified 不增;一次正反馈 verified++;recall_count 冻结
- 实网取证:副本 LanceDB(禁部署)上跑真实 recall+反馈,
BEFORE(0/0/0) → AFTER_RECALL(recall_count=0 seen=1 verified=0) →
AFTER_VERIFY(0/1/1);schema 演进在副本上补列 4 个成功
go build/vet/test + rust build 全绿;E2E 蒸馏触发测试系既有 flake(stash 复现),
本改动无关。禁部署遵守:live /var/lib/memoryweave 未动,仅在副本上验过。
|
2026-10-12 16:54:32 +08:00 |
|
小唯
|
9b7b969cd3
|
feat(memoryweave): GA-P0-1 拆分 not_useful_count → human_not_useful_count / dedup_downweight_count
背景:not_useful_count 被两种语义混写——用户人工点「没用」(feedback.go
MarkNotUseful) 与 dedup/合并流程自动降权(core.go Dedup demote) 都写同一字段。
实测 35010 行里 509 条非零但 human useful 仅 21 ⇒ 字段被混写。P2 自适应阈值
要靠它当标签,统计即垃圾。
改法(AC1-5,禁部署):
- LanceDB(arrow_schema) + sqlite(create/alter) 两侧同步新增
human_not_useful_count / dedup_downweight_count(additive,不删旧列)
- 两个写入点各写各的:feedback.go→IncrementHumanNotUseful;
core.go dedup→IncrementDedupDownweight
- not_useful_count 保留 deprecated,新代码不再读(读侧仅 Scan/迁移保留)
- 存量迁移工具 cmd/split_notuseful(--dry-run 默认,apply 需终审);
实测存量无可按来源判定行(M=0)→ 全部归 unknown(K=109 存活行),apply=no-op
- 单测 TestSplitNotUsefulFieldIsolation:两写入点写不同字段,相对增量断言
go build/vet/test + rust build 全绿;rust open() schema 演进在副本上
实测补列 human_not_useful_count/dedup_downweight_count 成功。
|
2026-10-12 14:17:31 +08:00 |
|
小唯
|
e9fce11a1b
|
fix(zhiyi): t_268b0353 治根 — 断 auto_recall V 传播 + 召回不写 freshness=verified(Rust 主路径+Go 兜底) + volatile_flag 标注预留
- core.go: auto_recall 的 memory_ids 传 nil(「召回命中」不再冒充「记忆有用」进排序权重)
- rust lancedb_ops.rs:489/510(zhiyi-consolidate 主写路径)+ go 兜底: 召回不再盖 freshness=verified
(「被召回」≠「被验证」,越常被召回的旧快照不再越「可信」)
- lancedb_ipc.go: volatile_flag 恒 false 处标注为预留惩罚分支,当前不生效
- 集成测试同步:版本计数负载不再写 freshness 列
|
2026-10-11 23:44:57 +08:00 |
|
小唯
|
aa8f503ae0
|
fix(forgetting): 遗忘候选池固定2000窗口不轮转 → 旋转窗口全覆盖(方案c′)
Rust: scan_forgetting_window 列投影取全部存活mem_ id→内排序→连续窗口→
区间过滤还原全字段;游标=窗口末id;wrapped回绕。修复 LanceDB query 默认limit=10坑。
Go: GetCandidatesForForgetting 传游标+持久化 forget-cursor.json(原子写,韧性降级)。
实测真库 coverage=1.0000(13轮全覆盖22462),池内>10-07从~2→每轮2000。
|
2026-10-11 12:53:15 +08:00 |
|
小唯
|
90af029c16
|
feat(memory): confidence 信任等级字段(Gap#2 来源加权 · 接线全通 · 加权默认关)
- schema: memories/episodes/tombstones +confidence(Float64,nullable) +confidence_source(Utf8,nullable)
- 迁移默认值改类型感知 + 一律可空(原 '' 字面量会把列标成 non-null,与 arrow_schema 冲突)
- 6 层接线全通:Rust schema/insert/scan/search → Go 解包/输出构造 → RecallResult
- recall.go: COALESCE(NULL→1.0) + 门控加权(ZHIYI_CONFIDENCE_LAMBDA 默认 0 = 首日 no-op)
- 新增 conf_e2e_test.go 端到端回归(未设 ZHIYI_CONF_SOCK 自动跳过)
- 验证:副本迁移 25→27 列行数不变;显式声明往返 0.5/authoritative;未声明读回 NULL
|
2026-10-08 20:39:29 +08:00 |
|
小唯
|
9bfe4c217f
|
fix(p1-1): forget path - counting test + purge-invalid endpoint (t_37ac8a45)
|
2026-10-08 15:44:04 +08:00 |
|
小唯
|
a187275e1b
|
fix(lancedb): episodes/tombstones schema 迁移 — open() 补齐缺失列 (P0 t_3df364b8)
根因:open() 用共享 arrow_schema()(25列) 建新表,但不迁移已存在表。
commit ca45c96 加 embedding_model/script_version 后,memories 重建为 25 列,
episodes/tombstones 停留 23 列 ⇒ Append 25 列静默失败 ⇒ episode 丢失 5.9h。
修复:open() 时对比实表 schema,用 add_columns(NewColumnTransform::SqlExpressions)
补齐缺失列,三表统一走迁移路径。
验收:episodes 118693→118714 行 / 23→25 列 / 最新 03:24:24→09:12:04;
近 90s schema 错 0、commit 冲突 0、写入成功 35 次;tombstones 同步 23→25 列。
部署坑:zhiyi-consolidate 是独立 systemd unit(Wants= 单向),重启 zhiyid 不会重启它。
|
2026-10-08 10:17:48 +08:00 |
|
小唯
|
ca45c96e32
|
fix(provenance): 落库 embedding_model/script_version 血缘字段 (t_7e3577c5)
根因: commit→distill→memory 管线从不在服务端持久化请求 metadata 里的
embedding_model/script_version, MemoryRecord 结构缺这两字段, 导致
zhiyi-vault-ingest.py 已发送的血缘被丢弃, 新写入恒 NULL。
修复:
- Go MemoryRecord + DistillInput 加两字段;
core.go commit handler 解析 metadata→AutoDistillTrigger 透传;
server.go 落库时 orDefault(embedding_model→bge-m3, script_version→unknown);
lancedb_ipc.go 记录 map 带上两字段。
- Rust MemoryRecord + arrow_schema() + insert_batch + 4 处 col_str 读取。
验证: commit 带 metadata → 蒸馏落地 19 行 bge-m3/vault-ingest-2.0.0 (原为 NULL)。
|
2026-10-08 03:57:30 +08:00 |
|
小唯
|
1060e62066
|
fix(admin): /memories 与 /memories/export 改用全表扫描(Scan),弃零向量 ANN
病根:两个列表/导出端点一直用『零向量 ANN』冒充『列出全部』——零向量没有方向,
ANN 退化成本存储序前 N 行,再按 ns 客户端过滤 ⇒ 计数完全失真
(实测 export hermes-main 报 1 条,真实 139+;shared 报 0,真实 29)。
修复:
① Rust lancedb_ops: scan_for_forgetting 加 namespace 下推(only_if),limit 作用于过滤后结果集
② Go 接口 LanceDB 新增 Scan(limit, ns):
- RustLanceDBClient → lancedb_scan RPC
- SQLiteClient → SELECT ... WHERE is_deleted=0 [AND ns] ORDER BY created_at DESC LIMIT
- MemLanceClient → 内存 map 过滤 + created_at 倒序
③ 两个端点 ListMemories / ExportMemoriesMD 改用 aa.LanceDB.Scan(limit, ns)
④ 补 mock(zz_commit mockLance / write-buffer fakeLDB)+ 5 条新判据
(全表 3 / hermes-main 2 / shared 1 / limit 生效 / 不存在 ns 0)
|
2026-09-21 16:36:41 +08:00 |
|
小唯
|
3b8ecba48e
|
perf: 织忆内存/碎片双治本 — PageRank O(V+E) 重写 + 写入去抖 + 在线VACUUM
1. PageRank 三重循环 O(47k×374k×20≈3.5e11) → 入边表 O(V+E):
单次 full 整合 4h41m → 95.2s,内存峰值 3.8G → 237MB(实测)
2. 图谱修剪 merge 边 id 加 relation + INSERT OR REPLACE:
修复 09-18 起 UNIQUE constraint 静默失败 → 主库首次跑消 9.8万冗余边
3. LanceDB 写入去抖(server.go + validator.go):
被动验证只写 Confidence 实际变化的记录;原先每输入重写全库 6000 条
→ 版本快照 O(n²),每日 ~1.9万版本/十几G 膨胀的根因
4. 新增 scripts/lance_vacuum_online.py:在线 VACUUM(不停服务)+
24h 版本窗口(可回滚)+ 行数门禁(减少才报警);替代停服务版
每日 vacuum → cron 已改为在线版
实测:侧车 RSS 1.09G→69MB;memories 分片 5383→1;服务全程在线
|
2026-09-21 10:17:56 +08:00 |
|
小唯
|
ee50ef0d59
|
fix(rust): 恢复缺失的 LanceDBStats/stats() 和 helper 函数 (t_3fb41049); storage: 添加软删除累积延迟缓冲 (t_384f785b)
|
2026-09-14 22:14:52 +08:00 |
|
小唯
|
68ce2c9678
|
feat(distill): 限制 prompt ≤8k token 保护本地 2B 单槽; storage: 添加 SoftDeleteBatch 及 Rust 端批量软删除优化 (t_3fb41049)
|
2026-09-14 22:09:44 +08:00 |
|
小怡
|
f2362150d1
|
perf(recall): 累积延迟更新治理写放大 — 读路径零逐条写 + 单事务批量落盘 (t_8496e8b6)
根因: recall 读路径对每条结果同步 lancedb.Update,LanceDB MVCC 每次提交=1 版本
实测 15 版本/分钟 / _versions 17.7G(真实数据 22M)
改动:
- Go: 新增 RecallWriteBuffer(窗口合并+阈值触发+优雅退出落盘);recall.go 读路径改 Record();RustLanceDBClient.UpdateRecallBatch
- Rust: lancedb_update_batch IPC — 按 delta 分组,每组一次 update(`recall_count + delta` + id IN (...)) 提交
- 单测 6 个 + IPC 端到端版本计数测试;bench_test.go 修 NewReranker 签名失配(阻塞包测试)
实测: 批量 3 条 → 1 个版本;逐条 3 次 → 3 个版本 (lance 不支持 CASE WHEN,已按 delta 分组规避)
|
2026-09-12 17:57:31 +08:00 |
|
小唯
|
a69f07c898
|
fix(stats): count_rows filter 类型修正 Option<&str> -> Option<String>
a7082d3 的 count_rows(Some("is_deleted = true")) 编译失败(E0308: 此 lance 版本
签名 Option<String>)。修正为 .to_string()。实测 stats tombstone_count=830
(memories 表 is_deleted=true 行数, 之前恒 0)。
|
2026-09-06 09:25:27 +08:00 |
|
小唯
|
a7082d381a
|
fix(stats): tombstone_count 统计源修正 — 数 memories is_deleted=true 行
SoftDelete 持久化语义 = memories 表内标记 is_deleted=true(不写独立 tombstones 表),
但 Rust stats() 的 tombstone_count 数的是空 tombstones 表 → 恒 0(指标失真)。
修正:stats() 对 memories 表 count_rows(Some("is_deleted = true")) 作为 tombstone_count。
验证: DELETE 一条记忆后 stats tombstone_count 应 >0。
|
2026-09-06 09:22:49 +08:00 |
|
xiaowei
|
4a245b6262
|
fix(forgetting): P2 候选源升级 — Rust scan 全表替代纯缓存遍历
GetCandidatesForForgetting 原实现只遍历进程内 _local.memories 缓存
(commit/recall/search 才触碰), 重启后缓存空 → decay scanned=3 扫不全,
9-25 到期记忆若不在缓存则永远无法被遗忘(闭环断)。
安全版 scan_for_forgetting (防 febc2c9 风暴复发):
- 强制 limit (IPC 钳制硬上限 5000, decay 侧 2000)
- 不读 vector 列 (1024维×3000条≈12MB+, IPC JSON 会卡)
- 真读 last_recalled_at 列 (scan_all 旧实现 String::new() 恒空 → 遗忘判定失真)
- 消费方截断护栏已就位 (merge 桶500 / conflict 500 / sanity 1000)
- IPC 失败/空 → fallback 缓存遍历 (保持可用)
验证: [decay] scanned=3 → 2000 (重启即扫全表), CPU 0%, 无 panic
|
2026-09-06 02:32:58 +08:00 |
|
xiaowei
|
2a350cf781
|
fix(distill): max_tokens 800→1200 — Agnes推理token预算不足
Agnes 2.0-flash是推理模型,推理token占大量预算。
800仍不够→JSON截断(parse error: unexpected end of JSON input)。
1200确保推理+正文都够用。
|
2026-08-20 01:13:06 +08:00 |
|