向量数据库概述:Faiss、Milvus、Qdrant、Chroma、Weaviate
概述
向量以一维数组形式存在,每个数值代表对象在多维空间中的特征或属性(如词向量的语义、图像的像素特征)。专门用于存储和处理向量数据的数据库,就是向量数据库。
向量数据库能高效地存储和检索向量数据,使开发者能够进行高级的相似性搜索和分析,便于快速准确地找到与查询向量相似的数据点。可用于文本、图像、音频和其他非结构化数据。
标量、向量、矢量、张量
几种量:
- 标量:Scalar,一个单独的数,没有方向和大小之分。
- 向量:Vector,也叫矢量,又称欧几里得向量(Euclidean Vector),描述具有大小和方向的量。
- 张量:Tensor,一个多维数组,可包含多个向量和标量。物理学中,张量通常用于描述物理场的变化和物质的性质等。张量可以看作是向量的推广,向量可以看作是一维张量。张量可以用一个多维数组表示,矩阵可看作是二维张量。
向量和矢量
两者在很多情况下是同一个概念,都描述具有大小和方向的量:
- 向量:更常用于数学、计算机科学以及广义的科学技术领域。包括二维向量和三维向量。在数学上通常表示为一个有序数组,例如(x,y,z)(x,y,z)(x,y,z)代表一个三维空间中的向量。向量可以进行加法、减法、点积、叉积等运算。在编程语言中,有时用来表示动态数组或列表,如C++中的
std::vector
表示一个可动态调整大小的数组。 - 矢量:更常用于物理学和工程学领域,如速度矢量、加速度矢量、力矢量
嵌入式表示
参考Embedding。
从原始数据到Embedding,一定层面上信息是丢失的。
向量空间
向量通常位于一个高维向量空间中,每个向量代表一个点。空间维度取决于数据的特征数量。空间中可使用数学方法来计算向量之间的相似性和距离,有助于搜索和分析。内容相近或相关的数据,在空间中表现出一定的密集性。
向量数据库的核心功能之一是近似最近邻搜索(Approximate Nearest Neighbors,ANN)。这是一种高效的搜索方法,用于找到与给定查询向量最相似的数据库中的向量。ANN搜索使用索引数据结构,以加速搜索过程。在进行ANN搜索时,数据库中的向量首先会被索引,这意味着它们被组织成一种数据结构,以便快速检索。然后,当一个查询向量进入数据库时,系统会使用度量相似度的方法计算查询向量与数据库中向量的相似性。最终,系统将返回最相似的向量作为查询的结果。
距离
参考相似度、距离。
在向量化领域:
- 余弦相似度:适合文本、推荐系统
- 欧氏距离:适合图像、声音
算法
向量检索算法有很多:
- FLAT:最原始,把每个向量都比较一遍(k-最近邻搜索),精度很高,性能低。
- LSH:检索速度快,算法简单易于实现。精度有限,只适用于近似检索场景;随数据分布不同,LSH性能可能也会发生显著变化。适合低维度向量和小型索引。
- HNSW:Hierarchical Navigable Small World,思想类似于SkipList,从上到下,搜索细化的过程。
- IVF:Inverted File,通过将向量数据聚类来减少查询时需要比较的向量数量。基于Voronoi图,将高维向量置于一个空间中,并根据它们所属的
单元格
或簇
进行分配。当查询向量落入某个单元格时,搜索范围被限制在该单元格内。为解决查询向量落在单元格边缘时可能错过相邻单元格中最近数据点的问题(即边缘问题),可通过增加nprobe值来扩展搜索范围。
HNSW示意图
对比
与传统数据库相比:
- 数据模型:
- 传统数据库:使用表格、文档或图形结构来存储数据
- 向量数据库:专注存储和检索向量表示,通常用于自然语言处理和机器学习任务
- 查询语言:
- 传统数据库:通常使用SQL等查询语言
- 向量数据库:查询语言针对向量搜索进行优化,如FAISS库中的向量搜索
- 数据类型:
- 传统数据库:支持多种数据类型,包括数字、文本、日期等
- 向量数据库:主要关注向量数据类型
- 应用领域:
- 传统数据库:广泛应用于企业应用、电子商务、数据分析等领域
- 向量数据库:主要用于自然语言处理、图像处理、推荐系统等需要向量表示的领域
总的来说,传统数据库和向量数据库各自适用不同类型的应用。传统数据库在结构化数据存储和关系管理方面表现出色,而向量数据库则在处理向量数据和支持大规模自然语言处理任务方面具有优势。在实际应用中,两者可能会相互结合以满足复杂的数据需求。
发展历程
大抵可分为3个阶段:
- 探索:主要以文件形式存储向量数据,索引和查询能力不太行。代表如Lucene。
- 发展:使用KD树等索引结构,查询性能尚可,但在高维空间查询效率不行。代表如:
- Faiss:Facebook AI Research,可用于高维向量的快速相似性搜索
- Annoy:
- 应用:实现高效的向量索引和查询,可处理海量高维向量数据,代表如:
- ElasticSearch:文本搜索,也可用于存储和检索嵌入向量
- DingoDB:
- Milvus:开源,支持高维向量存储和检索,并且具有良好的扩展性和性能
这些向量数据库都应用到了数据存储、查询与检索、数据更新等技术:
- 数据存储:矢量数据库将文本数据转换为嵌入向量,然后将这些向量存储在数据库中。常用的向量表示法包括Word2Vec、FastText和BERT
- 查询与检索:查询矢量数据库的过程涉及将输入文本转换为嵌入向量,然后与数据库中存储的向量进行比较。常用的相似性度量包括余弦相似度和欧几里得距离
- 数据更新:矢量数据库通常需要定期更新,以反映新添加的文本数据或改进嵌入向量的质量。这可以通过重新训练模型或增量更新的方式来实现。
应用场景:
- 语义搜索。假设要构建一个可以找到与用户查询意义相似的文档的搜索引擎。可以通过以下方式使用向量数据库。•将用户查询和文档文本转换为向量表示。•将这些向量存储在数据库中。•使用高效的相似性搜索来检索相关文档
- 推荐系统。假设正在构建一个电影推荐系统,那么可以使用向量数据库:•将用户偏好和电影嵌入存储为向量。•快速检索与用户偏好相似的电影,实现个性化推荐
- 文档聚类。向量数据库可以用于文档聚类任务。可以通过以下方式将大量文档分成相似内容的组:•将文档切块后,转换为向量表示。•使用向量数据库的功能将相似的向量分组
为了提高搜索速度,主要有两个方向:
- 减小向量大小: 通过降维减少向量值表示的位数。
- 减小搜索范围: 过聚类或根据特定属性、相似性或距离将向量组织成树状结构,并将搜索限制在最近的簇或通过最相似的分支进行过滤。
即:不再执行穷尽的最近邻搜索,而是执行ANN搜索,避免搜索整个数据集。
数据库
云原生对比表
数据库 | 优势 | 缺点 | 适用场景 | 并发量 | 性能 |
---|---|---|---|---|---|
Milvus | 分布式架构,支持十亿级向量检索;多索引算法(IVF/HNSW/ANNOY) | 部署复杂度较高,运维成本大 | 大规模AI搜索、推荐系统 | 高并发支持 | 高吞吐低延迟,支持GPU加速 |
Weaviate | 结合图数据库与向量检索;支持混合查询(向量+结构化过滤);内置嵌入生成 | 社区生态较小,企业版功能需付费 | 语义搜索、知识图谱、多条件混合检索 | 中等至高并发 | 查询性能受过滤条件复杂度影响较大 |
Qdrant | 云原生设计;支持动态数据过滤和混合搜索;Rust编写的高效引擎 | 分布式功能需企业版 | 生成式AI应用、高并发实时检索 | 高并发 | 毫秒级响应,内存优化优秀 |
Chroma | 轻量级内存数据库;LLM原生支持;API简单易用 | 无持久化存储(需手动配置);不适合超大规模数据 | AI原型快速开发、小规模语义搜索 | 低至中等并发 | 轻量级快速响应,但数据量增长后性能下降 |
Vespa | 支持实时数据更新;灵活排序规则(可编程权重) | 学习曲线陡峭,配置复杂 | 广告推荐、动态排序场景(如电商搜索) | 高并发支持 | 实时写入与查询性能平衡 |
Vald | 基于Kubernetes自动扩展;内置容错机制;支持自动索引管理 | 文档较少,社区支持有限 | 企业级实时搜索(如日志分析、监控系统) | 高并发支持 | 分布式负载均衡优化,适合流式数据处理 |
Deep Lake | 多模态数据存储;支持数据集版本控制 | 向量检索性能弱于专用数据库 | AI模型训练数据管理、多模态数据分析 | 中等并发 | 存储效率高,但检索速度一般 |
LanceDB | 基于Apache Arrow的高效列式存储;支持边缘部署 | 功能较新,成熟度待验证 | 边缘计算、小规模嵌入式应用 | 低并发 | 本地查询极快(微秒级),适合资源受限环境 |
对比项 | Milvus | Qdrant | Chroma | Weaviate |
---|---|---|---|---|
核心定位与架构 | 大规模、云原生、企业级。分布式微服务架构(Go/C++),为海量数据和高并发设计 | 高性能、内存安全、灵活部署。Rust编写,性能和内存效率优先。单节点/集群模式。架构相对简洁 | 开发者友好、易于上手、本地优先。Python主导(核心库C++/Rust),设计初衷嵌入式/本地,易于集成。客户端/服务器模式 | GraphQL原生、模块化、混合搜索。Go编写。以GraphQL API为核心,支持模块化扩展(向量化, Q&A)。设计支持向量、标量和混合搜索。单节点/集群 |
性能与可伸缩性 | 高。专为千亿级水平扩展设计。多种索引(HNSW,IVF,DiskANN)。资源消耗相对较高 | 高。Rust带来性能优势(低延迟P99)。高效过滤。量化支持。集群模式良好扩展 | 中到高。中小型数据表现好。大规模扩展能力相对弱于其他三者,但快速发展中。依赖底层库性能 | 高。Go并发性能好。支持HNSW。混合搜索是亮点。通过分片支持水平扩展。性能依赖配置和模块 |
易用性与开发体验 | 中等。架构复杂,部署运维需投入。SDK完善。文档全面 | 较好。API 清晰,文档质量高。部署相对简单。SDK丰富 | 高。极其易于上手。与 LangChain/紧密集成。非常适合快速原型和本地开发 | 较好。GraphQL API 强大但有学习曲线。SDK完善。文档良好。模块化简化某些流程 (如自带向量化) |
功能丰富度 | 非常丰富 多索引、多距离、复杂过滤、多租户、TTL、动态 Schema、多一致性级别、数据工具 | 丰富 强元数据过滤 (前置/后置)、地理/全文过滤、推荐API、集合别名、快照、量化 | 基础且实用 核心向量存储/搜索/过滤完善。API 简洁。生态集成强。功能深度相对较浅,但满足常见 RAG | 非常丰富 混合搜索 (BM25+Vector)、GraphQL 查询、数据对象关系 (交叉引用)、模块化 (向量化器, 阅读器, 生成器)、多租户、备份 |
部署与运维 | 复杂。推荐K8s部署 (Helm/Operator)。组件多,监控维护专业性要求高 | 灵活。Docker, K8s (Helm), 二进制。官方云 Qdrant Cloud。运维复杂度中等 | 简单(本地/基础模式)。本地使用极简。客户端/服务器Docker部署容易。官方云Chroma Cloud。大规模自建运维经验相对少 | 灵活。Docker, K8s (Helm)。官方云 Weaviate Cloud Services (WCS)。运维复杂度中等,集群配置需理解其概念 |
数据管理与持久化 | 强大。多种存储后端(S3,MinIO)。数据索引分离。备份恢复工具。动态字段 | 可靠。磁盘持久化。WAL保证写入。快照备份 | 基础(演进中)。本地文件系统(SQLite/DuckDB+npy)。服务器模式持久化更鲁棒 | 可靠。磁盘持久化,可配置存储后端。内置备份/恢复API。支持数据对象间的链接 |
生态与社区 | 成熟。CNCF毕业项目。社区活跃,用户多。与MLOps集成。Zilliz商业支持 | 快速增长。社区活跃,响应快。与 LangChain集成好。商业公司Qdrant Solutions支持/云服务 | 非常活跃。因易用性在AI/ML开发者中流行。Python生态结合紧密。商业公司 Chroma DB Inc. 支持/云服务 | 活跃增长。社区活跃,文档示例丰富。与 LangChain/集成好。商业公司 Weaviate B.V. (原 SeMI Tech.) 支持/云服务 |
传统数据库的向量支持对比表
数据库 | 类型 | 向量功能 | 特点 | 维度限制 | 适用场景 |
---|---|---|---|---|---|
PG+PgVector | 关系型 | 支持近似搜索(IVFFlat、HNSW) | 开源免费,兼容SQL查询,支持混合查询(向量+结构化数据) | 最高2000维,可调整 | 中小规模向量检索、现有PG生态升级 |
Oracle 23c+ | 关系型 | 内置向量数据类型,支持近似搜索(VECTOR INDEX) | ACID事务保障,与企业级功能(分区、备份)深度集成 | 支持高维(无明确限制) | 传统企业系统AI化(如ERP中的语义搜索、日志分析) |
SQL Server | 关系型 | 通过ML Services 集成向量计算,需自定义扩展 | 与Azure云服务深度绑定,支持Python/R脚本 | 依赖自定义实现 | 微软生态内AI应用 |
Elasticsearch 8.0+ | 搜索引擎 | 支持dense_vector 字段类型,结合KNN搜索API | 支持全文检索与向量混合查询,分布式架构 | 最高2048维 | 日志分析增强(异常检测)、结合文本的语义搜索 |
Redis 7.2+ | 内存数据库 | 需加载RedisVL模块,支持HNSW索引和混合查询 | 微秒级延迟,适合实时场景 | 最高2048维 | 实时推荐系统、缓存层快速检索 |
AWS Aurora | 云关系型 | 通过ML Insights 集成向量相似性计算(需结合Sagemaker) | 全托管服务,自动扩展,与AWS AI工具链无缝衔接 | 依赖Sagemaker模型 | 云原生AI应用 |
Google AlloyDB | 云关系型 | 支持PgVector扩展 | 高性能分析引擎,与BigQuery/Bigtable联动 | 同PgVector | 混合分析场景(OLAP+向量检索) |
ClickHouse | 分析型 | 内置L2Distance /cosineDistance 函数,支持自定义向量索引 | 列式存储优化,适合批量向量计算 | 无明确限制 | 大规模批处理分析 |
功能对比
数据库 | ANN | 混合查询 | 事务支持 | 扩展性 | 部署复杂度 |
---|---|---|---|---|---|
PG+PgVector | ✅(IVFFlat/HNSW) | ✅ | ✅ | 中等,需分片 | 低 |
Oracle | ✅(VECTOR INDEX) | ✅ | ✅ | 高,企业级扩展 | 高 |
ES | ✅(KNN API) | ✅ | ❌ | 高,分布式原生 | 中 |
Redis | ✅(HNSW) | ✅ | ❌ | 低,单节点受限 | 低 |
AWS Aurora | ❌(需外部计算) | ⚠️(部分) | ✅ | 高,自动扩缩容 | 低,全托管 |
ClickHouse | ❌(精确搜索) | ✅ | ❌ | 极高,PB级扩展 | 中 |
Faiss
GitHub,36.9K Star,4K Fork。
Meta开发的向量数据库,开山鼻祖,能够高效进行稠密向量的相似度检索和聚类。包含各种算法,能够搜索各种大小的向量集合,可处理大到不能完全放入内存的向量集合。C++编写,并提供Python封装。不是完整的数据库,但在算法研究方面无可替代。
示例:
# pip install faiss-cpu sentence-transformers numpy
import numpy as np
import faiss
from sentence_transformers import SentenceTransformerclass SimpleVectorDB:def __init__(self):"""初始化向量数据库"""# 用来保存原始文本,检索时要返回给用户看self.texts = [] # 加载预训练模型self.model = SentenceTransformer("BAAI/bge-small-zh-v1.5")# 获取模型的向量维度self.dimension = self.model.get_sentence_embedding_dimension()# 创建Faiss索引 - 使用L2距离(欧几里得距离)self.index = faiss.IndexFlatL2(self.dimension)def add_documents(self, documents):"""步骤1: 批量将文本转换为向量,并添加到向量数据库"""vectors = []for i, doc in enumerate(documents):print(f"正在处理第 {i+1} 个文档(总共{len(documents)}个):")vector = self.model.encode([doc])print(f"原文: '{doc}'")print(f"向量维度: {vector.shape} - 一句话变成了{vector.shape[1]}个数字!")print(f"向量前10个值: {vector[0][:10]}")print(f"向量数据类型: {vector.dtype}")print("-" * 50)vectors.append(vector[0])self.texts.append(doc)# 转换为numpy数组(Faiss要求的格式)vectors_array = np.array(vectors, dtype=np.float32)print(f"所有向量的形状: {vectors_array.shape}")print(f"向量矩阵大小: {vectors_array.nbytes} 字节")"""步骤2 索引构建,添加到Faiss索引中"""self.index.add(vectors_array)print(f"索引中的向量数量: {self.index.ntotal}")return vectors_arraydef search(self, query, k=3):"""步骤3: 向量检索"""print(f"\n=== 向量检索过程 ===")print(f"查询: '{query}'")# 将查询文本转换为向量query_vector = self.model.encode([query])[0]query_vector = query_vector.reshape(1, -1).astype(np.float32)# 在索引中搜索最相似的k个向量distances, indices = self.index.search(query_vector, k)print(f"搜索结果:")results = []for i in range(k):idx = indices[0][i]distance = distances[0][i]similarity = 1 / (1 + distance) # 转换距离为相似度分数results.append({"text": self.texts[idx],"distance": float(distance),"similarity": float(similarity),"index": int(idx),})print(f" {i+1}. 相似度: {similarity:.4f} | 距离: {distance:.4f} | 文本: '{self.texts[idx]}'")return resultsdef show_storage_details(self):"""展示存储细节"""print(f"\n=== 向量存储详情 ===")print(f"索引类型: {type(self.index).__name__}")print(f"向量维度: {self.dimension}")print(f"存储的向量数量: {self.index.ntotal}")print(f"索引大小估算: {self.index.ntotal * self.dimension * 4} 字节") # float32 = 4字节# 展示向量在内存中的存储形式if self.index.ntotal > 0:# 重构第一个向量来展示存储形式first_vector = self.index.reconstruct(0)print(f"第一个向量的存储形式:")print(f"类型: {type(first_vector)}")print(f"形状: {first_vector.shape}")print(f"前5个值: {first_vector[:5]}")print(f"后5个值: {first_vector[-5:]}")def main():documents = ["苹果是一种营养丰富的水果","Python是一种编程语言","机器学习是人工智能的重要分支","香蕉含有丰富的钾元素","深度学习使用神经网络进行训练","橙子富含维生素C","自然语言处理是AI的应用领域",]vector_db = SimpleVectorDB()vectors = vector_db.add_documents(documents)vector_db.show_storage_details()queries = ["什么水果比较健康?", "编程相关的内容", "AI技术"]for query in queries:vector_db.search(query, k=3)if __name__ == "__main__":main()
Milvus
GitHub,36.9K Star,3.4K Fork,参考Milvus介绍。
Qdrant
GitHub,25.6K Star,1.8K Fork。Rust编写,提供高速存储及检索、管理数据等功能,支持GPU加速,提供丰富API,提供直观的界面,适用于实际生产。
特性:
- 支持多种条件过滤;
- 条件过滤类型丰富,如字符串匹配、数值范围、地理位置等;
- 拥有查询规划器优化检索;
- 硬件加速;
- 断电期间也能确保数据持久型;
- 依托于Raft协议,支持分布式部署;
- 具有独立性,不依赖于外部的编排控制器或数据库,便于部署。
局限性:分布式性能不如Milvus稳定,在大规模数据集上的性能略逊于Milvus,尤其在高并发场景下吞吐量有限。
Chroma
GitHub,22.8K Star,1.8K Fork。
相较于Milvus和Weaviate,Chroma更加轻量化,适合小规模应用和学习使用。实现乘积量化快速检索方法。一般用于Python生态,尤其是LangChain、LlamaIndex等。
局限性:无原生持久化存储,依赖外部数据库;超10亿向量时性能下降40%;不支持GPU加速。
PgVector
GitHub,17.3K Star,870 Fork。
PG向量扩展插件。
Elasticsearch
7.*
版本开始引入向量搜索功能,dense_vector
。如果要使用ES,建议直接升级到8.*
甚至最新版。
Weaviate
GitHub,14.4K Star,1.1K Fork。
结合向量搜索和结构化过滤的能力,同时拥有云原生数据库的容错性和可伸缩性;可通过GraphQL、Rust以及各种语言客户端进行访问。在百万级向量数据上,能够实现毫秒级的快速检索。可方便地调用OpenAI、Cohere以及Hugging Face等平台提供的先进的数据向量化接口或模型。内置很多预训练模型和知识图谱功能,支持多模态搜索,新手友好。
LanceDB
GitHub,7.4K Star,584 Fork。
vearch
GitHub,2.2K Star,349 Fork,文档,官网
由京东开发的一套专为AI领域打造的分布式向量搜索系统,其功能不限于存储和计算大量特征向量,更为向量检索在各个机器学习领域,如图像处理、音视频处理以及自然语言处理等,提供基础的系统支持与保障。基于Faiss开发,但不同于Faiss仅支持单机运行,提供与Elasticsearch相似的用户友好的RESTful API,使用户能以更为便捷的方式进行表结构和数据的管理与查询。在使用过程中,用户首先需创建数据库和空间,接下来进行数据的导入,最终可对自己的数据集进行搜索。整个过程中流程清晰、操作便捷。
Pinecone
官网,全托管的云原生向量数据库服务,可快速处理数十亿个向量数据,并实时更新索引。还可以与元数据过滤器相结合,使得用户能够更迅速获取与查询数据高度相关的结果。
优势:
- 简单:API简单,不需要基础架构
- 快速:极低的查询延迟
- 实时:实时的索引更新
- 过滤能力强:查询结果相关性强
选型
几个考虑因素:
- 开源还是付费
- 数据量级
- 既有数据库/技术栈
- 团队规模
- 学习成本
技术融合趋势
- 传统数据库的向量增强:PostgreSQL通过PgVector支持HNSW索引,Oracle 23c内置向量引擎;
原生数据库的SQL兼容:Weaviate支持GraphQL+向量查询,Qdrant提供类似SQL的过滤语法。
建议策略:从长期演进角度,优先选择支持混合查询范式的数据库(如PgVector或Weaviate),避免未来架构重构。
拓展
流式向量检索:被查数据持续变动,查询目标不变。
VectraFlow,向量检索和流处理的结合。
参考
- Chatbot从0到1:对话式交互实践指南