此版本仍在开发中,尚不被认为是稳定的。对于最新的快照版本,请使用 Spring AI 1.0.1! |
米尔瓦斯
Milvus 是一个开源向量数据库,在数据科学和机器学习领域引起了广泛关注。其突出特点之一在于其对矢量索引和查询的强大支持。Milvus 采用最先进的尖端算法来加速搜索过程,使其即使在处理大量数据集时也能非常高效地检索相似的向量。
前提条件
-
正在运行的 Milvus 实例。以下选项可用:
-
Milvus 独立版:docker、operator、helm、DEB/RPM、docker compose。
-
Milvus 集群:干员、舵手。
-
-
如果需要,EmbeddingModel 的 API 密钥用于生成由
MilvusVectorStore
.
依赖
Spring AI 自动配置、入门模块的工件名称发生了重大变化。 有关更多信息,请参阅升级说明。 |
然后将 Milvus VectorStore 引导Starters依赖项添加到您的项目中:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-vector-store-milvus</artifactId>
</dependency>
或 Gradlebuild.gradle
构建文件。
dependencies {
implementation 'org.springframework.ai:spring-ai-starter-vector-store-milvus'
}
请参阅依赖项管理部分,将 Spring AI BOM 添加到构建文件中。 请参阅 Artifact Repositories 部分,将 Maven Central 和/或 Snapshot Repositories 添加到构建文件中。 |
矢量存储实现可以为您初始化必要的架构,但您必须通过指定initializeSchema
布尔值或通过…initialize-schema=true
在application.properties
文件。
这是一个重大变化!在早期版本的 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 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());
手动配置
您可以手动配置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) {
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 过滤器。 |
使用 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 特定的搜索功能时提供了更大的灵活性。
重要性nativeExpression
和searchParamsJson
在MilvusSearchRequest
这两个参数提高了 Milvus 搜索精度并确保最佳查询性能:
nativeExpression:使用 Milvus 的本机过滤表达式启用其他过滤功能。Milvus 过滤
例:
MilvusSearchRequest request = MilvusSearchRequest.milvusBuilder()
.query("sample query")
.topK(5)
.nativeExpression("metadata['category'] == 'science'")
.build();
searchParamsJson:对于使用 Milvus 的默认索引 IVF_FLAT 时调整搜索行为至关重要。Milvus 矢量指数
默认情况下,IVF_FLAT
需要nprobe
设置为准确的结果。如果未指定,nprobe
默认为1
,这可能导致回忆不良甚至搜索结果为零。
例:
MilvusSearchRequest request = MilvusSearchRequest.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 数据库的名称。 |
默认值 |
spring.ai.vectorstore.milvus.集合名称 |
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 集合的指标类型。 |
余弦 |
spring.ai.vectorstore.milvus.index参数 |
要用于 Milvus 集合的索引参数。 |
{“nlist”:1024} |
spring.ai.vectorstore.milvus.id-字段名称 |
集合的 ID 字段名称 |
doc_id |
spring.ai.vectorstore.milvus.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 |
主机的名称或地址。 |
本地主机 |
spring.ai.vectorstore.milvus.client.port |
连接端口。 |
19530 |
spring.ai.vectorstore.milvus.client.uri |
Milvus 实例的 uri |
- |
spring.ai.vectorstore.milvus.client.token |
Tokens作为识别和身份验证目的的密钥。 |
- |
spring.ai.vectorstore.milvus.client.connect-timeout-ms |
客户端通道的连接超时值。超时值必须大于零。 |
10000 |
spring.ai.vectorstore.milvus.client.keep-alive-time-ms |
客户端通道的保持活动时间值。keep-alive 值必须大于零。 |
55000 |
spring.ai.vectorstore.milvus.client.keep-alive-timeout-ms |
客户端通道的保持活动超时值。超时值必须大于零。 |
20000 |
spring.ai.vectorstore.milvus.client.rpc-截止日期-ms |
您愿意等待服务器回复多长时间的截止日期。通过截止时间设置,客户端会在遇到网络波动导致的快速 RPC 失败时等待。截止值必须大于或等于零。 |
0 |
spring.ai.vectorstore.milvus.client.client-key-path |
tls 双向身份验证的client.key路径,仅在“安全”为真时生效 |
- |
spring.ai.vectorstore.milvus.client.client-pem-路径 |
tls 双向身份验证的 client.pem 路径仅在“secure”为 true 时生效 |
- |
spring.ai.vectorstore.milvus.client.ca-pem-path |
tls 双向身份验证的 ca.pem 路径,仅在“secure”为真时生效 |
- |
spring.ai.vectorstore.milvus.client.server-pem-path |
server.pem 路径,仅当“安全”为真时才生效。 |
- |
spring.ai.vectorstore.milvus.client.server-name |
设置 SSL 主机名检查的目标名称覆盖,仅当“安全”为 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.用户名 |
此连接的用户名和密码。 |
根 |
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:9001(用户:minioadmin
通过:minioadmin
)
访问本机客户端
Milvus Vector Store 实现提供对底层原生 Milvus 客户端 (MilvusServiceClient
) 通过getNativeClient()
方法:
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
}
本机客户端允许您访问特定于 Milvus 的功能和作,这些功能和作可能不会通过VectorStore
接口。