docs(memory): 请求上界按条数维+字符维两维算准(review-m61 P2-1)

embedding.Embed 同时受条数界(8)与字符界(480 字)约束 ⇒ 一次 embedOnce(B 条)
会发 C 个请求(C 由正文长度决定,1..B),因此:

  正常批            C
  含一条坏正文      ≤ C + B(短正文 9;均长 75 汉字的现实批 10;病理上限 2B=16)
  服务整体挂死      首个 chunk 即失败 + 逐条 B ⇒ 1 + B = 9(与字符维无关)

修正 embed_isolation.go 文件头的上界表、approxRequests 的「两者一致」表述、
embedReuseStats.Sent 的注释,以及 embed_resilience_test.go 的上界注释与日志文案。
零行为改动:判据、实现、请求数都未动,测试全绿。
This commit is contained in:
AskaEth committed 2026-10-30 09:04:14 +08:00
1 parent 8f7017fc0b
commit 058fa141bf
3 files changed
+40 -17

No files matched your search

@@ -8,10 +8,15 @@ import (
// 本文件是「单分片韧性」的断言(M61,2026-10-30;design/23 §15.3 已登记口径):
// 一条慢/坏分片**不丢整条**——同一批里其它条目的向量照常返回,只损失那一条;
// 而整体性故障(服务挂死)**不放大**:最多 3 个请求就收手。
// 而整体性故障(服务挂死)**不放大**:整批在第一个 chunk 即失败 + 逐条 B 次
// ⇒ 1+B 个请求就收手(B = 批上限 8)。
//
// ⚠️ 请求数口径是**两维**的(见 embed_isolation.go 文件头):本文件的正文都很短
// (8 条合计远小于 DefaultBatchChars=480)⇒ chunkTexts 只按条数界切、C=1,因此
// 「含一条坏正文 = 1+B」在这些用例里是精确值;长正文批的真实上界是 C+B。
// TestEmbedIsolation_OneBadTextKeepsTheRest 是韧性的主断言:批里有一条坏正文时,
// 其余 7 条照常拿到向量,坏的那条记为缺口,请求数被二分定位的成本封顶。
// 其余 7 条照常拿到向量,坏的那条记为缺口,请求数被逐条隔离的成本封顶。
//
// 删掉 embedIsolated(改回「一次 Embed 定生死」)这一条会打红:整批返回错误、
// 7 条好正文的向量一起丢掉。
@@ -58,16 +63,19 @@ func TestEmbedIsolation_OneBadTextKeepsTheRest(t *testing.T) {
if kept != len(texts)-1 {
t.Fatalf("保住的条数 = %d, want %d", kept, len(texts)-1)
}
// 逐条隔离的成本上界:整批 1 次 + 逐条重试 B 次(B = 批上限 8)⇒ 9。
// 逐条隔离的成本上界:整批 1 个 chunk(本例正文短 ⇒ C=1)+ 逐条重试 B 次
// ⇒ 1+B = 9。长正文批的真实上界是 C+B(C 由 480 字字符界决定,见文件头)。
if limit := 1 + tidyEmbedBatch; reqs > limit {
t.Fatalf("定位一条坏分片花了 %d 个请求,超过逐条上界 %d(韧性变成了放大)", reqs, limit)
}
t.Logf("一条坏分片:保住 %d/%d 条,代价 %d 个请求(上界 1+B = %d)", kept, len(texts), reqs, 1+tidyEmbedBatch)
t.Logf("一条坏分片:保住 %d/%d 条,代价 %d 个请求(短正文上界 1+B = %d)",
kept, len(texts), reqs, 1+tidyEmbedBatch)
}
// TestEmbedIsolation_OutageStopsFast 是**反放大**的断言:服务整体挂死时不许把
// 「用请求换韧性」变成请求风暴 —— 逐条重试一条都没拿到即判定整体性故障,当场
// 返回错误,且请求数被 1+B 封顶。
// 返回错误,且请求数被 1+B 封顶(整批在第一个 chunk 就失败 ⇒ 1 个请求 + 逐条 B;
// 这一条与字符维的 chunk 数无关,本例正文短、C 本来就是 1)。
func TestEmbedIsolation_OutageStopsFast(t *testing.T) {
t.Parallel()
ctx := context.Background()