Milvus
Milvus 是一個開源向量資料庫,在資料科學和機器學習領域引起了廣泛關注。其突出特點之一是它對向量索引和查詢的強大支援。Milvus 採用最先進的尖端演算法來加速搜尋過程,使其在檢索相似向量方面效率極高,即使處理大量資料集時也是如此。
先決條件
-
正在執行的 Milvus 例項。以下選項可用
-
Milvus Standalone:Docker、Operator、Helm、DEB/RPM、Docker Compose。
-
Milvus Cluster:Operator、Helm。
-
-
如果需要,用於EmbeddingModel 的 API 金鑰,以生成由
MilvusVectorStore儲存的嵌入。
依賴項
|
Spring AI 自動配置、啟動模組的工件名稱發生了重大變化。請參閱 升級說明 以獲取更多資訊。 |
然後將 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'
}
| 請參閱依賴管理部分,將 Spring AI BOM 新增到您的構建檔案中。請參閱Artifact Repositories部分,將 Maven Central 和/或 Snapshot Repositories 新增到您的構建檔案中。 |
向量儲存實現可以為您初始化所需的模式,但您必須透過在相應的建構函式中指定 initializeSchema 布林值或在 application.properties 檔案中設定 ...initialize-schema=true 來選擇啟用。
| 這是一個重大更改!在早期版本的 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 向量儲存並使用它
@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 過濾器。 |
使用 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 的重要性
這兩個引數可提高 Milvus 搜尋精度並確保最佳查詢效能
nativeExpression:使用 Milvus 的原生過濾表示式啟用額外的過濾功能。Milvus 過濾
示例
MilvusSearchRequest request = MilvusSearchRequest.milvusBuilder()
.query("sample query")
.topK(5)
.nativeExpression("metadata['category'] == 'science'")
.build();
searchParamsJson:在使用 IVF_FLAT(Milvus 的預設索引)時,對於調整搜尋行為至關重要。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 資料庫的名稱。 |
default |
spring.ai.vectorstore.milvus.collection-name |
儲存向量的 Milvus 集合名稱 |
vector_store |
spring.ai.vectorstore.milvus.initialize-schema |
是否初始化 Milvus 的後端 |
假 |
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.auto-id |
布林標誌,指示是否對 ID 欄位使用自動 ID |
假 |
spring.ai.vectorstore.milvus.content-field-name |
集合的內容欄位名稱 |
content |
spring.ai.vectorstore.milvus.metadata-field-name |
集合的元資料欄位名稱 |
metadata |
spring.ai.vectorstore.milvus.embedding-field-name |
集合的嵌入欄位名稱 |
embedding |
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 |
作為識別和身份驗證目的的金鑰的令牌。 |
- |
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 |
用於 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。 |
假 |
spring.ai.vectorstore.milvus.client.idle-timeout-ms |
客戶端通道的空閒超時值。超時值必須大於零。 |
24h |
spring.ai.vectorstore.milvus.client.username |
此連線的使用者名稱和密碼。 |
root |
spring.ai.vectorstore.milvus.client.password |
此連線的密碼。 |
milvus |
啟動 Milvus 儲存
在 src/test/resources/ 資料夾中執行
docker-compose up
清理環境
docker-compose down; rm -Rf ./volumes
然後連線到向量儲存 https://:19530 或管理 https://:9001(使用者:minioadmin,密碼:minioadmin)
訪問原生客戶端
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 特定功能和操作。