v0.10.1

Upgrade Notes

  • ExternalSearchIndex.from_faiss_index no longer takes vectors, so passing them raises TypeError. For indexes that need the exact vectors for reconstruction, pass them to the constructor instead: ExternalSearchIndex(index, vectors).

  • ExternalSearchIndex.from_faiss_index now raises ValueError for an IVF index that has no direct map. Call faiss.extract_index_ivf(index).make_direct_map() first, or pass the vectors to ExternalSearchIndex(index, vectors).

  • Loading an InMemoryImageEmbeddingStore file saved by an earlier version raises ValueError. Build the store from its images again and save it.

  • InMemoryImageEmbeddingStore.save_to_disk ignores embeddings on a store on an HNSW graph and emits a FutureWarning, since the file holds the graph with the embeddings in it.

Performance

  • Building or updating a BruteForceIndex no longer copies the gallery first, which halves the extra peak memory and saves 14 to 17 % of the time. For 500 000 vectors of dimension 512 the peak went from 1985 MB to 1008 MB, and the build from 726 ms to 605 ms.

    Specs: 16 threads, 30 GB RAM, Python 3.14.3, NumPy 2.5.3.

  • ExternalSearchIndex.from_faiss_index no longer keeps a copy of the gallery and reads the vectors from the FAISS index instead. For 500 000 vectors of dimension 512 the adapter’s peak memory went from 1952 MB to 0 MB and its steady memory from 977 MB to 0 MB.

    Specs: 16 threads, 30 GB RAM, Python 3.14.3, NumPy 2.5.3, faiss-cpu 1.15.0.

  • Building or updating an HnswIndex no longer copies the gallery first, which saves one gallery of peak memory. For 500 000 vectors of dimension 512 the extra peak went from 2097 MB to 1120 MB.

    Specs: 16 threads, 30 GB RAM, Python 3.14.3, NumPy 2.5.3.

  • A store on an HNSW graph saves the graph and loads it back without building it again. Loading a store of 100 000 embeddings of dimension 512 went from 22.7 s to 0.2 s, and saving it from 2.4 s to 0.2 s.

    Specs: 16 threads, 30 GB RAM, Python 3.14.3, NumPy 2.4.6, safetensors 0.8.0.

Bug Fixes

  • A loaded HNSW store returns the same neighbors as the store that was saved. Before, the graph was built again on load, which with several threads could return different neighbors.