SpringBoot 整合 LangChain4j 实战:轻量 RAG 检索增强生成落地指南
本文介绍了一种基于SpringBoot和LangChain4j的轻量级RAG(检索增强生成)实现方案,用于构建企业知识库问答系统。方案通过整合H2嵌入式向量数据库和通义千问API,实现文档预处理、向量检索和增强生成全流程。文章详细展示了核心组件配置、文档处理服务、RAG检索链构建及HTTP接口实现,并提供了开发到生产环境的优化建议,包括向量库升级、LLM本地部署和检索效果调优。该方案具有轻量化、易
SpringBoot 整合 LangChain4j 实战:轻量 RAG 检索增强生成落地指南
检索增强生成(RAG)通过 “外部知识检索 + LLM 生成” 的组合模式,解决了大模型知识滞后、幻觉输出等痛点,成为企业级 AI 问答系统的核心架构。LangChain4j 作为 Java 生态的主流 LLM 开发框架,提供了从文档处理到检索链构建的全流程支持。本文详解 SpringBoot 整合 LangChain4j 实现 RAG 的关键步骤,以 “企业知识库问答” 为场景,提供轻量化、可直接复用的代码方案,帮助开发者快速落地基于自有知识的智能交互系统。
一、RAG 核心逻辑与技术选型
1. RAG 工作原理
RAG 的核心价值在于 “让 LLM 基于指定知识回答”,核心流程分为三步:
- 知识预处理:将企业文档(PDF/Word/TXT)拆分、转换为向量,存储到向量数据库;
- 检索匹配:用户提问时,将问题转为向量,从向量库中召回最相关的知识片段;
- 增强生成:将召回的知识片段作为上下文,与用户问题拼接后提交 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. 测试步骤
- 准备文档:在项目根目录创建docs文件夹,放入企业知识库文档(如产品手册.pdf);
- 启动服务:运行 SpringBoot 主类,确保服务端口 8080 正常启动;
- 加载文档:调用接口POST http://localhost:8080/api/rag/load-document?filePath=docs/产品手册.pdf,返回 “文档加载成功” 即完成入库;
- 问答测试:调用接口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 的组合,可快速抢占技术落地先机。
更多推荐
所有评论(0)