Weaviate
本节将指导您如何设置 Weaviate VectorStore,以存储文档嵌入并执行相似性搜索。
Weaviate 是一个开源向量数据库,允许您存储来自您喜爱的 ML 模型的数据对象和向量嵌入,并可无缝扩展至数十亿个数据对象。 它提供工具来存储文档嵌入、内容和元数据,并支持通过这些嵌入进行搜索,包括元数据过滤。
前提条件
-
一个正在运行的 Weaviate 实例。以下选项可用:
-
Weaviate 云服务 (需要创建账户和API密钥)
-
-
如果需要,获取用于在存储于
WeaviateVectorStore中的嵌入模型的API密钥。
依赖项
|
There has been a significant change in the Spring AI auto-configuration, starter modules' artifact names. Please refer to the 升级说明以获取更多信息。 |
在你的项目中添加Weaviate向量存储依赖项:
<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并使用`0`,您需要提供实例的访问权限。配置可以通过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");
If you choose to create a shell script to manage your environment variables, be sure to run it prior to starting your application by 'sourcing' the file, i.e. source <your_script_name>.sh. |
自动配置
Spring AI提供Spring Boot自配置功能,用于Weaviate向量存储。
要启用此功能,请在您的项目Maven pom.xml文件中添加以下依赖项:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-vector-store-weaviate</artifactId>
</dependency>
或者添加到您的Gradle 构建脚本文件中。
dependencies {
implementation 'org.springframework.ai:spring-ai-starter-vector-store-weaviate'
}
| 参考以下依赖管理部分,添加Spring AI BOM到你的构建文件中。 |
请查看以下向量存储的配置参数列表,了解默认值和配置选项。这些配置参数的类型为C0。
| 引用 Artifact 仓库 部分,以在构建文件中添加 Maven Central 和/或 Snapshot 仓库。 |
此外,您还需要配置一个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(OpenAiApi.builder().apiKey(apiKey).build());
}
现在您可以在应用程序中自动将WeaviateVectorStore作为向量存储进行注入。
手动配置
Instead of using Spring Boot auto-configuration, you can manually configure the WeaviateVectorStore using the builder pattern:
@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();
}
元数据过滤
你可以利用 元数据过滤器 与 Weaviate 存储池一起使用。
例如,你可以使用文本表达式语言:
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 filters。 |
例如,这个可移植的过滤表达式:
country in ['UK', 'NL'] && year >= 2020
转换为Weaviate特有的GraphQLFilter格式:
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
}]
运行Weaviate容器化服务在Docker中
快速开始本地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
这开始了一个可访问于韦阿迭代(Weaviate)实例,可访问于localhost:8080。
Weaviate向量存储属性
你可以使用以下属性在Spring Boot配置中对Weaviate向量存储进行定制化设置。
| 属性 | 描述 | 默认值 |
|---|---|---|
|
Weaviate服务器的主机 |
localhost:8080 |
|
事务管理器 |
HTTP |
|
该功能支持通过调用此API来验证用户的访问权限。请确保在请求头中包含有效的访问Tokens。 |
|
|
存储文档的类名 |
SpringAiWeaviate |
|
内容字段名 |
内容 |
|
元数据字段前缀 |
meta_ |
|
权衡一致性和速度之间的关系 |
ConsistentLevel.ONE |
|
配置可用于过滤器的元数据字段。格式如下:spring.ai.vectorstore.weaviate.filter-field.<field-name>=<field-type> |
| 对象类名应该以大写字母开头,字段名应该以小写字母开头。 See data-object-concepts |
访问原生客户端
Weaviate向量存储实现提供了通过底层 native Weaviate 客户端(0)使用的方法:
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
}
Native客户端赋予您访问Weaviate特定功能和操作的能力,这些功能和操作可能不会通过VectorStore接口暴露。