Weaviate
本节将引导您设置 Weaviate VectorStore 以存储文档嵌入并执行相似性搜索。
什么是 Weaviate?
Weaviate 是一个开源向量数据库。它允许您存储来自您最喜欢的 ML 模型的数据对象和向量嵌入,并无缝扩展到数十亿个数据对象。它提供工具来存储文档嵌入、内容和元数据,并通过这些嵌入进行搜索,包括元数据过滤。
先决条件
-
用于计算文档嵌入的
EmbeddingModel
实例。有多种选择可用 -
Weaviate 集群
。您可以在 Docker 容器中本地设置集群,或创建一个 Weaviate 云服务。对于后者,您需要创建一个 Weaviate 帐户,设置一个集群,并从 仪表板详细信息 获取您的访问 API 密钥。
在启动时,WeaviateVectorStore
会创建所需的 SpringAiWeaviate
对象模式(如果尚未配置)。
自动配置
然后将 WeaviateVectorStore 启动器依赖项添加到您的项目中
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-weaviate-store-spring-boot-starter</artifactId>
</dependency>
或添加到您的 Gradle build.gradle
构建文件中。
dependencies {
implementation 'org.springframework.ai:spring-ai-weaviate-store-spring-boot-starter'
}
向量存储实现可以为您初始化必要的模式,但您必须通过在适当的构造函数中指定 initializeSchema
布尔值或在 application.properties
文件中设置 …initialize-schema=true
来选择加入。
这是一个重大更改!在早期版本的 Spring AI 中,此模式初始化默认发生。 |
向量存储还需要一个 EmbeddingModel
实例来计算文档的嵌入。您可以选择可用的 EmbeddingModel 实现 之一。
例如,要使用 OpenAI EmbeddingModel,请将以下依赖项添加到您的项目中
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
或添加到您的 Gradle build.gradle
构建文件中。
dependencies {
implementation 'org.springframework.ai:spring-ai-openai-spring-boot-starter'
}
要连接到 Weaviate 并使用 WeaviateVectorStore
,您需要提供实例的访问详细信息。可以通过 Spring Boot 的 application.properties 提供一个简单的配置,
spring.ai.vectorstore.weaviate.host=<host of your Weaviate instance>
spring.ai.vectorstore.weaviate.api-key=<your api key>
spring.ai.vectorstore.weaviate.scheme=http
# API key if needed, e.g. OpenAI
spring.ai.openai.api.key=<api-key>
查看 配置参数 列表,了解默认值和配置选项。 |
现在您可以在应用程序中自动连接 Weaviate 向量存储并使用它。
@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
vectorStore.add(documents);
// Retrieve documents similar to a query
List<Document> results = vectorStore.similaritySearch(SearchRequest.query("Spring").withTopK(5));
配置属性
您可以在 Spring Boot 配置中使用以下属性来自定义 Weaviate 向量存储。
属性 | 描述 | 默认值 |
---|---|---|
|
Weaviate 服务器的主机。 |
localhost:8080 |
|
连接模式。 |
http |
|
用于与 Weaviate 服务器进行身份验证的 API 密钥。 |
- |
|
"SpringAiWeaviate" |
|
|
一致性和速度之间的期望权衡 |
ConsistentLevel.ONE |
|
spring.ai.vectorstore.weaviate.filter-field.<field-name>=<field-type> |
- |
|
- |
|
|
是否初始化所需的模式 |
|
元数据过滤
您也可以利用通用的、可移植的 元数据过滤器 与 WeaviateVectorStore 一起使用。
例如,您可以使用文本表达式语言
vectorStore.similaritySearch(
SearchRequest
.query("The World")
.withTopK(TOP_K)
.withSimilarityThreshold(SIMILARITY_THRESHOLD)
.withFilterExpression("country in ['UK', 'NL'] && year >= 2020"));
或使用表达式 DSL 以编程方式使用
FilterExpressionBuilder b = new FilterExpressionBuilder();
vectorStore.similaritySearch(
SearchRequest
.query("The World")
.withTopK(TOP_K)
.withSimilarityThreshold(SIMILARITY_THRESHOLD)
.withFilterExpression(b.and(
b.in("country", "UK", "NL"),
b.gte("year", 2020)).build()));
可移植的过滤器表达式会自动转换为专有的 Weaviate where 过滤器。例如,以下可移植过滤器表达式
country in ['UK', 'NL'] && year >= 2020
转换为 Weaviate GraphQL where 过滤器表达式
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
}]
手动配置
除了使用 Spring Boot 自动配置,您还可以手动配置 WeaviateVectorStore
。为此,您需要将 spring-ai-weaviate-store
依赖项添加到您的项目中
<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'
}
要在您的应用程序中配置 Weaviate,您可以创建一个 WeaviateClient
@Bean
public WeaviateClient weaviateClient() {
try {
return WeaviateAuthClient.apiKey(
new Config(<YOUR SCHEME>, <YOUR HOST>, <YOUR HEADERS>),
<YOUR API KEY>);
}
catch (AuthException e) {
throw new IllegalArgumentException("WeaviateClient could not be created.", e);
}
}
通过将 Spring Boot OpenAI 启动器添加到您的项目中,与 OpenAI 的嵌入集成。这为您提供了嵌入客户端的实现
@Bean
public WeaviateVectorStore vectorStore(EmbeddingModel embeddingModel, WeaviateClient weaviateClient) {
WeaviateVectorStoreConfig.Builder configBuilder = WeaviateVectorStore.WeaviateVectorStoreConfig.builder()
.withObjectClass(<YOUR OBJECT CLASS>)
.withConsistencyLevel(<YOUR CONSISTENCY LEVEL>);
return new WeaviateVectorStore(configBuilder.build(), embeddingModel, weaviateClient);
}
在 Docker 容器中运行 Weaviate 集群
在 Docker 容器中启动 Weaviate
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/v1 启动 Weaviate 集群,scheme=http,host=localhost:8080,apiKey=""。然后按照使用说明进行操作。