Milvus

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

先決條件

  • 一個正在運行的 Milvus 實例。以下選項可用:

  • 如果需要,用於 EmbeddingModel 的 API 金鑰,以產生由 MilvusVectorStore 儲存的嵌入向量。

相依性

然後將 Milvus VectorStore 啟動器相依性新增到您的專案中

<dependency>
	<groupId>org.springframework.ai</groupId>
	<artifactId>spring-ai-milvus-store-spring-boot-starter</artifactId>
</dependency>

或新增到您的 Gradle build.gradle 建置檔案中。

dependencies {
    implementation 'org.springframework.ai:spring-ai-milvus-store-spring-boot-starter'
}
請參閱相依性管理章節,將 Spring AI BOM 新增到您的建置檔案中。請參閱儲存庫章節,將 Milestone 和/或 Snapshot 儲存庫新增到您的建置檔案中。

向量儲存實作可以為您初始化必要的結構描述,但您必須選擇加入,方法是在適當的建構子中指定 initializeSchema 布林值,或在 application.properties 檔案中設定 …​initialize-schema=true

這是一個重大變更!在 Spring AI 的早期版本中,此結構描述初始化是預設發生的。

Vector Store 也需要一個 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.query("Spring").withTopK(5));

手動組態

除了使用 Spring Boot 自動組態之外,您還可以手動組態 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) {
		MilvusVectorStoreConfig config = MilvusVectorStoreConfig.builder()
			.withCollectionName("test_vector_store")
			.withDatabaseName("default")
			.withIndexType(IndexType.IVF_FLAT)
			.withMetricType(MetricType.COSINE)
			.build();
		return new MilvusVectorStore(milvusClient, embeddingModel, config);
	}

	@Bean
	public MilvusServiceClient milvusClient() {
		return new MilvusServiceClient(ConnectParam.newBuilder()
			.withAuthorization("minioadmin", "minioadmin")
			.withUri(milvusContainer.getEndpoint())
			.build());
	}

中繼資料篩選

您可以將通用的、可移植的 中繼資料篩選器 與 Milvus 儲存庫一起使用。

例如,您可以使用文字運算式語言

vectorStore.similaritySearch(
    SearchRequest.defaults()
    .withQuery("The World")
    .withTopK(TOP_K)
    .withSimilarityThreshold(SIMILARITY_THRESHOLD)
    .withFilterExpression("author in ['john', 'jill'] && article_type == 'blog'"));

或以程式設計方式使用 Filter.Expression DSL

FilterExpressionBuilder b = new FilterExpressionBuilder();

vectorStore.similaritySearch(SearchRequest.defaults()
    .withQuery("The World")
    .withTopK(TOP_K)
    .withSimilarityThreshold(SIMILARITY_THRESHOLD)
    .withFilterExpression(b.and(
        b.in("author","john", "jill"),
        b.eq("article_type", "blog")).build()));
這些篩選運算式會轉換為對等的 Milvus 篩選器。

Milvus VectorStore 屬性

您可以在您的 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 集合的度量類型。

COSINE

spring.ai.vectorstore.milvus.index-parameters

要用於 Milvus 集合的索引參數。

{"nlist":1024}

spring.ai.vectorstore.milvus.id-field-name

集合的 ID 欄位名稱

doc_id

spring.ai.vectorstore.milvus.is-auto-id

布林標記,指示是否將自動 ID 用於 ID 欄位

false

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

作為身分驗證和授權用途的金鑰的 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

用戶端通道的閒置逾時值。逾時值必須大於零。

24 小時

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://127.0.0.1:19530 上的向量儲存庫,或連線到 https://127.0.0.1:9001 進行管理 (使用者:minioadmin,密碼:minioadmin)

疑難排解

如果 Docker 抱怨資源不足,則執行

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