首页 时政热点 科技头条 智能AI 安全攻防 数码硬件 开发者生态 汽车 游戏 社会热点 开源推荐 医疗健康 归档 标签 关于

Turbovec – Google 的 TurboQuant,用于 Rust 中的矢量搜索

摘要

A 10 million document corpus takes 31 GB of RAM as float32. turbovec fits it in 4 GB - and searches it faster than FAISS. turbovec is a Rust vector index with Python bindings, built on Google Research...

and index the with search float32 turbovec vectors sync TurboQuantIndex
2026-08-19 1 阅读 约9分钟阅读 fittingopposite
分享:
字号:
1000 万个文档语料库需要 31 GB RAM 作为 float32。 Turbovec 可容纳 4 GB - 并且搜索速度比 FAISS 更快。 Turbovec 是一个带有 Python 绑定的 Rust 向量索引,基于 Google Research 的 TurboQuant 算法构建 - 一种数据无关的量化器,具有近乎最佳的失真,并且没有单独的训练阶段。在线摄取。添加向量,它们被索引——没有训练步骤,没有参数调整,随着语料库的增长不需要重建。快速 SIMD 搜索。手写内核 - ARM 上的 NEON SDOT/SMMLA、x86 上的 AVX-512 VNNI 和 vpermb,以及 AVX2 和标量回退 - 在每个测量的配置中都击败了 FAISS IndexPQFastScan,在两种架构上,在每个宽度的八个单元上,4 位平均为 3.4 倍,2 位平均为 23%。增量保存。 sync(path) 保留自上次同步以来发生的变化 - 每次调用一次 fsync,任何字节都安全,并且无论索引有多大,删除或小追加都会花费几毫秒。整个文件快照的写入/加载停留。在搜索时过滤。将 id 允许列表(或插槽位掩码)传递给 search(),内核会直接尊重它。您始终可以从允许的集合中获得最多 k 个结果 - 不会过度获取,也不会在选择性过滤器上召回。纯本地的。没有托管服务,没有数据离开您的计算机或 VPC。与任何开源嵌入模型配对,形成完全气隙的 RAG 堆栈。在隐私、内存或延迟很重要的地方构建 RAG?您来对地方了。 from Turbovec import TurboQuantIndex 索引 = TurboQuantIndex(dim = 1536, bit_width = 4) 索引。添加(向量)索引。添加 (more_vectors) 分数,索引 = 索引。搜索(查询,k=10)索引。写入(“my_index.tv”)加载= TurboQuantIndex。加载(“my_index.tv”)索引。 sync ( "my_index.tv" ) # 经过更多更改:持久增量保存向量和查询是形状 (n, dim) 的二维 float32 数组 - 其他 dtypes 被拒绝而不是静默转换,因此如果需要,请首先使用 np.asarray(x, dtype=np.float32) 进行转换。需要在删除后仍能保存的稳定 ID 吗?使用 IdMapIndex: import numpy as np from Turbovec import IdMapIndex index = IdMapIndex(dim=1536, bit_width=4) 索引。 add_with_ids ( 向量 , np . array ([ 1001 , 1002 , 1003 ], dtype = np . uint64 )) 分数 , ids = 索引 。 search(query,k=10)#ids是你的uint64外部ids索引。通过 id 索引删除 (1002) # O(1)。写入(“my_index.tvim”)加载= IdMapIndex。加载 ("my_index.tvim") 索引。 sync ( "my_index.tvim" ) # 持久增量保存,包含 ids 混合检索(过滤搜索)将结果限制为另一个系统(SQL、BM25、ACL、时间窗口等)生成的候选集: import numpy as np from Turbovec import IdMapIndex idx = IdMapIndex ( dim = 1536 , bit_width = 4 ) idx . add_with_ids ( Vectors , ids ) # 第 1 阶段:外部系统缩小候选 id。允许 = np . array ( db .execute ( "SELECT id FROM docs WHEREtenant=?" , ( t ,)). fetchall (), dtype = np . uint64 ) # 第 2 阶段:在候选集中进行密集重新排序。分数,ids = idx。 search ( query , k = 10 , allowedlist = allowed ) 过滤在 SIMD 内核内部以 32 个向量块粒度进行:在任何 LUT 查找或评分工作之前,不允许的插槽的块会被短路,并且评分块内的各个不允许的插槽会在堆插入时被丢弃。因此,选择性允许列表(允许的索引的一小部分)可以避免大部分 SIMD 成本,而不是支付费用并随后丢弃结果。输出长度为 min(k, n_allowed) ,其中 n_allowed 对不同的允许向量进行计数 - 当允许的向量少于 k 时,您将得到完全相同的结果,而不是填充后备。请参阅 docs/api.md 获取完整参考。每个框架中树内参考向量/文档存储的直接替换。相同的公共表面、相同的持久性语义、相同的检索器和管道连接 - 交换导入并保留管道。 LangChain — pip installturbovec[langchain] · 替换 langchain_core.vectorstores.InMemoryVectorStore LlamaIndex — pip installturbovec[llama-index] · 替换 llama_index.core.vector_stores.SimpleVectorStore Haystack — pip installturbovec[haystack] · 替换 haystack.document_stores.in_memory.InMemoryDocumentStore Agno — pip install Turbovec[agno] · 使用turbovec :: TurboQuantIndex 替换agno.vectordb.lancedb.LanceDb ;让 mut index = TurboQuantIndex :: new (1536, 4)。展开 ( ) ;指数 。添加(&向量);让结果=索引。搜索(&查询,10);指数 。写(“index.tv”)。展开 ( ) ;让已加载= TurboQuantIndex ::加载(“index.tv”)。展开 ( ) ;对于在删除后仍然存在的稳定外部 id:使用turbovec :: IdMapIndex ;让 mut index = IdMapIndex::new(1536, 4)。展开 ( ) ;指数 。 add_with_ids(&向量,&[1001,1002,1003])。展开 ( ) ;让(分数,ids)=索引。搜索(&查询,10);指数 。删除(1002);指数 。写(“index.tvim”)。展开 ( ) ;让已加载 = IdMapIndex::load("index.tvim") 。展开 ( ) ; TurboQuant 与 FAISS IndexPQ
这篇文章对您有帮助吗?

订阅66必读

每日精选科技资讯,直达你的邮箱