【Spring AI】05. 向量数据库-Chroma

Chroma

本节将指导您如何设置 Chroma VectorStore ,并使用组件进行存储文档嵌入向量相似性检索

Chroma Container

什么是 Chroma?


Chroma 是开源的嵌入向量数据库。它提供了文档嵌入向量、内容和元数据存储,并配备了通过这些嵌入向量进行搜索的工具,包括元数据过滤。

先决条件

  1. OpenAI 账户:在 OpenAI Signup 注册并在 API Keys 生成令牌。
  2. 访问 ChromeDB。后面会介绍如何使用 Docker 容器在本地启动 ChromaDB。
    在启动时,如果尚未预配完全,则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>
    

请参阅 03. 开始章节 的 Dependency Management 部分,将 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;
}

使用 Static API Token Authentication 保护的 ChromaDB 情况,请使用 ChromaApi#withKeyToken() 方法设置您的凭据。查看 ChromaWhereIT 以获取示例。
使用 Basic Authentication 保护的 ChromaDB 情况,请使用 ChromaApi#withBasicAuth(, ) 方法设置您的凭据。查看 BasicAuthChromaWhereIT 以获取示例。

接下来通过将 Spring Boot OpenAI starter 添加到您的项目中,与 OpenAI 的嵌入向量组件集成。 Embeddings 客户端的实现示例:

@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!!”的文档。

元数据过滤

您也可以利用通用的、便携的元数据过滤器与 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

在 localhost:8000/api/v1 启动一个 chroma 存储

  • 21
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值