102_Spring AI 干货笔记之 Weaviate 向量存储
本文介绍了Spring AI中Weaviate向量存储的集成方案。Weaviate是开源向量数据库,支持存储数据对象和向量嵌入。文章提供了通过Spring Boot自动配置或手动编程两种方式创建WeaviateVectorStore实例的方法,包括设置主机、协议、API密钥等参数。同时,展示了如何使用可移植元数据过滤器进行高级查询,将通用表达式转换为Weaviate GraphQL过滤器格式,并可
一、Weaviate
本节将引导您设置 Weaviate VectorStore 来存储文档嵌入并执行相似性搜索。
Weaviate 是一个开源的向量数据库,允许您存储来自您喜爱的机器学习模型的数据对象和向量嵌入,并能够无缝扩展到数十亿个数据对象。它提供了存储文档嵌入、内容和元数据以及搜索这些嵌入(包括元数据过滤)的工具。
二、先决条件
-
一个正在运行的 Weaviate 实例。有以下可用选项:
-
Weaviate Cloud Service(需要创建账户和 API 密钥)
-
-
(如果需要)用于 EmbeddingModel 的 API 密钥,以生成由 WeaviateVectorStore 存储的嵌入。
三、依赖项
Spring AI 自动配置、启动器模块的工件名称发生了重大变化。请参阅升级说明以获取更多信息。
将 Weaviate 向量存储依赖项添加到您的项目中:
Maven
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-weaviate-store</artifactId>
</dependency>
Gradle
dependencies {
implementation 'org.springframework.ai:spring-ai-weaviate-store'
}
请参阅 依赖管理 部分,将 Spring AI BOM 添加到您的构建文件中。
四、配置
要连接到 Weaviate 并使用 WeaviateVectorStore,您需要提供实例的访问详细信息。可以通过 Spring Boot 的 application.properties 提供配置:
spring.ai.vectorstore.weaviate.host=<weaviate_instance_host>
spring.ai.vectorstore.weaviate.scheme=<http_or_https>
spring.ai.vectorstore.weaviate.api-key=<your_api_key>
# 如果需要,提供 OpenAI 的 API 密钥
spring.ai.openai.api-key=<api-key>
如果您希望使用环境变量来处理敏感信息(如 API 密钥),您有多个选项:
选项 1:使用 Spring 表达式语言(SpEL)
您可以使用自定义环境变量名称,并在应用程序配置中引用它们:
# 在 application.yml 中
spring:
ai:
vectorstore:
weaviate:
host: ${WEAVIATE_HOST}
scheme: ${WEAVIATE_SCHEME}
api-key: ${WEAVIATE_API_KEY}
openai:
api-key: ${OPENAI_API_KEY}
# 在您的环境或 .env 文件中
export WEAVIATE_HOST=<weaviate_instance_host>
export WEAVIATE_SCHEME=<http_or_https>
export WEAVIATE_API_KEY=<your_api_key>
export OPENAI_API_KEY=<api-key>
选项 2:以编程方式访问环境变量
或者,您可以在 Java 代码中访问环境变量:
String weaviateApiKey = System.getenv("WEAVIATE_API_KEY");
String openAiApiKey = System.getenv("OPENAI_API_KEY");
如果您选择创建 shell 脚本来管理环境变量,请确保在启动应用程序之前通过“source”文件来运行它,即 source <your_script_name>.sh。
五、自动配置
Spring AI 为 Weaviate 向量存储提供了 Spring Boot 自动配置。要启用它,请将以下依赖项添加到项目的 Maven pom.xml 文件中:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-vector-store-weaviate</artifactId>
</dependency>
或添加到 Gradle build.gradle 构建文件中:
dependencies {
implementation 'org.springframework.ai:spring-ai-starter-vector-store-weaviate'
}
请参阅依赖管理部分,将 Spring AI BOM 添加到您的构建文件中。
请查看向量存储的配置参数列表,了解默认值和配置选项。
请参阅工件仓库部分,将 Maven Central 和/或快照仓库添加到您的构建文件中。
此外,您需要一个配置好的 EmbeddingModel bean。有关更多信息,请参阅 EmbeddingModel 部分。
以下是所需 bean 的示例:
@Bean
public EmbeddingModel embeddingModel() {
// 从安全源或环境变量中检索 API 密钥
String apiKey = System.getenv("OPENAI_API_KEY");
// 可以是任何其他 EmbeddingModel 实现
return new OpenAiEmbeddingModel(OpenAiApi.builder().apiKey(apiKey).build());
}
现在,您可以在应用程序中自动注入 WeaviateVectorStore 作为向量存储。
六、手动配置
您也可以手动配置 WeaviateVectorStore,而不是使用 Spring Boot 自动配置:
@Bean
public WeaviateClient weaviateClient() {
return new WeaviateClient(new Config("http", "localhost:8080"));
}
@Bean
public VectorStore vectorStore(WeaviateClient weaviateClient, EmbeddingModel embeddingModel) {
return WeaviateVectorStore.builder(weaviateClient, embeddingModel)
.options(options) // 可选:使用自定义选项
.consistencyLevel(ConsistentLevel.QUORUM) // 可选:默认为 ConsistentLevel.ONE
.filterMetadataFields(List.of( // 可选:可在过滤器中使用的字段
MetadataField.text("country"),
MetadataField.number("year")))
.build();
}
七、元数据过滤
您也可以将通用的、可移植的 元数据过滤器 与 Weaviate 存储一起使用。
例如,您可以使用文本表达式语言:
vectorStore.similaritySearch(
SearchRequest.builder()
.query("世界")
.topK(TOP_K)
.similarityThreshold(SIMILARITY_THRESHOLD)
.filterExpression("country in ['UK', 'NL'] && year >= 2020").build());
或者以编程方式使用 Filter.Expression DSL:
FilterExpressionBuilder b = new FilterExpressionBuilder();
vectorStore.similaritySearch(SearchRequest.builder()
.query("世界")
.topK(TOP_K)
.similarityThreshold(SIMILARITY_THRESHOLD)
.filterExpression(b.and(
b.in("country", "UK", "NL"),
b.gte("year", 2020)).build()).build());
这些(可移植的)过滤表达式会被自动转换为专有的 Weaviate 过滤表达式。
例如,这个可移植的过滤表达式:
country in ['UK', 'NL'] && year >= 2020
被转换为专有的 Weaviate GraphQL 过滤器格式:
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
}]
八、在 Docker 中运行 Weaviate
要快速启动本地 Weaviate 实例,可以在 Docker 中运行它:
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 启动一个可访问的 Weaviate 实例。
九、WeaviateVectorStore 属性
您可以在 Spring Boot 配置中使用以下属性来自定义 Weaviate 向量存储。
对象类名应以大写字母开头,字段名应以小写字母开头。请参阅 数据对象概念。
十、访问原生客户端
Weaviate 向量存储实现通过 getNativeClient() 方法提供对底层原生 Weaviate 客户端(WeaviateClient)的访问:
WeaviateVectorStore vectorStore = context.getBean(WeaviateVectorStore.class);
Optional<WeaviateClient> nativeClient = vectorStore.getNativeClient();
if (nativeClient.isPresent()) {
WeaviateClient client = nativeClient.get();
// 使用原生客户端进行 Weaviate 特定操作
}
原生客户端让您可以访问可能未通过 VectorStore 接口暴露的 Weaviate 特定功能和操作。
更多推荐

所有评论(0)