duckdb-vss:向量相似性搜索加速
duckdb-vss 项目地址: https://gitcode.com/gh_mirrors/du/duckdb-vss
项目介绍
duckdb-vss 是一款为 DuckDB 数据库设计的实验性扩展,它通过引入索引支持来加速向量相似性搜索(Vector Similarity Search)。该扩展利用了 DuckDB 从版本 v0.10.0 引入的新固定大小 ARRAY
类型。duckdb-vss 基于 usearch 库,旨在提供一个自定义索引类型(本例中的 HNSW 索引)的示例,并将其作为扩展暴露给 DuckDB。
项目技术分析
DuckDB 是一款嵌入式的分析型数据管理系统,它专为解决数据分析任务而设计。而向量相似性搜索是一种在向量空间中寻找与给定查询向量相似度最高的向量的技术。在处理大规模向量数据时,传统的搜索方法效率低下,因此需要特殊的索引结构来优化搜索过程。
duckdb-vss 通过引入 HNSW(Hierarchical Navigable Small World)索引来加速向量相似性搜索。HNSW 索引是一种图索引结构,它通过构建多层次的小世界图来优化搜索路径,从而提高搜索效率。通过集成 usearch 库,duckdb-vss 实现了在 DuckDB 中创建和使用这种索引的能力。
项目技术应用场景
向量相似性搜索在多个领域都有广泛的应用,以下是一些典型的使用场景:
- 推荐系统:在推荐系统中,通过比较用户的行为向量,可以找到相似的用户或物品,从而提供个性化的推荐。
- 图像搜索:在图像处理领域,可以利用图像的特征向量进行相似图像的搜索。
- 自然语言处理:在 NLP 任务中,比如文本分类或情感分析,通过向量相似性搜索可以快速找到最相关的文档或句子。
- 生物信息学:在生物信息学中,向量相似性搜索可以用于基因序列的相似性分析。
项目特点
- 易于集成:duckdb-vss 作为 DuckDB 的扩展,可以方便地集成到现有的 DuckDB 系统中。
- 性能优化:通过使用 HNSW 索引,duckdb-vss 可以显著加快向量相似性搜索的速度。
- 灵活配置:支持多种距离度量方法,如欧氏距离、余弦相似度和内积,可以根据实际需求选择合适的距离度量。
- 内存管理:索引本身不占用缓冲区管理,必须能够完全适应 RAM 内存。
下面详细介绍 duckdb-vss 的特点和用法。
创建和使用 HNSW 索引
在 DuckDB 中,创建 HNSW 索引非常简单。首先,你需要有一个包含 ARRAY
类型的列的表。以下是一个示例:
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);
创建索引后,你可以使用 ORDER BY
和 LIMIT
子句加速查询,例如:
SELECT * FROM my_vector_table ORDER BY array_distance(vec, [1,2,3]::FLOAT[3]) LIMIT 3;
此外,通过 EXPLAIN
命令,你可以验证索引是否被正确使用:
EXPLAIN SELECT * FROM my_vector_table ORDER BY array_distance(vec, [1,2,3]::FLOAT[3]) LIMIT 3;
支持多种距离度量
duckdb-vss 默认使用欧氏距离度量,但也可以在创建索引时指定其他度量,例如余弦相似度:
CREATE INDEX my_hnsw_cosine_index ON my_vector_table USING HNSW (vec) WITH (metric = 'cosine');
以下表格显示了支持的距离度量及其对应的 DuckDB 函数:
| 描述 | 度量 | 函数 | | --- | --- | --- | | 欧氏距离 | l2sq
| array_distance
| | 余弦相似度 | cosine
| array_cosine_distance
| | 内积 | ip
| array_negative_inner_product
|
插入、更新、删除和索引重新压缩
HNSW 索引支持在索引创建后对表进行插入、更新和删除操作。但需要注意的是:
- 在表数据填充后创建索引会更快,因为初始批量加载可以利用大数据表的并行性。
- 删除操作并不会立即反映在索引中,而是标记为删除,这可能导致索引随时间增长而陈旧,从而影响查询质量和性能。
为了解决这个问题,你可以调用 PRAGMA hnsw_compact_index('<index name>')
函数来触发索引的重新压缩,从而清除已删除的项。
限制
- 目前仅支持由
FLOAT
组成的向量。 - 索引本身不是缓冲区管理的,必须能够适应 RAM 内存。
尽管有这些限制,duckdb-vss 仍然是一个强大的工具,可以帮助加速向量相似性搜索。通过其易用性和高性能,它为处理大规模向量数据的应用程序提供了重要的价值。
duckdb-vss 项目地址: https://gitcode.com/gh_mirrors/du/duckdb-vss
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考