fix(recall): Embedder http client 8s 超时 + decay 分批 AC-1 日志

- Embedder http.Client{} 无超时 → 远端 bge 半开 TCP 时 recall 永久挂起
  (gateway 10s 断 → 织忆异常误报)。加 8s 超时快速失败降级。
- decay 每 tick 限量 2000 条(最久未访问优先) + scanned/forgotten 日志
  (AC-1 验收证据)
This commit is contained in:
xiaowei 2026-09-06 01:08:42 +08:00
parent 4376f1f2ce
commit e67f0bc7a6
2 changed files with 11 additions and 2 deletions

View File

@ -1249,6 +1249,8 @@ func NewServer() http.Handler {
// 最久未访问的last_recalled_at 最早 → 最该遗忘),防全表单次拉取 // 最久未访问的last_recalled_at 最早 → 最该遗忘),防全表单次拉取
// 内存翻倍 + 长时间阻塞触发器循环。 // 内存翻倍 + 长时间阻塞触发器循环。
memories, e := ldb.GetCandidatesForForgetting() memories, e := ldb.GetCandidatesForForgetting()
decayScanned := 0
decayForgotten := 0
if e == nil { if e == nil {
const maxDecayBatch = 2000 const maxDecayBatch = 2000
if len(memories) > maxDecayBatch { if len(memories) > maxDecayBatch {
@ -1259,6 +1261,7 @@ func NewServer() http.Handler {
memories = memories[:maxDecayBatch] memories = memories[:maxDecayBatch]
} }
for _, m := range memories { for _, m := range memories {
decayScanned++
// 解析 last_recalled_at // 解析 last_recalled_at
lastAccessed := time.Now().Add(-30 * 24 * time.Hour) // 默认30天前 lastAccessed := time.Now().Add(-30 * 24 * time.Hour) // 默认30天前
if t, ok := m["last_recalled_at"].(string); ok && t != "" { if t, ok := m["last_recalled_at"].(string); ok && t != "" {
@ -1288,9 +1291,14 @@ func NewServer() http.Handler {
forgetter.ScanAndForget(id) forgetter.ScanAndForget(id)
// 实际执行软删除(持久化到 LanceDB // 实际执行软删除(持久化到 LanceDB
_ = ldb.SoftDelete(id, "auto_forget") _ = 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": case "gap_scan":
// 检查已有缺口:过期 7 天的自动关闭 // 检查已有缺口:过期 7 天的自动关闭

View File

@ -9,6 +9,7 @@ import (
"net/http" "net/http"
"os" "os"
"sync" "sync"
"time"
) )
// Embedder bge-m3 编码客户端。优先使用本地 vLLM端口 8000fallback 到模力方舟 API。 // Embedder bge-m3 编码客户端。优先使用本地 vLLM端口 8000fallback 到模力方舟 API。
@ -33,7 +34,7 @@ func NewEmbedder(endpoint string) *Embedder {
endpoint: endpoint, endpoint: endpoint,
modelName: getModelName(), modelName: getModelName(),
apiKey: os.Getenv("MOLIFANG_API_KEY"), apiKey: os.Getenv("MOLIFANG_API_KEY"),
httpClient: &http.Client{}, httpClient: &http.Client{Timeout: 8 * time.Second},
dim: 1024, dim: 1024,
} }
} }