Chroma

本节将引导您完成设置 Chroma VectorStore 来存储文档嵌入并执行相似性搜索

Chroma Container

Chroma 是什么?

Chroma开源嵌入数据库。它为您提供了文档嵌入存储、内容和元数据以及搜索这些嵌入(包括元数据过滤)的工具。

先决条件

  1. OpenAI 帐户:在 OpenAI 注册 处创建帐户并在 API Keys 处生成令牌。

  2. 访问 ChromeDB。设置本地 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>
  • Chroma VectorStore.
<dependency>
  <groupId>org.springframework.ai</groupId>
  <artifactId>spring-ai-chroma-store</artifactId>
</dependency>

示例代码

使用正确的 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;
}

对于使用Static API Token Authentication保护的 ChromaDB ,请使用ChromaApi#withKeyToken(<Your Token Credentials>)方法设置您的凭据。检查ChromaWhereIT 的示例。
对于使用 Basic Authentication的 ChromaDB,请使用ChromaApi#withBasicAuth(<your user>, <your password>)方法设置您的凭据。检查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 AIrocks!!” 的文档。

元数据过滤

您还可以利用 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()));

注意:
这些(便携式)过滤器表达式会自动转换为 Chroma 专有的 where 过滤器表达式

例如,这个便携式过滤器表达式:

author in ['john', 'jill'] && article_type == 'blog'

转换为 Chroma 专有的 格式

{"$and":[
    {"author": {"$in": ["john", "jill"]}},
    {"article_type":{"$eq":"blog"}}]
}

本地运行 Chroma

docker run -it --rm --name chroma -p 8000:8000 ghcr.io/chroma-core/chroma:0.4.15

Chroma 存储访问地址:http://localhost:8000/api/v1

作者:Jeebiz  创建时间:2024-05-02 21:41
最后编辑:Jeebiz  更新时间:2024-07-06 19:00