跳转至

向量数据库基础

本文档介绍向量数据库的基本概念,重点介绍 GoVector 如何实现这些概念。

📋 什么是向量数据库?

向量数据库是一种专门设计用于高效存储和检索向量嵌入的数据库类型。与存储结构化数据的传统数据库不同,向量数据库针对相似度搜索操作进行了优化。

关键特性

  • 向量存储:优化用于存储高维向量
  • 相似度搜索:基于向量相似度的快速最近邻搜索
  • 元数据过滤:将向量搜索与传统元数据过滤相结合
  • 可扩展性:高效处理大型向量集合

🚀 向量嵌入

什么是向量嵌入?

向量嵌入是对象(文本、图像、音频等)在高维空间中的数值表示。它们捕获语义含义,其中相似的对象由彼此靠近的向量表示。

常见嵌入模型

模型类型 示例模型 向量维度 用例
文本 BERT、Sentence-BERT、GPT 768-1536 文本相似度、搜索
图像 ResNet、CLIP 512-2048 图像搜索、分类
音频 VGGish、Whisper 128-768 音频搜索、转录

🔧 距离度量

距离度量衡量向量之间的相似度。GoVector 支持三种主要度量:

余弦相似度

公式:cos(θ) = (A · B) / (||A|| ||B||)

范围:[-1, 1],其中 1 表示完全相同

最适合:归一化向量,方向敏感任务

欧几里得距离

公式:d(A, B) = √(Σ(Ai - Bi)²)

范围:[0, ∞),其中 0 表示完全相同

最适合:非归一化向量,绝对距离敏感任务

点积

公式:A · B = Σ(Ai × Bi)

范围:(-∞, ∞),值越高表示越相似

最适合:某些特殊用例,归一化向量

📊 索引算法

索引算法优化大型向量集合的搜索过程。

Flat 索引

描述:暴力搜索,计算与每个向量的距离

优点:精确结果,实现简单

缺点:对大型数据集速度慢(O(n) 复杂度)

最适合:小型数据集(< 10,000 个向量)

HNSW(层次化可导航小世界)

描述:用于近似最近邻搜索的多层图结构

优点:快速搜索(O(log n) 复杂度),高召回率

缺点:内存使用较高,插入速度较慢

最适合:大型数据集(> 10,000 个向量)

💡 向量量化

向量量化通过压缩向量来减少内存占用。

SQ8 量化

描述:标量量化,将每个 float32(4 字节)减少为 int8(1 字节)

压缩比:4:1(减少 75%)

影响:对搜索质量影响最小,显著节省内存

用例:内存受限的大型数据集

🎯 用例

向量数据库用于各种应用:

相似度搜索

  • 文本搜索:查找与查询相似的文档
  • 图像搜索:查找与查询图像相似的图像
  • 推荐系统:基于用户偏好推荐项目

聚类和分类

  • 异常检测:识别向量空间中的异常值
  • 聚类:将相似项目分组
  • 分类:基于最近邻分配标签

自然语言处理

  • 语义搜索:理解查询背后的含义
  • 问答:为问题找到相关信息
  • 文本摘要:识别文本中的关键概念

🔗 GoVector 如何实现这些概念

核心组件

  • 集合:具有特定配置的向量容器
  • :带有元数据的单个向量
  • 索引:用于高效搜索的数据结构
  • 存储:向量数据的持久层

架构

graph TD
    A[客户端应用] --> B[GoVector API]
    B --> C[集合管理]
    C --> D[索引引擎]
    C --> E[存储引擎]
    D --> F[HNSW 索引]
    D --> G[Flat 索引]
    E --> H[BoltDB 存储]
    E --> I[Protocol Buffers]
    E --> J[SQ8 量化]

关键特性

  • Qdrant 兼容性:Qdrant API 的直接替代品
  • 双模式:嵌入式库和独立微服务
  • 高性能:HNSW 索引实现快速搜索
  • 内存效率:SQ8 量化优化内存使用
  • 持久化:BoltDB 提供可靠存储

📈 性能考虑

向量维度

  • 较小维度(128-512):搜索更快,内存使用更低
  • 较大维度(768+):表示更好,内存使用更高

索引参数

  • HNSW M:每个节点的连接数(4-64)
  • EfConstruction:索引质量与构建时间(100-1000)
  • EfSearch:搜索速度与召回率(10-100)

批处理操作

  • 写入:批量处理多个点以提高性能
  • 搜索:限制结果集大小以加快响应速度
  • 删除:使用过滤器进行高效批量删除

🚩 最佳实践

数据准备

  • 归一化向量以获得更好的余弦相似度结果
  • 使用适当的嵌入模型以适应您的用例
  • 在嵌入前清理和预处理数据

集合设计

  • 根据嵌入模型选择适当的向量维度
  • 为您的用例选择正确的距离度量
  • 根据数据集大小配置索引参数

查询优化

  • 使用过滤器来缩小搜索空间
  • 限制结果集大小以提高性能
  • 尽可能批量处理多个查询

🔗 相关文档