本节将指导您设置Chroma VectorStore来存储文档嵌入并执行相似度搜索。
什么是色度?
链接:https://docs.trychroma.com/ [Chroma] 是开源的嵌入式数据库。它提供了存储文档嵌入、内容和元数据的工具,并能够搜索这些嵌入内容,包括元数据过滤。
先决条件
-
OpenAI账户:在链接:https://platform.openai.com/signup[OpenAI注册]页面创建一个账户,并在链接:https://platform.openai.com/account/api-keys[API密钥]页面生成一个令牌。
-
访问ChromeDB。附录setup local ChromaDB展示了如何使用Docker容器在本地设置数据库。
在启动时,如果尚未配置,则`ChromaVectorStore`将创建所需的集合。
配置
要设置ChromaVectorStore,您需要提供您的OpenAI API密钥。像这样将它设置为环境变量:
export SPRING_AI_OPENAI_API_KEY='Your_OpenAI_API_Key'
依赖关系
将这些依赖项添加到你的项目中:
-
OpenAI:用于计算嵌入。
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
-
彩度向量存储。
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-chroma-store</artifactId>
</dependency>
Tip
|
参考依赖管理部分,将Spring AI BOM添加到您的构建文件中。 |
样本代码
创建一个带有正确的ChromaDB授权配置的`RestTemplate`实例,并使用它来创建一个`ChromaApi`实例:
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
@Bean
public ChromaApi chromaApi(RestTemplate restTemplate) {
String chromaUrl = "http://localhost:8000";
ChromaApi chromaApi = new ChromaApi(chromaUrl, restTemplate);
return chromaApi;
}
Note
|
对于使用链接:https://docs.trychroma.com/usage-guide#static-api-token-authentication[静态API令牌认证]保护的ChromaDB,请使用`ChromaApi#withKeyToken(<Your Token Credentials>)`方法来设置您的凭据。查看`ChromaWhereIT`以获得一个示例。 对于使用链接:https://docs.trychroma.com/usage-guide#basic-authentication[基本认证]保护的ChromaDB,请使用`ChromaApi#withBasicAuth(<你的用户名>, <你的密码>)`方法来设置你的凭据。查看`BasicAuthChromaWhereIT`以获取一个示例。 |
通过在项目中添加 Spring Boot OpenAI 启动器以集成 OpenAI 的嵌入功能。这为您提供了嵌入客户端的实现:
@Bean
public VectorStore chromaVectorStore(EmbeddingClient embeddingClient, ChromaApi chromaApi) {
return new ChromaVectorStore(embeddingClient, chromaApi, "TestCollection");
}
在你的主代码中,创建一些文档:
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")));
将文档添加到你的向量存储中:
vectorStore.add(documents);
最后,检索与查询相似的文档:
List<Document> results = vectorStore.similaritySearch("Spring");
如果一切顺利,你应该能够检索到包含文本“Spring AI rocks!!”的文件。
元数据过滤
你也可以利用通用的、可移植的链接:https://docs.spring.io/spring-ai/reference/api/vectordbs.html#_metadata_filters[元数据过滤器],结合ChromaVector存储。
例如,你可以使用文本表达式语言:
vectorStore.similaritySearch(
SearchRequest.defaults()
.withQuery("The World")
.withTopK(TOP_K)
.withSimilarityThreshold(SIMILARITY_THRESHOLD)
.withFilterExpression("author in ['john', 'jill'] && article_type == 'blog'"));
或者通过使用`Filter.Expression` DSL来编程实现:
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()));
Note
|
那些(便携式)过滤器表达式会自动转换为专有的Chroma where 链接:https://docs.trychroma.com/usage-guide#using-where-filters[过滤器表达式]。
|
例如,这个便携式过滤表达式:
sql author in ['john', 'jill'] && article_type == 'blog'
被转换成专有的Chroma格式
json {"$and":[ {"author": {"$in": ["john", "jill"]}}, {"article_type":{"$eq":"blog"}}] }
在本地运行Chroma
shell docker run -it --rm --name chroma -p 8000:8000 ghcr.io/chroma-core/chroma:0.4.15