大多数项目一提到向量检索,第一反应就是上 Pinecone、Qdrant、Milvus 或 pgvector 这类专用向量数据库。但如果你已经在用 DuckDB 做分析,或者正在搭一个轻量级 RAG 流程,那么很可能根本不需要再引入一个额外组件。DuckDB 官方提供了一个 vss 扩展,直接在原生的 ARRAY 类型上实现基于 HNSW 的近似最近邻搜索。这篇文章会讲清楚这个扩展能做什么、怎么用,以及它的边界在哪里。
vss 是 DuckDB 的一个实验性核心扩展,作用是为固定长度的 ARRAY 列加速相似度查询。它实现的是 HNSW(分层可导航小世界)算法,也就是目前生产级向量搜索引擎最常用的那种图结构。实际使用中,你可以把 embedding 当成普通列存进表,在它上面建索引,然后跑 ORDER BY ... LIMIT 查询,DuckDB 会自动走索引而不是全表扫描。
由于它是嵌入式扩展,所以不需要启动独立服务,没有网络跳转,也不用额外运维基础设施——向量索引和 SQL 引擎跑在同一个进程里。
安装方式遵循 DuckDB 的扩展惯例:
INSTALL vss;
LOAD vss;
接着创建一张带固定长度 ARRAY 列的表,并建 HNSW 索引:
CREATE TABLE my_vector_table (vec FLOAT[3]);
INSERT INTO my_vector_table
SELECT array_value(a, b, c)
FROM range(1, 10) ra(a), range(1, 10) rb(b), range(1, 10) rc(c);
CREATE INDEX my_hnsw_index ON my_vector_table USING HNSW (vec);
注意这里的维度(FLOAT[3])在建表时就必须固定——DuckDB 的 ARRAY 类型是定长的,不像 LIST 那样可变。
索引建好之后,只要查询按距离函数对常量向量排序,并加上 LIMIT,DuckDB 就会自动使用该索引。例如:
SELECT * FROM my_vector_table
ORDER BY array_distance(vec, array_value(0.3, 0.2, 0.1))
LIMIT 10;
不过这个扩展也有明显限制。首先它是实验性的,意味着 API 和稳定性都可能变化。其次 HNSW 索引是近似的,不能保证每次返回的结果都和暴力搜索完全一致。第三,它只支持固定大小的 ARRAY 类型,无法直接索引变长 embedding。另外,索引会占用额外内存,数据写入和更新时也会带来维护成本。
简单来说,如果你只想在分析管道里顺手做做语义搜索,或者 RAG 实验的数据量还停留在万级以内,DuckDB VSS 完全够用,能省掉一套向量库的部署和接入。但要是业务已经上量、对延迟和精度要求很高,那还是回到专用向量数据库更稳妥。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.