跳到主要内容
版本:2.0.1

Weaviate

QWen 3.8 中英对照 Weaviate

本节将指导您配置 Weaviate VectorStore,以存储文档嵌入并执行相似度搜索。

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

前置条件​

  • 一个运行中的 Weaviate 实例。有以下选项可供选择:

  • 如需要,用于 EmbeddingModel 的 API 密钥,以生成存储在 WeaviateVectorStore 中的向量嵌入(embeddings)。

依赖项​

备注

Spring AI 自动配置和 starter 模块的 artifact 名称已发生重大变更。请参见升级说明以获取更多信息。

向您的项目添加 Weaviate 向量存储依赖:

<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'
}
提示

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

配置​

要连接到 Weaviate 并使用 WeaviateVectorStore,需要提供实例的访问详情。配置可以通过 Spring Boot 的 application.properties 提供:

spring.ai.vectorstore.weaviate.host=<host_of_your_weaviate_instance>
spring.ai.vectorstore.weaviate.scheme=<http_or_https>
spring.ai.vectorstore.weaviate.api-key=<your_api_key>
# API key if needed, e.g. OpenAI
spring.ai.openai.api-key=<api-key>

如果你更倾向于使用环境变量来存储 API 密钥等敏感信息,你有以下几种选择:

选项 1:使用 Spring 表达式语言(SpEL)​

您可以使用自定义环境变量名称,并在应用程序配置中引用它们:

# In application.yml
spring:
ai:
vectorstore:
weaviate:
host: ${WEAVIATE_HOST}
scheme: ${WEAVIATE_SCHEME}
api-key: ${WEAVIATE_API_KEY}
openai:
api-key: ${OPENAI_API_KEY}
# In your environment or .env file
export WEAVIATE_HOST=<host_of_your_weaviate_instance>
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'
}
提示

请参见 Dependency Management 部分,将 Spring AI BOM 添加到您的构建文件中。

请查看 配置参数 列表,以了解向量存储的默认值和配置选项。

提示

请参考 Artifact Repositories 部分,向您的构建文件中添加 Maven Central 和/或 Snapshot Repositories。

此外,你需要配置一个 EmbeddingModel Bean。有关详细信息,请参阅 EmbeddingModel 部分。

以下是一个所需 Bean 的示例:

@Bean
public EmbeddingModel embeddingModel() {
// Retrieve API key from a secure source or environment variable
String apiKey = System.getenv("OPENAI_API_KEY");

// Can be any other EmbeddingModel implementation
return new OpenAiEmbeddingModel(OpenAiEmbeddingOptions.builder().apiKey(apiKey).build());
}

现在,你可以自动装配 WeaviateVectorStore 作为应用程序中的向量存储。

手动配置​

除使用 Spring Boot 自动配置外,你还可以使用构建器模式手动配置 WeaviateVectorStore:

@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) // Optional: use custom options
.consistencyLevel(ConsistentLevel.QUORUM) // Optional: defaults to ConsistentLevel.ONE
.filterMetadataFields(List.of( // Optional: fields that can be used in filters
MetadataField.text("country"),
MetadataField.number("year")))
.build();
}

Metadata filtering​

您也可以使用通用的可移植 元数据过滤器 来与 Weaviate store 配合使用。

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

vectorStore.similaritySearch(
SearchRequest.builder()
.query("The World")
.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("The World")
.topK(TOP_K)
.similarityThreshold(SIMILARITY_THRESHOLD)
.filterExpression(b.and(
b.in("country", "UK", "NL"),
b.gte("year", 2020)).build()).build());
备注

这些(可移植的)过滤表达式会自动转换为专有的 Weaviate where 过滤器。

例如,以下便携式筛选器表达式:

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.31.22

这会在 localhost:8080 启动一个 Weaviate 实例。

WeaviateVectorStore 属性​

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

属性描述默认值
spring.ai.vectorstore.weaviate.hostWeaviate 服务器的主机地址localhost:8080
spring.ai.vectorstore.weaviate.scheme连接协议http
spring.ai.vectorstore.weaviate.api-key用于身份验证的 API 密钥
spring.ai.vectorstore.weaviate.object-class用于存储文档的类名。SpringAiWeaviate
spring.ai.vectorstore.weaviate.content-field-name内容字段的名称content
spring.ai.vectorstore.weaviate.meta-field-prefix元数据字段的名称前缀meta_
spring.ai.vectorstore.weaviate.consistency-level一致性与速度之间的期望权衡ConsistentLevel.ONE
spring.ai.vectorstore.weaviate.filter-field配置可用于过滤的元数据字段。格式:spring.ai.vectorstore.weaviate.filter-field.<field-name>=<field-type>
提示

对象类名应以大写字母开头,字段名应以小写字母开头。参见 data-object-concepts

访问原生客户端​

Weaviate 向量存储(Vector Store)的实现通过 getNative() 方法提供了对底层原生 Weaviate 客户端(WeaviateClient)的访问:

WeaviateVectorStore vectorStore = context.getBean(WeaviateVectorStore.class);
Optional<WeaviateClient> nativeClient = vectorStore.getNativeClient();

if (nativeClient.isPresent()) {
WeaviateClient client = nativeClient.get();
// Use the native client for Weaviate-specific operations
}

原生客户端为您提供对 Weaviate 特定功能和操作的访问权限,这些功能可能未通过 VectorStore 接口暴露。