2.2 KiB
2.2 KiB
P0: Recall 降级策略 — 织忆 Go daemon
目标
当 bge-embed (8000) 或 Rust IPC sidecar 不可用时,recall 自动降级到 graph.db 关键词搜索,不返回 500 错误。
修改文件
1. /tmp/memoryweave/go/internal/governance/graph_sqlite.go
新增方法 FallbackTextSearch(query, namespace, limit):
func (gs *SQLiteGraphStore) FallbackTextSearch(query, namespace string, limit int) []map[string]interface{} {
// 1. 从 edge properties 中搜索 content 字段(JSON 内 text 字段)
// 2. LIKE '%query%' 模糊匹配 nodes 的 name
// 3. 按 pagerank DESC 排序
// 4. LIMIT limit
}
sqlite-go 通过 CGo 操作,参考已有 queryRows 函数(行 1037)。 类似 SearchNodes(行 865)的模式,但搜索 edges 的 properties 字段。
2. /tmp/memoryweave/go/internal/storage/recall.go
在 RecallPipeline 结构体新增 GraphStore 字段:
type GraphExpander interface {
// ... existing methods
}
不用改 interface。在 Recall 方法末尾(当前行 149 return nil 之前),如果 candidates 为空且 lanceDB 搜索失败,尝试从 GraphStore 的 FallbackTextSearch 获取结果。
3. /tmp/memoryweave/go/internal/api/routes/core.go
在 Recall handler(行 209-293)中,当 a.Pipeline.Recall() 返回 err 时(行 240),不直接 500,而是调用 graph store 的 fallback 搜索:
if err != nil {
// Fallback: graph.db keyword search
fallbackResults := a.GraphStore.FallbackTextSearch(req.Query, req.Namespace, req.Limit)
if len(fallbackResults) > 0 {
// Convert fallback results to RecallResult format
results = convertFallbackResults(fallbackResults)
// return with 200 + warning header
} else {
respondError(w, 500, "recall failed: "+err.Error())
return
}
}
验证方法
# 正常状态能搜到
curl -s -X POST -H "X-API-Key: zhiyi-dev-key-2026" \
-d '{"query":"小唯","top_k":3}' \
http://localhost:7821/api/v1/recall | python -c "import json,sys;d=json.load(sys.stdin);print(f'count: {d.get(\"count\",0)}')"
# 模拟 bge-embed 挂了
# curl 应该仍返回结果(从 graph.db 关键词搜索)