查看: 55|回复: 0

RAG实战:用LangChain4j构建企业级知识库问答系统

[复制链接]

2

主题

0

回帖

0

积分

积极分子

金币
0
阅读权限
220
精华
0
威望
0
贡献
0
在线时间
0 小时
注册时间
2012-5-3
发表于 2026-3-31 09:33:00 | 显示全部楼层 |阅读模式

前言

RAG(Retrieval-Augmented Generation,检索增强生成)是当前企业落地大模型最主流的方案。它解决了大模型"幻觉"和"知识截止"两大痛点,让 AI 能够基于企业私有知识库进行精准问答。本文用 LangChain4j 带你从零构建一个完整的 RAG 系统。

一、RAG 核心原理

RAG 的工作流程分三步:

  1. 索引阶段:将文档切片 → 向量化 → 存入向量数据库
  2. 检索阶段:用户提问 → 向量化 → 相似度检索 → 召回相关文档片段
  3. 生成阶段:将召回内容 + 用户问题拼接为 Prompt → 大模型生成答案

二、环境准备

<!-- pom.xml -->
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j</artifactId>
    <version>0.36.0</version>
</dependency>
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-open-ai</artifactId>
    <version>0.36.0</version>
</dependency>
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-embeddings-all-minilm-l6-v2</artifactId>
    <version>0.36.0</version>
</dependency>

三、文档加载与切片

// 加载文档
Document document = FileSystemDocumentLoader.loadDocument(
    Paths.get("knowledge-base/company-faq.txt"),
    new TextDocumentParser()
);

// 文档切片(每片500字符,重叠50字符)
DocumentSplitter splitter = DocumentSplitters.recursive(500, 50);
List<TextSegment> segments = splitter.split(document);

System.out.println("切片数量: " + segments.size());

四、向量化与存储

// 使用本地嵌入模型(无需 API Key)
EmbeddingModel embeddingModel = new AllMiniLmL6V2EmbeddingModel();

// 使用内存向量库(生产环境可换 Milvus/Pinecone)
EmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore<>();

// 批量向量化并存储
EmbeddingStoreIngestor ingestor = EmbeddingStoreIngestor.builder()
    .documentSplitter(DocumentSplitters.recursive(500, 50))
    .embeddingModel(embeddingModel)
    .embeddingStore(embeddingStore)
    .build();

ingestor.ingest(document);
System.out.println("文档已向量化并存入知识库");

五、构建问答链

// 定义 AI 服务接口
interface KnowledgeBaseAssistant {
    String answer(String question);
}

// 配置 RAG 检索器
ContentRetriever contentRetriever = EmbeddingStoreContentRetriever.builder()
    .embeddingStore(embeddingStore)
    .embeddingModel(embeddingModel)
    .maxResults(3)          // 召回最相关的3个片段
    .minScore(0.6)          // 相似度阈值
    .build();

// 构建 AI 服务
KnowledgeBaseAssistant assistant = AiServices.builder(KnowledgeBaseAssistant.class)
    .chatLanguageModel(OpenAiChatModel.builder()
        .apiKey(System.getenv("OPENAI_API_KEY"))
        .modelName("gpt-4o-mini")
        .build())
    .contentRetriever(contentRetriever)
    .build();

// 开始问答
String answer = assistant.answer("公司的退款政策是什么?");
System.out.println("AI回答: " + answer);

六、生产环境优化

  1. 向量数据库:替换 InMemoryEmbeddingStore 为 Milvus 或 Weaviate
  2. 混合检索:结合关键词检索 + 向量检索,提升召回率
  3. 重排序:使用 Reranker 对召回结果重新排序,提升精度
  4. 流式输出:使用 StreamingChatLanguageModel 实现打字机效果

总结

RAG 是企业落地大模型的最佳实践。LangChain4j 提供了完整的 Java 生态支持,让你无需 Python 也能构建生产级 AI 应用。下期我们来聊:如何用 Milvus 替换内存向量库,支持百万级文档检索

觉得有帮助请点赞收藏!有问题欢迎评论区交流 🚀

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部