米尔弗斯
Milvus 是一个开源的矢量数据库,在数据科学和机器学习领域引起了广泛关注。其一大亮点是对向量索引和查询的强大支持。Milvus采用最先进的算法加速搜索过程,即使在处理大量数据集时,也极为高效地检索相似向量。
前提条件
-
一个运行中的米尔弗斯实例。以下选项可供选择:
-
Milvus 独立:Docker、Operator、Helm、DEB/RPM、Docker Compose。
-
米尔弗斯簇:操作员,舵手。
-
-
如有需要,需为 EmbeddingModel 提供 API 密钥,以生成存储于
MilvusVectorStore.
依赖
|
春季AI自动配置、起始模块的工件名称发生了重大变化。 更多信息请参阅升级说明。 |
然后把 Milvus VectorStore 启动启动依赖添加到你的项目中:
<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'
}
向量存储实现可以帮你初始化所需的模式,但你必须通过指定初始化模式在适当的构造函数中进行布尔值,或通过设置…initialize-schema=true在application.properties文件。
| 这是一个颠覆性的变革!在早期版本的 Spring AI 中,这种模式初始化是默认的。 |
向量存储还需要嵌入模型实例用于计算文档的嵌入。
你可以选择其中一种可用的嵌入模型实现。
连接并配置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.
为你的项目添加以下依赖:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-milvus-store</artifactId>
</dependency>
| 请参考依赖管理部分,将Spring AI的物料清单添加到你的构建文件中。 |
要在你的应用中配置 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());
或者程序化地使用滤波。表达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());
| 这些滤波表达式被转换为等效的MilvusFilter。 |
使用 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 向量存储属性
你可以在 Spring Boot 配置中使用以下属性来自定义 Milvus 向量存储。
| 属性 | 描述 | 默认值 |
|---|---|---|
spring.ai.vectorstore.milvus.database-name |
用Milvus数据库的名称。 |
默认值 |
spring.ai.vectorstore.milvus.collection-name |
用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-parameters- |
用于 Milvus 集合的索引参数。 |
{“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 |
该集合的内容字段名称 |
内容 |
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 |
米尔弗斯实例的乌里 |
- |
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 |
保持生命值客户渠道的时间价值。保持生命值必须大于零。 |
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路径仅在“安全”为真时生效 |
- |
Spring.ai.vectorstore.milvus.client.client-pem-path |
client.pem 路径用于 TLS 双向认证,只有在“安全”为真时才生效 |
- |
spring.ai.vectorstore.milvus.client.ca-pem-path |
ca.pem 路径用于 tls 双向认证,只有当“secure”为真时才生效 |
- |
spring.ai.vectorstore.milvus.client.server-pem-path |
server.pem 路径用于 TLS 单向认证,仅在“安全”为真时生效。 |
- |
spring.ai.vectorstore.milvus.client.server-name |
设置 SSL 主机名称检查的目标名称覆盖,仅在“安全”为真时生效。注:此值传递给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(Spring.ai.vectorstore.milvus.client.password) |
这个连接的密码。 |
米尔维斯 |
开设Milvus商店
从内部src/测试/资源/文件夹运行:
docker-compose up
清洁环境:
docker-compose down; rm -Rf ./volumes
然后连接到向量存储器,在 http://localhost:19530 或管理 http://localhost:9001(用户:minioadmin通过:minioadmin)
访问本地客户端
Milvus 向量存储实现提供了对底层原生 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接口。