Version: 0.9.24.dev.260416
后端:
1. Memory 预取缓存改为会话级隔离 + 管理面自动失效 + 空检索清理
- 预取缓存 key 从 smartflow:memory_prefetch:{userID} 改为 smartflow:memory_prefetch:u:{userID}:c:{chatID},隔离不同会话的记忆上下文,避免会话间互相覆盖
- 新增 DeleteMemoryPrefetchCacheByUser 方法,使用 SCAN+UNLINK 按模式批量删除指定用户所有会话的预取缓存
- ItemRepo 四个变更方法(SoftDeleteByID / RestoreByIDAt / UpdateManagedFieldsByIDAt / UpdateStatusByIDAt)通过 Model 携带 UserID,使 GORM cache deleter 可精准定位用户
- GormCachePlugin 将 MemoryItem 从忽略列表移至主动处理,新增 invalidMemoryPrefetchCache 异步失效方法
- 后台检索返回空结果时主动清除该用户所有预取缓存,避免过期记忆残留
2. 修复 RAG 召回未过滤 deleted 状态记忆的严重 bug
- MemoryCorpus.BuildRetrieveFilter 新增 status="active" 硬过滤,Milvus 向量检索直接排除已删除/已归档记忆
- 此前删除记忆后即使 MySQL 标记为 deleted,Milvus 中向量仍可被语义召回并注入 prompt
前端:无
仓库:无
This commit is contained in:
@@ -78,11 +78,16 @@ func (p *GormCachePlugin) dispatchCacheLogic(modelObj interface{}) {
|
||||
p.invalidConversationHistoryCache(m.UserID, m.ChatID)
|
||||
case model.AgentChat:
|
||||
p.invalidConversationHistoryCache(m.UserID, m.ChatID)
|
||||
case model.MemoryItem:
|
||||
// 1. 管理面删除/修改/恢复/新增记忆时,自动失效该用户所有会话的预取缓存;
|
||||
// 2. repo 方法通过 Model(&model.MemoryItem{UserID: userID}) 携带 userID,
|
||||
// 此处从模型实例中提取 UserID 进行精准失效;
|
||||
// 3. 若 UserID 为 0(无 userID 参数的 repo 方法),invalidMemoryPrefetchCache 内部守卫会直接跳过。
|
||||
p.invalidMemoryPrefetchCache(m.UserID)
|
||||
case model.AgentOutboxMessage,
|
||||
model.User,
|
||||
model.AgentStateSnapshotRecord,
|
||||
model.MemoryJob,
|
||||
model.MemoryItem,
|
||||
model.MemoryAuditLog,
|
||||
model.MemoryUserSetting:
|
||||
// 这些模型当前没有前台缓存读取链路依赖,故意静默忽略。
|
||||
@@ -163,3 +168,23 @@ func (p *GormCachePlugin) invalidConversationHistoryCache(userID int, conversati
|
||||
log.Printf("[GORM-Cache] Invalidated conversation history cache for user %d conversation %s", userID, normalizedConversationID)
|
||||
}()
|
||||
}
|
||||
|
||||
// invalidMemoryPrefetchCache 失效指定用户所有会话的记忆预取缓存。
|
||||
//
|
||||
// 步骤化说明:
|
||||
// 1. 先守卫 userID==0,无 userID 的 repo 方法(如 UpdateContentByID)触发 callback 时直接跳过;
|
||||
// 2. 异步调用 DeleteMemoryPrefetchCacheByUser,按模式 smartflow:memory_prefetch:u:{userID}:c:* 批量删除;
|
||||
// 3. 失败只记日志,不阻塞主事务,30 分钟 TTL 自然过期兜底。
|
||||
func (p *GormCachePlugin) invalidMemoryPrefetchCache(userID int) {
|
||||
if userID == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
go func() {
|
||||
if err := p.cacheDAO.DeleteMemoryPrefetchCacheByUser(context.Background(), userID); err != nil {
|
||||
log.Printf("[GORM-Cache] Failed to invalidate memory prefetch cache for user %d: %v", userID, err)
|
||||
return
|
||||
}
|
||||
log.Printf("[GORM-Cache] Invalidated memory prefetch cache for user %d", userID)
|
||||
}()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user