Milvus
Milvus 是一个开源的向量数据库,在数据科学和机器学习领域引起了广泛关注。其突出特点之一在于其对向量索引和查询的强力支持。Milvus 采用了最先进的算法来加速搜索过程,使其在处理大规模数据集时,检索相似向量的效率尤为出色。
先决条件
-
一个正在运行的 Milvus 实例。以下选项可用:
-
Milvus Standalone:Docker、Operator、Helm、DEB/RPM、Docker Compose。
-
Milvus Cluster:Operator、Helm。
-
-
如果需要,可以为 EmbeddingModel 提供一个 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'
}
向量存储实现可以为你初始化所需的模式(schema),但你必须通过在适当的构造函数中指定 initializeSchema
布尔值,或者在 application.properties
文件中设置 …initialize-schema=true
来选择启用此功能。
这是一个重大变更!在 Spring AI 的早期版本中,默认情况下会进行此模式初始化。
向量存储(Vector Store)同样需要一个 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.builder().query("Spring").topK(5).build());
手动配置
你可以手动配置 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, 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 过滤器。
Milvus VectorStore 属性
你可以在 Spring Boot 配置中使用以下属性来自定义 Milvus 向量存储。
属性 | 描述 | 默认值 |
---|---|---|
spring.ai.vectorstore.milvus.database-name | 使用的 Milvus 数据库名称。 | 默认 |
spring.ai.vectorstore.milvus.collection-name | 存储向量的 Milvus collection 名称 | 向量存储 |
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 | 集合的内容字段名称 | 内容 |
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.uri | Milvus 实例的 uri | - |
spring.ai.vectorstore.milvus.client.token | 作为识别和认证目的的密钥的 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 | server.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 | 客户端通道的空闲超时值。超时值必须大于零。 | 24 小时 |
spring.ai.vectorstore.milvus.client.username | 此连接的用户名和密码。 | 根 |
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 特定功能和操作。