OpenSearch

本节将指导您完成设置 OpenSearch VectorStore 以存储文档嵌入并执行相似性搜索的过程。

OpenSearch 是一种开源搜索和分析引擎,最初是从 Elasticsearch 分叉而来,并在 Apache License 2.0 下分发。它通过简化 AI 生成的资产的集成和管理来增强 AI 应用开发。OpenSearch 支持向量、词法和混合搜索功能,利用高级向量数据库功能来促进低延迟查询和相似性搜索,如 向量数据库页面 中所述。该平台非常适合构建可扩展的 AI 驱动型应用程序,并提供强大的数据管理、容错和资源访问控制工具。

先决条件

依赖项

将 OpenSearch 向量存储依赖项添加到您的项目

  • Maven

  • Gradle

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-opensearch-store</artifactId>
</dependency>
dependencies {
    implementation 'org.springframework.ai:spring-ai-opensearch-store'
}
请参阅 依赖项管理 部分,以将 Spring AI BOM 添加到您的构建文件中。

配置

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

spring:
  ai:
    vectorstore:
      opensearch:
        uris: <opensearch instance URIs>
        username: <opensearch username>
        password: <opensearch password>
        indexName: <opensearch index name>
        mappingJson: <JSON mapping for opensearch index>
        aws:
          host: <aws opensearch host>
          serviceName: <aws service name>
          accessKey: <aws access key>
          secretKey: <aws secret key>
          region: <aws region>
# API key if needed, e.g. OpenAI
    openai:
      apiKey: <api-key>
查看 配置参数 列表,了解默认值和配置选项。

自动配置

自托管 OpenSearch

Spring AI 为 OpenSearch 向量存储提供了 Spring Boot 自动配置。要启用它,请将以下依赖项添加到项目的 Maven pom.xml 或 Gradle build.gradle 构建文件中

  • Maven

  • Gradle

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-opensearch-store-spring-boot-starter</artifactId>
</dependency>
dependencies {
    implementation 'org.springframework.ai:spring-ai-opensearch-store-spring-boot-starter'
}

然后使用 spring.ai.vectorstore.opensearch.* 属性配置与自托管 OpenSearch 实例的连接。

Amazon OpenSearch 服务

要启用 Amazon OpenSearch 服务,请将以下依赖项添加到项目的 Maven pom.xml 或 Gradle build.gradle 构建文件中

  • Maven

  • Gradle

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-aws-opensearch-store-spring-boot-starter</artifactId>
</dependency>
dependencies {
    implementation 'org.springframework.ai:spring-ai-aws-opensearch-store-spring-boot-starter'
}

然后使用 spring.ai.vectorstore.opensearch.aws.* 属性配置与 Amazon OpenSearch 服务的连接。

请参阅 依赖项管理 部分,以将 Spring AI BOM 添加到您的构建文件中。

这是一个所需 bean 的示例

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

现在,您可以在应用程序中将 OpenSearchVectorStore 自动连接为向量存储。

@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 OpenSearch
vectorStore.add(List.of(document));

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

配置属性

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

属性 描述 默认值

spring.ai.vectorstore.opensearch.uris

OpenSearch 集群端点的 URI。

-

spring.ai.vectorstore.opensearch.username

访问 OpenSearch 集群的用户名。

-

spring.ai.vectorstore.opensearch.password

指定用户名的密码。

-

spring.ai.vectorstore.opensearch.indexName

要在 OpenSearch 集群中使用的默认索引的名称。

spring-ai-document-index

spring.ai.vectorstore.opensearch.mappingJson

定义索引映射的 JSON 字符串;指定文档及其字段如何存储和索引。

{ "properties":{ "embedding":{ "type":"knn_vector", "dimension":1536 } } }

spring.ai.vectorstore.opensearch.aws.host

OpenSearch 实例的主机名。

-

spring.ai.vectorstore.opensearch.aws.serviceName

OpenSearch 实例的 AWS 服务名称。

-

spring.ai.vectorstore.opensearch.aws.accessKey

OpenSearch 实例的 AWS 访问密钥。

-

spring.ai.vectorstore.opensearch.aws.secretKey

OpenSearch 实例的 AWS 密钥。

-

spring.ai.vectorstore.opensearch.aws.region

OpenSearch 实例的 AWS 区域。

-

自定义 OpenSearch 客户端配置

在 Spring Boot 自动配置的 OpenSearchClient 使用 Apache HttpClient 5 Transport bean 不符合您的需求的情况下,您仍然可以定义自己的 bean。请阅读 OpenSearch Java 客户端文档

元数据过滤

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

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

  • SQL 过滤器语法

  • Filter.Expression DSL

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

vectorStore.similaritySearch(SearchRequest.defaults()
        .withQuery("The World")
        .withTopK(TOP_K)
        .withSimilarityThreshold(SIMILARITY_THRESHOLD)
        .withFilterExpression(b.and(
                b.in("john", "jill"),
                b.eq("article_type", "blog")).build()));
这些(可移植的)过滤器表达式会自动转换为专有的 OpenSearch 查询字符串查询

例如,此可移植过滤器表达式

author in ['john', 'jill'] && 'article_type' == 'blog'

转换为专有的 OpenSearch 过滤器格式

(metadata.author:john OR jill) AND metadata.article_type:blog