From 9a014b28220072cef37ca03758b063b5ec69cf17 Mon Sep 17 00:00:00 2001 From: Francisco Javier Arceo Date: Fri, 28 Mar 2025 09:19:14 -0400 Subject: [PATCH] updating based on feedback Signed-off-by: Francisco Javier Arceo --- .../read_time_comparison_sqlite-vec-faiss.png | Bin 0 -> 34038 bytes docs/source/providers/vector_io/sqlite-vec.md | 34 +++++++++++++----- 2 files changed, 25 insertions(+), 9 deletions(-) create mode 100644 docs/_static/providers/vector_io/read_time_comparison_sqlite-vec-faiss.png diff --git a/docs/_static/providers/vector_io/read_time_comparison_sqlite-vec-faiss.png b/docs/_static/providers/vector_io/read_time_comparison_sqlite-vec-faiss.png new file mode 100644 index 0000000000000000000000000000000000000000..00e5fe03a602f888264317cd57174b7768f1c140 GIT binary patch literal 34038 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 A#{d8T literal 0 HcmV?d00001 diff --git a/docs/source/providers/vector_io/sqlite-vec.md b/docs/source/providers/vector_io/sqlite-vec.md index 191c87cb6..06ca7f52d 100644 --- a/docs/source/providers/vector_io/sqlite-vec.md +++ b/docs/source/providers/vector_io/sqlite-vec.md @@ -15,16 +15,23 @@ That means you're not limited to storing vectors in memory or in a separate serv ### Comparison to Faiss -SQLite-Vec is a lightweight alternative to Faiss, which is a popular vector database provider. -While Faiss is a fast, lightweight and powerful inline provider, Faiss reindexes the -entire database when a new vector is added. SQLite-Vec is a disk-based storage provider -that allows for larger vector storage and handles incremental writes more efficiently. +The choice between Faiss and sqlite-vec should be made based on the needs of your application, +as they have different strengths. -SQLite-vec is a great alternative to Faiss when you need to execute several writes to the -database. +#### Choosing the Right Provider + +Scenario | Recommended Tool | Reason +-- |-----------------| -- +Online Analytical Processing (OLAP) | Faiss | Fast, in-memory searches +Online Transaction Processing (OLTP) | sqlite-vec | Frequent writes and reads +Frequent writes | sqlite-vec | Efficient disk-based storage and incremental indexing +Large datasets | sqlite-vec | Disk-based storage for larger vector storage +Datasets that can fit in memory, frequent reads | Faiss | Fast in-memory searches, optimized for speed, indexing, and GPU acceleration + +#### Empirical Example Consider the histogram below in which 10,000 randomly generated strings were inserted -in batches of 100 into both Faiss and SQLite-vec using `client.tool_runtime.rag_tool.insert()`. +in batches of 100 into both Faiss and sqlite-vec using `client.tool_runtime.rag_tool.insert()`. ```{image} ../../../../_static/providers/vector_io/write_time_comparison_sqlite-vec-faiss.png :alt: Comparison of SQLite-Vec and Faiss write times @@ -35,12 +42,21 @@ You will notice that the average write time for `sqlite-vec` was 788ms, compared 47,640ms for Faiss. While the number is jarring, if you look at the distribution, you can see that it is rather uniformly spread across the [1500, 100000] interval. +Looking at each individual write in the order that the documents are inserted you'll see the increase in +write speed as Faiss reindexes the vectors after each write. ```{image} ../../../../_static/providers/vector_io/write_time_sequence_sqlite-vec-faiss.png :alt: Comparison of SQLite-Vec and Faiss write times :width: 400px ``` -For more information about this topic see [the GitHub Issue](https://github.com/meta-llama/llama-stack/issues/1165) -where this was discussed. + +In comparison, the read times for Faiss was on average 10% faster than sqlite-vec. +The modes of the two distributions highlight the differences much further where Faiss +will likely yield faster read performance. + +```{image} ../../../../_static/providers/vector_io/read_time_comparison_sqlite-vec-faiss.png +:alt: Comparison of SQLite-Vec and Faiss read times +:width: 400px +``` ## Usage