链接:https://milvus.io/[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'
}

Vector Store同样需要一个`EmbeddingClient`实例来为文档计算嵌入向量。你可以选择一个可用的嵌入客户端实现

Tip
参考依赖管理部分,将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
Tip
查看配置参数的列表以了解默认值和配置选项。

现在您可以在应用程序中自动连接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")));

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

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

手动配置

与其使用Spring Boot自动配置,不如手动配置`MilvusVectorStore`。要将以下依赖项添加到您的项目中:

<dependency>
	<groupId>org.springframework.ai</groupId>
	<artifactId>spring-ai-milvus-store</artifactId>
</dependency>
Tip
参考依赖管理部分,将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 存储的通用、可移植的链接:https://docs.spring.io/spring-ai/reference/api/vectordbs.html#_metadata_filters[元数据过滤器]。

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

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()));
Note
这些过滤表达式被转换成相等的PgVector过滤器。

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.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

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

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

然后连接到链接上的向量存储:[http://localhost:19530](http://localhost:19530) 或者用于管理的链接:[http://localhost:9001](http://localhost:9001) (用户名:minioadmin,密码:minioadmin

故障排除

如果 Docker 抱怨资源问题,那么执行:

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