本文将介绍如何使用 Java 语言结合 Chroma 向量数据库和 LangChain 框架,通过约 100 行代码实现本地知识库的向量检索功能。
技术栈
- Java 17+:开发语言
- LangChain4j:Java 版 LangChain 框架
- Chroma:轻量级向量数据库
- Sentence Transformers:用于生成文本嵌入
环境准备
- 安装 Java 17+
- 安装 Chroma(可通过 Docker 快速部署):
docker run -d -p 8000:8000 --name chroma chromadb/chroma - 创建 Maven 项目,添加依赖:
<dependencies>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j</artifactId>
<version>0.27.0</version>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-chroma</artifactId>
<version>0.27.0</version>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-embeddings-sentence-transformers</artifactId>
<version>0.27.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>2.0.9</version>
</dependency>
</dependencies>
实现代码
import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.DocumentLoader;
import dev.langchain4j.data.document.loader.FileSystemDocumentLoader;
import dev.langchain4j.data.document.splitter.DocumentSplitters;
import dev.langchain4j.data.embedding.Embedding;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.model.embedding.SentenceTransformersEmbeddingModel;
import dev.langchain4j.store.embedding.EmbeddingStore;
import dev.langchain4j.store.embedding.chroma.ChromaEmbeddingStore;
import java.net.URI;
import java.nio.file.Path;
import java.util.List;
public class LocalKnowledgeBase {
public static void main(String[] args) {
// 1. 配置参数
String chromaUrl = "http://localhost:8000";
String collectionName = "local-knowledge-base";
Path knowledgeBasePath = Path.of("src/main/resources/knowledge-base");
// 2. 初始化嵌入模型
EmbeddingModel embeddingModel = SentenceTransformersEmbeddingModel.builder()
.modelName("all-MiniLM-L6-v2")
.build();
// 3. 初始化Chroma向量存储
EmbeddingStore<TextSegment> embeddingStore = ChromaEmbeddingStore.builder()
.baseUrl(URI.create(chromaUrl))
.collectionName(collectionName)
.build();
// 4. 加载本地文档
DocumentLoader documentLoader = FileSystemDocumentLoader.builder()
.directoryPath(knowledgeBasePath)
.build();
List<Document> documents = documentLoader.load();
// 5. 分割文档为文本段
List<TextSegment> textSegments = DocumentSplitters.recursive(1000, 200)
.splitAll(documents);
// 6. 生成嵌入并存储到Chroma
embeddingStore.addAll(textSegments, embeddingModel);
// 7. 执行向量检索
String query = "如何使用Java实现向量检索?";
List<TextSegment> relevantSegments = embeddingStore
.findRelevant(query, embeddingModel, 3)
.stream()
.map(match -> match.embedded())
.toList();
// 8. 输出检索结果
System.out.println("查询: " + query);
System.out.println("\n检索到的相关内容:");
for (int i = 0; i < relevantSegments.size(); i++) {
System.out.println("\n--- 结果 " + (i + 1) + " ---");
System.out.println(relevantSegments.get(i).text());
}
}
}
代码解析
- 配置参数:设置 Chroma 服务地址、集合名称和本地知识库路径
- 初始化嵌入模型:使用 SentenceTransformers 的 all-MiniLM-L6-v2 模型生成文本嵌入
- 初始化 Chroma 向量存储:连接到本地 Chroma 服务
- 加载本地文档:从指定目录加载所有文档
- 分割文档:将长文档分割为 1000 字符的文本段,重叠 200 字符
- 生成并存储嵌入:将文本段转换为向量并存储到 Chroma
- 执行向量检索:根据查询生成向量,在 Chroma 中查找最相似的 3 个结果
- 输出结果:打印检索到的相关内容
使用说明
- 在
src/main/resources/knowledge-base目录下放入你的知识库文档(支持 txt、pdf、docx 等格式) - 启动 Chroma Docker 容器
- 运行 Java 程序
- 查看控制台输出的检索结果
扩展功能
- 支持更多文档格式:添加相应的文档解析依赖
- 优化检索效果:调整文本分割参数或更换更适合的嵌入模型
- 添加元数据过滤:结合文档元数据进行更精确的检索
- 集成 LLM:将检索结果作为上下文,结合大语言模型生成更智能的回答
总结
通过上述代码,我们实现了一个简单但功能完整的本地知识库向量检索系统。该系统能够:
- 自动加载本地文档
- 将文档转换为向量存储
- 根据自然语言查询检索相关内容
- 输出结构化的检索结果
这个实现仅用了约 100 行核心代码,展示了 Chroma 和 LangChain4j 在 Java 生态中构建向量检索系统的强大能力和易用性。

337

被折叠的 条评论
为什么被折叠?



