fix(memory): 增量向量化 + 单分片逐条隔离,召回请求数降一个数量级(M61)
M15(2026-10-13)登记的两条放大源落在记忆层,本次一并收口: 1. 整理轮/入库审查**只嵌增量**:新加 vector.Index.Vectors(SQLite/PG 实现, 按 id 取已存向量、维度不符当未命中),Store.embedIncremental 先复用索引里的 向量、只嵌缺的那些,并把手算出的向量回填索引 ⇒ 同一分区第二轮起零请求。 判据写明为「向量存在性 + 维度一致」(正文在本仓不可就地改写,故无需哈希)。 维度与当前 embedder 不一致时禁用复用并 WARN(不混两种表示)。 2. 嵌入链对单个慢分片有韧性:embedIsolated 整批失败后逐条隔离,坏的那几条 记缺口、其余照常返回;一条都没拿到才报错降级。请求数上界 1+B(B=8 ⇒ 9), 服务整体挂死时一次即收手,不用「请求放大」换韧性。 3. 缺口/复用/回填条数进日志(缺口走 WARN),review 的被审条目拿不到向量时 如实返回错误 ⇒ 走既有词项余弦降级(不把「算不出来」说成「没有重复」)。 请求数(单测内假 OpenAI 兼容服务端计数,生产 API embedder + 真 SQLite 索引): 24 条存量:修复前每轮 3 → 第一轮 3、第二轮 0 12 条分区整理轮:第一轮 2 → 第二轮 0 20 条候选的入库审查:26(201÷8)→ 第一条 3、第二条 0 一条坏正文:保住 7/8 条,代价 9 个请求;整体性故障 9 个请求后收手
This commit is contained in:
1 parent
9d28477e3a
commit
589e26c887
15 files changed
+1343
-48
No files matched your search
@@ -46,12 +46,19 @@ type Hit struct {
|
||||
// Index 是建立在已存 (id, vector) 对上的稠密向量相似度索引。
|
||||
//
|
||||
// Embed 用接入的 embedder 把一批文本转成向量。Add
|
||||
// 持久化一个 (id, vector) 对,id 重复时 upsert。Search 返回与 q
|
||||
// 持久化一个 (id, vector) 对,id 重复时 upsert。Vectors 按 id 取回
|
||||
// 已存向量(增量向量化的读口)。Search 返回与 q
|
||||
// 最相似的前 topK 个 id,按相似度降序排列。Dim 报告
|
||||
// 固定向量维度。Close 释放底层数据库。
|
||||
type Index interface {
|
||||
Embed(ctx context.Context, texts []string) ([]Vector, error)
|
||||
Add(ctx context.Context, id string, v Vector) error
|
||||
// Vectors 返回与 ids 对齐的已存向量:命中按位置给出,未命中(含维度与
|
||||
// 本索引不符的行)为 nil。ids 为空时返回同长度的空切片。
|
||||
//
|
||||
// 它是「增量向量化」的读口(memory 包的 embedIncremental):调用方据此
|
||||
// 只嵌缺的那些,而不是每轮把整个分区重新算一遍。它只读,不写任何行。
|
||||
Vectors(ctx context.Context, ids []string) ([]Vector, error)
|
||||
Search(ctx context.Context, q Vector, topK int) ([]Hit, error)
|
||||
Dim() int
|
||||
Close() error
|
||||
|
||||
Reference in new issue
Block a user