Weaviate

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

什么是 Weaviate?

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

先决条件

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

    • Transformers 嵌入 - 在您的本地环境中计算嵌入。请遵循 ONNX Transformers 嵌入说明。

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

    • 您还可以使用Azure OpenAI 嵌入PostgresML 嵌入模型

  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 = this.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

是否初始化所需的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
      }]

手动配置

您可以手动配置WeaviateVectorStore,而不是使用Spring Boot自动配置。为此,您需要将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的嵌入。这为您提供了一个Embeddings客户端的实现

@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=""。然后按照使用说明进行操作。