
MilvusMilvus是一个开源的向量数据库在数据科学和机器学习领域受到了广泛关注。其突出特性之一在于对向量索引和查询的强大支持。Milvus采用最前沿的先进算法来加速搜索过程使其在检索相似向量时效率极高即使处理大规模数据集也是如此。先决条件一个正在运行的Milvus实例。以下选项可用Milvus StandaloneDocker、Operator、Helm、DEB/RPM、Docker Compose。Milvus ClusterOperator、Helm。如果需要为EmbeddingModel准备一个API密钥用于生成MilvusVectorStore存储的嵌入向量。依赖Spring AI自动配置和启动模块的工件名称发生了重大变化。请参阅升级说明以获取更多信息。然后将Milvus VectorStore启动器依赖项添加到您的项目中dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-vector-store-milvus/artifactId/dependency或者添加到您的Gradlebuild.gradle构建文件中。dependencies { implementation org.springframework.ai:spring-ai-starter-vector-store-milvus }请参阅依赖管理部分将Spring AI BOM添加到您的构建文件中。请参阅工件仓库部分将Maven中央仓库和/或快照仓库添加到您的构建文件中。向量存储实现可以为您初始化所需的模式但您必须通过在适当的构造函数中指定initializeSchema布尔值或在application.properties文件中设置...initialize-schematrue来选择启用。这是一个重大变更在早期版本的Spring AI中此模式初始化是默认发生的。向量存储还需要一个EmbeddingModel实例来计算文档的嵌入向量。您可以选择一个可用的EmbeddingModel实现。要连接和配置MilvusVectorStore您需要提供Milvus实例的访问详细信息。一个简单的配置可以通过Spring Boot的application.yml提供spring:ai:vectorstore:milvus:client:host:localhostport:19530username:rootpassword:milvusdatabaseName:defaultcollectionName:vector_storeembeddingDimension:1536indexType:IVF_FLATmetricType:COSINE请查看配置参数列表以了解默认值和配置选项。现在您可以在应用程序中自动装配Milvus向量存储并使用它AutowiredVectorStorevectorStore;// ...ListDocumentdocumentsList.of(newDocument(Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!!,Map.of(meta1,meta1)),newDocument(The World is Big and Salvation Lurks Around the Corner),newDocument(You walk forward facing the past and you turn back toward the future.,Map.of(meta2,meta2)));// 将文档添加到 Milvus 向量存储vectorStore.add(documents);// 检索与查询相似的文档ListDocumentresultsthis.vectorStore.similaritySearch(SearchRequest.builder().query(Spring).topK(5).build());手动配置您可以不使用Spring Boot自动配置而是手动配置MilvusVectorStore。将以下依赖项添加到您的项目中dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-milvus-store/artifactId/dependency请参阅依赖管理部分将Spring AI BOM添加到您的构建文件中。要在您的应用程序中配置MilvusVectorStore您可以使用以下设置BeanpublicVectorStorevectorStore(MilvusServiceClientmilvusClient,EmbeddingModelembeddingModel){returnMilvusVectorStore.builder(milvusClient,embeddingModel).collectionName(test_vector_store).databaseName(default).indexType(IndexType.IVF_FLAT).metricType(MetricType.COSINE).batchingStrategy(newTokenCountBatchingStrategy()).initializeSchema(true).build();}BeanpublicMilvusServiceClientmilvusClient(){returnnewMilvusServiceClient(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.ExpressionDSL 以编程方式构建FilterExpressionBuilderbnewFilterExpressionBuilder();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过滤器。使用 MilvusSearchRequestMilvusSearchRequest扩展了SearchRequest允许您使用Milvus特有的搜索参数如原生表达式native expressions和搜索参数JSONsearch parameter JSON。MilvusSearchRequestrequestMilvusSearchRequest.milvusBuilder().query(sample query).topK(5).similarityThreshold(0.7).nativeExpression(metadata[\age\] 30)// 如果同时设置了 nativeExpression则会覆盖 filterExpression.filterExpression(age 30)// 如果设置了 nativeExpression此设置将被忽略.searchParamsJson({\nprobe\:128}).build();ListresultsvectorStore.similaritySearch(request);这在使用Milvus特有的搜索功能时提供了更大的灵活性。nativeExpression 和 searchParamsJson 在 MilvusSearchRequest 中的重要性这两个参数增强了Milvus搜索的精度并确保了最佳的查询性能nativeExpression允许使用Milvus的原生过滤表达式进行额外的过滤。Milvus 过滤示例MilvusSearchRequestrequestMilvusSearchRequest.milvusBuilder().query(sample query).topK(5).nativeExpression(metadata[category] science).build();searchParamsJson在使用Milvus的默认索引IVF_FLAT时对于调整搜索行为至关重要。Milvus 向量索引默认情况下IVF_FLAT需要设置nprobe才能获得准确结果。如果未指定nprobe默认为1这可能导致较低的召回率甚至零搜索结果。示例MilvusSearchRequestrequestMilvusSearchRequest.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数据库名称。defaultspring.ai.vectorstore.milvus.collection-name用于存储向量的Milvus集合名称。vector_storespring.ai.vectorstore.milvus.initialize-schema是否初始化Milvus后端模式。falsespring.ai.vectorstore.milvus.embedding-dimension存储在Milvus集合中的向量的维度。1536spring.ai.vectorstore.milvus.index-type为Milvus集合创建的索引类型。IVF_FLATspring.ai.vectorstore.milvus.metric-type用于Milvus集合的度量类型。COSINEspring.ai.vectorstore.milvus.index-parameters用于Milvus集合的索引参数。{nlist:1024}spring.ai.vectorstore.milvus.id-field-name集合的ID字段名称。doc_idspring.ai.vectorstore.milvus.auto-id布尔标志指示ID字段是否使用自动ID。falsespring.ai.vectorstore.milvus.content-field-name集合的内容字段名称。contentspring.ai.vectorstore.milvus.metadata-field-name集合的元数据字段名称。metadataspring.ai.vectorstore.milvus.embedding-field-name集合的嵌入向量字段名称。embeddingspring.ai.vectorstore.milvus.client.host主机名或地址。localhostspring.ai.vectorstore.milvus.client.port连接端口。19530spring.ai.vectorstore.milvus.client.uriMilvus实例的URI。-spring.ai.vectorstore.milvus.client.token用作标识和身份验证密钥的令牌。-spring.ai.vectorstore.milvus.client.connect-timeout-ms客户端通道的连接超时值。该值必须大于零。10000spring.ai.vectorstore.milvus.client.keep-alive-time-ms客户端通道的保持活动时间值。该值必须大于零。55000spring.ai.vectorstore.milvus.client.keep-alive-timeout-ms客户端通道的保持活动超时值。该值必须大于零。20000spring.ai.vectorstore.milvus.client.rpc-deadline-ms等待服务器回复的截止时间。设置截止时间后当遇到网络波动导致的快速RPC失败时客户端将等待。该值必须大于或等于零。0spring.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。falsespring.ai.vectorstore.milvus.client.idle-timeout-ms客户端通道的空闲超时值。该值必须大于零。24hspring.ai.vectorstore.milvus.client.username此连接的用户名。rootspring.ai.vectorstore.milvus.client.password此连接的密码。milvus启动 Milvus Store在src/test/resources/文件夹内运行docker-composeup清理环境docker-composedown;rm-Rf./volumes然后通过http://localhost:19530连接到向量存储或通过http://localhost:9001用户minioadmin密码minioadmin进行管理。故障排除如果Docker报告资源不足请执行dockersystem prune--all--force--volumes访问原生客户端Milvus向量存储实现通过getNativeClient()方法提供对底层原生Milvus客户端MilvusServiceClient的访问MilvusVectorStorevectorStorecontext.getBean(MilvusVectorStore.class);OptionalMilvusServiceClientnativeClientvectorStore.getNativeClient();if(nativeClient.isPresent()){MilvusServiceClientclientnativeClient.get();// 使用原生客户端执行Milvus特有的操作}原生客户端让您可以访问可能未通过VectorStore接口公开的Milvus特有功能和操作。