Spring AI 集成 Chroma VectorStore 技术详解与最佳实践
一、概述
随着 AI 大模型、知识检索、RAG(Retrieval Augmented Generation)等技术的兴起,向量数据库成为存储与检索嵌入向量的核心组件。Chroma 作为开源向量数据库,结合 Spring AI 生态,可轻松实现文档、内容、元数据的嵌入存储与高效检索。
本文系统讲解如何在 Spring AI 项目中集成 Chroma 向量数据库,实现文档嵌入存储与相似性检索。内容涵盖名词解释、技术背景、环境准备及 Maven 依赖配置,提供 Docker 部署命令与 Java 代码示例,包括嵌入模型 Bean 定义、VectorStore 构建、文档添加与检索逻辑。支持元数据过滤检索,并通过 Mermaid 图表展示整体流程、状态转变及交互时序。旨在帮助开发者理解 RAG 架构下向量数据库的核心作用,利用 Spring AI 生态快速构建智能检索与问答系统。
随着 AI 大模型、知识检索、RAG(Retrieval Augmented Generation)等技术的兴起,向量数据库成为存储与检索嵌入向量的核心组件。Chroma 作为开源向量数据库,结合 Spring AI 生态,可轻松实现文档、内容、元数据的嵌入存储与高效检索。
| 名词 |
|---|
| 解释 |
|---|
| 向量数据库 | 存储高维向量并支持向量相似性检索的数据库。代表产品有 Chroma、Milvus 等。 |
| Chroma | 一款开源嵌入式向量数据库,支持文档、向量与元数据存储与检索。 |
| EmbeddingModel | 嵌入模型,将文本/图片等数据转化为向量。常见如 OpenAI Embedding API。 |
| VectorStore | 向量存储接口,Spring AI 对向量数据库的抽象封装。 |
| SimilaritySearch | 基于向量的相似性检索,返回与查询向量最接近的内容。 |
| Metadata Filter | 通过元数据筛选检索结果的机制。 |
Maven 依赖:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-vector-store-chroma</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
本地 Chroma 部署:
docker run -it --rm --name chroma -p 8000:8000 ghcr.io/chroma-core/chroma:1.0.0
启动后服务地址为 http://localhost:8000/api/v1
# Chroma 连接配置
spring.ai.vectorstore.chroma.client.host=http://localhost
spring.ai.vectorstore.chroma.client.port=8000
spring.ai.vectorstore.chroma.collection-name=TestCollection
spring.ai.vectorstore.chroma.initialize-schema=true
# OpenAI 嵌入 API Key
spring.ai.openai.api.key=你的 OpenAI API Key
@Bean
public EmbeddingModel embeddingModel() {
return new OpenAiEmbeddingModel(OpenAiApi.builder().apiKey(System.getenv("OPENAI_API_KEY")).build());
}
@Bean
public VectorStore chromaVectorStore(EmbeddingModel embeddingModel, ChromaApi chromaApi) {
return ChromaVectorStore.builder(chromaApi, embeddingModel)
.tenantName("SpringAiTenant")
.databaseName("SpringAiDatabase")
.collectionName("TestCollection")
.initializeSchema(true)
.build();
}
@Autowired
VectorStore vectorStore;
List<Document> documents = List.of(
new Document("Spring AI rocks!!", Map.of("author", "john")),
new Document("The World is Big and Salvation Lurks Around the Corner", Map.of("author", "jill")),
new Document("You walk forward facing the past.", Map.of("author", "john"))
);
// 添加文档
vectorStore.add(documents);
// 相似性检索
List<Document> results = vectorStore.similaritySearch(SearchRequest.builder().query("Spring").topK(5).build());
List<Document> filteredResults = vectorStore.similaritySearch(
SearchRequest.builder()
.query("World")
.topK(5)
.filterExpression("author in ['john', 'jill'] && article_type == 'blog'")
.build()
);
graph LR
A[用户请求] --> B[文本转嵌入]
B --> C[Chroma 向量存储]
C --> D[相似性检索]
D --> E[返回结果]
说明:用户输入文本,经嵌入模型转为向量,存储于 Chroma 中,之后可进行相似性检索。
stateDiagram-v2
[*] --> 初始化
初始化 --> 已连接
已连接 --> 已创建集合
已创建集合 --> 已添加文档
已添加文档 --> 检索中
检索中 --> 返回结果
返回结果 --> [*]
说明:系统从初始化到连接、集合创建、文档添加、检索、返回结果的状态流转。
sequenceDiagram
participant User
participant SpringAI
participant EmbeddingModel
participant ChromaDB
User->>SpringAI: 提交检索请求
SpringAI->>EmbeddingModel: 文本转向量
SpringAI->>ChromaDB: 相似性检索(含元数据过滤)
ChromaDB-->>SpringAI: 检索结果
SpringAI-->>User: 返回文档列表
说明:用户请求经 Spring AI 处理,嵌入模型转向量后,Spring AI 调用 Chroma 进行检索并返回结果。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online