Chroma+LangChain:100 行 Java 代码实现本地知识库向量检索

本文将介绍如何使用 Java 语言结合 Chroma 向量数据库和 LangChain 框架,通过约 100 行代码实现本地知识库的向量检索功能。

技术栈

  • Java 17+:开发语言
  • LangChain4j:Java 版 LangChain 框架
  • Chroma:轻量级向量数据库
  • Sentence Transformers:用于生成文本嵌入

环境准备

  1. 安装 Java 17+
  2. 安装 Chroma(可通过 Docker 快速部署):
    docker run -d -p 8000:8000 --name chroma chromadb/chroma
    
  3. 创建 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());
        }
    }
}

代码解析

  1. 配置参数:设置 Chroma 服务地址、集合名称和本地知识库路径
  2. 初始化嵌入模型:使用 SentenceTransformers 的 all-MiniLM-L6-v2 模型生成文本嵌入
  3. 初始化 Chroma 向量存储:连接到本地 Chroma 服务
  4. 加载本地文档:从指定目录加载所有文档
  5. 分割文档:将长文档分割为 1000 字符的文本段,重叠 200 字符
  6. 生成并存储嵌入:将文本段转换为向量并存储到 Chroma
  7. 执行向量检索:根据查询生成向量,在 Chroma 中查找最相似的 3 个结果
  8. 输出结果:打印检索到的相关内容

使用说明

  1. src/main/resources/knowledge-base目录下放入你的知识库文档(支持 txt、pdf、docx 等格式)
  2. 启动 Chroma Docker 容器
  3. 运行 Java 程序
  4. 查看控制台输出的检索结果

扩展功能

  1. 支持更多文档格式:添加相应的文档解析依赖
  2. 优化检索效果:调整文本分割参数或更换更适合的嵌入模型
  3. 添加元数据过滤:结合文档元数据进行更精确的检索
  4. 集成 LLM:将检索结果作为上下文,结合大语言模型生成更智能的回答

总结

通过上述代码,我们实现了一个简单但功能完整的本地知识库向量检索系统。该系统能够:

  • 自动加载本地文档
  • 将文档转换为向量存储
  • 根据自然语言查询检索相关内容
  • 输出结构化的检索结果

这个实现仅用了约 100 行核心代码,展示了 Chroma 和 LangChain4j 在 Java 生态中构建向量检索系统的强大能力和易用性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

canjun_wen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值