mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-10-04 00:03:59 +00:00
fix(memory): 记忆层启动接线/并发/落盘一致性整备
按设计方案整顿记忆系统,收敛一批"单测照不出、只在长跑生产里暴露"的缺陷: - 启动接线:initMemoryStack 残留 `defer distiller.Stop()`,规则蒸馏 10min 心跳启动即死。改为由调用点 cleanup 停机,并补 Stopped() 探针 + TestInitMemoryStackKeepsDistillerRunning / TestStartKeepsLoopRunningUntilStop。 - L0 相关性上下文:SetDenseSpace 注入稠密空间时回填已有事件的稠密向量, 否则旧事件走稀疏余弦、新事件走稠密余弦,同一次 Prune 里两种尺度混排。 - 文档检索:QueryScored 访问计数从读锁内写移出(-race 竞争),更新后置脏, 优雅关停可落盘、FindColdDocs 冷度判据跨重启不再失真。 - 蒸馏管线:只 flush 未落盘记录(persisted 标记)、蒸馏成功后从 raw 文件 删除对应行、原子写文件,修重启重复蒸馏导致 mention_count 膨胀。 - 图库:全量 Recall 加实体上限(内部整备路径,防大图整表进内存); ClearSentenceID 补写锁;Commit/upsertEntity 计数语义注释澄清。 - 索引器:recalled 去重集加 FIFO 上限,防长跑进程自动注入越来越沉默。 - 文档/媒体注释修正;README 记忆层流程对齐跨模态召回。 验证:go build ./...、go vet、go test -race ./internal/memory/... ./internal/agent/core/... ./cmd/homed/... 全绿。
This commit is contained in:
@ -16,8 +16,18 @@ type Indexer struct {
|
||||
mu sync.RWMutex
|
||||
trained bool
|
||||
recalled map[string]bool // 已通过工具调用显式召回的实体名,自动注入时跳过
|
||||
|
||||
// recalledOrder 记录 recalled 的插入顺序,用于超限时按 FIFO 淘汰。
|
||||
recalledOrder []string
|
||||
}
|
||||
|
||||
// maxRecalledEntities 是「已召回实体」去重集的上限。
|
||||
//
|
||||
// 无上限时它只增不减:进程活得越久,被永久跳过的实体越多,自动注入
|
||||
// 越来越「沉默」——一个只在长跑进程里才暴露的隐蔽退化。超限后淘汰最旧的
|
||||
// 名字(允许重新注入),而不是丢弃整个集合。
|
||||
const maxRecalledEntities = 1024
|
||||
|
||||
func NewIndexer(db *GraphDB) *Indexer {
|
||||
return &Indexer{
|
||||
db: db,
|
||||
@ -32,7 +42,16 @@ func (idx *Indexer) MarkRecalled(names ...string) {
|
||||
idx.mu.Lock()
|
||||
defer idx.mu.Unlock()
|
||||
for _, name := range names {
|
||||
if idx.recalled[name] {
|
||||
continue
|
||||
}
|
||||
idx.recalled[name] = true
|
||||
idx.recalledOrder = append(idx.recalledOrder, name)
|
||||
}
|
||||
for len(idx.recalledOrder) > maxRecalledEntities {
|
||||
oldest := idx.recalledOrder[0]
|
||||
idx.recalledOrder = idx.recalledOrder[1:]
|
||||
delete(idx.recalled, oldest)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user