AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


草履虫都看得懂的向量数据库教程,一文就够了
发布日期:2024-11-25 21:16:29 浏览次数: 1523 来源:草台AI


关注不迷路

 

 

向量数据库的要点总结

什么是向量数据库?

  • • 用于存储、索引、查询和检索高维向量数据。

  • • 特别适合处理非结构化数据(如图像、音频、文本)。

  • • 实现传统数据库难以完成的高级分析和相似性搜索。

传统数据库的局限性

  • • 无法理解非结构化数据的意义。

  • • 无法有效搜索或分类复杂的文档、音频和图像数据。

向量数据库的核心特性

  • • 数据表示:

    • • 数据以向量形式存储,捕捉语义和上下文。

    • • 每个向量由ID(唯一标识)、维度(数值表示)、有效负载(元数据)组成。

  • • 距离度量:

    • • 欧几里得距离、余弦相似性、点积等方法衡量向量间相似性。

  • • 存储方式:

    • • 支持基于RAM的快速访问和基于磁盘的高效存储(内存映射)。

核心功能

  • • 索引:

    • • 使用HNSW(分层可导航小世界)算法进行快速索引和搜索。

    • • 支持有效负载索引优化元数据过滤。

  • • 搜索:

    • • 基于近似最近邻(ANN)算法的高效相似性搜索。

    • • 支持混合搜索(结合密集和稀疏向量实现语义和关键词匹配)。

  • • 更新与删除:

    • • 实时更新和批量修改向量。

    • • 删除过时或重复数据以保持数据库高效和精准。

向量类型

  • • 密集向量(Dense Vectors):

    • • 包含丰富语义信息,适合上下文相似性搜索。

  • • 稀疏向量(Sparse Vectors):

    • • 关注关键词或标记,适合精确匹配和元数据过滤。

高级优化

  • • 量化:

    • • 通过二进制或标量量化大幅降低内存使用,提升搜索速度至40倍。

    • • 支持多种量化方法,如二进制量化、标量量化和产品量化。

分布式部署

  • • 分片(Sharding):

    • • 将数据分布到多个节点上以实现负载均衡和并行处理。

  • • 复制(Replication):

    • • 在多个节点间保留数据副本以提高容错能力和高可用性。

  • • 多租户架构(Multitenancy):

    • • 支持不同用户或组织的数据隔离,优化合规性和隐私。

数据安全

  • • API密钥: 通过API密钥进行简单身份验证。

  • • JWT与RBAC: 使用JSON Web Tokens实现基于角色的访问控制。

  • • 网络隔离和加密: 部署专用网络,启用数据传输和存储加密。

应用场景

  • • 相似性搜索: 产品图片匹配、主题文档检索。

  • • 异常检测: 银行用户行为分析、不规则模式识别。

  • • 推荐系统: 个性化推荐(电影、音乐、商品)。

  • • RAG(检索增强生成): 结合大语言模型生成语义相关答案。

  • • 多模态搜索: 跨文本、图像、音频的数据检索。

  • • 语音与音频识别: 语音转文本、声音分类与检索。

  • • 知识图谱扩展: 关联研究文献、客户反馈与产品特性。

工具与支持

  • • SDKs: 提供Python、Go、Rust、JavaScript/TypeScript、C#、Java等多语言支持。

  • • 文档与社区: 丰富的教程、指南以及活跃的社区支持。

关键优势

  • • 更高效处理非结构化数据。

  • • 提供上下文语义搜索和关键词匹配的结合能力。

  • • 在数据安全、扩展性和高可用性方面表现卓越。


什么是向量数据库?

向量数据库架构

我们每天生成的数百万TB数据中,大多数是非结构化的。比如你拍的食物照片、工作中共享的PDF文件,或者保存但可能永远不会听的播客。这些数据并不能整齐地适配于行列。

非结构化数据缺乏严格的格式或模式,这使得传统数据库难以管理。然而,这些非结构化数据对人工智能(AI)机器学习现代搜索引擎有着巨大的潜力。

向量数据库是一种专门设计用于高效处理高维向量数据的系统。它在索引、查询和检索这些数据方面表现出色,能够实现传统数据库难以轻松完成的高级分析和相似性搜索。

传统数据库的挑战

传统的OLTPOLAP数据库几十年来一直是数据存储的核心。它们非常擅长管理具有明确模式的结构化数据,如姓名地址电话号码购买历史

OLTP 和 OLAP 数据库的结构

但当数据无法轻易分类时,例如PDF文件中的内容,事情就变得复杂了。

你可以将PDF文件以原始数据形式存储,可能还附加一些元数据。然而,数据库仍然无法理解文档内部的内容、对其进行分类,甚至无法搜索其中包含的信息。

这不仅仅适用于PDF文档。想想每天生成的大量文本、音频和图像数据。如果数据库无法理解这些数据的意义,那么如何在数据中进行搜索或发现关系?

向量数据库的结构

向量数据库通过将非结构化数据表示为向量,理解数据的上下文概念相似性,从而实现基于数据相似性的高级分析和检索。

何时使用向量数据库

不确定该使用向量数据库还是传统数据库?以下对比表可能会有所帮助。

特性 OLTP 数据库 OLAP 数据库 向量数据库
数据结构 行和列 行和列 向量
数据类型 结构化 结构化/部分非结构化 非结构化
查询方法 基于SQL(事务性查询) 基于SQL(聚合、分析查询) 向量搜索(基于相似性)
存储重点 基于模式,优化更新 基于模式,优化读取 上下文和语义
性能 优化高容量事务处理 优化复杂分析查询 优化非结构化数据检索
使用场景 库存管理、订单处理、CRM 商业智能、数据仓库 相似性搜索、推荐、RAG、异常检测等

什么是向量?

向量的定义

当机器需要处理非结构化数据(如图像、文本或音频文件)时,首先必须将这些数据转化为一种它可以处理的格式:向量

向量是数据的数值表示形式,能够捕捉数据的上下文语义

传统数据库难以理解非结构化数据的含义,而向量可以将这些数据转化为机器可以处理的形式。例如,从文本生成的向量可以表示单词之间的关系和含义,使机器能够比较并理解其上下文。

向量数据库中定义向量的三个关键要素是:ID维度有效负载(Payload)。这些组件共同工作,有效地表示系统中的向量。它们共同构成了,这是向量数据库中存储和检索数据的核心单位。

向量点的表示

每个部分在向量的存储、检索和解释中都起着重要作用。

1. ID:向量的唯一标识符

与关系型数据库一样,向量数据库中的每个向量都有一个唯一ID。它是向量的“标签”,类似于主键,确保可以轻松找到向量。

虽然ID本身不参与相似性搜索(基于向量的数值数据操作),但它对于将向量与其对应的“现实世界”数据(如文档、图像或音频文件)关联至关重要。

执行搜索并找到相似向量后,会返回这些向量的ID。随后可以使用这些ID获取与结果相关的详细信息或元数据

2. 维度:数据的核心表示

每个向量的核心是一组数字,它们共同在多维空间中表示数据。

从文本到向量:如何实现?

这些数字由嵌入模型(如深度学习算法)生成,捕捉数据中的基本模式或关系。因此,提到“嵌入”时,往往是指这些模型的输出向量。

例如,为表示文本数据,嵌入将语言的语义和上下文细节封装到其维度中。

基于句子的嵌入模型生成向量

因此,比较两个相似的句子时,它们的嵌入会非常相似,因为它们具有相似的语言元素

两个相似句子的嵌入对比

嵌入的美妙之处在于,它将复杂的数据简化为一种可以在多维空间中进行比较的形式。

3. 有效负载:通过元数据添加上下文

有时,仅靠数字还不足以全面理解或优化搜索。虽然维度捕捉了数据的本质,但有效负载则包含了元数据以提供结构化信息。

元数据可以是文本数据(如描述、标签、类别),也可以是数值(如日期或价格)。当需要根据未直接编码在向量中的标准筛选或排序搜索结果时,这些附加信息非常重要。

这些元数据在需要应用额外的过滤器排序条件时非常宝贵。

例如,当搜索一张狗的图片时,向量帮助数据库找到视觉上相似的图像。但如果你希望结果仅显示拍摄于过去一年的图片,或者带有“假期”标签的图片,有效负载可以帮助你通过过滤不符合查询条件的向量来缩小结果范围。

过滤示例

如果想了解过滤如何在Qdrant中实现,请查看我们的完整过滤指南

向量数据库的架构

向量数据库由多个不同的实体和关系组成。以下是向量数据库中发生的关键架构概念:


向量数据库架构图

集合(Collections)

集合本质上是一组向量(或“”),它们根据相似性或特定任务被逻辑分组在一起。集合中的每个向量具有相同的维度性,并且可以使用一个单一的度量进行比较。除非必要,否则避免创建多个集合;可以通过分片(Sharding)多租户模式(Multitenancy)来扩展到多个节点或在相同基础设施内处理不同用例。

距离度量(Distance Metrics)

距离度量决定了如何计算向量之间的相似性。创建集合时选择距离度量,这一选择取决于所处理数据的类型以及向量的生成方式。以下是最常见的三种距离度量:

  • • 欧几里得距离(Euclidean Distance): 直线距离,就像在空间中测量两点之间的物理距离。当实际距离(如空间数据)很重要时,选择此选项。

  • • 余弦相似性(Cosine Similarity): 衡量的是角度而不是长度,用于评估两个向量的方向是否一致。适合文本或文档数据,侧重于意义而非量级。
    例如,衡量两个事物是相似相反还是无关

    余弦相似性示例
  • • 点积(Dot Product): 用于评估两个向量之间的对齐程度。常用于推荐系统,评估两个对象的“匹配度”。

基于RAM和内存映射(Memmap)的存储

默认情况下,Qdrant将向量存储在RAM中,为适合内存的数据集提供超快访问。但当数据集超出RAM容量时,Qdrant支持**内存映射(Memmap)**作为替代方案。

通过内存映射,可以将向量存储在磁盘上,同时通过直接将数据映射到内存实现高效访问。只需在创建集合时设置 "on_disk": true 即可启用。

from qdrant_client import QdrantClient, models

client = QdrantClient(url='http://localhost:6333')

client.create_collection(
    collection_name="{collection_name}",
    vectors_config=models.VectorParams(
        size=768,
        distance=models.Distance.COSINE,
        on_disk=True
    ),
)

有关hnsw_config.on_diskmemmap_threshold等其他配置,请参阅Qdrant关于存储的文档。

SDKs

Qdrant 提供了多种 SDK,支持不同的编程语言。无论你使用 PythonGoRustJavascript/TypescriptC# 还是 Java,都可以找到适合的工具。


向量数据库的核心功能

向量数据库功能

对于传统数据库,基本操作包括创建读取更新删除记录。向量数据库的许多操作与此类似,但针对向量的复杂性进行了优化。

1. 索引:HNSW索引与数据传输

在向量数据库中,索引向量类似于在传统数据库中创建条目。然而,这一步对于向量数据库尤为重要。向量需要被以便于搜索的方式进行组织。

HNSW(分层可导航小世界)是一种高效的索引算法,大多数向量数据库都依赖它来组织向量以实现快速搜索。

HNSW 构建了一个多层图,每个向量是一个节点,连接表示相似性。较高层次连接大体相似的向量,而较低层次则连接紧密相关的向量,使得搜索随着深入逐渐精确。

使用HNSW算法索引数据

当运行搜索时,HNSW 从顶部开始,通过跳转层快速缩小搜索范围。随着深入搜索,仅专注于相关向量。

1.1 有效负载索引

在 Qdrant 中,索引是模块化的。可以独立配置向量和有效负载的索引。有效负载索引用于优化基于元数据的过滤。

需要为希望搜索的每个字段建立有效负载索引。HNSW 负责寻找相似向量,而有效负载索引确保只返回符合条件的向量。

结合全文搜索和基于向量的搜索,可以让搜索更灵活。在同一查询中既能概念性搜索相关文档,又能确保包含特定关键词。


2. 搜索:近似最近邻(ANN)搜索

相似性搜索允许你按意义进行搜索。例如,查找唤起相同情感的类似歌曲、匹配艺术构想的图像,甚至探索文本中的情感模式。

相似单词的分组

工作原理是,当用户向数据库查询时,查询也会被转换成一个向量。算法快速识别图中最可能包含与查询向量最近的区域。

ANN搜索图

搜索逐步向下进行,逐渐缩小范围到更相关的向量。当在底层找到最接近的向量时,这些点会被翻译回实际数据,表示你的最高分文档

以下是这一过程的概览:

向量数据库搜索功能

3. 更新向量:实时与批量调整

数据是动态的,向量也不例外。保持向量的最新状态对于搜索的相关性至关重要。

  • • 实时更新: 当需要立即调整向量时,Qdrant 提供了高效的实时修改功能:

client.upsert(
    collection_name='product_collection',
    points=[
        PointStruct(id=product_id, vector=new_vector, payload=new_payload)
    ]
)
  • • 批量更新: 对于大规模更改(如在模型更新后重新索引向量),批量更新可以在一个操作中更新多个向量,而不会影响搜索性能:

batch_of_updates = [
    PointStruct(id=product_id_1, vector=updated_vector_1, payload=new_payload_1),
    PointStruct(id=product_id_2, vector=updated_vector_2, payload=new_payload_2),
    # 添加更多点...
]

client.upsert(
    collection_name='product_collection',
    points=batch_of_updates
)

4. 删除向量:管理过时和重复数据

高效的向量管理是保持搜索准确性和数据库精简性的关键。删除表示过时或不相关数据的向量(如过期产品、旧新闻文章或归档用户档案),可以帮助保持性能和相关性。

在 Qdrant 中,删除向量非常简单,只需指定向量的 ID:

client.delete(
    collection_name='data_collection',
    points_selector=[point_id_1, point_id_2]
)

删除操作可用于清理数据、删除重复项以及管理向量的生命周期(如设置时间限制后自动删除),以保持数据集的相关性和聚焦。


密集向量与稀疏向量

密集向量与稀疏向量

理解向量的基本概念后,接下来要了解两种主要的向量类型:密集向量(Dense Vectors)稀疏向量(Sparse Vectors)

1. 密集向量

密集向量几乎每个元素都包含信息。向量中的每个数值都贡献了数据的语义意义关系细微差别

例如,这句“我爱向量相似性”的密集向量表示可能如下所示:

密集向量的表示

每个数字都有权重,所有数字共同传递了句子的整体意义。因此,它们更适合识别上下文相似的内容,即使字词完全不匹配。


2. 稀疏向量

稀疏向量则更注重要点。在稀疏向量中,大量元素是零。只有在某些特征或标记存在时,才会赋值非零值。

例如,“我爱向量相似性”被分解为标记(tokens)后,通过标记化(tokenization)每个标记分配一个唯一的ID,生成如下稀疏向量:

{ 
  193: 0.04, 
  9182: 0.12, 
  15012: 0.73, 
  6731: 0.69, 
  454: 0.21 
}

稀疏向量特别适用于关键词搜索元数据过滤,例如检查特定标记是否存在,而无需捕捉完整的意义或上下文。


混合搜索的优势

有时仅靠上下文还不够,需要同时具有精确匹配能力。密集向量非常适合基于数据的上下文或意义检索结果,而稀疏向量则在需要关键词或特定属性匹配时表现优异。

混合搜索允许同时利用两者的优势,实现更相关经过过滤的搜索。

例如,Qdrant 使用归一化融合技术来将多种搜索方法的结果结合起来。常见的融合方法是互惠排名融合(RRF),它结合了不同方法的结果,并将同时被两种方法高度评价的项优先列出。


量化:提升速度至40倍

向量数据库架构

随着向量数据集规模的增长,搜索的计算需求也随之增加。

量化技术可以显著缩小向量的大小并加快比较速度。例如,采用二进制量化可以使搜索速度提高40倍,同时内存使用减少32倍。对于需要处理大型数据集或追求低延迟结果的场景,这种提升至关重要。

量化的工作原理

量化通过将高维向量(通常每个维度使用4字节)转换为二进制表示(每个维度仅使用1比特)实现优化。正值转换为“1”,其他值转换为“0”。

二进制量化示例

虽然量化会降低数据的精度,但对性能的提升非常显著。例如,使用二进制量化的OpenAI嵌入模型,只牺牲约5%的准确率就能实现这些性能优化。通过技术如过采样重新打分,损失可以进一步降低。

量化的其他方法

除了二进制量化,还可以选择其他方法,例如:

  • • 标量量化(Scalar Quantization)

  • • 产品量化(Product Quantization)

设置量化方法

可以通过quantization_config参数配置量化方式:

client.create_collection(
    collection_name="{collection_name}",
    vectors_config=models.VectorParams(
        size=1536,
        distance=models.Distance.COSINE
    ),
    quantization_config=models.BinaryQuantization(
        binary=models.BinaryQuantizationConfig(
            always_ram=True  # 将量化后的向量存储在RAM中以加快访问
        ),
    ),
)

若需要节省RAM空间,可以通过设置on_disk=True将原始向量存储在磁盘上,同时将量化后的向量保存在RAM中以加速访问。

有关量化的更多方法和性能优化技巧,请参阅我们的量化指南


分布式部署

随着系统规模的增长,关键因素是容错性负载均衡可用性。单一节点的能力有限,最终需要跨多台机器分散工作负载,确保系统保持快速和稳定。

分片:跨节点分配数据

在分布式Qdrant集群中,数据被分割为称为分片的小单元,并分布在不同节点上。这种方式既能平衡负载,又能确保查询可并行处理。

每个集合(即相关数据点的分组)可以拆分为不重叠的子集,由不同节点管理。

分布式向量数据库的分片和Raft一致性
  • • Raft一致性协议: 确保所有节点保持同步并具有一致的数据视图。如果某个节点发生故障,其余节点会接管缺失数据的管理。

默认情况下,Qdrant系统中的分片数量与集群中的节点数量一致。但你可以在创建集合时手动指定shard_number以实现更精细的控制:

client.create_collection(
    collection_name="{collection_name}",
    vectors_config=models.VectorParams(size=300, distance=models.Distance.COSINE),
    shard_number=4,  # 自定义分片数量
)

分片有两种主要类型:

  1. 1. 自动分片: 数据点通过一致性哈希自动分布到分片中。每个分片包含数据的独立子集。

  2. 2. 用户定义的分片: 指定数据点如何分布,适用于需要更高数据组织控制的场景(如多租户)。


复制:高可用性和数据完整性

为了避免单点故障影响系统运行,可以通过复制在不同节点上保留相同数据的多个副本,从而实现高可用性

在Qdrant中,**副本集(Replica Sets)**管理这些分片副本。如果某个副本不可用,其他副本会接管并保持系统运行。

副本集和复制示意图

查询时,如果数据存储在本地分片,操作由本地处理;如果数据位于远程分片,则通过gRPC检索。

你可以通过replication_factor控制副本数量。例如,创建一个包含4个分片且复制因子为2的集合,会在集群中分布8个物理分片:

client.create_collection(
    collection_name="{collection_name}",
    vectors_config=models.VectorParams(size=300, distance=models.Distance.COSINE),
    shard_number=4,
    replication_factor=2,
)

建议结合使用分片和复制,以确保数据既分布在不同节点上,又因副本冗余而具备高可用性。


多租户架构:数据隔离

多租户示意图

当有多个客户或用户组需要在同一基础设施中保持数据隔离时,可以使用多租户架构

多租户架构允许在单一集群中隔离不同租户(如用户、客户或组织)的数据。例如:

  • • 为租户1分配Shard 1,位于加拿大(可能出于合规需求,如GDPR)。

  • • 为租户2分配Shard 2,位于德国。

在后端,数据将物理上分离,但仍在同一基础设施内。

在操作中,可以为每个向量添加租户特定的group_id标签,以便标识所属租户:

client.upsert(
    collection_name="tenant_data",
    points=[
        models.PointStruct(
            id=2,
            payload={"group_id""tenant_1"},
            vector=[0.10.90.1]
        )
    ],
    shard_key_selector="canada"
)

这种方法优化了数据隐私、合规性和可扩展性,而无需为每个租户创建过多集合或维护独立集群。

更多关于多租户设置的实现,请查看我们的多租户和自定义分片指南


数据安全与访问控制

向量数据库中的一个常见安全风险是嵌入逆向攻击(Embedding Inversion Attacks),即攻击者可能通过嵌入向量重建原始数据。为了防止此类风险以及确保数据的安全性,在将向量数据库投入生产环境之前,需要实施多层保护措施。


快速安全设置:API密钥身份验证

对于简单用例,可以通过API密钥快速实现身份验证。以下是启用API密钥的方法:

在配置文件或环境变量中设置API密钥:

service:
  api_key: your_secret_api_key_here
  enable_tls: true  # 确保启用TLS以保护API密钥不被暴露

请求中包含API密钥:

from qdrant_client import QdrantClient

client = QdrantClient(
    url="https://localhost:6333",
    api_key="your_secret_api_key_here"
)

启用TLS(传输层安全协议)是保护API密钥的关键步骤,因为它防止密钥在传输过程中被拦截。


高级安全设置:基于JWT的访问控制

在更复杂的场景中,Qdrant支持基于角色的访问控制(RBAC),通过**JWT(JSON Web Tokens)**实现更精细的权限管理。

  • • 角色定义与权限分配: 管理角色并分配权限,每个角色的权限会被编码进JWT令牌。

  • • 请求验证: 数据库会验证每个请求的JWT,确保用户只能访问其被授权的数据。

使用 Qdrant Web UI 生成和管理访问令牌:

通过Web UI生成JWT访问令牌

默认安全性与生产环境注意事项

Qdrant实例默认未启用任何安全保护,因此在生产环境中启用安全措施尤为重要。以下是其他安全建议:

  • • 网络隔离: 使用专用网络部署数据库以减少暴露面。

  • • 访问日志: 记录所有访问行为以便审计。

  • • 数据加密: 启用静态和传输中的数据加密。

详细指南请参考Qdrant官方安全文档


动手实践

通过本文的学习,我们了解到向量数据库不仅仅是传统意义上的数据库,它开启了从高级相似性搜索混合搜索的全新可能性,结合语义和精确匹配实现高效内容检索。

最好的学习方式是实践:

  • • 搭建一个语义搜索引擎,探索语义搜索的实现。

  • • 尝试部署混合搜索服务,体验结合语义和关键词匹配的强大搜索能力。

以下是一些向量数据库的典型用例:

用例 实现方式 示例
相似性搜索 使用向量距离查找相似的数据点 查找相似产品图片、基于主题检索文档、发现相关主题
异常检测 基于向量空间中的偏差检测异常点 检测银行中的异常用户行为,识别不规则模式
推荐系统 使用向量嵌入学习和建模用户偏好 个性化电影或音乐推荐、电商产品推荐
RAG(检索增强生成) 将向量搜索与大语言模型(LLMs)结合生成相关答案 客户支持、自动生成文档摘要、研究报告
多模态搜索 在单一查询中跨文本、图像和音频等多种数据类型搜索 根据描述和图片搜索产品,基于音频或文本检索图像
语音与音频识别 使用向量表示实现语音和音频内容的识别与检索 语音转文本、语音控制智能设备、识别并分类声音
知识图谱扩展 使用向量将非结构化数据链接到知识图谱中的概念 将研究论文链接到相关研究,连接客户评论和产品功能,组织专利数据

总结

向量数据库通过其在非结构化数据管理和相似性搜索方面的强大能力,正在迅速成为现代数据驱动解决方案的关键工具。通过实践,你可以发现其在推荐系统、异常检测、RAG等多种场景中的潜力。


本文来源:

https://qdrant.tech/articles/what-is-a-vector-database/



53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询