ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

SQL+向量双阶段混合搜索模式:turbovec allowlist实战教程

SQL+向量双阶段混合搜索模式:turbovec allowlist实战教程 SQL向量双阶段混合搜索模式turbovec allowlist实战教程【免费下载链接】turbovecA vector index built on TurboQuant, written in Rust with Python bindings项目地址: https://gitcode.com/GitHub_Trending/tu/turbovecturbovec是一个基于 Google TurboQuant 算法、用 Rust 编写并带 Python 绑定的向量索引。当你已有 SQL 数据库存放文档想叠加向量语义检索时turbovec 的allowlist参数可以把「SQL 粗筛 向量精排」的双阶段混合搜索落地到一行代码且过滤发生在 SIMD 内核内部不会牺牲召回率。本教程面向新手讲清这套SQL向量双阶段混合搜索的原理、步骤与避坑要点。为什么需要「双阶段」混合搜索纯 SQL 检索如 BM25 或LIKE关键词擅长精确匹配但不懂语义纯向量检索懂语义却不懂租户隔离、权限、时间窗口这类结构化条件。两者结合就是经典的混合搜索阶段执行者目标阶段一粗筛SQL / BM25 / ACL把百万级候选缩小到几千个合法 id阶段二精排turbovec 向量相似度在合法集合内按语义相似度取 Top-K很多新手踩过的坑是「事后过滤」先全库向量检索取 Top-K再在应用层剔除不允许的文档。这样一旦 Top-K 里大部分被过滤掉你就拿不满 K 条结果召回率直接受损。turbovec 的 allowlist 是「内核内过滤」——搜索过程只会在允许的集合里堆入结果保证你始终拿到最多 K 条来自合法集合的结果。快速上手5 分钟搭出 SQL向量双阶段搜索整个流程只需要三步建索引用IdMapIndex带外部 id 的索引存文档向量id 与你的数据库主键一一对应SQL 粗筛从数据库查出候选 id 列表allowlist 精排把候选 id 数组传给search(allowlist...)。import numpy as np from turbovec import IdMapIndex idx IdMapIndex(dim1536, bit_width4) idx.add_with_ids(vectors, ids) # ids 为你的 uint64 文档 id # 阶段一SQL 粗筛例如按租户过滤 allowed np.array( db.execute(SELECT id FROM docs WHERE tenant?, (tenant,)).fetchall(), dtypenp.uint64, ) # 阶段二在候选集合内做向量精排 scores, ids idx.search(query, k10, allowlistallowed)关键规则只有三条allowlist必须是uint64一维数组且每个 id 都要存在于索引中否则抛KeyError空 allowlist 会抛ValueError请在上游保证候选集合非空返回长度为min(k, 允许向量的去重数量)——allowlist 里重复的 id 不会撑大结果候选比 K 少时返回恰好那么多不做-1/NaN 填充。更多细节见 docs/api.md。内核级过滤为什么 allowlist 不拖慢搜索这是 turbovec 相比「先搜后滤」方案的本质优势。过滤发生在 SIMD 打分内核里以32 个向量的块为粒度整块短路一个块内没有任何被允许的槽位时直接跳过不执行任何 LUT 查表与打分槽位丢弃被打分的块内不允许的槽位在堆插入前就被剔除。因此当 allowlist 只放行索引的一小部分比如某租户只占全库 1%时绝大部分 SIMD 成本被省掉而不是付全款再丢结果。核心实现可参考 turbovec/src/search.rs 与 turbovec/src/id_map.rsPython 绑定层对 allowlist 的校验与快照逻辑在 turbovec-python/src/lib.rs 中。 还有一个隐藏加速加载索引后调用prepare()可以预热懒加载的 id→slot 映射让第一次带allowlist的搜索免去一次 O(n) 构建开销见 docs/api.md。常见错误与排查清单现象原因解决ValueError: allowlist is emptySQL 粗筛没返回任何行上游兜底空候选时直接返回空结果KeyErrorRust 侧UnknownIdallowlist 含已被删除的 id先index.contains(id)或从 SQL 侧确认文档仍存在结果数量少于 K允许向量的去重数量 K属预期行为调用侧按需补齐TypeErrorbuffer 错误数组非uint64或非一维np.asarray(ids, dtypenp.uint64)相关校验行为有完整测试覆盖可参考 turbovec-python/tests/test_filtering.py 和 turbovec/tests/filtering.rs。进阶在主流框架里怎么用turbovec 提供 LangChain、LlamaIndex、Haystack、Agno 的即插即用集成过滤能力以filter参数暴露docs store.similarity_search( query, k5, filter{source: manual, version: 2}, )框架层会把filter解析成 id allowlist 再交给内核打分。各框架的完整用法分别见docs/integrations/langchain.mddocs/integrations/llama_index.mddocs/integrations/haystack.mddocs/integrations/agno.md如果你不需要框架、只需要原始索引的批处理查询TurboQuantIndex.search(queries, k, mask...)还支持布尔位掩码slot bitmask形式的过滤适合多查询批量场景。总结双阶段混合搜索 SQL 粗筛候选 id turbovecallowlist内核内向量精排一步解决权限/租户/时间窗口过滤allowlist 过滤在 32 向量块粒度短路选择性越强的过滤越省钱不存在召回率损失记住三条契约uint64一维数组、空列表报错、结果长度min(k, 去重允许数)生产上建议加载后先prepare()再上线带 allowlist 的搜索。按 README.md 完成pip install turbovec后你就可以把这套 SQL向量混合检索嵌入自己的 RAG 系统了。【免费下载链接】turbovecA vector index built on TurboQuant, written in Rust with Python bindings项目地址: https://gitcode.com/GitHub_Trending/tu/turbovec创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进