【向量库】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.

在这里插入图片描述
 

### 关于Spring FrameworkAI向量数据库的集成 #### 背景介绍 Spring Framework 是一个广泛使用的 Java 开发框架,提供了多种模块来简化应用程序的开发过程。随着 AI 技术的发展,特别是自然语言处理(NLP)、图像识别等领域的需求增加,向量数据库逐渐成为一种重要的技术工具。向量数据库能够高效存储和检索高维数据,例如嵌入式表示(embeddings),这些数据通常由机器学习模型生成。 尽管 Spring Framework 并未直接提供针对向量数据库的支持[^1],但可以通过扩展其生态系统中的组件其他库或服务协同工作,从而实现向量数据库的集成。 --- #### 集成方法概述 以下是几种可能的方式,可以将 Spring 应用程序向量数据库结合起来: 1. **通过 HTTP 客户端调用外部向量数据库 API** 如果使用的是云托管的向量数据库(如 Pinecone、Milvus 或 Weaviate),可以直接利用 `Spring Web` 提供的功能发送 HTTP 请求到目标服务。这允许开发者轻松地执行 CRUD 操作以及复杂的相似度搜索。 示例代码如下: ```java import org.springframework.web.client.RestTemplate; public class VectorDatabaseClient { private final RestTemplate restTemplate = new RestTemplate(); public String searchSimilarVectors(String queryVector) { String url = "https://vector-database-service.com/api/search"; return restTemplate.postForObject(url, queryVector, String.class); } } ``` 2. **引入第三方客户端 SDK** 许多流行的向量数据库都提供了官方或者社区支持的 Java SDK。例如 Milvus 的 Java Client 可以被无缝集成至 Spring Boot 项目中。这样做的好处是可以避免手动解析 JSON 响应并提高编码效率。 下面是一个简单的例子展示如何配置此类依赖项: ```xml <!-- Maven Dependency --> <dependency> <groupId>io.milvus</groupId> <artifactId>milvus-sdk-java</artifactId> <version>2.x.x</version> </dependency> ``` 3. **定制 Repository 层封装业务逻辑** 对于更复杂的应用场景,建议定义专门的数据访问层(Repository)。此模式下可隐藏底层细节并将具体操作抽象化以便后续维护升级更加便捷。假设我们正在设计这样一个类,则大致结构可能是这样的: ```java @Service public class VectorRepository { private final RSocketRequester requester; // Or any other client type. public VectorRepository(RSocketRequester.Builder builder){ this.requester = builder.tcp("localhost",7000).rsocketStrategies(...).build(); } public List<VectorEntity> findNearestNeighbors(VectorQuery query){ ... } } ``` 4. **结合消息队列异步处理任务** 当面对大规模并发请求时,考虑采用 Kafka/Zookeeper/RabbitMQ 等中间件分摊压力不失为明智之举。借助 `Spring Integration` 和 `Spring Cloud Stream`,能轻易达成上述目的同时保持系统的灵活性伸缩性。 --- #### 注意事项 - 向量索引构建耗时较长,在线环境下需谨慎评估是否适合即时更新策略; - 数据一致性问题不容忽视,尤其是在分布式环境中跨多个节点同步状态期间可能出现短暂不一致现象; - 性能优化至关重要,务必关注内存占用率及磁盘 I/O 效率等方面的表现; --- ### 结论 虽然当前版本的 Spring Framework 尚无内置对 AI 向量数据库的支持[^2],然而凭借强大的插件体系及其高度灵活的设计理念完全可以满足实际需求。只要合理规划架构布局再辅以恰当的技术选型就能成功搭建起融合现代人工智能特性的企业级解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

roman_日积跬步-终至千里

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

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

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

打赏作者

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

抵扣说明:

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

余额充值