十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

TurboQuantIndex vs IdMapIndex:turbovec两大索引类型的选择决策表

TurboQuantIndex vs IdMapIndex:turbovec两大索引类型的选择决策表 TurboQuantIndex vs IdMapIndexturbovec两大索引类型的选择决策表【免费下载链接】turbovecA vector index built on TurboQuant, written in Rust with Python bindings项目地址: https://gitcode.com/GitHub_Trending/tu/turbovecturbovec 是一个用 Rust 编写、带 Python 绑定的向量索引库基于 Google 的 TurboQuant 量化算法支持 2/3/4-bit 压缩且无需训练阶段。它提供两种索引类型TurboQuantIndex位置索引和IdMapIndex稳定 ID 索引。选错索引类型是新手最常犯的错误——这篇文章用一张决策表帮你一次选对。30秒速查先给结论你的情况选择只增不删、一次性建好就查TurboQuantIndex需要按业务 ID 删除单条向量IdMapIndexID 来自外部系统数据库主键、文档编号IdMapIndex做 RAG 文档存储 / 接 LangChain、LlamaIndexIdMapIndex临时实验、内存里跑完即弃两者皆可TurboQuantIndex更省两大索引分别是什么TurboQuantIndex位置索引快和省的极致每个向量用插入位置槽位号 0 到 n-1来标识。search()返回的是槽位下标swap_remove(5)可以 O(1) 删除第 5 个槽位的向量——但注意删除时最后一个向量会挪进被删的槽位顺序不保证保留。它没有额外元数据是两者中最轻量的一种。IdMapIndex稳定 ID 索引删了也不乱IdMapIndex是在TurboQuantIndex之上加了一层双向哈希表u64 id ↔ 槽位。你用自己的外部 ID比如1001、1002注册向量import numpy as np from turbovec import IdMapIndex idx IdMapIndex(dim1536, bit_width4) idx.add_with_ids(vectors, np.array([1001, 1002, 1003], dtypenp.uint64)) scores, ids idx.search(query, k10) # ids 就是你传入的 uint64 外部 ID idx.remove(1002) # O(1) 按 ID 删除删除时槽位照样会挪动但你的 ID 永远不变search()直接返回外部 ID省掉了一次手动映射。底层实现见 turbovec/src/id_map.rs。六大差异对比一张表看懂怎么选差异点TurboQuantIndexIdMapIndex向量身份槽位号int64会漂移外部 u64 ID稳定不变删除方式swap_remove(slot)O(1)remove(id)O(1) 按 ID搜索结果槽位下标需自己映射回业务直接返回你的外部 ID过滤方式mask布尔掩码按槽位allowlistID 白名单按 ID过滤稳定性⚠️ 任何变更都会让 mask 失效✅ allowlist 永远有效文件后缀.tv.tvim内存开销最低多一张 ID 哈希表相对向量数据可忽略两种索引的文件格式、增量保存等细节完整文档在 docs/api.md核心结构定义见 turbovec/src/lib.rs。按场景选索引RAG、数据库、混合检索 RAG 文档存储→IdMapIndex。文档 ID 通常来自你的数据库或对象存储删一篇文档要能按 ID 精确删且不能影响其他文档的引用。官方对 LangChain、LlamaIndex、Haystack、Agno 的集成内部用的都是IdMapIndex原因正在于此。️ 与外部数据库同步→IdMapIndex。向量行对应数据库主键remove(id)实测在 0.4~1.4 微秒量级比 FAISS 的同名操作10 万条时单次约 0.2~1 秒快 6 个数量级。⚡ 多租户 / 权限过滤搜索→IdMapIndexallowlist。先用 SQL 筛出该租户可见的 ID 集合再在向量核内直接限定范围无需超取再丢弃。 一次性离线批处理→TurboQuantIndex。不删、不映射槽位号就是最省事的 ID。避坑指南为什么 mask 过滤会被静默破坏这是选错索引代价最大的一个坑值得单独讲TurboQuantIndex的mask按槽位命名。swap_remove会重排槽位所以任何一次变更都会让旧 mask 失效——哪怕变更前后长度没变比如一次swap_remove加一次add旧 mask 也依然能通过长度校验然后悄无声息地选中另一批向量不报错、不提示。IdMapIndex的allowlist按外部 ID 命名索引从不重排 ID没有这个失效模式若白名单里的 ID 已被删除会直接抛KeyError提醒你而不是查错。一句话记忆要过滤、又要变更就选 IdMapIndex。两种索引的共同能力无论选哪个你都能享受 turbovec 的核心卖点数据无关量化随机旋转 Lloyd-Max 码本无需训练、无需调参1000 万条 float32 文档31 GB压进约 4 GBTQ 校准调一次calibrate(采样)约 1024 行即可平均可提升约 2.5 个点的 R10 召回增量保存sync(path)只写自上次以来的变更单次 fsync任何字节处崩溃都安全搜索时过滤过滤发生在 SIMD 内核内部选择性过滤几乎零额外成本纯本地无托管服务数据不出你的机器可搭配任意开源 embedding 模型组空气隔离 RAG 栈。总结不删、不需要业务 ID →TurboQuantIndex最轻最快要删、要稳定 ID、要接外部系统或框架 →IdMapIndex几乎零代价换取稳定性拿不准时选IdMapIndex是更安全的答案——它的额外开销只是一张哈希表而选错的代价是一次静默的数据错选。【免费下载链接】turbovecA vector index built on TurboQuant, written in Rust with Python bindings项目地址: https://gitcode.com/GitHub_Trending/tu/turbovec创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表