0

向量数据库基本概念和主流对比

向量数据库

向量数据库概述

向量数据库因其****高效存储、索引和搜索高维数据点(即向量)的独特能力,在多个领域逐渐凸显其重要性。这些数据库专门设计来处理以多维空间中的向量形式表示的数据条目。向量可以涵盖各种信息,包括数值特征、文本或图像的嵌入,甚至是分子结构等复杂数据。

为了更直观地理解向量数据库,下面用一个2D网格来形象化其工作方式。在这个网格中,一个轴代表动物的颜色(棕色、黑色、白色),另一个轴代表动物的大小(小、中、大)

在这个表示中:

图像A:棕色,中等大小

图像B:黑色,小尺寸

图像C:白色,大尺寸

图像E:黑色,大尺寸

可以想象,每张图片都是根据其颜色和大小属性在网格上对应的一个点。这个简化的网格模型揭示了向量数据库的可视化表示方式。实际的向量空间拥有更多的维度,并采用更为复杂的搜索和检索技术

向量存储机制

向量数据库通过向量嵌入技术存储数据,将各类对象(如商品、文档或数据点)映射为多维空间中的向量。每个对象都对应一个向量,该向量捕捉了对象的多样特征或属性。设计这些向量的目的是,相似对象在向量空间中彼此靠近,而不相似的对象则相隔较远。

可以将向量嵌入比作一种特殊的编码,描述了对象的关键特征。例如,如果要表示不同类型的动物,并希望相似的动物具有相似的编码,那么猫和狗可能拥有相近的编码,因为它们共同特征,比如有四条腿和毛等。相反,鱼和鸟等差异较大的动物则会有较大的编码差异。

在向量数据库中,这些嵌入被用来存储和组织对象。当用户想要寻找与特定查询相似的对象时,数据库会分析这些嵌入,计算查询嵌入与其他对象嵌入之间的距离,从而迅速定位与查询最为相似的对象

以音乐流媒体应用为例,歌曲可以通过捕捉音乐特征(如节奏、流派、使用的乐器)的嵌入被表示为向量。当用户搜索与他们最喜欢的曲目相似的歌曲时,应用的向量数据库会通过比较这些嵌入来推荐高度匹配用户口味的歌曲。

总之,向量嵌入是一种将复杂对象转化为数值向量的方法,能够捕捉对象的特征。向量数据库利用这些嵌入,根据它们在多维空间中的位置,能够高效地搜索和检索出相似或相关的对

工作流程

  1. 用户查询:向ChatGPT输入问题或请求。
  2. 嵌入创建:输入转为向量嵌入,数学化捕捉核心含义。
  3. 数据库比较:与数据库嵌入比较,计算相似性找最相关嵌入。
  4. 输出生成:数据库生成由高度匹配嵌入组成的响应。
  5. 用户响应:系统发送含相关联信息的响应给用户。
  6. 后续查询:新查询创新嵌入,检索数据库相似嵌入,建立新联系

实现原理

Vector Embeddings

对于传统数据库,搜索功能都是基于不同的索引方式(B Tree、倒排索引等)加上精确匹配和排序算法(BM25、TF-IDF)等实现的。本质还是基于文本的精确匹配,这种索引和搜索算法对于关键字的搜索功能非常合适,但对于语义搜索功能就非常弱。

例如,如果你搜索“小狗”,那么你只能得到带有“小狗”关键字相关的结果,而无法得到“柯基”、“金毛”等结果,因为“小狗”和“金毛”是不同的词,传统数据库无法识别它们的语义关系,所以传统的应用需要人为的将“小狗”和“金毛”等词之间打上特征标签进行关联,这样才能实现语义搜索。而如何将生成和挑选特征这个过程,也被称为 Feature Engineering (特征工程),它是将原始数据转化成更好的表达问题本质的特征的过程。

但是如果你需要处理非结构化的数据,就会发现非结构化数据的特征数量会开始快速膨胀,例如我们处理的是图像、音频、视频等数据,这个过程就变得非常困难。例如,对于图像,可以标注颜色、形状、纹理、边缘、对象、场景等特征,但是这些特征太多了,而且很难人为的进行标注,所以我们需要一种自动化的方式来提取这些特征,而这可以通过 Vector Embedding 实现。

Vector Embedding 是由 AI 模型(例如大型语言模型 LLM)生成的,它会根据不同的算法生成高维度的向量数据,代表着数据的不同特征,这些特征代表了数据的不同维度。例如,对于文本,这些特征可能包括词汇、语法、语义、情感、情绪、主题、上下文等。对于音频,这些特征可能包括音调、节奏、音高、音色、音量、语音、音乐等。

例如对于目前来说,文本向量可以通过 OpenAI 的 text-embedding-ada-002 模型生成,图像向量可以通过 clip-vit-base-patch32 模型生成,而音频向量可以通过 wav2vec2-base-960h 模型生成。这些向量都是通过 AI 模型生成的,所以它们都是具有语义信息的。

相似性搜索

借助embedding技术,我们可以将世间万物抽象成一组组向量数据,并存放到向量数据库中。有了数据,下一步就是如何使用了?这就不得不提****相似度搜索了。

其实上面已经提到过了,判断2个向量之间的相似度的方式,就是计算2个向量之间的距离。这只是计算相似度方法的其中一种。

用最简单的二维坐标系作为示例;

1、欧几里得距离

欧几里得距离是向量之间的绝对距离,两个向量之间距离越小,就表示越相似。 这种计算方式看似最简单,但计算结果很容易产生偏差。比如当2个维度的单位不同时,结果可能会失效。

2、余弦相似度

余弦相似度是通过计算向量之间的夹角,两个向量的夹角越小,就表示越相似。 这种计算方式对向量长度不敏感,只关注方向的相似性,所以也很容易在一些场景下产生偏差。

3、点积相似度

点积相似度则是计算向量之间的点积,点积越大,就越相似。 点积则兼顾了向量的长度与方向。

过滤

实际查询时,肯定不希望每次对全量的数据进行搜索,这样效率就太低了。向量数据库也有这方面的考虑,它一般会维护2个索引:向量索引 、元数据索引。

元数据索引有点类似MySQL上的唯一索引\普通索引。在真正执行时,不论是前置过滤,还是后置过滤,都是借助元数据索引来减少查询范围,达到提升查询效率的目的。

向量数据库的应用场景

向量数据库在各个领域都展现了广泛的应用,其中几个典型的应用场景包括:

推荐系统:通过支持相似性查询和向量聚合,向量数据库用于构建高效的推荐系统,实现对用户历史行为的个性化推荐。

搜索引擎:利用向量数据库可提高搜索质量和效率,将网页内容表示为向量,建立索引并实现与查询相关的快速检索。

社交媒体分析:向量数据库在社交媒体分析领域支持相似性查询和聚合操作,能够快速识别和提取社交媒体数据中的模式和趋势,包括情感分析、主题建模和社区发现等。

生物信息学:在基因序列分析和蛋白质相互作用预测等生物信息学领域,向量数据库有广泛应用。通过将基因序列和蛋白质表示为向量,实现高效的模式识别、聚类和预测。

图像和视频分析:应用于图像和视频分析,包括图像检索、物体识别和场景分类等。通过将图像和视频表示为向量,建立索引并实现对相似图像或视频的快速检索。

向量数据库选型

Chroma

向量数据库 Chroma 是一种专门设计用来高效管理和查询向量数据的数据库系统。Chroma 通过其高效的数据结构和算法优化,能够快速处理和检索大量的向量数据。

以下是 Chroma 向量数据库的一些主要特点:

  1. 高效的向量索引**:Chroma 使用高效的索引结构,如倒排索引、KD-树或基于图的索引,以加快向量搜索速度。**
  2. 支持多种相似度度量**:它支持多种向量相似度度量标准,包括欧氏距离、余弦相似度等,使其可以广泛应用于不同的应用场景。**
  3. 可扩展性和弹性**:Chroma 能够支持水平扩展,适应大规模数据集的需要。同时,它也能有效处理数据的动态变化,适应快速发展的存储需求。**
  4. 易于集成和使用**:Chroma 设计有易于使用的API接口,支持多种编程语言接入,便于开发者在不同的系统和应用中集成使用。**
  5. 实时性能优化**:Chroma 优化了查询处理过程,支持实时的数据查询和更新,满足实时分析和决策的需求。**

Milvus

Milvus 提供了高效的向量检索能力,特别适合用于机器学习和人工智能领域,如推荐系统、图像检索和自然语言处理等。Milvus 支持海量数据的快速检索,以及灵活的数据更新和扩展功能。

以下是 Milvus 的一些关键特点:

  1. 高效的向量索引**:Milvus 支持多种索引类型,如倒排索引、HNSW、IVF 等,用户可以根据具体需求选择最合适的索引策略来优化检索性能。**
  2. 多种相似度度量**:它支持多种相似度计算方法,包括欧氏距离、余弦相似度等,以满足不同场景下的需求。**
  3. 可扩展性**:Milvus 能够在不同的硬件和平台上运行,支持在云环境中部署。其架构支持水平和垂直扩展,适应从小规模到大规模的应用需求。**
  4. 强大的API支持**:Milvus 提供了丰富的API,包括Python、Java、Go等多种语言的SDK,便于开发者集成和使用。**
  5. 云原生支持:Milvus 支持在Kubernetes环境中部署,使得其能够利用云原生技术的优势,如容器化、微服务架构和自动化管理。

Milvus 的设计理念是提供一个灵活、高效和易于使用的向量数据管理平台,帮助用户解决在处理大规模复杂数据时遇到的挑战。它的开源特性也为广泛的社区合作提供了可能,使得其功能和性能不断得到提升和优化。

Faiss

Faiss 是由 Facebook AI Research(FAIR)开发的一个高效的库。Faiss 特别适合处理大量高维数据的相似度搜索任务,常用于机器学习和人工智能领域中的应用,如图像检索、视频推荐和自然语言处理等。

以下是 Faiss 的一些关键特性:

  1. 高效的索引结构**:Faiss 提供多种索引结构和搜索算法,包括扁平(flat)索引、倒排文件(IVF)索引和基于量化的索引(如 PQ 和 OPQ)。这些索引能够在维护较高查询精度的同时,显著提高搜索速度。**
  2. 支持批量查询**:Faiss 设计了优化的批处理查询,能够同时处理多个查询,这样可以充分利用现代多核CPU的计算资源,极大提高处理速度。**
  3. 灵活的距离计算**:它支持多种距离计算方法,包括L2(欧氏距离)和内积,用户可以根据具体需求选择适合的度量方式。**
  4. GPU加速**:Faiss 还提供了GPU版本,可以利用GPU强大的并行处理能力来进一步加速向量搜索和聚类计算。**
  5. 易于集成和使用**:Faiss 可以与 Python 紧密集成,通过提供的 Python 接口,用户可以方便地在 Python 环境中使用 Faiss 进行数据处理和分析。**

Faiss 的设计目标是提供一种既快速又准确的方式来搜索和聚类数十亿级别的向量数据。它的高效性使其在工业级应用中非常受欢迎,而开源的特性也使得社区能够持续对其进行改进和优化。

Weaviate

Weaviate 是一个开源的向量搜索引擎,它采用了最新的机器学习模型来优化向量搜索和存储。Weaviate 使用图数据结构来组织数据,支持高效的向量索引和近似最近邻(ANN)搜索。

以下是 Weaviate 的一些关键特性:

  1. 基于图的数据模型**:Weaviate 使用图数据结构来存储和管理数据,每个数据点都作为图中的一个节点,这些节点可以通过边相互连接,以表示复杂的数据关系。**
  2. 机器学习集成**:Weaviate 直接集成了机器学习模型,如Transformer模型,用于自动将文本和其他数据类型转换成高维向量。这种集成简化了AI驱动应用的开发流程。**
  3. 模块化和可扩展**:Weaviate 的架构支持模块化,用户可以根据需要添加不同的模块来扩展功能,如自定义向量化模块或特定的数据连接器。**
  4. 实时索引与查询**:Weaviate 设计了实时数据索引和查询的能力,支持在大规模数据集上进行高效的向量搜索。**
  5. 丰富的API和客户端支持**:Weaviate 提供了RESTful APIGraphQL接口,以及多种客户端库(如Python、JavaScript),便于开发者使用和集成。**
  6. 云原生和高可用性**:Weaviate 是为云环境优化的,支持在Kubernetes上部署,确保了高可用性和弹性。**

Weaviate 为开发者提供了一个功能强大、灵活且易于使用的向量搜索平台,特别适用于那些需要深入挖掘和理解大规模复杂数据集的应用。

比较

最后我们基于一些常用标准来比较这些开源向量数据库

1、开源协议

作为项目的最主要的一个选择标准就是开源的协议类型。一般向量数据库类软件倾向于选择对商业和开源社区都友好的许可证,以鼓励技术的采用和发展。上面的四个库也不例外

Faiss使用最开放的MIT,其他的库也都对商业使用友好。

2、关键特征对比

对比来看:

  • 易用性**: Chroma 强调在 Jupyter Notebook 上的易用性,而 Weaviate 则强调其 GraphQL API 的灵活性和效率。**
  • 存储与性能**: Milvus 在存储和查询性能方面提供了内存与持久存储的结合,相比之下,Faiss 强调 GPU 加速能力在搜索过程中的作用。**
  • 数据处理与更新**: Milvus 提供自动数据分区和容错,Weaviate 支持实时数据更新,确保数据的时效性。**
  • 搜索技术**: Chroma 和 Milvus 都提到了它们对搜索算法的支持,而 Faiss 则提供了适应不同技术风格的搜索技术,Weaviate 使用 GraphQL 提高了数据结构定义的效率。**

3、使用案例

Chroma擅长处理多媒体内容,Milvus 提供通用的数据处理能力且特别适合于推荐系统和语言/视觉分析,Faiss 强调其 GPU 加速在搜索上的优势,而 Weaviate 则以其在企业级数据管理中的应用为特色。

4、支持语言

可以看到chroma基本是原始python的内置库了,对于跨语言调用这方面还是支持的不够

5、GitHub Stars

虽然不是那么重要但是它可以侧面反映出项目的受欢迎程度,Stars越多,意味着大家关注的程度就越高,这样如果有问题的话被解决的几率也会更大

总结

Chroma在易用性上占优,特别适合在Jupyter Notebook上进行开发、测试和生产,是处理多媒体数据,尤其是音频和视频搜索的理想选择。

Milvus强调在存储效率和数据查询性能上的平衡,支持内存和持久存储,适用于各种数据类型和格式。它在电子商务、自然语言处理以及图像和视频分析等多个方面有广泛应用,特别是在数据分区、负载均衡和容错方面提供了强大的支持。

Faiss可以进行GPU加速的高速检索,特别擅长处理庞大数据集的快速最近邻搜索,适用于不同技术需求和数据环境,能够与多种技术风格相协调。

Weaviate则提供了GraphQL-based API,强调与知识图的灵活高效交互。支持实时数据更新,确保数据的时效性,以及通过模式推断功能,自动化了数据结构定义的过程,适合于需要数据分类和企业资源规划的场合。

它们都能提供高效的搜索能力和处理大规模数据集的能力,但在细节实现和特定功能上各有侧重,这需要根据实际业务需求来决定最合适的选择。选择使用哪个库将取决于数据的类型、处理需求和预期的使用场景

其它

pgvector

  • 优点:

    • 与PostgreSQL集成**:无需额外的数据库系统。**
    • 熟悉的SQL接口**:降低学习成本。**
  • 缺点:

    • 性能限制**:在处理大量数据时可能性能不足。**
    • 扩展性受限**:受限于PostgreSQL的架构。**

OpenSearch

  • 优点:

    • 功能丰富**:在搜索和分析方面具有强大能力。**
    • 可扩展性**:支持分布式部署。**
  • 缺点:

    • 插件依赖**:向量搜索需要额外插件支持。**
    • 性能挑战**:在向量搜索方面可能不如专用数据库。**

TiDB Vector

  • 优点:

    • 分布式事务**:支持强一致性和高可用性。**
    • 兼容MySQL**:易于迁移和集成。**
  • 缺点:

    • 新功能**:向量支持相对较新,可能存在不稳定性。**
    • 生态系统发展中**:社区和第三方支持有待加强。**

Elasticsearch

  • 优点:

    • 强大的搜索能力**:全文检索和分析功能完善。**
    • 丰富的插件**:可扩展性强。**
  • 缺点:

    • 向量搜索需插件**:需要额外安装和配置。**
    • 资源消耗大**:在大型集群中可能需要更多资源。**

** AnalyticDB**

  • 优点:

    • 高性能分析**:适合大规模数据的实时分析。**
    • 云原生**:无需维护基础设施。**
  • 缺点:

    • 非开源**:定制和二次开发受限。**
    • 成本较高**:按使用量计费,长期成本可能较高。**

向量数据库的使用

以faiss为例

import numpy as np
import faiss
import time
from transformers import AutoTokenizer, AutoModel

# 1. 文档预处理:将文档转换为向量
def document_to_vector(documents, model, tokenizer):
    inputs = tokenizer(documents, padding=True, truncation=True, return_tensors="pt", max_length=512)
    outputs = model(**inputs)
    embeddings = outputs.last_hidden_state.mean(dim=1).detach().numpy().astype('float32')
    return embeddings

# 2. 创建FAISS索引并添加文档向量
def create_faiss_index(doc_vectors):
    dim = doc_vectors.shape[1]
    index = faiss.IndexFlatL2(dim)
    index.add(doc_vectors)
    return index

# 3. 模拟用户输入并生成查询向量
def query_to_vector(query, model, tokenizer):
    inputs = tokenizer(query, padding=True, truncation=True, return_tensors="pt", max_length=512)
    outputs = model(**inputs)
    query_vector = outputs.last_hidden_state.mean(dim=1).detach().numpy().astype('float32')
    return query_vector

# 4. 查询FAISS索引并返回Top-K相关数据
def search_faiss_index(index, query_vector, k):
    D, I = index.search(query_vector, k)
    return D, I

# 5. 主函数
def main():
    # 加载预训练模型和分词器
    model_name = "sentence-transformers/all-MiniLM-L6-v2"
    tokenizer = AutoTokenizer.from_pretrained(model_name)
    model = AutoModel.from_pretrained(model_name)

    # 示例文档
    documents = [
        "This is a document about machine learning.",
        "Another document about deep learning.",
        "A document discussing natural language processing.",
        "A document on computer vision.",
        "A document about reinforcement learning.",
        # ... 更多文档
    ]

    # 1. 文档预处理:将文档转换为向量
    doc_vectors = document_to_vector(documents, model, tokenizer)

    # 2. 创建FAISS索引并添加文档向量
    index = create_faiss_index(doc_vectors)

    # 3. 模拟用户输入并生成查询向量
    user_query = "I am interested in natural language processing."
    query_vector = query_to_vector(user_query, model, tokenizer)

    # 4. 查询FAISS索引并返回Top-K相关数据
    k = 3
    start_time = time.time()
    D, I = search_faiss_index(index, query_vector, k)
    end_time = time.time()

    # 5. 结果转换:将返回的索引转换为实际的文档内容
    top_k_documents = [documents[i] for i in I[0]]

    # 打印查询结果
    print("查询最近邻索引:", I)
    print("查询最近邻距离:", D)
    print("查询耗时:", end_time - start_time)
    print("Top-K相关文档:")
    for doc in top_k_documents:
        print(doc)

if __name__ == "__main__":
    main()

实际业务要远远复杂的多,例如ai推荐可能要大数据平台,不同业务的业务流、深度学习算法等,ai问答要结合rag、prompt


标题: 向量数据库基本概念和主流对比
作者:Larry
地址:http://www.zhangyucode.top/articles/2026/05/02/1777664216545.html