MongoDB Vector Search:一文了解其核心功能
在人工智能和机器学习领域,向量搜索(Vector Search)已成为一项至关重要的技术。它广泛应用于推荐系统、图像识别、自然语言处理等领域,能够快速找到与给定查询向量最相似的数据项。MongoDB,作为一款流行的NoSQL数据库,也推出了自己的向量搜索功能——MongoDB Vector Search。本文将深入探讨MongoDB Vector Search的核心功能、工作原理、优势、应用场景,并将其与其他向量数据库进行对比,帮助您全面了解这项技术。
1. 什么是向量搜索(Vector Search)?
在深入了解MongoDB Vector Search之前,我们需要先理解什么是向量搜索。
1.1. 向量(Vector)的概念
在数学和计算机科学中,向量是一个有序的数值列表。这些数值可以代表各种类型的数据,例如:
- 文本: 通过词嵌入(Word Embedding)技术(如Word2Vec、GloVe、BERT等)将单词或句子转换为数值向量。
- 图像: 使用卷积神经网络(CNN)等模型提取图像特征,形成特征向量。
- 音频: 通过音频处理技术(如梅尔频率倒谱系数MFCC)提取音频特征,生成特征向量。
- 用户画像: 将用户的属性(如年龄、性别、兴趣爱好等)编码为数值向量。
这些向量通常具有高维度(数百甚至数千维),用于表示数据的语义信息。
1.2. 向量搜索的定义
向量搜索,也称为相似性搜索(Similarity Search)或最近邻搜索(Nearest Neighbor Search),是指在给定一个查询向量的情况下,从向量数据库中找出与查询向量最相似(距离最近)的K个向量的过程。这里的“相似性”通常通过计算向量之间的距离来衡量,常用的距离度量方法包括:
- 欧氏距离(Euclidean Distance): 最常见的距离度量,计算两点之间的直线距离。
- 余弦相似度(Cosine Similarity): 计算两个向量之间的夹角余弦值,值越接近1表示越相似。
- 内积(Dot Product): 向量的点乘,值越大表示越相似。
- 汉明距离(Hamming Distance): 两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数。
- 曼哈顿距离(Manhattan Distance): 也称为城市街区距离,计算两点在坐标系上的绝对轴距总和。
1.3. 向量搜索的挑战
传统的基于关键词的搜索方法难以处理语义层面的相似性。例如,搜索“快乐的小狗”可能无法返回包含“高兴的狗狗”的结果,尽管它们的语义是相似的。向量搜索通过将数据转换为向量并计算向量之间的距离,可以有效地解决这个问题。
然而,在大规模高维向量数据集中进行精确的最近邻搜索计算成本非常高。为了提高搜索效率,通常采用近似最近邻搜索(Approximate Nearest Neighbor, ANN)算法。
2. MongoDB Vector Search 概述
MongoDB Vector Search 是 MongoDB Atlas(MongoDB的云数据库服务)提供的一项功能,它允许用户在 MongoDB 中存储和索引向量数据,并执行高效的向量搜索。它构建在 Atlas Search(基于 Apache Lucene)之上,利用了 Lucene 的 HNSW(Hierarchical Navigable Small World)索引来实现快速的近似最近邻搜索。
2.1. 核心功能
MongoDB Vector Search 提供了以下核心功能:
- 向量数据存储: 支持存储高维向量数据(float,int,byte数组),并与其他结构化或非结构化数据一起存储在 MongoDB 文档中。
- 向量索引: 使用 HNSW 算法构建向量索引,以加速向量搜索。
- 向量搜索: 支持使用
$vectorSearch
聚合管道阶段执行向量搜索。 - 多种距离度量: 支持欧氏距离、余弦相似度和内积等多种距离度量。
- 过滤和预过滤: 支持在向量搜索之前或之后应用过滤条件,以缩小搜索范围。
- 与 Atlas Search 集成: 可以与 Atlas Search 的其他功能(如全文搜索、范围查询等)结合使用,实现更复杂的搜索需求。
- 可扩展性: 利用 MongoDB Atlas 的分布式架构,可以水平扩展以处理大规模向量数据集。
2.2. 工作原理
MongoDB Vector Search 的核心是 HNSW 索引。下面简要介绍 HNSW 算法的工作原理:
- 构建多层图: HNSW 算法将向量数据集组织成一个多层图结构。每一层都是一个 Navigable Small World (NSW) 图。
- 分层搜索: 搜索从最上层开始,在每一层找到与查询向量最接近的节点。然后将这些节点作为下一层的入口点,继续向下搜索,直到达到最底层。
- 近似最近邻: 由于 HNSW 算法是一种近似最近邻搜索算法,它不保证一定能找到精确的最近邻,但可以在可接受的精度损失下显著提高搜索效率。
2.3 向量搜索的索引
MongoDB Vector Search目前提供两种向量索引:
-
hnsw (default): Hierarchical Navigable Small World graphs是一种基于图的数据结构,用于高效地找到数据集中与给定查询向量最接近的向量。通过构建多层图结构,其中每一层都是底层数据的更粗略表示,HNSW能够在搜索过程中快速导航到数据集的相关部分。这使得HNSW非常适用于高维空间中的近似最近邻搜索。
-
ivfflat: Inverted File Flat是一种倒排文件索引,它将向量空间划分为多个单元格(Voronoi cells),并为每个单元格创建一个倒排列表。在搜索过程中,首先找到查询向量所属的单元格,然后仅在该单元格的倒排列表中搜索最近邻。IVFFlat适用于中等维度和大规模数据集。
2.4. 优势
MongoDB Vector Search 具有以下优势:
- 易于使用: 作为 MongoDB 的一部分,它与现有的 MongoDB 工具和 API 无缝集成,降低了学习成本。
- 高性能: 基于 HNSW 索引,提供快速的向量搜索性能。
- 灵活性: 支持多种距离度量和过滤选项,可以满足不同的应用需求。
- 可扩展性: 利用 MongoDB Atlas 的分布式架构,可以轻松扩展以处理大规模数据。
- 统一的数据平台: 将向量数据与其他类型的数据存储在同一个数据库中,简化了数据管理和应用开发。
3. MongoDB Vector Search 的应用场景
MongoDB Vector Search 可用于各种需要处理语义相似性的应用场景,包括:
- 推荐系统: 根据用户的历史行为或偏好,推荐相似的商品、文章、视频等。
- 图像搜索: 根据上传的图像或图像特征,搜索相似的图像。
- 语义搜索: 理解用户查询的语义,返回更相关的搜索结果。
- 异常检测: 识别与正常模式不同的异常数据点。
- 数据去重: 查找并删除重复或高度相似的数据。
- 问答系统: 根据用户的问题,找到最相关的答案。
- 基因组学研究: 搜索相似的基因序列。
- 化学信息学: 搜索相似的分子结构。
4. MongoDB Vector Search 的使用示例
下面是一个简单的使用 MongoDB Vector Search 的示例:
4.1. 数据准备
假设我们有一个包含电影信息的集合 movies
,每个文档包含电影的标题、描述和描述的嵌入向量:
json
[
{
"title": "The Shawshank Redemption",
"description": "Two imprisoned men bond over a number of years, finding solace and eventual redemption through acts of common decency.",
"description_embedding": [0.1, 0.2, 0.3, ...] // 假设这是一个长度为 768 的向量
},
{
"title": "The Godfather",
"description": "The aging patriarch of an organized crime dynasty transfers control of his clandestine empire to his reluctant son.",
"description_embedding": [0.4, 0.5, 0.6, ...]
},
// ... 更多电影
]
4.2. 创建向量索引
在 description_embedding
字段上创建 HNSW 向量索引:
javascript
db.movies.createIndex(
{ "description_embedding": "vector" },
{
"name": "vector_index",
"vectorOptions": {
"dimensions": 768, // 向量维度
"similarity": "cosine", // 相似度度量
"m": 16, //每个向量在构建期间连接到的最大双向链接数。
"efConstruction":64, // 在构建期间使用的动态最近邻居列表的大小。
"type": "hnsw" //索引类型, 可选 "hnsw" (default) or "ivfflat"
}
}
)
4.3. 执行向量搜索
使用 $vectorSearch
聚合管道阶段执行向量搜索,找到与给定查询向量最相似的 5 部电影:
javascript
db.movies.aggregate([
{
$vectorSearch: {
"index": "vector_index",
"path": "description_embedding",
"queryVector": [0.7, 0.8, 0.9, ...], // 查询向量
"numCandidates": 50, //要考虑的候选向量的最大数量。
"limit": 5
}
},
{
$project: {
"title": 1,
"description": 1,
"score": { $meta: "vectorSearchScore" } // 获取相似度分数
}
}
])
* index: 指定向量索引的名称。
* queryVector: 嵌入查询向量,如果使用 filter
, 则必需是一个浮点数组。
* path: 包含嵌入向量的字段。
* limit: 要返回的最大文档数。
* numCandidates: 要考虑的候选向量的最大数量。
4.4. 过滤
可以在向量搜索之前或之后应用过滤条件:
javascript
db.movies.aggregate([
{
$vectorSearch: {
"index": "vector_index",
"path": "description_embedding",
"queryVector": [0.7, 0.8, 0.9, ...],
"numCandidates": 150,
"limit": 5,
"filter": { "year": { $gt: 2000 } } // 仅搜索 2000 年之后上映的电影
}
},
{
$project: {
"title": 1,
"description": 1,
"year":1,
"score": { $meta: "vectorSearchScore" }
}
}
])
5. MongoDB Vector Search 与其他向量数据库的对比
除了 MongoDB Vector Search,还有一些其他的向量数据库可供选择,例如:
- Pinecone: 专门为向量搜索设计的云原生向量数据库。
- Weaviate: 开源的向量搜索引擎,支持 GraphQL API。
- Qdrant: 开源的向量搜索引擎,提供 Rust、Python 和 Go 客户端。
- Milvus: 开源的向量数据库,专为大规模向量搜索设计。
- Elasticsearch: 8.0以后的版本也支持向量搜索。
下表对比了 MongoDB Vector Search 与这些向量数据库的一些关键特性:
特性 | MongoDB Vector Search | Pinecone | Weaviate | Qdrant | Milvus | Elasticsearch |
---|---|---|---|---|---|---|
类型 | NoSQL 数据库的一部分 | 专用向量数据库 | 开源向量搜索引擎 | 开源向量搜索引擎 | 开源向量数据库 | 搜索引擎 |
数据模型 | 文档 | 向量 | 对象 | 向量 | 向量 | 文档 |
索引 | HNSW, ivfflat | HNSW,Product Quantization | HNSW | HNSW | 多种 | HNSW |
距离度量 | 欧氏距离、余弦相似度、内积 | 多种 | 多种 | 多种 | 多种 | 多种 |
过滤 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
可扩展性 | 水平扩展 | 水平扩展 | 水平扩展 | 水平扩展 | 水平扩展 | 水平扩展 |
部署 | MongoDB Atlas | 云服务 | 自托管/云服务 | 自托管/云服务 | 自托管/云服务 | 自托管/云服务 |
易用性 | 与 MongoDB 集成 | 简单 API | GraphQL API | 多语言客户端 | 多语言客户端 | 与Elasticsearch集成 |
选择建议:
- 如果您已经是 MongoDB 用户, 并且需要将向量搜索与其他类型的数据查询结合起来,MongoDB Vector Search 是一个不错的选择。
- 如果您需要一个专门的向量数据库, 并且对性能和可扩展性有较高要求,可以考虑 Pinecone 或 Milvus。
- 如果您需要一个开源的解决方案, 并且希望有更多的灵活性和控制权,可以考虑 Weaviate 或 Qdrant。
- 如果您已经是Elasticsearch用户, 并且需求较为简单,可以考虑使用Elasticsearch。
6. 总结
MongoDB Vector Search 为 MongoDB 用户提供了一种简单、高效、可扩展的向量搜索解决方案。它与 MongoDB 的现有功能无缝集成,可以轻松地将向量搜索添加到您的应用程序中。通过理解其核心功能、工作原理和应用场景,您可以更好地利用这项技术来解决实际问题。
希望本文能帮助您全面了解 MongoDB Vector Search。如果您有任何问题或需要进一步的帮助,请随时提问。