diff --git a/go/internal/api/server.go b/go/internal/api/server.go index 281ba53..622ba46 100644 --- a/go/internal/api/server.go +++ b/go/internal/api/server.go @@ -1249,6 +1249,8 @@ func NewServer() http.Handler { // 最久未访问的(last_recalled_at 最早 → 最该遗忘),防全表单次拉取 // 内存翻倍 + 长时间阻塞触发器循环。 memories, e := ldb.GetCandidatesForForgetting() + decayScanned := 0 + decayForgotten := 0 if e == nil { const maxDecayBatch = 2000 if len(memories) > maxDecayBatch { @@ -1259,6 +1261,7 @@ func NewServer() http.Handler { memories = memories[:maxDecayBatch] } for _, m := range memories { + decayScanned++ // 解析 last_recalled_at lastAccessed := time.Now().Add(-30 * 24 * time.Hour) // 默认30天前 if t, ok := m["last_recalled_at"].(string); ok && t != "" { @@ -1288,9 +1291,14 @@ func NewServer() http.Handler { forgetter.ScanAndForget(id) // 实际执行软删除(持久化到 LanceDB) _ = ldb.SoftDelete(id, "auto_forget") + decayForgotten++ } } - } + } + } + // AC-1 验收日志(P1 修复 type 断言后 last_recalled_at 可解析;batch<=2000) + if decayScanned > 0 { + log.Printf("[decay] scanned=%d forgotten=%d (batch<=2000, 最久未访问优先)", decayScanned, decayForgotten) } case "gap_scan": // 检查已有缺口:过期 7 天的自动关闭 diff --git a/go/internal/storage/embedder.go b/go/internal/storage/embedder.go index fd3ec8d..9ba1f7d 100644 --- a/go/internal/storage/embedder.go +++ b/go/internal/storage/embedder.go @@ -9,6 +9,7 @@ import ( "net/http" "os" "sync" + "time" ) // Embedder bge-m3 编码客户端。优先使用本地 vLLM(端口 8000),fallback 到模力方舟 API。 @@ -33,7 +34,7 @@ func NewEmbedder(endpoint string) *Embedder { endpoint: endpoint, modelName: getModelName(), apiKey: os.Getenv("MOLIFANG_API_KEY"), - httpClient: &http.Client{}, + httpClient: &http.Client{Timeout: 8 * time.Second}, dim: 1024, } }