# FAISS 删除向量：保留业务 ID，防止删除一条后其他结果串号

FAISS CPU实跑顺序ID删除错配与IndexIDMap2业务ID稳定，保存重读一致；二维向量手工编写，不是模型embedding。

## 环境

- Python 3.12+；在 reference 中 pip install -r requirements.txt。

## 启动

~~~sh
cd reference
python3 verify.py
# 运行后查看原生结果阅读器（读取records.json）
python3 -m http.server 8787
# 打开 http://127.0.0.1:8787/report.html
~~~

## 七步操作

1. 准备显式业务ID

输入为九个手工二维点，业务ID从101到920且不连续，查询点为4.1。它们不是模型embedding，方便直接看清删除后的身份变化。

2. 创建顺序索引

先创建IndexFlatL2并add向量，搜索返回的是顺序位置。若把位置当作永不变化的业务ID，删除后会产生错误关联。

3. 删除并观察位移

删除顺序位置1，再搜索最近点。数组位置前移，继续用旧metadata位置表映射会把本应为512的结果指向其他业务条目。

4. 加入IDMap2

用IndexIDMap2包装IndexFlatL2，并通过add_with_ids写入显式int64业务ID。向量顺序与业务身份从此分开保存。

5. 按业务ID删除

按业务ID205执行remove_ids，再查询。返回的最近业务ID仍为512，205不再出现，不能只检查索引总数少了一条。

6. 保存重读核对

把索引写到临时文件后重读，比较搜索返回ID集合与顺序。下载包只保留源代码与小型结果，不发布运行时索引二进制。

7. 区分示例向量

实际执行FAISS CPU原生接口，保留顺序索引误映射与IDMap正确结果。本题只说明删除身份合同，不给出某个真实语义模型的召回率。

## 目录身份

- starter：待完成的任务接口与原创输入，TODO不是已完成实现。
- reference：作者原生完成参考和实际产物。records.json/browser-result.json为本地实测记录，不是AI助手回复。
- TASK.md：可交给相应AI助手的原始任务合同。该助手账号生成会话未运行。

## 依赖与许可

原创教学代码以MIT许可提供。第三方项目、模型及浏览器遵循其自身许可。第三方依赖由本地安装获取，不包含node_modules、模型权重、WASM运行时、数据库、缓存或凭据。

## 官方依据

- https://github.com/facebookresearch/faiss/wiki/Special-operations-on-indexes
