您应该使用哪个矢量数据库? 选择最适合您需求的数据库

2024-09-01 15:04

本文主要是介绍您应该使用哪个矢量数据库? 选择最适合您需求的数据库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

导言

矢量数据库已成为存储非结构化和结构化数据表示并编制索引的首选。 这些表征被称为向量嵌入,由嵌入模型生成。 向量存储在利用深度学习模型(尤其是大型语言模型)的应用开发中发挥着至关重要的作用。

什么是矢量数据库?

在现实世界中,并非所有数据都能整齐地排列成行和列。 在处理复杂的非结构化数据(如图像、视频和自然语言)时尤其如此。

矢量数据库是一种以高维矢量形式存储数据的数据库,本质上是代表对象特征或特性的数字列表。 每个矢量对应一个独特的实体,如一段文本、图像或视频。

但为什么要使用矢量呢? 奥妙就在于它能够捕捉语义和相似性。 通过将数据表示为向量,我们可以对它们进行数学比较,并确定它们的相似或不相似程度。 这使我们能够执行复杂的查询,如 "为我查找与此相似的图片 "或 “检索与此文本语义相关的文档”。

为什么需要矢量数据库?

近年来,矢量数据库越来越受欢迎,尤其是在机器学习(ML)和人工智能(AI)领域。 人工智能和 ML 模型的复杂性要求采用有效的方法来存储、搜索和检索它们所处理的大量非结构化数据。

对于为结构化数据而构建的传统数据库来说,矢量数据的复杂性和大小可能经常会让它们难以承受。 相反,矢量数据库就是为此而专门设计的。 它们提供专门的搜索和索引算法,即使在拥有数十亿条目的数据库中,也能迅速找到可比较的矢量。

矢量数据库的不同用例

通过查找可比矢量的能力,人工智能和 ML 的应用得到了极大扩展。 典型用例包括:

  • RAG 系统: 矢量数据库可与大型语言模型(LLMs)相结合,构建以知识为基础的语言人工智能应用。
  • 推荐系统: 矢量数据库可以将用户偏好和项目属性表示为矢量,从而为高度个性化的推荐引擎提供动力。
  • 通过搜索视觉相关的图像或视频,矢量数据库彻底改变了基于内容的检索。
  • 自然语言处理: 矢量数据库通过将文本转换为矢量,提供语义搜索、主题建模和文档分组功能。
  • 欺诈检测: 矢量数据库可用于协助识别金融交易中的趋势和异常情况。

矢量数据库比较

目前有许多矢量数据库,如 Qdrant、Pinecone、Milvus、Chroma、Weaviate 等。 每个数据库都有自己的优势、利弊和理想用例。 在此,我们将对 Pinecone、Milvus、Chroma、Weaviate、Faiss、Elasticsearch 和 Qdrant 等流行的矢量数据库进行全面比较。

部署选项

在这方面,Pinecone 是个异数。 出于性能和可扩展性的考虑,Pinecone 是一项完全托管的服务,因此无法在本地运行实例。 Milvus、Chroma、Weaviate、Faiss、Elasticsearch 和 Qdrant 都可以在本地运行;其中大多数都提供了用于运行的 Docker 镜像。

在这里插入图片描述

可扩展性

Qdrant提供静态分片功能;如果数据增长超出服务器容量,则需要向集群添加更多机器,并重新分片所有数据。 这可能是一个耗时且复杂的过程。 此外,不平衡的分片会带来瓶颈,降低系统效率。

Pinecone 通过其 Serveless Tier 支持计算和存储的分离。 对于基于 POD 的集群,Pinecone 采用的是静态分片,要求用户在扩展集群时手动重新分片。

Weaviate 提供静态分片。 在没有任何分布式数据替换的情况下,Chroma 无法扩展到单节点以外的规模

在这里插入图片描述

性能基准测试

  • Qdrant几乎在所有场景中都实现了最高的RPS和最低的延迟,无论我们选择的精度阈值和指标如何。 在其中一个数据集上,它的 RPS 也提高了 4 倍。
  • Elasticsearch 在许多用例中都变得相当快,但在索引时间方面却非常慢。 当存储 1,000 多万个 96 维向量时,它可能会慢 10 倍! (32 分钟对 5.5 小时)
  • 在索引时间方面,Milvus 是最快的,而且精度也很高。 不过,当嵌入维度较高或向量数量较多时,Milvus 在 RPS 或延迟方面就无法与其他产品相提并论了。
  • Redis 能够实现较好的 RPS,但主要是在较低精度的情况下。 在单线程情况下,Redis 也能实现较低的延迟;但在并行请求较多的情况下,延迟会迅速增加。 速度提升的部分原因是其定制协议。
  • 随着时间的推移,Weaviate 的改进最小。 由于其他引擎的相对改进,就 RPS 和延迟而言,它已成为最慢的引擎之一。

在这里插入图片描述

数据管理

在这里插入图片描述

矢量相似性搜索

矢量数据库如此有用的原因之一是,它们可以告诉我们事物之间的关系,以及它们的相似或不相似程度。 矢量数据库可以通过各种距离度量来实现这一功能,不同的矢量数据库会采用不同的距离度量。

在这里插入图片描述

集成和应用程序接口

REST 应用程序接口更常见,而 GRPC 应用程序接口则面向延迟关键场景或需要快速移动大量数据时的性能和吞吐量。 根据您的要求和网络情况,GRPC 的速度可比 REST 快数倍。

在这里插入图片描述

社区和生态系统

开放源代码意味着我们可以浏览核心数据库的源代码,矢量数据库具有灵活的许可模式。

在这里插入图片描述

元数据过滤

元数据是一个非常强大的概念,与矢量数据库的核心功能相辅相成;它是模糊的人类语言与结构化数据之间的纽带。 这是架构的基础,当人类用户询问产品时,人工智能购物助手会立即回复他们所描述的产品。

在这里插入图片描述

向量数据库功能

  • Qdrant: Qdrant 使用三种类型的索引为其数据库提供动力。 这三种索引分别是有效载荷索引(类似于传统的面向文档数据库中的索引)、字符串有效载荷全文索引和矢量索引。 他们的混合搜索方法是矢量搜索与属性过滤的结合。
  • Pinecone: RBAC 对于大型企业来说是不够的。 存储优化(S1)在性能方面存在一些挑战,只能达到 10-50 QPS。 命名空间的数量有限,用户在使用元数据过滤作为绕过这一限制的方法时应小心谨慎,因为这将对性能产生很大影响。 此外,这种方法也无法实现数据隔离。
  • Weaviate: Weaviate 使用两种索引为其数据库提供支持。 一种是将数据对象属性映射到其在数据库中的位置的倒排索引,另一种是支持高性能查询的矢量索引。 此外,它的混合搜索方法使用密集向量来理解查询的上下文,并结合稀疏向量来进行关键字匹配。
  • Chroma:Chroma 使用 HNSW 算法来支持 kNN 搜索。
  • Milvus:Milvus 支持多个内存索引和表级分区,从而实现了实时信息检索系统所需的高性能。 支持 RBAC 是企业级应用的要求。 关于分区,通过将搜索限制在数据库的一个或多个子集上,分区可以提供比静态分区更有效的数据过滤方式,静态分区可能会带来瓶颈,当数据增长超出服务器容量时需要重新分区。 分区是一种管理数据的好方法,它可以根据类别或时间范围将数据分组为子集。 这可以帮助您轻松过滤和搜索大量数据,而无需每次都搜索整个数据库。 没有一种索引类型能适合所有的使用情况,因为每种使用情况都有不同的权衡标准。 有了更多索引类型的支持,您就可以更灵活地在准确性、性能和成本之间找到平衡。
  • Faiss: FAISS 是一种支持 kNN 搜索的算法

总体比较摘要

在这里插入图片描述

这篇关于您应该使用哪个矢量数据库? 选择最适合您需求的数据库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1127273

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash