【向量库】Weaviate概述与架构解析

一、什么是weaviate

Weaviate 是一个开源的向量数据库(vector database),它能够同时存储数据对象和它们的向量表示

与传统的关系型数据库不同,Weaviate 支持基于语义相似度的检索(即向量搜索/语义搜索(向量和文本相似的搜索)),可以高效地处理文本、图片等多种类型的数据,并支持结合结构化过滤进行复杂查询

Weaviate 的主要特点包括:
搜索:

  • 高效的向量检索:能够在百万级甚至更大规模的数据集中,毫秒级完成最近邻(Nearest Neighbor)搜索。
  • 混合搜索: 结合向量搜索和关键词搜索(文本和向量搜索ing)
  • 向量搜索: 基于 HNSW 算法的高效向量索引
  • 多媒体支持:支持文本、图片等多种数据类型的向量化和检索。

典型应用场景包括语义搜索、图片搜索、相似性检索、推荐系统、异常检测、数据分类等Weaviate 简介 官方文档

 

二、High-Level Architecture

参考:
https://deepwiki.com/search/highlevel-architecture_254cebb0-bc55-4fd7-a374-cfbcaaaaa6ea

在这里插入图片描述

如上架构图体现了 Weaviate 的分层设计:
API 层处理外部接口,Core Components 管理业务逻辑,Extension System 提供可插拔功能,Storage Layer 负责数据持久化。

 

1. Core Components

核心组件描述
API LayerWeaviate主要入口点,支持REST API(负责设置各种REST处理器,含认证、授权、Schema、对象操作、批量处理、GraphQL接口 )、gRPC API(提供高性能服务,含traverser、认证、schema管理、批量管理功能 )、GraphQL API(提供查询接口,通过traverser解析请求 )
Objects Manager管理单个对象的CRUD操作,依赖Schema Manager、DB、Modules和授权器
通过ShardLike接口实现对象的CRUD操作,如PutObjectObjectByIDDeleteObject
Schema Manager1. 负责类定义和元数据管理,集群级别通过Indexer接口处理类的增删改查;
2. 用例层通过SchemaManager接口提供强一致性schema操作;负责数据模型管理,与集群服务的Raft协议集成以保证一致性
Cluster Service管理分布式协调,使用Raft共识算法

 

2. Storage Layer

核心组件描述
LSM KV Store每个Shard包含一个,用于持久化对象数据
Vector Indices (HNSW)Shard支持多个,含主向量索引和命名向量索引
Inverted Indices通过属性索引实现,支持文本搜索和过滤功能
Object Storage通过LSM - KV存储实现,支持创建不同策略的存储桶

3. 组件交互流程

  1. 请求流程: API Layer → Objects/Batch Manager → DB → Index → Shard → Storage Layer
  2. 集群协调: Cluster Service 通过 Raft 同步 Schema 变更(元数据通过raft算法)
  3. 模块集成: Modules Provider 为各组件提供向量化和 AI 功能
  4. 查询执行: Traverser 协调 DB 和 Explorer 执行复杂查询

 

三、核心组件

1. API Layer

Weaviate provides multiple API interfaces:

  • REST API: Traditional HTTP-based interface for CRUD operations
  • GraphQL API: Rich query language with advanced filtering and traversal
  • gRPC API: High-performance binary protocol for efficient data transfer

These interfaces expose Weaviate’s functionality for data management, search, and schema operations.

 

2. Schema Management

The schema system defines the structure of data stored in Weaviate:

  • Classes: Define object types (similar to tables in relational databases)
  • Properties: Define fields within classes
  • Data Types: Support for primitive types and references
  • Vector Configurations: Settings for vectorization and indexing

Schema changes are managed through a RAFT consensus algorithm to ensure consistency across distributed deployments.

 

3. Vector Indexing

Weaviate 使用分层可导航小世界(HNSW)图来实现快速近似最近邻搜索。该算法创建了一个多层图结构,即使对于数百万个向量,也能实现对数时间的相似性搜索。

Weaviate uses Hierarchical Navigable Small World (HNSW) graphs for fast approximate nearest-neighbor search. This algorithm creates a multi-layered graph structure that enables logarithmic-time similarity searches even with millions of vectors.

HNSW 算法核心特性

  • 多层图结构:通过在不同层级(从粗到细)建立节点连接,形成 “高速公路” 式的搜索路径。底层包含所有节点,高层为底层的稀疏采样,层级越高节点越少但连接跨度越大。
  • 近似搜索:不保证找到绝对精确的最近邻,但能在合理时间内返回足够近似的结果,适合大规模向量数据场景(如数百万至数十亿向量)。

 

3.1. 查询原理

在这里插入图片描述

上图图清晰地展示了 HNSW(Hierarchical Navigable Small World,分层可导航小世界) 算法的核心流程和索引结构,分为左右两部分:Search Process(搜索流程)和 HNSW Index Structure(HNSW 索引结构)。
 

3.2. 左侧:Search Process(搜索流程)

描述新向量(查询向量)如何在 HNSW 中找到最近邻,步骤如下:

  1. New Vector(新向量)
    • 输入:待查询的向量(如用户输入的文本转换的向量、图像特征向量等)。
    • 作用:触发一次近似最近邻搜索(Approximate Nearest Neighbor Search)。
  2. Start at Entry Point(从入口点开始)
    • HNSW 会预先确定一个全局入口点(Entry Point),作为搜索的起始节点。
    • 作用:避免随机起始导致的低效,确保从“高层”开始快速缩小范围。
  3. Greedy Traversal(贪心遍历) 策略:从入口点开始,逐层向下,在每一层中“贪心”选择距离查询向量最近(局部最优加速搜索)的邻居节点,快速向目标区域逼近。
  4. Explore Neighbors(探索邻居)
    • 在底层(Layer 0),算法会精细化探索邻居节点对比更多候选(如何对比),提升结果精度。
    • 作用:在高层快速缩小范围后,底层用更密集的连接确保结果质量。
  5. K-Nearest Neighbors(K 近邻结果)
    • 输出:最终找到与查询向量最相似的 K 个节点(向量),完成近似最近邻搜索

 

3.3. 右侧:HNSW Index Structure(HNSW 索引结构)

描述HNSW 的多层图结构,从查询向量的视角看索引的层次:

  1. Query Vector(查询向量) :搜索的输入
  2. Entry Point(入口点) :全局统一的起始节点,所有搜索都从这里进入高层图,确保搜索路径的一致性。
  3. Layer 2 - Sparse Graph(第 2 层 - 稀疏图)高层(如 Layer 2):节点少、连接稀疏,跨度大(类似“高速公路”)。 快速跳过大量无关节点,用最少步骤定位到“大致区域”。
  4. Layer 1 - Denser Graph(第 1 层 - 较密集图)中层(如 Layer 1):节点和连接比高层更密集,开始缩小搜索范围。 在高层定位的基础上,进一步逼近目标区域。
  5. Layer 0 - Densest Graph(第 0 层 - 最密集图)底层(Layer 0):包含所有原始数据节点,连接最密集。 作用:精细化搜索,确保找到足够近似的最近邻。

 

3.4. 小结

  1. 分层设计的意义

    • 高层(稀疏)负责快速“跳跃”,用最少步骤缩小范围;
    • 底层(密集)负责精细化搜索,保证结果精度。
    • 这种“先粗后细”的方式,让 HNSW 在百万/亿级向量中仍能高效搜索。
  2. 与传统算法的区别

    • 传统 KNN 是“暴力遍历”(逐层对比所有节点),复杂度 (O(n));
    • HNSW 用多层图将复杂度降为 O(log n),适合大规模数据。
  3. 参数影响

    • 层数、每层连接数(M)、构建时的搜索范围(efConstruction)等参数,会影响索引大小、构建时间和搜索效率,需根据数据规模调优。

 

4. Storage System

Weaviate uses an LSM (Log-Structured Merge-tree) key-value store for persistent storage:

  • Memtables: In-memory storage for recent writes
  • Segment Files: Immutable disk storage
  • Compaction: Background process to optimize storage

The storage system is designed for high write throughput and efficient reads, with support for sharding and replication in distributed deployments.

 

5. Module System

Weaviate’s module system provides a flexible way to extend functionality:

  • Vectorizers: Transform raw data into vector embeddings
  • Text Modules: Process and analyze text data
  • Image Modules: Process and analyze image data
  • Custom Modules: Support for user-defined extensions
    Modules can be added or configured to tailor Weaviate to specific use cases.

在这里插入图片描述
 

Weaviate和ChromaDB都是用于向量数据库的工具,在向量查询性能方面有不同的表现。 Weaviate是一个开源的向量搜索引擎,它支持多种向量索引类型,如HNSW(Hierarchical Navigable Small World),可以实现高效的近似最近邻搜索。Weaviate在大规模数据集上能够利用其分布式架构和优化的索引结构,快速定位查询向量最相似的向量。例如,当处理包含数百万甚至数十亿向量的数据集时,Weaviate可以通过其并行计算能力和分布式存储,将查询任务分配到多个节点上进行处理,从而显著提高查询速度。此外,Weaviate还支持混合搜索,即可以同时根据向量相似度和其他属性进行查询,这在一些复杂的查询场景中非常有用。 ChromaDB是一个轻量级的向量数据库,它的设计目标是简单易用且高效。ChromaDB采用了一种简单而有效的索引策略,在小规模到中等规模的数据集上表现出色。对于包含数千到数十万向量的数据集,ChromaDB可以快速完成向量查询,并且其查询性能受数据集规模的影响相对较小。ChromaDB的优势在于其简洁的API和低资源消耗,对于一些对性能要求不是特别高,但希望快速搭建向量查询系统的场景,ChromaDB是一个不错的选择。 在实际应用中,如果需要处理大规模的数据集,并且对查询性能和系统的可扩展性有较高要求,Weaviate可能更适合。而如果是小规模到中等规模的数据集,并且追求简单易用和低资源消耗,ChromaDB可能是更好的选择。 ```python # 以下是使用Weaviate进行向量查询的简单示例 import weaviate client = weaviate.Client("http://localhost:8080") # 定义查询向量 query_vector = [0.1, 0.2, 0.3] # 构建查询 near_vector = {"vector": query_vector} response = ( client.query .get("YourClassName", ["property1", "property2"]) .with_near_vector(near_vector) .with_limit(10) .do() ) print(response) ``` ```python # 以下是使用ChromaDB进行向量查询的简单示例 import chromadb client = chromadb.Client() collection = client.create_collection(name="your_collection") # 添加向量数据 collection.add( embeddings=[[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]], ids=["id1", "id2"] ) # 定义查询向量 query_vector = [0.1, 0.2, 0.3] # 进行向量查询 results = collection.query( query_embeddings=[query_vector], n_results=1 ) print(results) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

roman_日积跬步-终至千里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值