跳到主要内容
版本:2.0.1

Milvus

QWen 3.8 中英对照 Milvus

Milvus 是一款开源向量数据库,在数据科学和机器学习领域引起了广泛关注。其突出特点之一在于对向量索引和查询的强健支持。Milvus 采用最先进的尖端算法来加速搜索过程,使其在检索相似向量时表现出极高的效率,即使在处理大规模数据集时也不例外。

前置条件​

  • 正在运行的 Milvus 实例。可用选项包括:

  • 如果需要,则需提供用于 EmbeddingModel 的 API 密钥,以生成由 MilvusVectorStore 存储的嵌入向量。

依赖项​

备注

Spring AI 自动配置(auto-configuration)和 starter 模块的 artifact 名称发生了重大变更。更多信息请参阅 升级说明。

然后在项目中添加 Milvus VectorStore 启动器依赖项:

<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'
}
提示

参考 Dependency Management 章节,将 Spring AI BOM 添加到构建文件中。参考 Artifact Repositories 章节,将 Maven Central 和/或 Snapshot 仓库添加到构建文件中。

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

备注

这是一项破坏性变更!在 Spring AI 的早期版本中,该 schema 初始化是默认执行的。

Vector Store 同样需要一个 EmbeddingModel 实例来计算文档的 embeddings。您可以从可用的 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
提示

查看配置参数列表,了解默认值和配置选项。

现在你可以在应用中自动装配(Auto-wire) 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());

手动配置​

除了使用 Spring Boot 自动配置外,你还可以手动配置 MilvusVectorStore。请向项目添加以下依赖:

<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-milvus-store</artifactId>
</dependency>
提示

请参考 Dependency Management 部分,将 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 过滤器。

备注

当从搜索结果中读取元数据时,数值将通过 Gson 进行反序列化。整数值将作为 Long 类型返回,十进制数值将作为 Double 类型返回。那些直接将整数元数据字段强制转换为 Double 的代码,应更新为使用 Long 或 Number 父类型。

使用 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 特定的搜索功能时具有更大的灵活性。

MilvusSearchRequest 中 nativeExpression 和 searchParamsJson 的重要性

QWen 3.8 中英对照 Milvus Importance of nativeExpression and searchParamsJson in MilvusSearchRequest

这两个参数提升了 Milvus 的搜索精度,并确保最佳的查询性能:

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

示例:

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

searchParamsJson: 在使用 Milvus 默认索引 IVF_FLAT 时,用于调优搜索行为。Milvus Vector Index

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

示例:

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

使用 nativeExpression 可确保高级筛选功能,而 searchParamsJson 则能避免因默认 nprobe 值较低而导致的低效搜索。

Milvus 向量存储属性​

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

属性描述默认值
spring.ai.vectorstore.milvus.database-name要使用的 Milvus 数据库名称。default
spring.ai.vectorstore.milvus.collection-name用于存储向量的 Milvus 集合名称vector_store
spring.ai.vectorstore.milvus.partition-name用于限定插入、删除和搜索操作的现有 Milvus 分区名称。如果未设置或为空,则使用 Milvus 的默认行为。-
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-parametersMilvus 集合所使用的索引参数。{"nlist":1024}
spring.ai.vectorstore.milvus.id-field-name集合的 ID 字段名称doc_id
spring.ai.vectorstore.milvus.auto-id表示是否为 ID 字段使用自增标识的布尔型标志false
spring.ai.vectorstore.milvus.content-field-name集合的内容字段名称content
spring.ai.vectorstore.milvus.metadata-field-name集合的元数据字段名称元数据
spring.ai.vectorstore.milvus.embedding-field-name集合的嵌入字段名称嵌入
spring.ai.vectorstore.milvus.client.host主机名称或地址。localhost
spring.ai.vectorstore.milvus.client.port连接端口。19530
spring.ai.vectorstore.milvus.client.uriMilvus 实例的 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客户端通道的 keep-alive 超时值。该超时值必须大于零。20000
spring.ai.vectorstore.milvus.client.rpc-deadline-ms用于设置等待服务器回复的时长上限。当遇到因网络波动导致的快速 RPC 失败时,设置了 deadline 的客户端会进行等待。deadline 值必须大于或等于零。0
spring.ai.vectorstore.milvus.client.client-key-pathclient.key 路径用于 TLS 双向认证,仅在 "secure" 为 true 时生效-
spring.ai.vectorstore.milvus.client.client-pem-path当 “secure” 为 true 时,用于 TLS 双向认证的 client.pem 路径才生效-
spring.ai.vectorstore.milvus.client.ca-pem-pathtls 双向认证所使用的 ca.pem 路径,仅当 "secure" 为 true 时生效-
spring.ai.vectorstore.milvus.client.server-pem-pathserver.pem 的路径,用于 TLS 单向认证,仅在 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 向量存储实现通过 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
}

原生客户端可让您访问可能未通过 VectorStore 接口暴露的 Milvus 特定功能和操作。