此版本仍在开发中,尚未被视为稳定版。为了获取最新的快照版本,请使用Spring AI 1.1.3spring-doc.cadn.net.cn

Milvus

Milvus 是一个开源的向量数据库,在数据科学和机器学习领域中获得了广泛关注。其突出特点之一在于对向量索引和查询的强大支持。Milvus采用最先进的前沿算法来加速搜索过程,使其在处理大量数据集时,也能极为高效地检索出相似向量。spring-doc.cadn.net.cn

前提条件

依赖项

There has been a significant change in the Spring AI auto-configuration, starter modules' artifact names. Please refer to the 升级说明以获取更多信息。spring-doc.cadn.net.cn

然后在您的项目中添加Milvus向量存储Starters依赖项:spring-doc.cadn.net.cn

<dependency>
	<groupId>org.springframework.ai</groupId>
	<artifactId>spring-ai-starter-vector-store-milvus</artifactId>
</dependency>

或者添加到您的Gradle 构建脚本文件中。spring-doc.cadn.net.cn

dependencies {
    implementation 'org.springframework.ai:spring-ai-starter-vector-store-milvus'
}
参考依赖管理部分,将Spring AI BOM添加到您的构建文件中。 参考制品仓库部分,将Maven中央仓库和/或快照仓库添加到您的构建文件中。

The vector store implementation can initialize the requisite schema for you, but you must opt-in by specifying the initializeSchema boolean in the appropriate constructor or by setting …​initialize-schema=true in the application.properties file.spring-doc.cadn.net.cn

这是一个破坏性变更!在早期版本的 Spring AI 中,此模式初始化是默认进行的。

向量存储库也需要一个EmbeddingModel实例来为文档计算嵌入。 您可以选择可用的嵌入模型实现之一。spring-doc.cadn.net.cn

要连接并配置MilvusVectorStore,您需要提供实例的访问详情。 简单的配置可以通过Spring Boot的application.yml来提供spring-doc.cadn.net.cn

spring:
	ai:
		vectorstore:
			milvus:
				client:
					host: "localhost"
					port: 19530
					username: "root"
					password: "milvus"
				databaseName: "default"
				collectionName: "vector_store"
				embeddingDimension: 1536
				indexType: IVF_FLAT
				metricType: COSINE
查看配置参数列表以了解默认值和配置选项。

现在,您可以在应用程序中自动装配Milvus向量存储并使用它spring-doc.cadn.net.cn

@Autowired VectorStore vectorStore;

// ...

List <Document> documents = List.of(
    new Document("Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!!", Map.of("meta1", "meta1")),
    new Document("The World is Big and Salvation Lurks Around the Corner"),
    new Document("You walk forward facing the past and you turn back toward the future.", Map.of("meta2", "meta2")));

// Add the documents to Milvus Vector Store
vectorStore.add(documents);

// Retrieve documents similar to a query
List<Document> results = this.vectorStore.similaritySearch(SearchRequest.builder().query("Spring").topK(5).build());

手动配置

如果不想使用Spring Boot的自动配置,您可以手动配置MilvusVectorStore。 要将以下依赖项添加到您的项目中:spring-doc.cadn.net.cn

<dependency>
	<groupId>org.springframework.ai</groupId>
	<artifactId>spring-ai-milvus-store</artifactId>
</dependency>
参考以下依赖管理部分,添加Spring AI BOM到你的构建文件中。

为了在您的应用中配置MilvusVectorStore,您可以使用以下设置:spring-doc.cadn.net.cn

	@Bean
	public VectorStore vectorStore(MilvusServiceClient milvusClient, EmbeddingModel embeddingModel) {
		return MilvusVectorStore.builder(milvusClient, embeddingModel)
				.collectionName("test_vector_store")
				.databaseName("default")
				.indexType(IndexType.IVF_FLAT)
				.metricType(MetricType.COSINE)
				.batchingStrategy(new TokenCountBatchingStrategy())
				.initializeSchema(true)
				.build();
	}

	@Bean
	public MilvusServiceClient milvusClient() {
		return new MilvusServiceClient(ConnectParam.newBuilder()
			.withAuthorization("minioadmin", "minioadmin")
			.withUri(milvusContainer.getEndpoint())
			.build());
	}

元数据过滤

您可以利用通用、可移植的元数据过滤器与Milvus存储配合使用。spring-doc.cadn.net.cn

例如,你可以使用文本表达式语言:spring-doc.cadn.net.cn

vectorStore.similaritySearch(
    SearchRequest.builder()
    .query("The World")
    .topK(TOP_K)
    .similarityThreshold(SIMILARITY_THRESHOLD)
    .filterExpression("author in ['john', 'jill'] && article_type == 'blog'").build());

或通过编程方式使用 Filter.Expression DSL:spring-doc.cadn.net.cn

FilterExpressionBuilder b = new FilterExpressionBuilder();

vectorStore.similaritySearch(SearchRequest.builder()
    .query("The World")
    .topK(TOP_K)
    .similarityThreshold(SIMILARITY_THRESHOLD)
    .filterExpression(b.and(
        b.in("author","john", "jill"),
        b.eq("article_type", "blog")).build()).build());
这些过滤表达式被转换为等效的Milvus过滤器。

使用MilvusSearchRequest

MilvusSearchRequest 扩展了 SearchRequest,使您能够使用 Milvus 特定的搜索参数,如原生表达式和搜索参数 JSON。spring-doc.cadn.net.cn

MilvusSearchRequest request = MilvusSearchRequest.milvusBuilder()
    .query("sample query")
    .topK(5)
    .similarityThreshold(0.7)
    .nativeExpression("metadata[\"age\"] > 30") // Overrides filterExpression if both are set
    .filterExpression("age <= 30") // Ignored if nativeExpression is set
    .searchParamsJson("{\"nprobe\":128}")
    .build();
List results = vectorStore.similaritySearch(request);

这使得在使用Milvus特定的搜索功能时具有更大的灵活性。spring-doc.cadn.net.cn

MilvusSearchRequestnativeExpressionsearchParamsJson的重要性

这两个参数增强了Milvus的搜索精度,并确保了查询性能的最佳。spring-doc.cadn.net.cn

nativeExpression: 使用Milvus的原生过滤表达式启用额外的过滤功能。 Milvus过滤说明spring-doc.cadn.net.cn

MilvusSearchRequest request = MilvusSearchRequest.milvusBuilder()
    .query("sample query")
    .topK(5)
    .nativeExpression("metadata['category'] == 'science'")
    .build();

searchParamsJson: 使用IVF_FLAT时调整搜索行为的关键,IVF_FLAT是Milvus的默认索引。 Milvus向量索引spring-doc.cadn.net.cn

默认情况下,IVF_FLAT 需要设置 nprobe 以获得准确的结果。如果不指定,nprobe 默认为 1,这可能导致召回率低或甚至没有搜索结果。spring-doc.cadn.net.cn

MilvusSearchRequest request = MilvusSearchRequest.milvusBuilder()
    .query("sample query")
    .topK(5)
    .searchParamsJson("{\"nprobe\":128}")
    .build();

使用 nativeExpression 确保高级过滤,而 searchParamsJson 防止了由低默认 nprobe 值引起的无效搜索。spring-doc.cadn.net.cn

Milvus 向量存储属性

您可以在 Spring Boot 配置中使用以下属性来自定义 Milvus 向量存储。spring-doc.cadn.net.cn

属性 描述 默认值

spring.ai.vectorstore.milvus.database-namespring-doc.cadn.net.cn

要使用的Milvus数据库的名称。spring-doc.cadn.net.cn

默认spring-doc.cadn.net.cn

spring.ai.vectorstore.milvus.collection-namespring-doc.cadn.net.cn

Milvus集合名称,用于存储向量spring-doc.cadn.net.cn

vector_storespring-doc.cadn.net.cn

spring.ai.vectorstore.milvus.initialize-schemaspring-doc.cadn.net.cn

是否初始化Milvus的后端spring-doc.cadn.net.cn

falsespring-doc.cadn.net.cn

spring.ai.vectorstore.milvus.embedding-dimensionspring-doc.cadn.net.cn

Milvus集合中待存储向量的维度。spring-doc.cadn.net.cn

1536spring-doc.cadn.net.cn

spring.ai.vectorstore.milvus.index-typespring-doc.cadn.net.cn

为Milvus集合创建的索引类型。spring-doc.cadn.net.cn

IVF_FLATspring-doc.cadn.net.cn

spring.ai.vectorstore.milvus.metric-typespring-doc.cadn.net.cn

Milvus集合中将使用的度量类型。spring-doc.cadn.net.cn

COSINEspring-doc.cadn.net.cn

spring.ai.vectorstore.milvus.index-parametersspring-doc.cadn.net.cn

Milvus集合中要使用的索引参数。spring-doc.cadn.net.cn

{"nlist":1024}spring-doc.cadn.net.cn

spring.ai.vectorstore.milvus.id-field-namespring-doc.cadn.net.cn

集合的ID字段名称spring-doc.cadn.net.cn

doc_idspring-doc.cadn.net.cn

spring.ai.vectorstore.milvus.auto-idspring-doc.cadn.net.cn

布尔标志,用于指示是否使用自动ID作为ID字段spring-doc.cadn.net.cn

falsespring-doc.cadn.net.cn

spring.ai.vectorstore.milvus.content-field-namespring-doc.cadn.net.cn

集合内容字段名称spring-doc.cadn.net.cn

内容spring-doc.cadn.net.cn

spring.ai.vectorstore.milvus.metadata-field-namespring-doc.cadn.net.cn

集合的元数据字段名称spring-doc.cadn.net.cn

元数据spring-doc.cadn.net.cn

spring.ai.vectorstore.milvus.embedding-field-namespring-doc.cadn.net.cn

集合的嵌入字段名称spring-doc.cadn.net.cn

嵌入spring-doc.cadn.net.cn

spring.ai.vectorstore.milvus.client.hostspring-doc.cadn.net.cn

主机的名称或地址。spring-doc.cadn.net.cn

本地主机spring-doc.cadn.net.cn

spring.ai.vectorstore.milvus.client.portspring-doc.cadn.net.cn

连接端口。spring-doc.cadn.net.cn

19530spring-doc.cadn.net.cn

spring.ai.vectorstore.milvus.client.urispring-doc.cadn.net.cn

Milvus 实例的 URIspring-doc.cadn.net.cn

-spring-doc.cadn.net.cn

spring.ai.vectorstore.milvus.client.tokenspring-doc.cadn.net.cn

用于身份验证和识别目的的Tokens密钥。spring-doc.cadn.net.cn

-spring-doc.cadn.net.cn

spring.ai.vectorstore.milvus.client.connect-timeout-msspring-doc.cadn.net.cn

客户端通道的连接超时值。此超时值必须大于零。spring-doc.cadn.net.cn

10000spring-doc.cadn.net.cn

spring.ai.vectorstore.milvus.client.keep-alive-time-msspring-doc.cadn.net.cn

客户端通道的保持活动时间值。保持活动时间值必须大于零。spring-doc.cadn.net.cn

55000spring-doc.cadn.net.cn

spring.ai.vectorstore.milvus.client.keep-alive-timeout-msspring-doc.cadn.net.cn

客户端通道的保持活动超时值。此超时值必须大于零。spring-doc.cadn.net.cn

20000spring-doc.cadn.net.cn

spring.ai.vectorstore.milvus.client.rpc-deadline-msspring-doc.cadn.net.cn

您愿意等待服务器响应的最长时间限制。通过设置截止时间,客户端在遇到由网络波动引起的快速RPC失败时将等待。截止时间值必须大于或等于零。spring-doc.cadn.net.cn

0spring-doc.cadn.net.cn

spring.ai.vectorstore.milvus.client.client-key-pathspring-doc.cadn.net.cn

客户端密钥路径用于TLS双向认证,仅在`secure`设置为true时生效spring-doc.cadn.net.cn

-spring-doc.cadn.net.cn

spring.ai.vectorstore.milvus.client.client-pem-pathspring-doc.cadn.net.cn

客户端证书路径用于两向身份认证,仅在'secure'为true时生效spring-doc.cadn.net.cn

-spring-doc.cadn.net.cn

spring.ai.vectorstore.milvus.client.ca-pem-pathspring-doc.cadn.net.cn

TLS双向认证的ca.pem路径,仅在安全设置为true时才会生效。spring-doc.cadn.net.cn

-spring-doc.cadn.net.cn

spring.ai.vectorstore.milvus.client.server-pem-pathspring-doc.cadn.net.cn

服务器PEM配置文件路径,仅在"secure"为true时生效。spring-doc.cadn.net.cn

-spring-doc.cadn.net.cn

spring.ai.vectorstore.milvus.client.server-namespring-doc.cadn.net.cn

设置SSL主机名称检查的目标名称绕过,仅在"secure"为True时生效。注意:此值将传递给grpc.ssl_target_name_override。spring-doc.cadn.net.cn

-spring-doc.cadn.net.cn

spring.ai.vectorstore.milvus.client.securespring-doc.cadn.net.cn

确保对这个连接的授权,并设置为True以启用TLS。spring-doc.cadn.net.cn

falsespring-doc.cadn.net.cn

spring.ai.vectorstore.milvus.client.idle-timeout-msspring-doc.cadn.net.cn

客户端通道的空闲超时值。超时值必须大于零。spring-doc.cadn.net.cn

24hspring-doc.cadn.net.cn

spring.ai.vectorstore.milvus.client.usernamespring-doc.cadn.net.cn

输入用户名和密码,用于这个连接。spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

spring.ai.vectorstore.milvus.client.passwordspring-doc.cadn.net.cn

这个连接的密码是:spring-doc.cadn.net.cn

Milvusspring-doc.cadn.net.cn

开始安装 Milvus 服务

src/test/resources/ 目录内部运行:spring-doc.cadn.net.cn

docker-compose up

清理环境:spring-doc.cadn.net.cn

docker-compose down; rm -Rf ./volumes

然后连接到向量存储库,可访问 http://localhost:19530,或用于管理 http://localhost:9001 (用户: minioadmin, 密码: minioadmin)spring-doc.cadn.net.cn

troubleshooting

如果Docker报告资源不足,请执行以下操作:spring-doc.cadn.net.cn

docker system prune --all --force --volumes

访问原生客户端

向量数据库Milvus实现提供了一个通过内核连接到其 underlying native Milvus client(MilvusServiceClient)的方法(getNativeClient()):spring-doc.cadn.net.cn

MilvusVectorStore vectorStore = context.getBean(MilvusVectorStore.class);
Optional<MilvusServiceClient> nativeClient = vectorStore.getNativeClient();

if (nativeClient.isPresent()) {
    MilvusServiceClient client = nativeClient.get();
    // Use the native client for Milvus-specific operations
}

The native client gives you access to Milvus-specific features and operations that might not be exposed through the VectorStore interface.spring-doc.cadn.net.cn