您当前的位置:首页 > 电脑百科 > 数据库 > 百科

矢量数据库对比和选择指南

时间:2023-07-08 15:23:58  来源:  作者:deephub

矢量数据库是为实现高维矢量数据的高效存储、检索和相似性搜索而设计的。使用一种称为嵌入的过程,将向量数据表示为一个连续的、有意义的高维向量。

本文将研究存储/检索向量数据和执行相似性搜索的实用方法,在我们深入研究之前,首先先介绍矢量数据库的两个关键功能:

1、执行搜索的能力

当给定查询向量时,向量数据库可以根据指定的相似度度量(如余弦相似度或欧几里得距离)检索最相似的向量。这允许应用程序根据它们与给定查询的相似性来查找相关项或数据点。

2、高性能

矢量数据库通常使用索引技术,比如近似最近邻(ANN)算法来加速搜索过程。这些索引方法旨在降低在高维向量空间中搜索的计算复杂度,而传统的方法如空间分解由于高维而变得不切实际。

简介

矢量数据库领域现在正在急速的扩展,如何权衡选择呢,这里我整理了5个主要的方向:

像Pinecone这样的纯矢量数据库,比如Pinecone也是建立在下面的FAIss之上的

全文搜索数据库,如ElasticSearch,以前是作为搜索引擎现在增加了矢量存储和检索的功能

矢量库,如Faiss, Annoy和Hnswlib,还不能作为数据库,只是矢量的处理

支持矢量的NoSQL数据库,如MongoDB、Cosmos DB和Cassandra,都是老牌的数据存储,但是加入了矢量的功能

支持矢量的SQL数据库,如SingleStoreDB或PostgreSQL,与上面不同的是这些数据库支持SQL语句

除了上面提到的五种主要方法外,还有如Vertex AI和Databricks,它们的功能超越了数据库,我们不进行讨论。

1、纯矢量数据库

纯矢量数据库是专门为存储和检索矢量而设计的。包括Chroma, LanceDB, Marqo, Milvus/ Zilliz, Pinecone, Qdrant, Vald, Vespa, Weaviate等。数据是基于对象或数据点的向量表示来组织和索引。这些向量可以是各种类型数据的数字表示,包括图像、文本文档、音频文件或任何其他形式的结构化或非结构化数据。

优点

利用索引技术进行高效的相似度搜索

大型数据集和高查询工作负载的可伸缩性

支持高维数据

支持基于HTTP和json的api

原生支持向量运算,包括加法,减法,点积,余弦相似度

缺点

纯矢量数据库:纯矢量数据库可以存储矢量和一些元数据,但是其他就不行了。对于大多数用例,可能还需要包括诸如实体、属性和层次结构(图)、位置(地理空间)等描述的数据,这就要其他存储的整合。

有限或没有SQL支持:纯矢量数据库通常使用自己的查询语言,这使得很难对矢量和相关信息运行传统的分析,也很难将矢量和其他数据类型结合起来。

没有完整的CRUD:纯矢量数据库并不是真正为创建、更新和删除操作而设计的。所以必须首先对数据进行矢量化和索引,这些数据库的重点是获取向量数据,并基于向量相似度查询最近邻,而索引是很耗时的。索引矢量数据计算量大、成本高、耗时长。这使得基本上无法进行实时的操作。例如,Pinecone的IMI索引(反向多索引,人工神经网络的一种变体)会产生存储开销,并且是计算密集型。它主要是为静态或半静态数据集设计的,如果经常添加、修改或删除向量,基本上不太可能。而Milvus使用的索引被称为产品量化和分层可导航小世界(HNSW),这是一种近似的技术,在搜索准确性和效率之间进行权衡。它的索引需要配置各种参数,使用不正确的参数选择可能会影响搜索结果的质量或导致效率低下。

功能性不强:许多矢量数据库在基本特性上严重落后,包括ACID事务、灾难恢复、RBAC、元数据过滤、数据库可管理性、可观察性等。这可能会导致严重的业务问题,要解决这些问题,则需要我们自己来处理了这会导致开发量大增。

2、全文检索数据库

这类数据库包括Elastic/Lucene、OpenSearch和Solr。

优点

高可伸缩性和性能,特别是对于非结构化文本文档

丰富的文本检索功能,如内置的外语支持,可定制的标记器,词干器,停止列表和N-grams

大部分基于开源库(Apache Lucene)

成熟的且有大型集成生态系统,包括矢量库

缺点

没有优化向量搜索或相似匹配

主要设计用于全文搜索,而不是语义搜索,因此基于它构建的应用程序将不具有检索增强生成(RAG)和其他的完整上下文。为了实现语义搜索功能,这些数据库需要使用其他工具以及大量自定义评分和相关模型进行增强。

其他数据格式(图像、音频、视频)的有限应用

基本上不支持GPU

一般选择这些库的原因都是因为在以前项目上增加新的功能,并且数据量小,对主业务也不会产生多大影响时使用。如果需要重新构架大型项目,不建议使用。

3、开源矢量库

对于许多开发者来说,Faiss、Annoy和Hnswlib等开源矢量库是一个很好的起点。Faiss是一个用于密集向量相似性搜索和聚类的库。Annoy (Approximate Nearest Neighbors Oh Yeah)是一个用于人工神经网络搜索的轻量级库。Hnswlib是一个实现HNSW ANN搜索算法的库。

优点

快速近邻搜索

为高维构建

支持面向人工神经网络的索引结构,包括倒排文件,产品量化和随机投影

支持推荐系统、图像搜索和自然语言处理的用例

SIMD(单指令,多数据)和GPU支持,加快向量相似度搜索操作

缺点

维护和集成麻烦

与精确方法相比,可能会牺牲搜索准确性

需要自己部署和维护:需要你构建和维护复杂的基础设施,为应用程序需求提供足够的CPU、GPU和内存资源。

对元数据过滤、SQL、CRUD操作、事务、高可用性、灾难恢复以及备份和还原的支持有限或不支持

他们之所以称为库(或者包)而不是数据库是因为它们只提供了很少的但是却非常专业功能,如果你想入门学习或者做一个简单的demo,它们都是很好开始,但不建议直接应用到生产中。

4、支持矢量的NoSQL数据库

这些数据库包括:NoSQL数据库,如MongoDB, Cassandra/ DataStax Astra, CosmosDB和Rockset。还有像像redis这样的键值数据库和其他特殊用途的数据库,如Neo4j(图数据库)

几乎所有这些NoSQL数据库都是最近才添加矢量搜索扩展而具备矢量能力的,所以如果要是用的话一定要做好测试。

优点

对于特定的数据模型,NoSQL数据库提供了高性能和可扩展性。Neo4j可以与llm一起用于社交网络或知识图谱。一个具有矢量能力的时间序列数据库(如kdb)可能能够将矢量数据与金融市场数据结合起来。

缺点

NoSQL数据库的矢量功能是基本的/新生的/未经测试的。今年,许多NoSQL数据库添加了向量支持。比如:

今年5月,Cassandra宣布了增加矢量搜索的计划。

4月,Rockset宣布支持基本矢量搜索,

5月Azure Cosmos DB宣布支持MongoDB vCore的矢量搜索。

DataStax和MongoDB在本月(6月)宣布了矢量搜索功能(都是预览版)!

NoSQL数据库的矢量搜索性能可能差别很大,这取决于所支持的矢量函数、索引方法和硬件加速。而且NoSQL数据库的查询效率本来就不高,再加上矢量的功能,一定不会快。

我的观点一直没有变,那就是如果复杂数据一定要存到关系型数据库中,像MongoDB这样的当作辅助存储是没问题,但当作主要存储和主要查询那是所谓的自称为“全栈”的前端干出来的事,因为什么都不懂,所以觉得什么都简单。

5、支持矢量的SQL数据库

这些库与上面的类似,但是它们基本都是关系型数据库并且支持sql查询,例如SingleStoreDB, PostgreSQL, Clickhouse和K.NETica的pgvector/Supabase Vector(测试版)。

在一个已建立的数据库中添加基本的矢量功能并不是一件难事。比如矢量数据库Chroma就是来自ClickHouse

优点

包含矢量搜索功能,如点积,余弦相似度,欧几里得距离和曼哈顿距离。

使用相似度分数找到k个最近邻

多模型SQL数据库提供混合查询,并且可以将向量与其他数据结合起来以获得更有意义的结果

大多数SQL数据库都可以作为服务部署,可以在云上进行完全管理。

缺点

SQL数据库是为结构化数据而设计的。而矢量是非结构化数据,如图像、音频和文本。虽然关系数据库通常可以存储文本和blob,但大多数数据库不会将这些非结构化数据矢量化以用于机器学习。

大多数SQL数据库(还)没有针对向量搜索进行优化。关系数据库的索引和查询机制主要是为结构化数据设计的,而不是为高维矢量数据设计的。虽然用于向量数据处理的SQL数据库的性能可能不是特别好,但支持向量的SQL数据库可能会添加扩展或新功能来支持向量搜索。

传统的SQL数据库不能向外扩展,它们的性能会随着数据的增长而下降。使用SQL数据库处理高维向量的大型数据集可能需要进行额外的优化,比如对数据进行分区或使用专门的索引技术来保持高效的查询性能。

总结

所以,那么如何选择呢?

1、如果入门或者demo的话可以直接使用开源的矢量库,比如Faiss可以支持本地的亿级数据,但是无法提供对外服务。

2、对于产品,如果要开发新的功能并且上线,那就要将矢量存储和现有的存储分开,专业的人做专业的事,可选择纯矢量数据库或开源矢量库自行开发(如果功能简单的话),保证系统的稳定性。

3、如果非要在现有系统上使用矢量功能,比如Elastic、MongoDB 上存储和检索大量的矢量数据,那么一定要做好测试,并且自求多福吧,没准你遇到的问题不仅ChatGPT不知道,stackoverflow上也没有。

4、现在矢量存储还是再发展阶段,所以有些功能还不完善,所以尽量使用成熟版本,对于生产环境不要冒险尝鲜。

最后说说架构的建议:

微服务架构是一种软件架构风格,其中应用程序被拆分为一组小型、独立的服务,每个服务都专注于提供特定的业务功能,每个微服务都应该专注于解决一个具体的业务问题或提供一项特定的功能。这种精细化的划分使得每个微服务可以根据需要进行独立的扩展、部署和维护。

矢量搜索也不例外应该独立成单独的服务,服务都独立了存储不是也应该独立吗。

当然如果非要把矢量存储和业务数据放在一起也可以,我没有任何意见,反正出问题又不是我来解决,我就看个热闹就行了



Tags:数据库   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
向量数据库落地实践
本文基于京东内部向量数据库vearch进行实践。Vearch 是对大规模深度学习向量进行高性能相似搜索的弹性分布式系统。详见: https://github.com/vearch/zh_docs/blob/v3.3.X/do...【详细内容】
2024-04-03  Search: 数据库  点击:(5)  评论:(0)  加入收藏
如何正确选择NoSQL数据库
译者 | 陈峻审校 | 重楼Allied Market Research最近发布的一份报告指出,业界对于NoSQL数据库的需求正在持续上升。2022年,全球NoSQL市场的销售额已达73亿美元,预计到2032年将达...【详细内容】
2024-03-28  Search: 数据库  点击:(14)  评论:(0)  加入收藏
为什么数据库连接池不采用 IO 多路复用?
这是一个非常好的问题。IO多路复用被视为是非常好的性能助力器。但是一般我们在使用DB时,还是经常性采用c3p0,tomcat connection pool等技术来与DB连接,哪怕整个程序已经变成以...【详细内容】
2024-03-27  Search: 数据库  点击:(13)  评论:(0)  加入收藏
过去一年,我看到了数据库领域的十大发展趋势
作者 | 朱洁策划 | 李冬梅过去一年,行业信心跌至冰点2022 年中,红衫的一篇《适应与忍耐》的报告,对公司经营提出了预警,让各个公司保持现金流,重整团队,想办法增加盈利。这篇报告...【详细内容】
2024-03-12  Search: 数据库  点击:(27)  评论:(0)  加入收藏
让数据库和缓存数据保持一致的三种策略
如何保证缓存和数据库的一致性,这算得上是个老生常谈的话题啦,看到好多技术新人在写更新缓存数据代码,采用了非常复杂甚至“诡异”的方案,甚为不解。一、背景目前随着缓存架构方...【详细内容】
2024-02-20  Search: 数据库  点击:(36)  评论:(0)  加入收藏
MySQL数据库如何生成分组排序的序号
经常进行数据分析的小伙伴经常会需要生成序号或进行数据分组排序并生成序号。在MySQL8.0中可以使用窗口函数来实现,可以参考历史文章有了这些函数,统计分析事半功倍进行了解。...【详细内容】
2024-01-30  Search: 数据库  点击:(54)  评论:(0)  加入收藏
一篇文章,彻底理解数据库操作语言:DDL、DML、DCL、TCL
本篇文章以具体的SQL语句讲解了数据库SQL语言四大分类(数据定义语言DDL,数据操作语言DML,数据查询语言DQL,数据控制语言DCL),同时也介绍了事务控制语言TCL。最近与开发和运维讨论...【详细内容】
2024-01-30  Search: 数据库  点击:(43)  评论:(0)  加入收藏
一文读懂:什么是数据库,它到底有啥用?
提到数据库,可能很多人会很陌生。但据库其实已经渗入我们生活的方方面面,像网上购物、扫码点餐、抢红包等等应用背后都离不开数据库的支持。可以说数据库是支撑各类应用软件运...【详细内容】
2024-01-25  Search: 数据库  点击:(43)  评论:(0)  加入收藏
oracle数据库基础学习
在当今数字化时代,数据库已成为企业运营的关键要素。而Oracle数据库,作为全球领先的企业级数据库管理系统,更是备受推崇。本文将带您深入了解Oracle数据库的基础知识,帮助您从零...【详细内容】
2024-01-20  Search: 数据库  点击:(90)  评论:(0)  加入收藏
一个流行的支持超多数据库的ORM库
Sequelize 是一个流行的 Node.js ORM(对象关系映射)库,用于在 Node.js 中操作关系型数据库。它支持多种数据库系统,如 PostgreSQL、MySQL、SQLite 和 MSSQL,并提供了简单易用的 A...【详细内容】
2024-01-15  Search: 数据库  点击:(77)  评论:(0)  加入收藏
▌简易百科推荐
向量数据库落地实践
本文基于京东内部向量数据库vearch进行实践。Vearch 是对大规模深度学习向量进行高性能相似搜索的弹性分布式系统。详见: https://github.com/vearch/zh_docs/blob/v3.3.X/do...【详细内容】
2024-04-03  京东云开发者    Tags:向量数据库   点击:(5)  评论:(0)  加入收藏
原来 SQL 函数是可以内联的!
介绍在某些情况下,SQL 函数(即指定LANGUAGE SQL)会将其函数体内联到调用它的查询中,而不是直接调用。这可以带来显著的性能提升,因为函数体可以暴露给调用查询的规划器,从而规划器...【详细内容】
2024-04-03  红石PG  微信公众号  Tags:SQL 函数   点击:(4)  评论:(0)  加入收藏
如何正确选择NoSQL数据库
译者 | 陈峻审校 | 重楼Allied Market Research最近发布的一份报告指出,业界对于NoSQL数据库的需求正在持续上升。2022年,全球NoSQL市场的销售额已达73亿美元,预计到2032年将达...【详细内容】
2024-03-28    51CTO  Tags:NoSQL   点击:(14)  评论:(0)  加入收藏
为什么数据库连接池不采用 IO 多路复用?
这是一个非常好的问题。IO多路复用被视为是非常好的性能助力器。但是一般我们在使用DB时,还是经常性采用c3p0,tomcat connection pool等技术来与DB连接,哪怕整个程序已经变成以...【详细内容】
2024-03-27  dbaplus社群    Tags:数据库连接池   点击:(13)  评论:(0)  加入收藏
八个常见的数据可视化错误以及如何避免它们
在当今以数据驱动为主导的世界里,清晰且具有洞察力的数据可视化至关重要。然而,在创建数据可视化时很容易犯错误,这可能导致对数据的错误解读。本文将探讨一些常见的糟糕数据可...【详细内容】
2024-03-26  DeepHub IMBA  微信公众号  Tags:数据可视化   点击:(7)  评论:(0)  加入收藏
到底有没有必要分库分表,如何考量的
关于是否需要进行分库分表,可以根据以下考量因素来决定: 数据量和负载:如果数据量巨大且负载压力较大,单一库单一表可能无法满足性能需求,考虑分库分表。 数据增长:预估数据增长...【详细内容】
2024-03-20  码上遇见你  微信公众号  Tags:分库分表   点击:(15)  评论:(0)  加入收藏
在 SQL 中写了 in 和 not in,技术总监说要炒了我……
WHY?IN 和 NOT IN 是比较常用的关键字,为什么要尽量避免呢?1、效率低项目中遇到这么个情况:t1表 和 t2表 都是150w条数据,600M的样子,都不算大。但是这样一句查询 ↓select *...【详细内容】
2024-03-18  dbaplus社群    Tags:SQL   点击:(6)  评论:(0)  加入收藏
应对慢SQL的致胜法宝:7大实例剖析+优化原则
大促备战,最大的隐患项之一就是慢SQL,对于服务平稳运行带来的破坏性最大,也是日常工作中经常带来整个应用抖动的最大隐患,在日常开发中如何避免出现慢SQL,出现了慢SQL应该按照什...【详细内容】
2024-03-14  京东云开发者    Tags:慢SQL   点击:(5)  评论:(0)  加入收藏
过去一年,我看到了数据库领域的十大发展趋势
作者 | 朱洁策划 | 李冬梅过去一年,行业信心跌至冰点2022 年中,红衫的一篇《适应与忍耐》的报告,对公司经营提出了预警,让各个公司保持现金流,重整团队,想办法增加盈利。这篇报告...【详细内容】
2024-03-12    InfoQ  Tags:数据库   点击:(27)  评论:(0)  加入收藏
SQL优化的七个方法,你会哪个?
一、插入数据优化 普通插入:在平时我们执行insert语句的时候,可能都是一条一条数据插入进去的,就像下面这样。INSERT INTO `department` VALUES(1, '研发部(RD)', &#39...【详细内容】
2024-03-07  程序员恰恰  微信公众号  Tags:SQL优化   点击:(20)  评论:(0)  加入收藏
站内最新
站内热门
站内头条