Milvus

Milvus 是一个开源向量数据库,在数据科学和机器学习领域备受关注。其突出的特点之一在于对向量索引和查询的强大支持。Milvus 采用了最先进的尖端算法来加速搜索过程,即使处理海量数据集,也能极高效地检索相似向量。

先决条件

依赖项

Spring AI 自动配置、Starter 模块的 artifact 名称发生了重大变化。更多信息请参阅升级说明

然后将 Milvus VectorStore boot starter 依赖项添加到您的项目

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

或添加到您的 Gradle build.gradle 构建文件。

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

向量存储实现可以为您初始化所需的 Schema,但您必须通过在适当的构造函数中指定 initializeSchema 布尔值,或在 application.properties 文件中设置 …​initialize-schema=true 来选择开启此功能。

这是一个破坏性变更!在早期版本的 Spring AI 中,Schema 初始化是默认发生的。

向量存储还需要一个 EmbeddingModel 实例来计算文档的嵌入。您可以选择一种可用的 EmbeddingModel 实现

要连接和配置 MilvusVectorStore,您需要提供您的实例的访问详情。可以通过 Spring Boot 的 application.yml 提供简单的配置

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 Vector Store 并使用它

@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());

手动配置

您也可以手动配置 MilvusVectorStore,而不是使用 Spring Boot 自动配置。将以下依赖项添加到您的项目

<dependency>
	<groupId>org.springframework.ai</groupId>
	<artifactId>spring-ai-milvus-store</artifactId>
</dependency>
请参阅依赖管理部分,将 Spring AI BOM 添加到您的构建文件。

要在您的应用程序中配置 MilvusVectorStore,可以使用以下设置

	@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 存储中使用通用、可移植的元数据过滤器

例如,您可以使用文本表达式语言

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 进行编程配置

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。

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 特定的搜索功能时提供了更大的灵活性。

nativeExpressionsearchParamsJsonMilvusSearchRequest 中的重要性

这两个参数增强了 Milvus 搜索精度并确保了最佳查询性能

nativeExpression: 使用 Milvus 的原生过滤表达式启用额外的过滤功能。Milvus 过滤

示例

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

searchParamsJson: 使用 Milvus 的默认索引 IVF_FLAT 时,对于调整搜索行为至关重要。Milvus 向量索引

默认情况下,IVF_FLAT 需要设置 nprobe 才能获得准确结果。如果未指定,nprobe 默认为 1,这可能导致召回率较低甚至搜索结果为零。

示例

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

使用 nativeExpression 可确保高级过滤,而 searchParamsJson 可防止因默认 nprobe 值过低导致的无效搜索。

Milvus VectorStore 属性

您可以在 Spring Boot 配置中使用以下属性来自定义 Milvus 向量存储。

属性 描述 默认值

spring.ai.vectorstore.milvus.database-name

要使用的 Milvus 数据库名称。

default

spring.ai.vectorstore.milvus.collection-name

用于存储向量的 Milvus Collection 名称

vector_store

spring.ai.vectorstore.milvus.initialize-schema

是否初始化 Milvus 后端

false

spring.ai.vectorstore.milvus.embedding-dimension

存储在 Milvus Collection 中的向量维度。

1536

spring.ai.vectorstore.milvus.index-type

为 Milvus Collection 创建的索引类型。

IVF_FLAT

spring.ai.vectorstore.milvus.metric-type

用于 Milvus Collection 的度量类型(Metric Type)。

COSINE

spring.ai.vectorstore.milvus.index-parameters

用于 Milvus Collection 的索引参数。

{"nlist":1024}

spring.ai.vectorstore.milvus.id-field-name

Collection 的 ID 字段名称

doc_id

spring.ai.vectorstore.milvus.is-auto-id

布尔标志,指示 ID 字段是否使用 auto-id

false

spring.ai.vectorstore.milvus.content-field-name

Collection 的内容字段名称

content

spring.ai.vectorstore.milvus.metadata-field-name

Collection 的元数据字段名称

metadata

spring.ai.vectorstore.milvus.embedding-field-name

Collection 的嵌入字段名称

embedding

spring.ai.vectorstore.milvus.client.host

主机名称或地址。

localhost

spring.ai.vectorstore.milvus.client.port

连接端口。

19530

spring.ai.vectorstore.milvus.client.uri

Milvus 实例的 URI

-

spring.ai.vectorstore.milvus.client.token

用作身份识别和认证目的的 Token。

-

spring.ai.vectorstore.milvus.client.connect-timeout-ms

客户端通道的连接超时值。超时值必须大于零。

10000

spring.ai.vectorstore.milvus.client.keep-alive-time-ms

客户端通道的 Keep-alive 时间值。Keep-alive 值必须大于零。

55000

spring.ai.vectorstore.milvus.client.keep-alive-timeout-ms

客户端通道的 Keep-alive 超时值。超时值必须大于零。

20000

spring.ai.vectorstore.milvus.client.rpc-deadline-ms

愿意等待服务器回复的截止时间。设置截止时间后,客户端在遇到由网络波动引起的快速 RPC 失败时将等待。截止时间值必须大于或等于零。

0

spring.ai.vectorstore.milvus.client.client-key-path

用于 TLS 双向认证的 client.key 路径,仅当 "secure" 为 true 时生效

-

spring.ai.vectorstore.milvus.client.client-pem-path

用于 TLS 双向认证的 client.pem 路径,仅当 "secure" 为 true 时生效

-

spring.ai.vectorstore.milvus.client.ca-pem-path

用于 TLS 双向认证的 ca.pem 路径,仅当 "secure" 为 true 时生效

-

spring.ai.vectorstore.milvus.client.server-pem-path

用于 TLS 单向认证的 server.pem 路径,仅当 "secure" 为 true 时生效。

-

spring.ai.vectorstore.milvus.client.server-name

设置 SSL 主机名检查的目标名称覆盖,仅当 "secure" 为 True 时生效。注意:此值会传递给 grpc.ssl_target_name_override

-

spring.ai.vectorstore.milvus.client.secure

保护此连接的授权,设置为 True 以启用 TLS。

false

spring.ai.vectorstore.milvus.client.idle-timeout-ms

客户端通道的空闲超时值。超时值必须大于零。

24h

spring.ai.vectorstore.milvus.client.username

此连接的用户名和密码。

root

spring.ai.vectorstore.milvus.client.password

此连接的密码。

milvus

启动 Milvus Store

src/test/resources/ 文件夹中运行

docker-compose up

清理环境

docker-compose down; rm -Rf ./volumes

然后连接到 http://localhost:19530 上的向量存储,或连接管理界面 http://localhost:9001 (用户: minioadmin, 密码: minioadmin)

故障排除

如果 Docker 提示资源问题,则执行

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

访问原生客户端

Milvus Vector Store 实现通过 getNativeClient() 方法提供对底层原生 Milvus 客户端 (MilvusServiceClient) 的访问

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
}

原生客户端让您可以访问 Milvus 特定的功能和操作,这些功能和操作可能不会通过 VectorStore 接口暴露。