以下是您提供的HTML片段的中文翻译:

Weaviate

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

什么是 Weaviate?

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

先决条件

  1. EmbeddingClient 实例来计算文档嵌入。有几种选择:

    • 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 对象架构(如果尚未提供)。

依赖

将这些依赖项添加到您的项目中:

  • 嵌入式客户端启动器,用于计算嵌入式。

  • Transformers Embedding(本地),并按照ONNX Transformers Embedding指示操作。

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

或使用OpenAI(云)

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

您需要提供您的OpenAI API密钥。请将其设置为环境变量,如下所示:

export SPRING_AI_OPENAI_API_KEY='Your_OpenAI_API_Key'
  • 添加Weaviate VectorStore依赖项

<dependency>
  <groupId>org.springframework.ai</groupId>
  <artifactId>spring-ai-weaviate-store</artifactId>
</dependency>
请参阅依赖管理部分,将Spring AI BOM添加到您的构建文件中。

使用方法

创建一个连接到本地 Weaviate 集群的 WeaviateVectorStore 实例:

@Bean
public VectorStore vectorStore(EmbeddingClient embeddingClient) {
  WeaviateVectorStoreConfig config = WeaviateVectorStoreConfig.builder()
     .withScheme("http")
     .withHost("localhost:8080")
     // 定义用于相似度搜索过滤器的元数据字段。
     .withFilterableMetadataFields(List.of(
        MetadataField.text("country"),
        MetadataField.number("year"),
        MetadataField.bool("active")))
     // 一致性级别可以是:ONE、QUORUM 或 ALL。
     .withConsistencyLevel(ConsistentLevel.ONE)
     .build();

  return new WeaviateVectorStore(config, embeddingClient);
}
必须明确列出所有元数据字段的名称和类型(BOOLEANTEXTNUMBER),以供在过滤器表达式中使用。上面的 withFilterableMetadataKeys 注册了可过滤的元数据字段:country 类型为 TEXTyear 类型为 NUMBERactive 类型为 BOOLEAN

如果可过滤的元数据字段扩展了新条目,您必须(重新)上传/更新具有此元数据的文档。

您可以使用以下 Weaviate 系统元数据 字段,无需明确定义:id_creationTimeUnix_lastUpdateTimeUnix

然后在您的主要代码中,创建一些文档:

List<Document> documents = List.of(
   new Document("Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!!", Map.of("country", "UK", "active", true, "year", 2020)),
   new Document("The World is Big and Salvation Lurks Around the Corner", Map.of()),
   new Document("You walk forward facing the past and you turn back toward the future.", Map.of("country", "NL", "active", false, "year", 2023)));

现在将文档添加到您的向量存储库中:

vectorStore.add(List.of(document));

最后,检索与查询相似的文档:

List<Document> results = vectorStore.similaritySearch(
   SearchRequest
      .query("Spring")
      .withTopK(5));

如果一切顺利,您应该检索到包含文本“Spring AI rocks!!”的文档。

元数据过滤

您还可以在 WeaviateVectorStore 中利用通用的、可移植的元数据过滤器

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

vectorStore.similaritySearch(
   SearchRequest
      .query("The World")
      .withTopK(TOP_K)
      .withSimilarityThreshold(SIMILARITY_THRESHOLD)
      .withFilterExpression("country in ['英国', '荷兰'] && 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", "英国", "荷兰"),
         b.gte("year", 2020)).build()));

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

country in ['英国', '荷兰'] && year >= 2020

会被转换为 Weaviate GraphQL where 过滤表达式

operator:And
   operands:
      [{
         operator:Or
         operands:
            [{
               path:["meta_country"]
               operator:Equal
               valueText:"英国"
            },
            {
               path:["meta_country"]
               operator:Equal
               valueText:"荷兰"
            }]
      },
      {
         path:["meta_year"]
         operator:GreaterThanEqual
         valueNumber:2020
      }]

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