Milvus
Milvus 是一個開源向量資料庫,在資料科學和機器學習領域備受關注。其突出的特點之一在於對向量索引和查詢的強大支援。Milvus 採用了最先進的尖端演算法來加速搜尋過程,即使處理海量資料集,也能極高效地檢索相似向量。
先決條件
-
正在執行的 Milvus 例項。以下選項可用
-
Milvus Standalone(獨立版): Docker, Operator, Helm, DEB/RPM, Docker Compose.
-
Milvus Cluster(叢集版): Operator, Helm.
-
-
如果需要,用於 EmbeddingModel(嵌入模型) 的 API 金鑰,用於生成由
MilvusVectorStore
儲存的嵌入。
依賴項
Spring AI 自動配置、Starter 模組的 artifact 名稱發生了重大變化。更多資訊請參閱升級說明。 |
然後將 Milvus VectorStore boot starter 依賴項新增到您的專案
<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'
}
向量儲存實現可以為您初始化所需的 Schema,但您必須透過在適當的建構函式中指定 initializeSchema
布林值,或在 application.properties
檔案中設定 …initialize-schema=true
來選擇開啟此功能。
這是一個破壞性變更!在早期版本的 Spring AI 中,Schema 初始化是預設發生的。 |
向量儲存還需要一個 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
,而不是使用 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 特定的搜尋功能時提供了更大的靈活性。
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 資料庫名稱。 |
default |
spring.ai.vectorstore.milvus.collection-name |
用於儲存向量的 Milvus Collection 名稱 |
vector_store |
spring.ai.vectorstore.milvus.initialize-schema |
是否初始化 Milvus 後端 |
false |
spring.ai.vectorstore.milvus.embedding-dimension |
儲存在 Milvus Collection 中的向量維度。 |
1536 |
spring.ai.vectorstore.milvus.index-type |
為 Milvus Collection 建立的索引型別。 |
IVF_FLAT |
spring.ai.vectorstore.milvus.metric-type |
用於 Milvus Collection 的度量型別(Metric Type)。 |
COSINE |
spring.ai.vectorstore.milvus.index-parameters |
用於 Milvus Collection 的索引引數。 |
{"nlist":1024} |
spring.ai.vectorstore.milvus.id-field-name |
Collection 的 ID 欄位名稱 |
doc_id |
spring.ai.vectorstore.milvus.is-auto-id |
布林標誌,指示 ID 欄位是否使用 auto-id |
false |
spring.ai.vectorstore.milvus.content-field-name |
Collection 的內容欄位名稱 |
content |
spring.ai.vectorstore.milvus.metadata-field-name |
Collection 的元資料欄位名稱 |
metadata |
spring.ai.vectorstore.milvus.embedding-field-name |
Collection 的嵌入欄位名稱 |
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 |
用作身份識別和認證目的的 Token。 |
- |
spring.ai.vectorstore.milvus.client.connect-timeout-ms |
客戶端通道的連線超時值。超時值必須大於零。 |
10000 |
spring.ai.vectorstore.milvus.client.keep-alive-time-ms |
客戶端通道的 Keep-alive 時間值。Keep-alive 值必須大於零。 |
55000 |
spring.ai.vectorstore.milvus.client.keep-alive-timeout-ms |
客戶端通道的 Keep-alive 超時值。超時值必須大於零。 |
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。 |
false |
spring.ai.vectorstore.milvus.client.idle-timeout-ms |
客戶端通道的空閒超時值。超時值必須大於零。 |
24h |
spring.ai.vectorstore.milvus.client.username |
此連線的使用者名稱和密碼。 |
root |
spring.ai.vectorstore.milvus.client.password |
此連線的密碼。 |
milvus |
啟動 Milvus Store
在 src/test/resources/
資料夾中執行
docker-compose up
清理環境
docker-compose down; rm -Rf ./volumes
然後連線到 https://:19530 上的向量儲存,或連線管理介面 https://:9001 (使用者: minioadmin
, 密碼: minioadmin
)
訪問原生客戶端
Milvus Vector Store 實現透過 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
}
原生客戶端讓您可以訪問 Milvus 特定的功能和操作,這些功能和操作可能不會透過 VectorStore
介面暴露。