1. 向量数据库简介

openGauss DataVec 向量数据库是一个基于openGauss的向量引擎, 提供向量数据类型的存储、检索。在处理大规模高维向量数据时,能够提供快速、准确的检索结果。适用于智能知识检索、 检索增强生成 RAG(Retrieval-Augmented Generation) 等各种复杂应用场景的智能应用。

此外,DataVec还支持`鲲鹏指令集加速`,实现毫秒级响应。鲲鹏指令集是华为自主研发的一套高性能计算指令集,能够显著提升数据处理和计算的效率。通过利用鲲鹏指令集,DataVec可以在处理大规模向量数据时,提供更快的响应速度和更高的处理能力。

在实际应用中,DataVec可以广泛应用于各种需要高效向量检索的场景。例如,在`推荐系统`中,DataVec可以根据用户的历史行为和偏好,快速找到与用户兴趣相似的内容,从而提供个性化的推荐。在`图像检索`中,DataVec可以通过图像特征向量,快速找到与查询图像相似的图片。在`自然语言处理(NLP)`中,DataVec可以通过文本嵌入,快速找到与查询文本语义相似的文档。

2. 向量数据库特性描述

  • 支持的`向量数据类型`:vector、bitvec、sparsevec

  • 支持的`索引类型`:IVFFLAT、IVF-PQ、HNSW、HNSW-PQ

  • 支持`PQ量化压缩`:乘积量化(Product Quantization, PQ)是一种基于高效压缩高维向量的方法,适用于大规模数据集的相似度搜索。通过将高维向量分割成为多个低维子向量,并对每个子向量进行独立聚类,将原始向量表示为一系列质心,从而显著减少内存使用和提升检索速度。

  • 支持`标量向量混合查询`:这种混合查询的支持使得用户可以在同一个查询中结合不同类型的数据,从而实现更复杂和精细的分析。

  • 支持`原地更新引擎`:ANN索引页面中在每个Element Tuple尾部附加xmin和xmax字段,从而支持原地更新引擎。

  • 支持`并行构建索引`:ANN支持并行构建索引,通过将数据集分成若干个子集分配到不同工作线程上,在每个线程上独立计算并将各线程结果合并形成最终全局索引,这极大地提升了处理大规模数据集的效率。

3. 向量数据库操作介绍

3.1 基本操作

快速部署

详见[容器镜像安装](https://docs.opengauss.org/zh/docs/latest-lite/docs/InstallationGuide/%E5%AE%B9%E5%99%A8%E9%95%9C%E5%83%8F%E5%AE%89%E8%A3%85.html)。

创建向量表

DataVec新增多种[向量数据类型](https://docs.opengauss.org/zh/docs/latest/docs/SQLReference/%E5%90%91%E9%87%8F%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B.html)(vector、bitvector、sparsevector等),向量表的创建与openGauss原生语法保持一致,创建时指定存储向量类型即可。

CREATE TABLE [TABLE_NAME]
(
    COL1 DATATYPE,
    ...,
    COLN VECTORTYPE,
);

示例1:创建一个带有3维向量的表。

openGauss=# CREATE TABLE items (val vector(3));

数据插入

向量的数据插入与openGauss原生语法保持一致,使用INSERT或者COPY插入,指定数据类型即可。

INSERT INTO [TABLE_NAME] VALUES 
(
    DATA1,
    ...,
    [0.1, 0.3, 0.6, ...]
);

示例2:向量数据的插入。

openGauss=# INSERT INTO items (val) VALUES ('[1,2,3]'), ('[4,5,6]');

向量索引创建

DataVec目前支持了IVFFLAT、HNSW、IVFPQ及HNSWPQ等算法的[向量索引](https://docs.opengauss.org/zh/docs/latest/docs/SQLReference/%E5%90%91%E9%87%8F%E7%B4%A2%E5%BC%95.html),基于openGauss中的ASTORE存储实现,通过索引结构能够高效地检索出查询结果。

CREATE INDEX [INDEX_NAME]
ON [TABLE_NAME]
USING [ivfflat|hnsw|...]
WITH (
    lists=<LISTS>,|
    m=<M>,
    ef_construction=<EF_CONSTRUCTION>,
    enable_pq = on, 
    pq_m = <PQ_M>, 
    pq_ksub = <PQ_KSUB>
    ...
);

示例3:索引创建。​​​​​​​

openGauss=# CREATE INDEX ON items USING ivfflat (val vector_l2_ops) WITH (lists = 100);
openGauss=# CREATE INDEX ON items USING hnsw (val vector_cosine_ops) WITH (m = 16, ef_construction=200,enable_pq=on, pq_m=2000);

向量检索

通过ANN索引,DataVec可以进行高效的近似搜索;此外还可以进行非索引的精确检索。​​​​​​​

SELECT COL1, COLN 
FROM [TABLE_NAME] 
ORDER BY COLN [VECTOR_OPERATER]  '[0.1, 0.3, 0.7, ...]' 
LIMIT <TOPK>;

示例4:计算最近邻。​​​​​​​

openGauss=# SELECT * FROM items ORDER BY val <-> '[3,1,2]' LIMIT 5;
openGauss=# SELECT * FROM items ORDER BY val <#> '[3,1,2]' LIMIT 5;
openGauss=# SELECT * FROM items ORDER BY val <=> '[3,1,2]' LIMIT 5;

融合查询

融合查询结合了结构化过滤和非结构化检索的技术,使用户在同一查询中使用不同的数据类型和查询方法,以获取更为精确的非结构化数据。下面以全文搜索和向量搜索的融合查询为例。

示例5:融合查询。​​​​​​​

openGauss=#
WITH combined AS 
(
       (
       SELECT id, user_id, document_id, content, created_time, updated_time,
       embedding <-> '[1, 2, 3]'::vector AS similarity, 1 AS source 
       FROM documents 
       ORDER BY embedding <-> '[1, 2, 3]'::vector 
       LIMIT 10
       )
       UNION ALL
       (
       SELECT id, user_id, document_id, content, created_time, updated_time,
       ts_rank(to_tsvector('testchcfg', content), query) AS similarity, 2 AS source
       FROM documents, to_tsquery('testchcfg', 'openGauss向量数据库新特性是什么?') query
       WHERE to_tsvector('testchcfg', content) @@ query
       ORDER BY ts_rank(to_tsvector('testchcfg', content), query) DESC
       LIMIT 10
       )
)
SELECT id, document_id, content, MAX(similarity) AS similarity, BIT_OR(source)
FROM combined
GROUP BY id, document_id, content
ORDER BY similarity DESC
LIMIT 10;

欢迎小伙伴们讨论交流~

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐