此版本仍在开发中,尚未被视为稳定版本。最新的快照版本请使用 Spring AI 1.0.0-SNAPSHOT! |
MongoDB Atlas
本节将引导您将 MongoDB Atlas 设置为矢量存储以用于 Spring AI。
什么是 MongoDB Atlas?
MongoDB Atlas 是 MongoDB 提供的完全托管式云数据库,可在 AWS、Azure 和 GCP 中使用。 Atlas 支持对 MongoDB 文档数据进行原生矢量搜索和全文搜索。
MongoDB Atlas Vector Search 允许您将嵌入存储在 MongoDB 文档中,创建向量搜索索引,并使用近似最近邻算法(分层可导航小世界)执行 KNN 搜索。
您可以在 MongoDB 聚合阶段中使用聚合运算符对向量嵌入执行搜索。$vectorSearch
先决条件
-
运行 MongoDB 版本 6.0.11、7.0.2 或更高版本的 Atlas 集群。要开始使用 MongoDB Atlas,您可以按照此处的说明进行操作。确保您的 IP 地址包含在 Atlas 项目的 https://www.mongodb.com/docs/atlas/security/ip-access-list/#std-label-access-list[访问列表] 中。
-
用于计算文档嵌入的实例。有几个选项可用。请参阅 EmbeddingModel 部分以了解更多信息。
EmbeddingModel
-
用于设置和运行 Java 应用程序的环境。
自动配置
Spring AI 为 MongoDB Atlas Vector Store 提供 Spring Boot 自动配置。
要启用它,请将以下依赖项添加到项目的 Maven 文件中:pom.xml
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-mongodb-atlas-store-spring-boot-starter</artifactId>
</dependency>
或您的 Gradle 构建文件。build.gradle
dependencies {
implementation 'org.springframework.ai:spring-ai-mongodb-atlas-store-spring-boot-starter'
}
矢量存储实现可以为您初始化必要的架构,但您必须通过在相应的构造函数中指定布尔值或在文件中进行设置来选择加入。initializeSchema
…initialize-schema=true
application.properties
请参阅 Dependency Management 部分,将 Spring AI BOM 添加到您的构建文件中。 |
请参阅 Repositories 部分,将 Milestone 和/或 Snapshot Repositories 添加到您的构建文件中。 |
Schema 初始化
矢量存储实现可以为您初始化必要的架构,但您必须通过在相应的构造函数中指定布尔值或在文件中进行设置来选择加入。initializeSchema
spring.ai.vectorstore.mongodb.initialize-schema=true
application.properties
这是一个突破性的变化!在早期版本的 Spring AI 中,默认情况下会进行此架构初始化。 |
当设置为 时,将自动执行以下操作:initializeSchema
true
-
集合创建:如果指定的用于存储向量的集合尚不存在,则将创建该集合。
-
Search Index Creation:将根据配置属性创建搜索索引。
如果您运行的是免费或共享层集群,则必须通过 Atlas UI、Atlas 管理 API 或 Atlas CLI 单独创建索引。
如果您在 上调用了现有的 Atlas Vector Search 索引,则 Spring AI 不会创建其他索引。因此,如果现有索引配置了不兼容的设置(例如维度数不同),您稍后可能会遇到错误。vector_index springai_test.vector_store collection |
确保您的索引具有以下配置:
{
"fields": [
{
"numDimensions": 1536,
"path": "embedding",
"similarity": "cosine",
"type": "vector"
}
]
}
此外,您还需要一个已配置的 Bean。请参阅 EmbeddingModel 部分以了解更多信息。EmbeddingModel
以下是所需 bean 的示例:
@Bean
public EmbeddingModel embeddingModel() {
// Can be any other EmbeddingModel implementation.
return new OpenAiEmbeddingModel(new OpenAiApi(System.getenv("SPRING_AI_OPENAI_API_KEY")));
}
配置属性
您可以在 Spring Boot 配置中使用以下属性来自定义 MongoDB Atlas 矢量存储。
...
spring.data.mongodb.uri=<connection string>
spring.data.mongodb.database=<database name>
spring.ai.vectorstore.mongodb.collection-name=vector_store
spring.ai.vectorstore.mongodb.initialize-schema=true
spring.ai.vectorstore.mongodb.path-name=embedding
spring.ai.vectorstore.mongodb.indexName=vector_index
spring.ai.vectorstore.mongodb.metadata-fields-to-filter=foo
财产 | 描述 | 默认值 |
---|---|---|
|
用于存储向量的集合的名称。 |
|
|
是否为您初始化后端 Schema |
|
|
用于存储向量的路径的名称。 |
|
|
用于存储向量的索引的名称。 |
|
|
逗号分隔值,用于指定在查询向量存储时可以使用哪些元数据字段进行筛选。需要,以便创建元数据索引(如果元数据索引尚不存在) |
空列表 |
手动配置属性
如果您希望手动配置 MongoDB Atlas 矢量存储而不进行自动配置,则可以通过直接设置 及其依赖项来实现。MongoDBAtlasVectorStore
示例配置
@Configuration
public class VectorStoreConfig {
@Bean
public MongoDBAtlasVectorStore vectorStore(MongoTemplate mongoTemplate, EmbeddingModel embeddingModel) {
MongoDBVectorStoreConfig config = MongoDBVectorStoreConfig.builder()
.withCollectionName("custom_vector_store")
.withVectorIndexName("custom_vector_index")
.withPathName("custom_embedding_path")
.withMetadataFieldsToFilter(List.of("author", "year"))
.build();
return new MongoDBAtlasVectorStore(mongoTemplate, embeddingModel, config, true);
}
}
添加文档
要将文档添加到向量存储中,您需要将输入文档转换为类型并调用该方法。此方法将使用 来计算嵌入并将其保存到 MongoDB 集合中。Document
addDocuments()
EmbeddingModel
List<Document> docs = List.of(
new Document("Proper tuber planting involves site selection, timing, and care. Choose well-drained soil and adequate sun exposure. Plant in spring, with eyes facing upward at a depth two to three times the tuber's height. Ensure 4-12 inch spacing based on tuber size. Adequate moisture is needed, but avoid overwatering. Mulching helps preserve moisture and prevent weeds.", Map.of("author", "A", "type", "post")),
new Document("Successful oil painting requires patience, proper equipment, and technique. Prepare a primed canvas, sketch lightly, and use high-quality brushes and oils. Paint 'fat over lean' to prevent cracking. Allow each layer to dry before applying the next. Clean brushes often and work in a well-ventilated space.", Map.of("author", "A")),
new Document("For a natural lawn, select the right grass type for your climate. Water 1 to 1.5 inches per week, avoid overwatering, and use organic fertilizers. Regular aeration helps root growth and prevents compaction. Practice natural pest control and overseeding to maintain a dense lawn.", Map.of("author", "B", "type", "post")) );
vectorStore.add(docs);
删除文档
要从向量存储中删除文档,请使用该方法。此方法采用文档 ID 列表,并从 MongoDB 集合中删除相应的文档。delete()
List<String> ids = List.of("id1", "id2", "id3"); // Replace with actual document IDs
vectorStore.delete(ids);
执行相似性搜索
要执行相似性搜索,请使用所需的查询参数构造一个对象并调用该方法。此方法将根据向量相似性返回与查询匹配的文档列表。SearchRequest
similaritySearch()
List<Document> results = vectorStore.similaritySearch(
SearchRequest
.query("learn how to grow things")
.withTopK(2)
);
元数据筛选
元数据筛选允许通过根据指定的元数据字段筛选结果来进行更精细的查询。此功能使用 MongoDB 查询 API 与矢量搜索一起执行筛选操作。
筛选表达式
该类将筛选表达式转换为 MongoDB Atlas 元数据筛选表达式。支持的操作包括:MongoDBAtlasFilterExpressionConverter
-
$and
-
$or
-
$eq
-
$ne
-
$lt
-
$lte
-
$gt
-
$gte
-
$in
-
$nin
这些操作允许将筛选逻辑应用于与向量存储中的文档关联的元数据字段。
筛选表达式示例
以下是如何在相似性搜索中使用筛选条件表达式的示例:
FilterExpressionBuilder b = new FilterExpressionBuilder();
List<Document> results = vectorStore.similaritySearch(
SearchRequest.defaults()
.withQuery("learn how to grow things")
.withTopK(2)
.withSimilarityThreshold(0.5)
.withFilterExpression(this.b.eq("author", "A").build())
);
教程和代码示例
要开始使用 Spring AI 和 MongoDB:
-
请参阅 Spring AI 集成的入门指南。
-
有关演示使用 Spring AI 和 MongoDB 进行检索增强生成 (RAG) 的综合代码示例,请参阅此详细教程。