Weaviate

本節將引導您設定 Weaviate VectorStore 以儲存文件嵌入並執行相似性搜尋。

Weaviate 是一個開源向量資料庫,允許您儲存資料物件和來自您偏好的 ML 模型向量嵌入,並無縫擴充套件到數十億個資料物件。它提供了儲存文件嵌入、內容和元資料以及搜尋這些嵌入的工具,包括元資料過濾功能。

先決條件

依賴

Spring AI 自動配置、starter 模組的 artifact 名稱發生了重大變化。有關更多資訊,請參閱升級說明

將 Weaviate Vector Store 依賴新增到您的專案

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-weaviate-store</artifactId>
</dependency>

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

dependencies {
    implementation 'org.springframework.ai:spring-ai-weaviate-store'
}
請參閱依賴管理章節,將 Spring AI BOM 新增到您的構建檔案。

配置

要連線到 Weaviate 並使用 WeaviateVectorStore,您需要提供例項的訪問詳細資訊。可以透過 Spring Boot 的 application.properties 提供簡單的配置,

spring.ai.vectorstore.weaviate.host=<host_of_your_weaviate_instance>
spring.ai.vectorstore.weaviate.scheme=<http_or_https>
spring.ai.vectorstore.weaviate.api-key=<your_api_key>
# API key if needed, e.g. OpenAI
spring.ai.openai.api-key=<api-key>

環境變數,

export SPRING_AI_VECTORSTORE_WEAVIATE_HOST=<host_of_your_weaviate_instance>
export SPRING_AI_VECTORSTORE_WEAVIATE_SCHEME=<http_or_https>
export SPRING_AI_VECTORSTORE_WEAVIATE_API_KEY=<your_api_key>
# API key if needed, e.g. OpenAI
export SPRING_AI_OPENAI_API_KEY=<api-key>

或者可以混合使用。

如果您選擇建立一個 shell 指令碼以便於將來的工作,請務必在啟動應用程式之前透過“source”檔案來執行它,例如 source <您的指令碼名稱>.sh

自動配置

Spring AI 為 Weaviate Vector Store 提供了 Spring Boot 自動配置。要啟用它,請將以下依賴項新增到您的專案的 Maven pom.xml 檔案中

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-vector-store-weaviate</artifactId>
</dependency>

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

dependencies {
    implementation 'org.springframework.ai:spring-ai-starter-vector-store-weaviate'
}
請參閱依賴管理章節,將 Spring AI BOM 新增到您的構建檔案。

請檢視向量儲存的配置引數列表,瞭解預設值和配置選項。

請參閱倉庫章節,將 Maven Central 和/或 Snapshot 倉庫新增到您的構建檔案。

此外,您還需要一個配置好的 EmbeddingModel bean。有關更多資訊,請參閱EmbeddingModel章節。

以下是所需 bean 的示例

@Bean
public EmbeddingModel embeddingModel() {
    // Can be any other Embeddingmodel implementation.
    return new OpenAiEmbeddingModel(new OpenAiApi(System.getenv("SPRING_AI_OPENAI_API_KEY")));
}

現在您可以在應用程式中將 WeaviateVectorStore 自動注入為向量儲存。

手動配置

您可以使用 builder 模式手動配置 WeaviateVectorStore,而不是使用 Spring Boot 自動配置

@Bean
public WeaviateClient weaviateClient() {
    return new WeaviateClient(new Config("http", "localhost:8080"));
}

@Bean
public VectorStore vectorStore(WeaviateClient weaviateClient, EmbeddingModel embeddingModel) {
    return WeaviateVectorStore.builder(weaviateClient, embeddingModel)
        .objectClass("CustomClass")                    // Optional: defaults to "SpringAiWeaviate"
        .consistencyLevel(ConsistentLevel.QUORUM)      // Optional: defaults to ConsistentLevel.ONE
        .filterMetadataFields(List.of(                 // Optional: fields that can be used in filters
            MetadataField.text("country"),
            MetadataField.number("year")))
        .build();
}

元資料過濾

您也可以在 Weaviate 儲存中使用通用、可移植的元資料過濾器

例如,您可以使用文字表示式語言

vectorStore.similaritySearch(
    SearchRequest.builder()
        .query("The World")
        .topK(TOP_K)
        .similarityThreshold(SIMILARITY_THRESHOLD)
        .filterExpression("country in ['UK', 'NL'] && year >= 2020").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("country", "UK", "NL"),
        b.gte("year", 2020)).build()).build());
這些(可移植的)過濾器表示式會自動轉換為 Weaviate 專有的where 過濾器

例如,這個可移植的過濾器表示式

country in ['UK', 'NL'] && year >= 2020

被轉換為 Weaviate 專有的 GraphQL 過濾器格式

operator: And
operands:
    [{
        operator: Or
        operands:
            [{
                path: ["meta_country"]
                operator: Equal
                valueText: "UK"
            },
            {
                path: ["meta_country"]
                operator: Equal
                valueText: "NL"
            }]
    },
    {
        path: ["meta_year"]
        operator: GreaterThanEqual
        valueNumber: 2020
    }]

在 Docker 中執行 Weaviate

要快速啟動本地 Weaviate 例項,您可以在 Docker 中執行它

docker run -it --rm --name weaviate \
    -e AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=true \
    -e PERSISTENCE_DATA_PATH=/var/lib/weaviate \
    -e QUERY_DEFAULTS_LIMIT=25 \
    -e DEFAULT_VECTORIZER_MODULE=none \
    -e CLUSTER_HOSTNAME=node1 \
    -p 8080:8080 \
    semitechnologies/weaviate:1.22.4

這將啟動一個可透過 localhost:8080 訪問的 Weaviate 例項。

WeaviateVectorStore 屬性

您可以在 Spring Boot 配置中使用以下屬性來自定義 Weaviate 向量儲存。

屬性 描述 預設值

spring.ai.vectorstore.weaviate.host

Weaviate 伺服器的主機

localhost:8080

spring.ai.vectorstore.weaviate.scheme

連線 schema

http

spring.ai.vectorstore.weaviate.api-key

用於認證的 API 金鑰

spring.ai.vectorstore.weaviate.object-class

spring.ai.vectorstore.weaviate.object-class

用於儲存文件的類名

spring.ai.vectorstore.weaviate.consistency-level

一致性與速度之間的預期權衡

ConsistentLevel.ONE

spring.ai.vectorstore.weaviate.filter-field

配置可在過濾器中使用的元資料欄位。格式:spring.ai.vectorstore.weaviate.filter-field.<欄位名>=<欄位型別>

訪問原生客戶端

Weaviate Vector Store 實現透過 getNativeClient() 方法提供對底層原生 Weaviate 客戶端 (WeaviateClient) 的訪問

WeaviateVectorStore vectorStore = context.getBean(WeaviateVectorStore.class);
Optional<WeaviateClient> nativeClient = vectorStore.getNativeClient();

if (nativeClient.isPresent()) {
    WeaviateClient client = nativeClient.get();
    // Use the native client for Weaviate-specific operations
}

原生客戶端允許您訪問 Weaviate 特定的功能和操作,這些功能和操作可能不會透過 VectorStore 介面暴露。