Weaviate

本节将引导您设置 Weaviate VectorStore 以存储文档嵌入并执行相似性搜索。

什么是 Weaviate?

Weaviate 是一个开源向量数据库。它允许您存储来自您最喜欢的 ML 模型的数据对象和向量嵌入,并无缝扩展到数十亿个数据对象。它提供工具来存储文档嵌入、内容和元数据,并通过这些嵌入进行搜索,包括元数据过滤。

先决条件

  1. 用于计算文档嵌入的 EmbeddingModel 实例。有多种选择可用

    • Transformers Embedding - 在本地环境中计算嵌入。请遵循 ONNX Transformers Embedding 指令。

    • OpenAI Embedding - 使用 OpenAI 嵌入端点。您需要在 OpenAI 注册 创建一个帐户,并在 API 密钥 生成 api-key 令牌。

    • 您也可以使用 Azure OpenAI EmbeddingPostgresML Embedding Client

  2. Weaviate 集群。您可以在 Docker 容器中本地设置集群,或创建一个 Weaviate 云服务。对于后者,您需要创建一个 Weaviate 帐户,设置一个集群,并从 仪表板详细信息 获取您的访问 API 密钥。

在启动时,WeaviateVectorStore 会创建所需的 SpringAiWeaviate 对象模式(如果尚未配置)。

自动配置

然后将 WeaviateVectorStore 启动器依赖项添加到您的项目中

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

或添加到您的 Gradle build.gradle 构建文件中。

dependencies {
    implementation 'org.springframework.ai:spring-ai-weaviate-store-spring-boot-starter'
}

向量存储实现可以为您初始化必要的模式,但您必须通过在适当的构造函数中指定 initializeSchema 布尔值或在 application.properties 文件中设置 …​initialize-schema=true 来选择加入。

这是一个重大更改!在早期版本的 Spring AI 中,此模式初始化默认发生。

向量存储还需要一个 EmbeddingModel 实例来计算文档的嵌入。您可以选择可用的 EmbeddingModel 实现 之一。

例如,要使用 OpenAI EmbeddingModel,请将以下依赖项添加到您的项目中

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

或添加到您的 Gradle build.gradle 构建文件中。

dependencies {
    implementation 'org.springframework.ai:spring-ai-openai-spring-boot-starter'
}
请参阅 依赖项管理 部分,将 Spring AI BOM 添加到您的构建文件中。请参阅 存储库 部分,将里程碑和/或快照存储库添加到您的构建文件中。

要连接到 Weaviate 并使用 WeaviateVectorStore,您需要提供实例的访问详细信息。可以通过 Spring Boot 的 application.properties 提供一个简单的配置,

spring.ai.vectorstore.weaviate.host=<host of your Weaviate instance>
spring.ai.vectorstore.weaviate.api-key=<your api key>
spring.ai.vectorstore.weaviate.scheme=http

# API key if needed, e.g. OpenAI
spring.ai.openai.api.key=<api-key>
查看 配置参数 列表,了解默认值和配置选项。

现在您可以在应用程序中自动连接 Weaviate 向量存储并使用它。

@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
vectorStore.add(documents);

// Retrieve documents similar to a query
List<Document> results = vectorStore.similaritySearch(SearchRequest.query("Spring").withTopK(5));

配置属性

您可以在 Spring Boot 配置中使用以下属性来自定义 Weaviate 向量存储。

属性 描述 默认值

spring.ai.vectorstore.weaviate.host

Weaviate 服务器的主机。

localhost:8080

spring.ai.vectorstore.weaviate.scheme

连接模式。

http

spring.ai.vectorstore.weaviate.api-key

用于与 Weaviate 服务器进行身份验证的 API 密钥。

-

spring.ai.vectorstore.weaviate.object-class

"SpringAiWeaviate"

spring.ai.vectorstore.weaviate.consistency-level

一致性和速度之间的期望权衡

ConsistentLevel.ONE

spring.ai.vectorstore.weaviate.filter-field

spring.ai.vectorstore.weaviate.filter-field.<field-name>=<field-type>

-

spring.ai.vectorstore.weaviate.headers

-

spring.ai.vectorstore.weaviate.initialize-schema

是否初始化所需的模式

false

元数据过滤

您也可以利用通用的、可移植的 元数据过滤器 与 WeaviateVectorStore 一起使用。

例如,您可以使用文本表达式语言

vectorStore.similaritySearch(
   SearchRequest
      .query("The World")
      .withTopK(TOP_K)
      .withSimilarityThreshold(SIMILARITY_THRESHOLD)
      .withFilterExpression("country in ['UK', 'NL'] && year >= 2020"));

或使用表达式 DSL 以编程方式使用

FilterExpressionBuilder b = new FilterExpressionBuilder();

vectorStore.similaritySearch(
   SearchRequest
      .query("The World")
      .withTopK(TOP_K)
      .withSimilarityThreshold(SIMILARITY_THRESHOLD)
      .withFilterExpression(b.and(
         b.in("country", "UK", "NL"),
         b.gte("year", 2020)).build()));

可移植的过滤器表达式会自动转换为专有的 Weaviate where 过滤器。例如,以下可移植过滤器表达式

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

转换为 Weaviate GraphQL where 过滤器表达式

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
      }]

手动配置

除了使用 Spring Boot 自动配置,您还可以手动配置 WeaviateVectorStore。为此,您需要将 spring-ai-weaviate-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'
}

要在您的应用程序中配置 Weaviate,您可以创建一个 WeaviateClient

@Bean
public WeaviateClient weaviateClient() {
   try {
      return WeaviateAuthClient.apiKey(
            new Config(<YOUR SCHEME>, <YOUR HOST>, <YOUR HEADERS>),
            <YOUR API KEY>);
   }
   catch (AuthException e) {
      throw new IllegalArgumentException("WeaviateClient could not be created.", e);
   }
}

通过将 Spring Boot OpenAI 启动器添加到您的项目中,与 OpenAI 的嵌入集成。这为您提供了嵌入客户端的实现

@Bean
public WeaviateVectorStore vectorStore(EmbeddingModel embeddingModel, WeaviateClient weaviateClient) {

   WeaviateVectorStoreConfig.Builder configBuilder = WeaviateVectorStore.WeaviateVectorStoreConfig.builder()
      .withObjectClass(<YOUR OBJECT CLASS>)
      .withConsistencyLevel(<YOUR CONSISTENCY LEVEL>);

   return new WeaviateVectorStore(configBuilder.build(), embeddingModel, weaviateClient);
}

在 Docker 容器中运行 Weaviate 集群

在 Docker 容器中启动 Weaviate

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/v1 启动 Weaviate 集群,scheme=http,host=localhost:8080,apiKey=""。然后按照使用说明进行操作。