Milvus

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

先决条件

  • 运行中的 Milvus 实例。以下选项可用:

  • 如果需要,EmbeddingClient 的 API 密钥用于生成 MilvusVectorStore 存储的嵌入。

依赖

然后将 Milvus VectorStore 引导启动依赖项添加到您的项目中:

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

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

dependencies {
    implementation 'org.springframework.ai:spring-ai-milvus-store-spring-boot-starter'
}

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

请参阅依赖管理部分,将 Spring AI BOM 添加到您的构建文件中。请参阅仓库部分,将里程碑和/或快照仓库添加到您的构建文件中。

要连接并配置 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")));

// 将文档添加到 PGVector
vectorStore.add(documents);

// 检索与查询类似的文档
List<Document> results = vectorStore.similaritySearch(SearchRequest.query("Spring").withTopK(5));

手动配置

您可以手动配置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, EmbeddingClient embeddingClient) {
		MilvusVectorStoreConfig config = MilvusVectorStoreConfig.builder()
			.withCollectionName("test_vector_store")
			.withDatabaseName("default")
			.withIndexType(IndexType.IVF_FLAT)
			.withMetricType(MetricType.COSINE)
			.build();
		return new MilvusVectorStore(milvusClient, embeddingClient, config);
	}

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

元数据过滤

您可以利用通用、便携的元数据过滤器与 Milvus 存储。

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

vectorStore.similaritySearch(
    SearchRequest.defaults()
    .withQuery("The World")
    .withTopK(TOP_K)
    .withSimilarityThreshold(SIMILARITY_THRESHOLD)
    .withFilterExpression("author in ['john', 'jill'] && article_type == 'blog'"));

或者以编程方式使用 Filter.Expression DSL:

FilterExpressionBuilder b = new FilterExpressionBuilder();

vectorStore.similaritySearch(SearchRequest.defaults()
    .withQuery("The World")
    .withTopK(TOP_K)
    .withSimilarityThreshold(SIMILARITY_THRESHOLD)
    .withFilterExpression(b.and(
        b.in("john", "jill"),
        b.eq("article_type", "blog")).build()));
这些过滤表达式将转换为相应的 PgVector 过滤器。

Milvus VectorStore 属性

您可以使用以下属性来定制 Milvus 向量存储的 Spring Boot 配置。

属性 描述 默认值

spring.ai.vectorstore.milvus.database-name

要使用的Milvus数据库的名称。

默认

spring.ai.vectorstore.milvus.collection-name

用于存储向量的Milvus集合名称

vector_store

spring.ai.vectorstore.milvus.embedding-dimension

要存储在Milvus集合中的向量的维度。

1536

spring.ai.vectorstore.milvus.index-type

要为Milvus集合创建的索引类型。

IVF_FLAT

spring.ai.vectorstore.milvus.metric-type

要用于Milvus集合的度量类型。

COSINE

spring.ai.vectorstore.milvus.index-parameters

要用于Milvus集合的索引参数。

{"nlist":1024}

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

用于身份验证和认证目的的密钥。

-

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

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

10000

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

客户端通道的保持活跃时间值。保持活跃值必须大于零。

55000

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

客户端通道的保持活跃超时值。超时值必须大于零。

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

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

24小时

spring.ai.vectorstore.milvus.client.username

此连接的用户名和密码。

root

spring.ai.vectorstore.milvus.client.password

此连接的密码。

milvus

启动 Milvus 存储

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