向量数据库的介绍

我们做了很多期关于大模型的内容了

但是不论是检索增强生成RAG

还是代理Agent

几乎每个大语言模型驱动的应用程序

都可能会用到向量数据库

那么,究竟什么是向量数据库

它与传统数据库有何不同

我们又该如何选择向量数据库呢?

今天我们就来聊聊这个话题


为了方便大家的理解

整个内容并没有晦涩的术语或者复杂的数学公式

大飞我希望尽量能够做到雅俗共赏

在讲向量数据库之前

我们首先需要理解什么是向量?

应该说

向量是基于不同特征或者属性

来描述一个对象的数据表示

每个向量代表一个单独的数据点

例如一个词或者一张图片

由描述其许多特性的值的集合组成

这些变量有时也被称为“特征”“维度”

例如

一张图片可以表示为像素值的向量

整个句子也可以表示为单词嵌入的向量

一些常用的数据向量包括

1、图像向量

这是通过深度学习模型提取的图像特征向量

这些特征向量捕捉了图像的重要信息

如颜色、形状、纹理等

可以用于图像识别检索等任务

2、文本向量

这是通过词嵌入技术如Word2VecBERT等生成的文本特征向量

这些向量包含了文本的语义信息

可以用于文本分类、情感分析等任务

3、语音向量

这是通过声学模型从声音信号中提取的特征向量

这些向量捕捉了声音的重要特性

如音调、节奏、音色等

可以用于语音识别、声纹识别等任务

而向量数据库就是一种将数据存储为高维向量的数据库

高维向量是特征或者属性的数学表示

每个向量都有一定数量的维度

根据数据的复杂性和粒度

维度可以从几十到几千不等

向量通常是通过对原始数据

比如文本、图像、音频、视频等等

应用某种变换或嵌入函数来生成的

嵌入函数可以基于各种方法

比如机器学习模型、单词嵌入、特征提取算法

向量数据库会采用索引策略

来简化向量相似的特定查询

这在机器学习应用程序中特别有用

因为相似性搜索经常用来发现可以比较的数据点

或者生成建议

向量数据库的主要功能包括三点

管理、存储和检索

向量数据库以原始数据形式处理数据

能够有效地组织和管理数据

便于AI模型应用

而且它能够存储向量数据

包括各种AI模型需要使用到的高维数据

此外

向量数据库特别擅长高效地检索数据

这个特点能够确保AI模型在需要的时候

快速获得所需要的数据

这也是向量数据库能够在一些推荐系统

或者检索系统中得到应用的重要原因

向量数据库的主要优点是

它允许基于数据的向量距离或者相似性

来进行快速准确的相似性搜索和检索

这意味着,可以使用向量数据库

根据语义或上下文含义

查找最相似或最相关的数据

而不是使用基于精确匹配或者预定义标准的查询数据库的传统方法

向量数据库可以搜索非结构化数据

但是也可以处理半结构化甚至结构化数据

例如,可以使用向量数据库

根据视觉内容和风格查找与给定图像相似的图像

或者根据主题和情感查找与给定文档相似的文档

以及根据功能和评级查找与给定产品相似的产品

接下来

我们说说向量数据库的工作机理

我们已经知道

向量数据库的构建是为了适应向量嵌入的特定结构

并且它们使用索引算法

根据向量与查询向量的相似性

来有效地搜索和检索向量

向量数据库的工作原理

我们可以通过CPU和GPU的工作原理进行类比

CPU和GPU分别是计算机的运算和图形处理核心

而向量数据库则是大模型的记忆和存储核心

在大模型学习阶段

向量数据库会接收多模态数据进行向量化表示

让大模型在训练时能够更高效地调用和处理数据

区别于传统数据库

向量数据库主要有三点不同

数据向量化,向量检索和相似度计算

数据的向量化采用embedding技术

嵌入作为一个桥梁

将非数字数据转换为机器学习模型可以使用的形式

使它们能够更有效地识别数据中的模式和关系

一般来说,文本是一维向量

图像是二维矩阵

视频相当于三维矩阵

这些嵌入实质上是存储数据的上下文表示的数字列表

在存储层内

数据库以m个向量堆栈的形式存储

每个向量使用n个维度表示一个数据点

总大小为m×n

为了查询性能的原因

这些堆栈通常通过分片的方式进行划分

向量检索是指输入一个向量

从数据库中查找与输入向量最相似的topN个向量返回

要在向量数据库中执行相似性搜索和检索

需要使用表示所需信息或条件的查询向量

查询向量可以从与存储向量相同类型的数据导出

或者从不同类型的数据导出

使用相似性度量来计算两个向量在向量空间中的距离

相似性度量可以基于各种度量

比如余弦相似性、欧氏距离、向量内积

hamming距离、jaccard指数

其中

向量检索算法是向量数据库的核心之一

向量检索可以看为是近似最近邻搜索

通过预先的索引构建来减小数据查询时的搜索空间

加快检索速度

目前主要的检索算法有几种

包括基于树的方法

例如KDTree和Annoy

基于图的方法,例如HNSW

基于乘积量化的方法

例如SQ和PQ,基于哈希的方法

例如LSH,以及基于倒排索引的方法

向量数据库中的索引可以按照数据结构和压缩级别两个层次进行组织实现

根据数据结构建立的索引

可以分为基于哈希、基于树、基于图和基于倒排文件的几种

而根据数据压缩方式建立索引

主要包括平坦压缩和量化压缩

平坦压缩是指以未经修改的形式存储向量的索引

量化中索引的底层向量

通常通过将浮点数转换为整数的方式

被分解成由较少字节组成的块

从而减少内存消耗和搜索过程中的计算成本

相似性搜索和检索的结果

通常是与查询向量具有最高相似性得分的向量的排序列表

然后

你可以访问与原始源或索引中的每个向量

相关联的相应原始数据

接下来

我们再介绍一下目前向量数据库都有哪些种类

市面上都有哪些向量数据库

以及它们之间的一些差异点

根据向量数据库的的实现方式

我们可以将向量数据库大致分为4类

分别是原生的向量数据库、支持向量的全文检索数据库、支持向量的NoSQL数据库

以及支持向量的关系型数据库

先说第一类原生的向量数据库

这些数据库是专门为存储和检索向量而设计的

包括Chroma, LanceDB, Marqo

Milvus,也就是Zilliz, Pinecone

Qdrant

Vald, Vespa, Weaviate等等

它们所管理的数据是基于对象或数据点的向量表示

进行组织和索引

我们今天只介绍其中的三种

其他数据库的具体信息可以参考各自的官网

第一个是Faiss,严格来说

Faiss只是一个用于高效相似性搜索和密集向量聚类的开源库

Faiss是用C++编写的

带有完整的Python/numpy包装器

一些常用算法都有GPU实现

成为了很多开源向量数据库的基础

Faiss能够构建不同的索引类型

并提供了欧式距离或者点积的相似度计算功能

有些索引类型是简单的基线

比如精确搜索

大多数可用的索引结构需要考虑搜索时间

搜索质量

每个索引向量使用的内存等等

Faiss支持多种向量搜索技术

提供了能够在不同大小的向量集中搜索的算法

甚至可以处理那些超过内存容量的向量集

Faiss的主要优势之一是速度和可扩展性

即使在具有数十亿个向量的数据集中也可以进行快速搜索

此外

Faiss还提供了用于评估和调整参数的辅助代码

第二个是Pinecone

Pinecone是一个基于云的向量数据库

可以开发实时相似性搜索应用

能够以毫秒级的延迟存储和探索高维向量嵌入

适用于推荐系统、图片和视频搜索以及自然语言处理等应用

Pinecone的主要功能包括自动索引、实时更新、查询自动调整和用于与当前流程进行简单交互的REST API

它的架构专为可扩展性和稳健性而构建

可以轻松管理海量数据

同时保持高可用性

Pinecone是一个可以托管的向量数据库平台

也就是说有商用方案

也有免费使用方案

它的主要特点包括

支持全托管服务、高度可伸缩、实时数据摄取、低延迟的搜索、以及与LangChain集成

Pinecone采用了多种安全措施来保护用户的数据安全和隐私

包括多层次的访问控制机制可以控制用户的访问权限和操作权限

同时采用了数据加密、传输加密等技术来保护数据的安全性

还提供了数据备份和恢复等功能

可以防止数据丢失和损坏

Pinecone在性能方面表现非常出色

它能够支持高达1百万次的QPS

且具有低延迟和高吞吐量的特点

还具有分布式部署、实时索引构建和高效的向量相似度搜索等优点

可以帮助用户快速处理大规模的向量数据

此外

Pinecone还支持多种编程语言和框架

比如Python、Java、TensorFlow 等

使得用户可以轻松地将其集成到自己的应用程序中

第三个是Milvus

Milvus是一个开源的分布式向量数据库

它具备高可用、高性能、易拓展的特点

用于海量向量数据的实时召回

Milvus 基于 Faiss、Annoy、HNSW 等向量搜索库构建

可以轻松管理数百万个实体

可以根据不同的数据特点选择最合适的索引算法

核心是解决稠密向量相似度检索的问题

在向量检索的基础上

Milvus支持数据分区分片、数据持久化、增量数据摄取、标量向量混合查询、time travel 等功能

同时大幅优化了向量检索的性能

可满足任何向量检索场景的应用需求

此外

Milvus还具有分布式部署、高可用性和高扩展性等优点

可以帮助用户快速处理海量的向量数据

它也提供了多种安全措施来保护用户的数据安全和隐私

支持 SSL/TLS 加密和访问控制等技术

可以防止数据被非法访问和窃取

还提供了数据备份和恢复等功能

可以保护数据的完整性和可用性

在客户端方面

Milvus还提供了多种语言的SDK

例如Python、Java、C++等

使得用户可以方便地使用不同的编程语言来访问和操作Milvus

第二类是支持向量的全文检索数据库

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

它们都具有丰富的文本检索功能

比如可定制的标记器

分词器,停用词列表和N-grams等等

大部分都基于开源库

并且有大型集成的生态系统

包括了向量库

例如

Elasticsearch是一个支持各种类型数据的分布式搜索和分析引擎

Elasticsearch在7.3版本中

添加了对向量数据索引的支持

支持混合查询

但是向量检索采用的仍然是暴力计算

性能损耗较大

在8.0版本引入了knn search

其实就是一种近似最近邻搜索算法

相似度支持欧式距离

点积和余弦相似性

knn search底层其实使用的是HNSW

不过遗憾的是

这种方式无法进行混合检索

第三类是支持向量的NoSQL数据库

几乎所有这些NoSQL数据库

都是最近才通过添加向量搜索扩展而具备向量能力的

所以如果要是使用的话一定要做好测试

Cassandra,Rockset

Azure Cosmos DB和MongoDB等都纷纷宣布了增加向量搜索的计划

NoSQL数据库的向量搜索性能可能差别很大

这取决于所支持的向量函数、索引方法和硬件加速

对于支持向量的NoSQL 数据库

探索尝试未尝不可

但在生产环境中使用要慎之又慎

第四类是支持向量的SQL数据库

这些大都数都是关系型数据库

并且支持sql查询

例如SingleStoreDB, PostgreSQL

Clickhouse和Kinetica的pgvector/Supabase Vector等等

它们都宣布包含了向量搜索功能

比如点积

余弦相似度

欧几里得距离和曼哈顿距离

并且使用相似度分数找到n个最近邻

由于提供了混合查询

可以将向量与其他数据结合起来

从而获得更有意义的结果

另外

大多数SQL数据库都可以作为服务部署

可以在云上进行完全的管理

例如

Postgres通过pg_vector和pg_embdding两个插件来实现向量数据库

让PG数据库支持了向量索引检索的能力

它的索引算法使用的是基于Faiss的IVF Flat索引

提供了优异的召回率

我们再简单对这些向量数据库做一些对比

首先是编程语言支持方面

Chroma目前提供了Python和TypeScript的包装器

而基于C++编程语言的有OLAP数据库Clickhouse

以及开源向量索引HNSWLib

不过如今呢

一些新的数据库通常都会使用更加现代的编程语言

比如说Golang或者是Rust来编写

比如Pinecone就是用Rust重写过

目前呢只有Vespa是用Java来构建

其次呢是开源方面

Pinecone是完全闭源的

而Zilliz也是一个闭源的

完全托管的商业解决方案

但是它是完全建立在Milvus之上

而Milvus是开源的

其他的向量数据库呢

至少在代码库的方面

基本上都是源代码可用的

不过呢

还要看一下具体的许可证

这决定了代码的可许可性以及如何去部署

在检索算法方面

许多向量数据库的检索算法都采用了HNSW

其中Milvus的检索算法支持得最为丰富

大家可以暂停观看一下

最后呢在部署方式上

向量数据库的典型部署方式

包括本地部署和托管云原生的方式

二者呢都遵循CS架构

还有一种新的选择呢是嵌入式的模式

其中数据库本身与应用程序的代码是紧密结合的

以severless的方式运行

目前呢只有Chroma和LanceDB可以用作嵌入式的数据库

综上所述

有网友已经贴心的总结了

主流的向量数据库的部分指标的对比

此外呢在选择向量数据库的时候

还需要特别考虑几个因素

分别是第一点可扩展性

它是否能够高效的处理高维度的大数据量

而且能够根据数据需求的增长进行扩展

第二点性能

速度和效率对数据库至关重要

需要在数据搜索、搜索性能

和执行各种向量操作方面表现出色

第三点灵活性

需要支持广泛的数据类型和格式

并且可以轻松地适应不同的应用场景

第四点易用性

数据库是否易于使用和管理

易于安装和配置

具有直观的API

并且有良好的文档和支持

第五点可靠性

需要有可靠和稳定的声誉

那对比完主流的向量数据库之后

我们看一看与其他类型的数据库对比它们是怎么样

那传统数据库呢

比如说关系数据库

它们的目的是存储结构化的数据

这就意味着数据会被组织到一个预定义的表、行或者列中

从而可以确定数据的完整性和一致性

传统数据库呢往往会针对于CRUD的操作进行优化

目的是高效的创建读取、更新和删除数据的条目

让它能够适用于从Web服务到企业软件的各种应用程序

但是一旦定义了数据库的结构

进行更改的时候可能就会非常的复杂

而且耗时

这种刚性可以确保数据的一致性

但是灵活性可能不如一些的现代数据库的无模式

或者是动态模式的特性

我大概总结了一下它们之间的区别放到这里

此外呢

在与行和列中存储多种标准数据类型

比如说字符串、数字或者其他标量数据类型的方式不同

向量数据库引入了向量这种新的数据类型

并且围绕这种数据类型来构建和优化

专门用来实现快速的存储检索和最近邻搜索语义

而在传统数据库中则是使用

查找完全匹配项的索引或者是键值对

对数据库中的行进行查询

并且返回这些查询的相关行

在与图数据库的对比方面

向量数据库在信息提取

信息索引和信息检索方面有很大区别

我们今天呢就暂时不多说了

有时间呢再专门去介绍

在最后呢

我想简单介绍一下

向量数据库在大语言模型中的应用

基于大语言模型的应用经常会面临一些挑战

比如说生成不准确或者是不相关的信息

缺乏事实的一致性或者是常识

重复或者是自相矛盾

以及存在偏见或者是令人反感等等

那为了克服这些挑战

可以使用向量数据库来存储与所需的领域的

不同主题、关键词、事实、观点以及来源的信息

然后呢在使用大语言模型的时候

通过AI插件从向量数据库中传递信息

从而生成更具有信息性和吸引力的内容

来符合用户的目标意图和指定的风格

那借助于向量数据库

我们能够快速的加载和存储事件作为嵌入

将向量数据库作为指挥大语言模型的手段

提供上下文信息、长期记忆

检索语义上的数据关联等等这些功能

向量数据库的典型使用一般包括这样几步啊

第一步呢

是使用embeding技术来创建向量

第二步呢

是将这些向量存储到向量数据库中

第三步呢

就是应用一些索引的策略来组织管理向量

第四步呢

是使用查询向量来执行相似性的搜索

第五步呢

是从向量数据库中取得相似的向量

实际上呢

向量数据库在自然语言处理

计算机视觉、推荐系统

以及其他需要对数据进行语义理解和匹配的领域呢

都有很多的应用

而在向量数据库中存储信息

能够让大语言模型生成更加相关

更加连贯的文本

由于向量数据库将要查询的数据存储为嵌入向量

并且大语言模型也是将它内部的知识编码为嵌入向量

因此呢在生成式的问答应用中是天生的一对

向量数据库可以充当知识库的功能

而大语言模型可以直接在嵌入空间中去查询数据的子集

所以一般的使用啊是这样的

首先呢

用户通过界面用自然语言提出问题

问题的文本呢会被传递给嵌入模型

然后返回一个句子的嵌入向量

随后呢

问题的向量会被传递给向量数据库

通过ANN搜索返回与之最相似的前k个结果

这一步呢非常关键

因为它大大缩小了大语言模型在下一步中的搜索空间

接下来呢

基于开发者预定义的模板去构建一个大语言模型的提示

将它呢转化成为嵌入向量并传递给大语言模型

大语言模型呢在前k个结构中去搜索信息

并且生成问题的答案

再把这个答案呢发送给用户

不过呢

向量数据库也有一些潜在的限制

比方说在搜索应用中

他们不一定会优先考虑关键词短语的精准匹配

来确定相关性

而且呢存储和查询的数据必须适应

所使用的嵌入模型的最大序列长度

比如说在类似于BERT的模型中

这个长度呢一般不会超过几百个词

目前呢最好的方法是利用像LangChain

以及像LlamaIndex这样的框架

将数据分块

或者是压缩成适合底层模型上下文的固定大小的向量

同样呢向量数据库也面临着许多

与其他数据库技术相同的一些挑战

比如说提高可扩展性、近似精度、延迟性能和经济性

许多向量数据库在核心的数据库能力方面都还需要提升

比如说像安全性、弹性、运营支持和工作负载支持的多样化

随着AI应用的成熟

未来对向量数据库的需要

一定不会仅仅只限于向量搜索的功能

你可能感兴趣的:(大模型,人工智能)