Skip to content

fix(search-index): 补齐远端向量索引一致性与异常响应校验 - #185

Merged
2977094657 merged 7 commits into
LifeArchiveProject:mainfrom
xiaoshengbao:codex/remote-embedding-review-fixes
Oct 10, 2026
Merged

2977094657 merged 7 commits into
LifeArchiveProject:mainfrom
xiaoshengbao:codex/remote-embedding-review-fixes

Conversation

@xiaoshengbao

@xiaoshengbao xiaoshengbao commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

配套修复 #184 的远端 OpenAI 兼容向量实现。切换服务或模型后,旧索引仍使用建立时的模型快照查询,避免新查询向量与旧索引落在不同空间;全账号部分索引同步保存身份指纹,防止后续任务错误触发全量重建。

同时拒绝重复、缺失、越界的响应序号,以及 NaN、Infinity、float32 溢出、零向量和批次维度不一致。远端 tokenizer 在下载与读取缓存时均验证可加载性,坏文件回退字符切块并可重新获取,缓存按远端模型身份隔离。

新增 37 项隔离回归,覆盖 Ollama/OpenAI 请求约定、乱序与 base64 响应、建索引与查询、模型切换、旧版本索引回退、密钥轮换、部分进度复用和 tokenizer 恢复;既有部分索引覆盖测试改用真实目录模型,保留原断言。

合并顺序

分支基于 #184 的 6cac45d,保留作者提交与署名。请先合并 #184(建议 merge commit),再合并本 PR;在 #184 合并前,本 PR 的差异会包含其基础实现。若 #184 使用 squash/rebase,需要先将配套修复重放到更新后的 main。

验证

所有远端回归均使用固定合成数据与模拟 HTTP 服务,不访问真实账号或付费模型 API;不将模拟验证描述为真实 Ollama 实测。

上游 fork PR 的工作流仍需维护者批准;上面的结果来自 fork 中同一份工作流和同一提交,不能替代上游的分支保护检查。

协议参考:Ollama OpenAI compatibility — /v1/embeddings。请求使用 model、字符串数组 input 和 encoding_format: float,支持 Ollama 根地址、/v1 或完整 /v1/embeddings 地址。

taosiuman and others added 7 commits October 9, 2026 19:09
本地语义检索原先只有三个 ONNX 编码器模型:权重要下载到本机,推理也只能在本机跑。WeMM-Embedding-2B 是解码器结构的多模态向量模型,官方只提供 GGUF,走不通现有的 ONNX + tokenizer.json 通路。

新增 backend 为 remote 的模型规格:文本仍在本机切分,向量交给局域网内的服务计算。模型目录加入 wemm-2b-remote(2048 维),在下载列表里直接标记为已就绪,不下载任何文件;远端服务需要 tokenizer 才能把文本切成模型认得的形式,首次使用时从服务端拉取 tokenizer.json 并缓存到模型目录,之后直接用缓存。
目录里的地址只是默认值,换机器或换端口就只能改仓库文件。把 remote_endpoint 补进账号设置:留空沿用目录默认地址,非空则覆盖,前端在远端模型的卡片里提供输入框。

地址必须列进 DEFAULTS:_configure 只比较 DEFAULTS 里的键,否则「只改地址」会被当成没有改动而直接返回旧配置。
Windows 上代理客户端会把代理写进注册表,httpx 默认会读取并使用它。向量服务跑在同一台机器或局域网内时,请求会被代理拦下,报错表现为 502 或连接失败:实测把地址指向 127.0.0.1 上已关闭的端口,拿到的是代理的 502,而不是连接被拒绝,完全看不出真正原因。

新增 is_lan_endpoint() 判断是否需要直连:回环、.local、单标签主机名,以及 ai.providers.is_lan_address 认的 RFC 1918 / IPv6 ULA 网段;局域网定义直接复用该函数,与「允许局域网 IP 的模型服务使用 HTTP」保持同一套口径。远端 tokenizer 的拉取同样处理。
- 远端推理固定走 POST {base}/v1/embeddings({model,input,encoding_format}),
  按 data[].index 取向量并兼容 base64 编码;Ollama、LM Studio、vLLM 等可直接
  接入,WeMM 等退化为目录预设,不再要求服务方实现本工具自有接口。
- 账号配置新增远端模型名、可选 API Key、允许自签名证书;保存时探测向量维度
  并在每次响应校验,维度不一致直接报错而不是给出无意义结果。
- 索引身份指纹(协议+地址+模型名+维度)变化时重建 generation,避免换服务后
  旧向量与新查询落在不同向量空间却继续复用。
- 远端不提供 tokenizer.json 时按字符上界切块,不再中断整轮建索引;查询串按
  字符上限收口。
- 代理绕过扩展到 100.64.0.0/10(Tailscale 等覆盖网络)与链路本地地址,明文
  HTTP 的允许范围保持不变。
- 新增 POST /api/ai/local-search/remote/test,供前端「测试连接」列出服务模型
  并探测维度;模型名不被服务端校验,因此清单里没有时给出明确提示。
- 远端模型卡片提供服务地址、模型名、可选 API Key、允许自签名证书,以及
  WeMM 2B / Ollama / LM Studio 快速预设与「测试连接」(列出服务上的模型并
  探测维度,模型名对不上时直接提示)。
- 底部隐私说明按当前模型是否为远端切换措辞:远端检索会把文本发送到该服务,
  本机模型仍是「不上传聊天」。
- AI 服务页标签改为「本机或你指定的服务」,不再笼统承诺检索只在本机运行。
@xiaoshengbao
xiaoshengbao marked this pull request as ready for review October 9, 2026 16:08
@2977094657
2977094657 merged commit 38df4bb into LifeArchiveProject:main Oct 10, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants