OpenSearch
本节将指导您完成设置 OpenSearch VectorStore
以存储文档嵌入并执行相似性搜索的过程。
OpenSearch 是一种开源搜索和分析引擎,最初是从 Elasticsearch 分叉而来,并在 Apache License 2.0 下分发。它通过简化 AI 生成的资产的集成和管理来增强 AI 应用开发。OpenSearch 支持向量、词法和混合搜索功能,利用高级向量数据库功能来促进低延迟查询和相似性搜索,如 向量数据库页面 中所述。该平台非常适合构建可扩展的 AI 驱动型应用程序,并提供强大的数据管理、容错和资源访问控制工具。
先决条件
-
正在运行的 OpenSearch 实例。以下选项可用
-
EmbeddingModel
实例以计算文档嵌入。有多个选项可用-
如果需要,用于 EmbeddingModel 的 API 密钥,以生成
OpenSearchVectorStore
存储的嵌入。
-
依赖项
将 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 向量存储。
属性 | 描述 | 默认值 |
---|---|---|
|
OpenSearch 集群端点的 URI。 |
- |
|
访问 OpenSearch 集群的用户名。 |
- |
|
指定用户名的密码。 |
- |
|
要在 OpenSearch 集群中使用的默认索引的名称。 |
|
|
定义索引映射的 JSON 字符串;指定文档及其字段如何存储和索引。 |
{ "properties":{ "embedding":{ "type":"knn_vector", "dimension":1536 } } } |
|
OpenSearch 实例的主机名。 |
- |
|
OpenSearch 实例的 AWS 服务名称。 |
- |
|
OpenSearch 实例的 AWS 访问密钥。 |
- |
|
OpenSearch 实例的 AWS 密钥。 |
- |
|
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