Milvus

Milvus 是一個開源向量資料庫,在資料科學和機器學習領域備受關注。其突出的特點之一在於對向量索引和查詢的強大支援。Milvus 採用了最先進的尖端演算法來加速搜尋過程,即使處理海量資料集,也能極高效地檢索相似向量。

先決條件

依賴項

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'
}
請參閱依賴管理部分,將 Spring AI BOM 新增到您的構建檔案。請參閱倉庫部分,將 Maven Central 和/或 Snapshot 倉庫新增到您的構建檔案。

向量儲存實現可以為您初始化所需的 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 特定的搜尋功能時提供了更大的靈活性。

nativeExpressionsearchParamsJsonMilvusSearchRequest 中的重要性

這兩個引數增強了 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)

故障排除

如果 Docker 提示資源問題,則執行

docker system prune --all --force --volumes

訪問原生客戶端

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 介面暴露。