SpringBoot 整合 LangChain4j 实战:轻量 RAG 检索增强生成落地指南

检索增强生成(RAG)通过 “外部知识检索 + LLM 生成” 的组合模式,解决了大模型知识滞后、幻觉输出等痛点,成为企业级 AI 问答系统的核心架构。LangChain4j 作为 Java 生态的主流 LLM 开发框架,提供了从文档处理到检索链构建的全流程支持。本文详解 SpringBoot 整合 LangChain4j 实现 RAG 的关键步骤,以 “企业知识库问答” 为场景,提供轻量化、可直接复用的代码方案,帮助开发者快速落地基于自有知识的智能交互系统。

一、RAG 核心逻辑与技术选型

1. RAG 工作原理

RAG 的核心价值在于 “让 LLM 基于指定知识回答”,核心流程分为三步:

  1. 知识预处理:将企业文档(PDF/Word/TXT)拆分、转换为向量,存储到向量数据库;
  1. 检索匹配:用户提问时,将问题转为向量,从向量库中召回最相关的知识片段;
  1. 增强生成:将召回的知识片段作为上下文,与用户问题拼接后提交 LLM,生成精准回答。

2. 技术栈选型(轻量高效)

组件

选型说明

核心作用

开发框架

SpringBoot 3.2

快速搭建 Java 后端服务,提供依赖管理

LLM 框架

LangChain4j 0.34.0

封装 RAG 全流程,简化 LLM 与向量库集成

向量数据库

H2 嵌入式向量库(开发环境)/Milvus(生产)

存储文档向量,支持相似性检索

LLM 服务

通义千问 API(阿里云)/Ollama(本地部署)

提供生成能力,支持 API / 本地两种模式

文档处理

LangChain4j 文档加载器 + 文本拆分器

解析 PDF/TXT,拆分长文档为短片段

二、项目初始化与核心依赖

1. Maven 依赖配置(pom.xml)

核心依赖聚焦 RAG 必需组件,避免冗余:


<dependencies>

<!-- SpringBoot基础 -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

<!-- LangChain4j核心 -->

<dependency>

<groupId>dev.langchain4j</groupId>

<artifactId>langchain4j-core</artifactId>

<version>0.34.0</version>

</dependency>

<!-- 向量库集成(H2嵌入式) -->

<dependency>

<groupId>dev.langchain4j</groupId>

<artifactId>langchain4j-vector-db-h2</artifactId>

<version>0.34.0</version>

</dependency>

<!-- 文档加载(PDF/TXT) -->

<dependency>

<groupId>dev.langchain4j</groupId>

<artifactId>langchain4j-document-loader-pdf</artifactId>

<version>0.34.0</version>

</dependency>

<dependency>

<groupId>dev.langchain4j</groupId>

<artifactId>langchain4j-document-loader-txt</artifactId>

<version>0.34.0</version>

</dependency>

<!-- 通义千问集成(可选,替换为Ollama也可) -->

<dependency>

<groupId>dev.langchain4j</groupId>

<artifactId>langchain4j-alibaba-tongyi</artifactId>

<version>0.34.0</version>

</dependency>

<!-- 工具类 -->

<dependency>

<groupId>org.projectlombok</groupId>

<artifactId>lombok</artifactId>

<optional>true</optional>

</dependency>

</dependencies>

三、核心组件实现(分模块讲解)

1. 配置类:初始化 LLM 与向量库

统一配置 LLM 客户端与向量存储,支持开发 / 生产环境切换:


import dev.langchain4j.model.chat.ChatLanguageModel;

import dev.langchain4j.model.embedding.EmbeddingModel;

import dev.langchain4j.model.alibaba.tongyi.TongYiChatModel;

import dev.langchain4j.model.alibaba.tongyi.TongYiEmbeddingModel;

import dev.langchain4j.store.embedding.EmbeddingStore;

import dev.langchain4j.store.embedding.h2.H2EmbeddingStore;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration

public class RagConfig {

// 通义千问API密钥(从配置文件读取)

@Value("${tongyi.api-key}")

private String tongyiApiKey;

/**

* 初始化LLM(用于生成回答)

*/

@Bean

public ChatLanguageModel chatLanguageModel() {

return TongYiChatModel.builder()

.apiKey(tongyiApiKey)

.modelName("qwen-turbo") // 轻量版模型,响应更快

.temperature(0.2) // 低温度减少随机性,提升回答准确性

.build();

}

/**

* 初始化嵌入模型(将文本转为向量)

*/

@Bean

public EmbeddingModel embeddingModel() {

return TongYiEmbeddingModel.builder()

.apiKey(tongyiApiKey)

.build();

}

/**

* 初始化向量存储(H2嵌入式,文件路径:./rag-h2-db)

*/

@Bean

public EmbeddingStore embeddingStore() {

return H2EmbeddingStore.builder()

.persistDirectory("./rag-h2-db")

.build();

}

}

2. 文档处理服务:加载与向量存储

实现 PDF/TXT 文档的加载、拆分与向量入库,支持批量处理:


import dev.langchain4j.data.document.Document;

import dev.langchain4j.data.document.loader.DocumentLoader;

import dev.langchain4j.data.document.loader.pdf.PdfDocumentLoader;

import dev.langchain4j.data.document.loader.txt.TxtDocumentLoader;

import dev.langchain4j.data.document.splitter.DocumentSplitters;

import dev.langchain4j.data.segment.TextSegment;

import dev.langchain4j.model.embedding.EmbeddingModel;

import dev.langchain4j.store.embedding.EmbeddingStore;

import lombok.RequiredArgsConstructor;

import org.springframework.stereotype.Service;

import java.nio.file.Path;

import java.util.List;

@Service

@RequiredArgsConstructor

public class DocumentProcessingService {

private final EmbeddingStore embeddingStore;

private final EmbeddingModel embeddingModel;

/**

* 加载文档并存储到向量库

* @param filePath 文档路径(支持PDF/TXT)

*/

public void loadAndStoreDocument(String filePath) {

// 1. 根据文件后缀选择加载器

DocumentLoader loader = filePath.endsWith(".pdf")

? PdfDocumentLoader.load(Path.of(filePath))

: TxtDocumentLoader.load(Path.of(filePath));

Document document = loader.load();

// 2. 拆分文档(按800字符拆分,重叠100字符保持上下文连贯)

List<TextSegment> textSegments = DocumentSplitters.recursive(800, 100)

.split(document);

// 3. 生成向量并入库

embeddingStore.addAll(textSegments, embeddingModel);

System.out.printf("文档加载完成:%s,拆分片段数:%d%n", filePath, textSegments.size());

}

}

3. RAG 核心服务:检索增强生成

构建检索链,实现 “问题 - 检索 - 生成” 的自动化流程,支持对话记忆:


import dev.langchain4j.chain.ConversationalRetrievalChain;

import dev.langchain4j.memory.ChatMemory;

import dev.langchain4j.memory.chat.MessageWindowChatMemory;

import dev.langchain4j.model.chat.ChatLanguageModel;

import dev.langchain4j.retriever.EmbeddingStoreRetriever;

import dev.langchain4j.retriever.Retriever;

import lombok.RequiredArgsConstructor;

import org.springframework.stereotype.Service;

@Service

@RequiredArgsConstructor

public class RagService {

private final ChatLanguageModel chatLanguageModel;

private final EmbeddingStore embeddingStore;

private final EmbeddingModel embeddingModel;

/**

* 构建RAG检索链(带对话记忆)

*/

private ConversationalRetrievalChain buildRagChain() {

// 1. 构建检索器(召回Top3最相关片段)

Retriever retriever = EmbeddingStoreRetriever.from(

embeddingStore,

embeddingModel,

3 // 检索结果数量

);

// 2. 对话记忆(保留最近3轮对话,避免上下文丢失)

ChatMemory chatMemory = MessageWindowChatMemory.withMaxMessages(6); // 3轮×2(问+答)

// 3. 构建检索增强链

return ConversationalRetrievalChain.builder()

.chatLanguageModel(chatLanguageModel)

.retriever(retriever)

.chatMemory(chatMemory)

.promptTemplate("""

仅基于以下上下文信息回答用户问题,不要编造内容:

{context}

用户问题:{question}

回答要求:简洁明了,基于上下文给出精准答案,若上下文无相关信息请说明"暂无相关知识"。

""")

.build();

}

/**

* 处理用户问题,返回增强回答

*/

public String generateAnswer(String question) {

ConversationalRetrievalChain ragChain = buildRagChain();

return ragChain.execute(question);

}

}

4. 接口层:暴露 HTTP 接口供调用

提供文档加载与问答接口,支持前端 / 其他服务调用:


import lombok.RequiredArgsConstructor;

import org.springframework.web.bind.annotation.*;

@RestController

@RequestMapping("/api/rag")

@RequiredArgsConstructor

public class RagController {

private final DocumentProcessingService documentProcessingService;

private final RagService ragService;

/**

* 加载文档接口(初始化时调用,支持PDF/TXT)

*/

@PostMapping("/load-document")

public String loadDocument(@RequestParam String filePath) {

try {

documentProcessingService.loadAndStoreDocument(filePath);

return "文档加载成功";

} catch (Exception e) {

return "文档加载失败:" + e.getMessage();

}

}

/**

* 问答接口(核心接口,接收用户问题返回增强回答)

*/

@GetMapping("/query")

public String query(@RequestParam String question) {

return ragService.generateAnswer(question);

}

}

四、配置文件与测试流程

1. 配置文件(application.yml)

配置 LLM 密钥与服务端口:


spring:

application:

name: springboot-langchain4j-rag

server:

port: 8080

# 通义千问API配置(需在阿里云申请密钥)

tongyi:

api-key: your-tongyi-api-key

2. 测试步骤

  1. 准备文档:在项目根目录创建docs文件夹,放入企业知识库文档(如产品手册.pdf);
  1. 启动服务:运行 SpringBoot 主类,确保服务端口 8080 正常启动;
  1. 加载文档:调用接口POST http://localhost:8080/api/rag/load-document?filePath=docs/产品手册.pdf,返回 “文档加载成功” 即完成入库;
  1. 问答测试:调用接口GET http://localhost:8080/api/rag/query?question=产品支持哪些支付方式?,验证回答是否基于文档内容。

五、关键优化与生产环境适配

1. 开发环境→生产环境优化

  • 向量库替换:将 H2 嵌入式向量库替换为 Milvus/Chroma,支持分布式部署与高并发检索;
  • LLM 优化:本地部署 Ollama+Llama 3(7B/13B),避免 API 调用成本与网络依赖;
  • 缓存策略:添加 Redis 缓存,缓存高频问题的检索结果,提升响应速度。

2. 检索效果优化

  • 文档拆分策略:长文档按段落拆分(DocumentSplitters.byParagraph()),短文档按字符拆分,平衡检索精度与效率;
  • 检索参数调整:调整topK值(默认 3),数据量小时设为 2-3,数据量大时设为 5-8;
  • 提示词优化:细化 prompt 模板,明确要求 LLM 引用文档片段来源(如 “答案来自文档第 X 片段”),提升可追溯性。

3. 性能与安全保障

  • 异步处理:文档加载改为异步任务(@Async),避免大文件加载阻塞接口;
  • 权限控制:添加接口认证(如 JWT),限制文档加载与问答接口的访问权限;
  • 日志记录:记录用户问题、检索结果与生成回答,便于问题排查与效果评估。

总结

SpringBoot 整合 LangChain4j 实现 RAG 的核心在于 “简化集成流程、聚焦业务价值”,通过 LangChain4j 封装的组件,开发者无需关注向量转换、检索匹配等底层细节,可快速搭建基于自有知识的智能问答系统。本文提供的方案轻量化、易扩展,适合企业知识库、产品手册问答等场景,同时支持根据业务需求升级为分布式架构。随着 LLM 与向量数据库的持续发展,RAG 将成为企业落地 AI 应用的首选方案,而 Java 开发者通过 SpringBoot+LangChain4j 的组合,可快速抢占技术落地先机。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐