Milvus

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

先决条件

  • 一个正在运行的 Milvus 实例。以下选项可用

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

依赖项

然后将 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'
}
请参考 依赖管理 部分,将 Spring AI BOM 添加到您的构建文件中。请参考 仓库 部分,将里程碑和/或快照仓库添加到您的构建文件中。

向量存储实现可以为您初始化所需的模式,但您必须通过在相应的构造函数中指定 `initializeSchema` 布尔值或在 `application.properties` 文件中设置 `…​initialize-schema=true` 来选择加入。

这是一个重大更改!在早期版本的 Spring AI 中,此模式初始化默认启用。

向量存储还需要一个 `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 向量存储并使用它

@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.query("Spring").withTopK(5));

手动配置

无需使用 Spring Boot 自动配置,您可以手动配置 `MilvusVectorStore`。将以下依赖项添加到您的项目中

<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) {
		MilvusVectorStoreConfig config = MilvusVectorStoreConfig.builder()
			.withCollectionName("test_vector_store")
			.withDatabaseName("default")
			.withIndexType(IndexType.IVF_FLAT)
			.withMetricType(MetricType.COSINE)
			.build();
		return new MilvusVectorStore(milvusClient, embeddingModel, 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("author","john", "jill"),
        b.eq("article_type", "blog")).build()));
这些过滤器表达式将转换为等效的 Milvus 过滤器。

Milvus VectorStore 属性

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

属性 描述 默认值

spring.ai.vectorstore.milvus.database-name

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

default

spring.ai.vectorstore.milvus.collection-name

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

vector_store

spring.ai.vectorstore.milvus.initialize-schema

是否初始化 Milvus 后端

false

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.id-field-name

集合的 ID 字段名称

doc_id

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

布尔标志,指示是否为 ID 字段使用自动 ID

false

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

集合的内容字段名称

content

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

集合的元数据字段名称

metadata

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

集合的嵌入字段名称

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

用作身份验证和授权密钥的令牌。

-

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

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

24h

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

然后连接到 https://127.0.0.1:19530 上的向量存储,或连接到 https://127.0.0.1:9001 进行管理 (用户:minioadmin,密码:minioadmin)

故障排除

如果 Docker 抱怨资源不足,请执行

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