docs: add algorithm documentation

This commit is contained in:
youzini
2026-05-31 17:02:21 +00:00
parent fa2a3bfd63
commit 98d35b0ea1
5 changed files with 514 additions and 0 deletions

View File

@@ -0,0 +1,79 @@
# 向量与 Embedding
向量是召回质量的下限。本文档说明 embedding 路径、向量空间身份、维度门禁——尤其是"换 embedding 模型导致维度变化"时如何保证不崩、不误用旧向量。
实现:`vector/embedding.js``vector/vector-index.js``vector/vector-space.js``vector/vector-gate.js`
## Embedding 执行位置
> `embeddingExecution` 默认 `client`——embedding 默认在客户端(浏览器)执行。
第三方自定义 URL 是一等公民OpenAI 兼容 `/v1/embeddings`、one-api、new-api、litellm、vLLM、llama.cpp、Ollama 桥接等。Authority 不生成 embedding只存/搜向量。
## 批量 Embedding
`embedBatch()``vector/embedding.js`
- 默认按 `embeddingBatchSize=10` 分块(可配,上限 100
- 直连模式发送分块 OpenAI 兼容 `/embeddings` 请求,`input: string[]`,含 `encoding_format: "float"`
- 后端模式发送分块 `/api/vector/embed``texts: string[]`
- **分块失败回退**:整块失败时降级到逐条 `embedText`
- **部分结果回退**:返回的向量里有 null/缺失项时,只重试缺失项,不重试整块
- `AbortError` 继续向上传播(不吞)
HTTP 错误400/401/403/429/502 等)会带状态码和响应体抛出,而不是吞成"返回空结果"的泛化错误——这样用户能看到真实的 provider 错误(比如余额不足 403
## 向量空间身份vectorSpaceId
换 embedding 模型会改变向量维度和语义空间。如果静默把新模型的查询向量拿去和旧模型的存储向量比,结果是垃圾。
> `vectorSpaceId` 由 provider 类型、embedding 模式、规范化 API URL、模型名、观测维度共同计算得出——**不是只看模型名**。API key 不参与计算。
实现见 `vector/vector-space.js``deriveVectorSpace(config, observedDim)`
## 本地向量清单manifest
直连/自定义 URL 路径维护一个本地向量清单,记录 `vectorSpaceId``observedDim`、模型、状态。
> 向量搜索按 manifest 兼容性门控:维度或向量空间不匹配时,标记 stale/dirty 并返回空向量结果,让召回回退到图/词法召回——**绝不静默复用不兼容的旧向量**。
这条保证了用户换模型时看到的是"记忆没丢,搜索索引在重建",而不是错误的召回结果或"数据丢失"的错觉。
## 维度门禁
`vector/vector-gate.js` 决定向量准备/修复前的动作skip / repair / blocked / sync。
直连模型/源/集合变更时,不再把旧 `node.embedding` 当作干净可用。Authority 搜索在 BME apply/manifest 能力启用时也按 manifest 兼容性门控。
## 服务器端向量应用
启用 Authority `/bme/vector-apply` 时:
> BME 在 payload 里发送 `vectorSpaceId` 和 `observedDim`(顶层 + 每项元数据。DOA 按批校验 vectorSpaceId/observedDim 一致性,拒绝混合维度,返回带类型的校验错误。失败/404/旧 DOA 时回退到旧 Authority Trivium 路径或本地。
## 连接测试
`testVectorConnection()` 测的是**真实批量 embedding 路径**(走 `embedBatch`),而不是单条短文本——因为"测试通过但实际 embedding 失败"的根因就是测试只测了单条短文本而运行时用的是批量长文本。
- 测试按表单选择的传输模式direct/backend测试不被 Authority 自动主路径劫持
- 后端模式同时探测 `/api/vector/embed`(批量 embedding`/api/vector/query`(向量存储健康)
- Authority 模式先用 embedding provider 生成批量向量,再检查 Trivium stat避免暗示 Authority 生成 embedding
## 后台向量同步合并
后台向量同步任务通过 `runtime/vector-sync-coalescer.js` 合并:
- 同 chat + 模型 scope 合并范围
- 活跃同步期间最多保留一个待处理任务
- 切换聊天时跳过陈旧任务
- 队列拒绝时回滚待处理状态
这避免了"每次编辑/reroll 都产生独立任务、串行 FIFO 队列堆积"的放大问题。
## 关键默认参数
| 参数 | 默认 | 含义 |
| --- | --- | --- |
| `embeddingExecution` | client | embedding 执行位置 |
| `embeddingBatchSize` | 10上限 100 | 批量分块大小 |
| `encoding_format` | float | 直连 OpenAI 兼容请求 |