向量数据库的要点总结
什么是向量数据库?
- • 用于存储、索引、查询和检索高维向量数据。
- • 特别适合处置惩罚非布局化数据(如图像、音频、文本)。
- • 实现传统数据库难以完成的高级分析和相似性搜索。
传统数据库的范围性
- • 无法理解非布局化数据的意义。
- • 无法有效搜索或分类复杂的文档、音频和图像数据。
向量数据库的核心特性
- • 数据表示:
- • 数据以向量形式存储,捕捉语义和上下文。
- • 每个向量由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)、机器学习和现代搜索引擎有着巨大的潜力。
向量数据库是一种专门设计用于高效处置惩罚高维向量数据的系统。它在索引、查询和检索这些数据方面表现出色,能够实现传统数据库难以轻松完成的高级分析和相似性搜索。
传统数据库的挑战
传统的OLTP和OLAP数据库几十年来不停是数据存储的核心。它们非常擅长管理具有明确模式的布局化数据,如姓名、地点、电话号码和购买汗青。
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_disk或memmap_threshold等其他设置,请参阅Qdrant关于存储的文档。
SDKs
Qdrant 提供了多种 SDK,支持不同的编程语言。无论你利用 Python、Go、Rust、Javascript/Typescript、C# 还是 Java,都可以找到适合的工具。
|