Spring AI 实战:SpringBoot 整合 LangChain4j

📅 发布时间:2026/7/17 19:28:52 👁️ 浏览次数:
Spring AI 实战:SpringBoot 整合 LangChain4j
目录一、LangChain4j 核心认知1. 框架定位2. 核心特性3. 核心组件4. 典型应用场景二、SpringBoot 整合 LangChain4j 前置准备1. 获取 API Key2. 导入 Maven 依赖3. 配置模型参数三、核心功能实现1. 基础对话能力1.1 Low Level API轻量调用1.2 High Level API链式调用1.3 自定义角色对话2. 会话记忆能力2.1 Low Level API 实现记忆2.2 High Level API 实现记忆3. Function Calling函数调用4. RAG检索增强生成5. 自定义扩展能力5.1 自定义模型5.2 自定义工具5.3 自定义链四、实战案例智能客服系统1. 项目结构设计2. 核心代码实现2.1 服务层整合所有核心能力2.2 控制层提供 RESTful 接口2.3 启动类3. 接口测试五、总结与拓展1. 整合总结在 AI 大模型普及的当下Java 开发者想要快速将大模型能力集成到业务系统中SpringBoot 的轻量高效与 LangChain4j 的大模型适配能力结合成为最优解之一。LangChain4j 作为 Java 生态的大模型集成框架复刻了 Python 版 LangChain 的核心设计让 Java 开发者无需跨语言即可实现大模型的对话、工具调用、检索增强生成等核心能力。本文将从 LangChain4j 核心特性出发一步步讲解 SpringBoot 与 LangChain4j 的整合流程涵盖基础对话、会话记忆、Function Calling、RAG 等核心功能并通过智能客服实战案例让开发者快速落地大模型应用开发。一、LangChain4j 核心认知1. 框架定位LangChain4j 是一款专为 Java 开发者设计的轻量级大模型集成框架核心目标是简化 LLM大型语言模型在 Java 应用中的落地无需复杂的底层调用通过封装好的 API 即可快速对接 OpenAI、Hugging Face 等主流大模型轻松构建聊天机器人、问答系统、文本生成等 AI 应用。2. 核心特性LangChain4j 之所以能成为 Java 生态大模型开发的首选核心在于其贴合 Java 开发习惯的设计特性模块化架构模型集成、数据加载、链式调用等功能解耦可按需选择避免冗余依赖多模型兼容原生支持 OpenAI、Hugging Face 等主流 LLM 提供商模型切换无需大幅修改代码链式调用能力支持将文本生成、情感分析、信息检索等多个任务串联实现复杂业务逻辑丰富的内置组件提供开箱即用的数据加载器、文本处理器支持从多源加载并预处理数据高扩展性预留丰富的扩展点可自定义模型、工具、链组件适配个性化业务需求安全管控内置 API Key 管理机制避免密钥硬编码保障数据和接口安全。3. 核心组件LangChain4j 的核心能力围绕三大组件展开是所有功能实现的基础语言模型Language Model核心组件负责接收指令并生成文本对接各类大模型的底层接口记忆Memory存储对话历史让大模型具备上下文理解能力实现多轮连贯对话工具Tool扩展大模型能力边界支持调用外部 API、执行搜索、运行系统命令等解决大模型 “知识滞后”“无法实操” 的问题。4. 典型应用场景基于核心组件和特性LangChain4j 可覆盖绝大多数 Java 端 AI 应用开发场景智能客服 / 虚拟助手实现多轮上下文对话解答用户业务问题知识库问答系统结合企业文档提供精准的结构化答案自动文本生成生成文章、代码、报告、营销文案等智能工具调度让大模型根据需求自动调用天气、搜索、物流等外部 API。二、SpringBoot 整合 LangChain4j 前置准备在进行功能开发前需完成基础环境配置包括 API Key 获取、依赖导入和配置文件编写本教程以对接 OpenAI 模型为例其他模型配置逻辑基本一致。1. 获取 API Key前往 OpenAI 官网注册并登录账号进入 API Key 管理页面生成并复制 API Key切勿直接硬编码到代码中可将 API Key 存储到环境变量或 SpringBoot 配置文件中保证密钥安全。2. 导入 Maven 依赖在 SpringBoot 项目的pom.xml中添加核心依赖包括 SpringBoot Web 启动器、LangChain4j 核心包和 OpenAI 适配包建议使用最新版本dependencies!-- SpringBoot Web核心依赖 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!-- LangChain4j核心包 --dependencygroupIddev.langchain4j/groupIdartifactIdlangchain4j-core/artifactIdversion0.26.0/version/dependency!-- LangChain4j OpenAI适配包 --dependencygroupIddev.langchain4j/groupIdartifactIdlangchain4j-open-ai/artifactIdversion0.26.0/version/dependency/dependencies3. 配置模型参数在 SpringBoot 的application.yml或application.properties中配置 OpenAI 模型的核心参数核心是配置 API Key也可自定义模型类型、请求超时时间等langchain4j:openai:api-key: 你的OpenAI API Key# 可选配置指定模型默认gpt-3.5-turbomodel-name: gpt-3.5-turbo# 可选配置请求超时时间timeout: 30s三、核心功能实现SpringBoot 整合 LangChain4j 后可实现从基础对话到高级定制的全链路能力以下按基础到高级的顺序讲解核心功能的代码实现所有代码均以 SpringBoot 的Service注解实现可直接注入到控制器中使用。1. 基础对话能力基础对话是大模型应用的核心LangChain4j 提供Low Level API和High Level API两种调用方式分别适配简单场景和复杂场景。1.1 Low Level API轻量调用适用于简单的单轮对话场景直接创建模型实例并调用生成方法代码简洁import dev.langchain4j.model.chat.ChatLanguageModel;import dev.langchain4j.model.openai.OpenAiChatModel;import org.springframework.stereotype.Service;Servicepublic class ChatService {// 注入OpenAI聊天模型private final ChatLanguageModel chatModel;// 构造方法初始化模型public ChatService() {this.chatModel new OpenAiChatModel();}// 单轮对话方法public String singleChat(String userMessage) {// 直接调用模型生成响应return chatModel.generate(userMessage);}}1.2 High Level API链式调用适用于需要扩展的对话场景基于ConversationalRetrievalChain构建对话链可后续灵活添加记忆、检索等能力import dev.langchain4j.chain.ConversationalRetrievalChain;import dev.langchain4j.model.chat.ChatLanguageModel;import dev.langchain4j.model.openai.OpenAiChatModel;import org.springframework.stereotype.Service;Servicepublic class ChainChatService {private final ChatLanguageModel model;public ChainChatService() {model new OpenAiChatModel();}// 链式对话方法public String chainChat(String userMessage) {// 构建对话链ConversationalRetrievalChain chain ConversationalRetrievalChain.builder().chatLanguageModel(model).build();// 执行链并返回结果return chain.execute(userMessage);}}1.3 自定义角色对话通过PromptTemplate模板为大模型设置角色让响应更贴合业务场景如专业客服、技术顾问、文案编辑import dev.langchain4j.model.chat.ChatLanguageModel;import dev.langchain4j.model.openai.OpenAiChatModel;import dev.langchain4j.template.PromptTemplate;import dev.langchain4j.data.segment.Parameters;import org.springframework.stereotype.Service;Servicepublic class RoleChatService {// 定义角色提示模板private final PromptTemplate promptTemplate PromptTemplate.from(你是一名专业的{{role}}请基于专业知识简洁、准确地回答问题{{question}});private final ChatLanguageModel chatModel;public RoleChatService() {this.chatModel new OpenAiChatModel();}// 自定义角色对话public String roleChat(String role, String question) {// 渲染模板填充角色和问题参数String prompt promptTemplate.apply(Parameters.from(role, role, question, question));return chatModel.generate(prompt);}}2. 会话记忆能力基础对话默认无上下文记忆通过 LangChain4j 的Memory组件可实现多轮连贯对话让大模型记住历史对话内容核心使用MessageWindowChatMemory实现对话记忆窗口限制最大记忆消息数。2.1 Low Level API 实现记忆手动管理记忆组件添加用户消息和 AI 响应到记忆中import dev.langchain4j.memory.chat.MessageWindowChatMemory;import dev.langchain4j.model.chat.ChatLanguageModel;import dev.langchain4j.model.openai.OpenAiChatModel;import dev.langchain4j.model.chat.UserMessage;import dev.langchain4j.model.chat.AiMessage;import org.springframework.stereotype.Service;Servicepublic class MemoryChatService {private final ChatLanguageModel chatModel;// 初始化记忆窗口最大保存50条消息private final MessageWindowChatMemory memory;public MemoryChatService() {this.chatModel new OpenAiChatModel();this.memory MessageWindowChatMemory.builder().maxMessages(50).build();}// 带记忆的多轮对话public String memoryChat(String userMessage) {// 将用户消息加入记忆memory.add(UserMessage.from(userMessage));// 基于记忆中的所有消息生成响应String response chatModel.generate(memory.messages());// 将AI响应加入记忆memory.add(AiMessage.from(response));return response;}}2.2 High Level API 实现记忆通过对话链自动管理记忆无需手动添加消息开发更高效import dev.langchain4j.chain.ConversationalRetrievalChain;import dev.langchain4j.memory.chat.MessageWindowChatMemory;import dev.langchain4j.model.chat.ChatLanguageModel;import dev.langchain4j.model.openai.OpenAiChatModel;import org.springframework.stereotype.Service;Servicepublic class ChainMemoryChatService {private final ChatLanguageModel model;private final MessageWindowChatMemory memory;public ChainMemoryChatService() {model new OpenAiChatModel();memory MessageWindowChatMemory.builder().maxMessages(50).build();}// 链式多轮对话自动管理记忆public String chainMemoryChat(String userMessage) {ConversationalRetrievalChain chain ConversationalRetrievalChain.builder().chatLanguageModel(model).chatMemory(memory) // 为对话链绑定记忆.build();return chain.execute(userMessage);}}3. Function Calling函数调用Function Calling 是大模型的高级能力让大模型能根据用户需求自动调用外部函数解决大模型 “知识不实时”“无法执行具体操作” 的问题例如调用天气 API、搜索接口获取实时信息。核心实现通过Tool注解标记外部函数通过Agent代理让大模型自动识别并调用工具。import dev.langchain4j.agent.Agent;import dev.langchain4j.agent.tool.Tool;import dev.langchain4j.agent.tool.ToolRegistry;import dev.langchain4j.model.chat.ChatLanguageModel;import dev.langchain4j.model.openai.OpenAiChatModel;import org.springframework.stereotype.Service;Servicepublic class FunctionCallingService {private final ChatLanguageModel model;// 工具注册器管理所有可调用工具private final ToolRegistry toolRegistry;public FunctionCallingService() {model new OpenAiChatModel();toolRegistry new ToolRegistry();}// 函数调用入口public String callFunction(String userMessage) {// 构建代理绑定模型和工具注册器Agent agent Agent.builder().chatLanguageModel(model).toolRegistry(toolRegistry).build();return agent.execute(userMessage);}// 定义搜索工具Tool注解标记描述需清晰方便大模型识别Tool(name search, description 当需要获取实时信息、未知知识时调用入参为搜索关键词)public String search(String query) {// 此处可对接百度、必应等搜索API实现真实搜索return 【实时搜索结果】 query - 相关信息为XXX对接真实API后替换;}// 定义天气工具Tool(name weather, description 当需要查询各地天气信息时调用入参为城市名称)public String getWeather(String location) {// 此处可对接高德、百度天气APIreturn 【 location 天气信息】25℃晴微风对接真实API后替换;}}4. RAG检索增强生成RAG 是解决大模型知识滞后和幻觉问题的核心技术通过检索外部知识库的相关信息让大模型基于检索结果生成答案保证答案的准确性和实时性是企业级问答系统的核心实现方案。核心流程加载知识库文档→切分文本片段→存储到向量库→用户提问时检索相关片段→大模型基于片段生成答案。import dev.langchain4j.chain.RetrievalAugmentedGenerationChain;import dev.langchain4j.data.document.Document;import dev.langchain4j.data.document.DocumentLoader;import dev.langchain4j.data.document.FileDocumentLoader;import dev.langchain4j.data.segment.TextSegment;import dev.langchain4j.data.segment.TextSegmenter;import dev.langchain4j.data.segment.TextSegmenterFactory;import dev.langchain4j.model.chat.ChatLanguageModel;import dev.langchain4j.model.openai.OpenAiChatModel;import dev.langchain4j.retrieval.Retriever;import dev.langchain4j.retrieval.vectorstore.VectorStoreRetriever;import dev.langchain4j.vectorstore.VectorStore;import dev.langchain4j.vectorstore.VectorStoreFactory;import org.springframework.stereotype.Service;import java.util.List;Servicepublic class RagService {private final ChatLanguageModel model;private final Retriever retriever;// 初始化时创建向量库和检索器public RagService() {model new OpenAiChatModel();VectorStore vectorStore VectorStoreFactory.create(); // 内置向量库生产可替换为Pinecone等retriever new VectorStoreRetriever(vectorStore);}// RAG核心方法基于知识库生成答案public String ragAnswer(String userMessage) {RetrievalAugmentedGenerationChain ragChain RetrievalAugmentedGenerationChain.builder().chatLanguageModel(model).retriever(retriever) // 绑定检索器.build();return ragChain.execute(userMessage);}// 加载知识库文档到向量库public void loadKnowledgeBase(String docPath) {// 加载本地文档支持txt、md、pdf等格式DocumentLoader documentLoader new FileDocumentLoader(docPath);ListDocument documents documentLoader.load();// 切分文本为小片段适配大模型上下文窗口TextSegmenter segmenter TextSegmenterFactory.create();ListTextSegment segments segmenter.segment(documents);// 将文本片段加入检索器自动向量化存储retriever.add(segments);}}5. 自定义扩展能力LangChain4j 的高扩展性体现在自定义模型、自定义工具、自定义链三个方面可完全适配企业个性化业务需求以下讲解核心自定义实现。5.1 自定义模型当需要对接自研大模型或本地模型如本地部署的 Transformer时可实现ChatLanguageModel接口自定义模型import dev.langchain4j.model.chat.ChatLanguageModel;import dev.langchain4j.model.chat.ChatMessage;import dev.langchain4j.model.chat.ChatResponse;import dev.langchain4j.model.chat.AiMessage;import org.springframework.stereotype.Service;import java.util.List;Servicepublic class CustomModelService {// 自定义模型实例private final ChatLanguageModel customModel;public CustomModelService() {this.customModel new LocalChatModel();}// 自定义模型生成方法public String customGenerate(String prompt) {return customModel.generate(prompt);}// 实现ChatLanguageModel接口自定义本地模型static class LocalChatModel implements ChatLanguageModel {Overridepublic ChatResponse generate(ListChatMessage messages) {// 此处实现自研/本地模型的调用逻辑String customResponse 本地模型响应 messages.get(messages.size()-1).text();// 构造并返回响应return ChatResponse.builder().message(AiMessage.from(customResponse)).build();}}}5.2 自定义工具除了内置工具可通过Tool注解实现自定义业务工具例如调用企业内部的订单查询、物流跟踪接口import dev.langchain4j.agent.Agent;import dev.langchain4j.agent.tool.Tool;import dev.langchain4j.agent.tool.ToolRegistry;import dev.langchain4j.model.chat.ChatLanguageModel;import dev.langchain4j.model.openai.OpenAiChatModel;import org.springframework.stereotype.Service;Servicepublic class CustomToolService {private final ChatLanguageModel model;private final ToolRegistry toolRegistry;public CustomToolService() {model new OpenAiChatModel();toolRegistry new ToolRegistry();}public String callCustomTool(String userMessage) {Agent agent Agent.builder().chatLanguageModel(model).toolRegistry(toolRegistry).build();return agent.execute(userMessage);}// 自定义企业订单查询工具Tool(name orderQuery, description 查询企业订单状态入参为订单编号)public String queryOrder(String orderNo) {// 对接企业内部订单系统APIreturn 【订单 orderNo 状态】已发货物流单号SF1234567890;}}5.3 自定义链当需要串联多个自定义任务时可实现Chain接口自定义链例如 “文本生成→情感分析→结果过滤” 的组合逻辑import dev.langchain4j.chain.Chain;import dev.langchain4j.model.chat.ChatLanguageModel;import dev.langchain4j.model.openai.OpenAiChatModel;import org.springframework.stereotype.Service;Servicepublic class CustomChainService {private final ChatLanguageModel model;public CustomChainService() {model new OpenAiChatModel();}// 自定义链执行入口public String customChainExecute(String userMessage) {CustomBusinessChain chain new CustomBusinessChain(model);return chain.execute(userMessage);}// 实现Chain接口自定义业务链static class CustomBusinessChain implements Chain {private final ChatLanguageModel model;public CustomBusinessChain(ChatLanguageModel model) {this.model model;}Overridepublic String execute(String input) {// 步骤1大模型生成文本String generateText model.generate(基于以下需求生成文案 input);// 步骤2对生成的文本进行情感分析String sentiment model.generate(分析以下文本的情感倾向仅返回正面/负面/中性 generateText);// 步骤3过滤负面文案返回结果if (负面.equals(sentiment)) {return 生成的文案情感倾向为负面已过滤请重新输入需求;}return 生成文案情感 sentiment generateText;}}}四、实战案例智能客服系统结合以上所有核心功能我们构建一个企业级智能客服系统实现多轮上下文对话、实时工具调用、知识库问答的核心能力让开发者快速将代码落地到实际项目中。1. 项目结构设计遵循 SpringBoot 的分层开发规范按控制器→服务层→自定义组件划分结构清晰易于维护src/main/java/com/example/aichat/├── controller/ # 控制层提供接口入口│ └── AiChatController.java├── service/ # 服务层实现核心业务逻辑│ └── AiCustomerService.java└── AiChatApplication.java # SpringBoot启动类2. 核心代码实现2.1 服务层整合所有核心能力将对话、记忆、Function Calling、RAG 整合到一个服务类实现智能客服的综合能力import dev.langchain4j.agent.Agent;import dev.langchain4j.agent.tool.Tool;import dev.langchain4j.agent.tool.ToolRegistry;import dev.langchain4j.chain.ConversationalRetrievalChain;import dev.langchain4j.data.document.Document;import dev.langchain4j.data.document.FileDocumentLoader;import dev.langchain4j.data.segment.TextSegment;import dev.langchain4j.data.segment.TextSegmenter;import dev.langchain4j.data.segment.TextSegmenterFactory;import dev.langchain4j.memory.chat.MessageWindowChatMemory;import dev.langchain4j.model.chat.ChatLanguageModel;import dev.langchain4j.model.openai.OpenAiChatModel;import dev.langchain4j.retrieval.Retriever;import dev.langchain4j.retrieval.vectorstore.VectorStoreRetriever;import dev.langchain4j.vectorstore.VectorStore;import dev.langchain4j.vectorstore.VectorStoreFactory;import org.springframework.stereotype.Service;import java.util.List;Servicepublic class AiCustomerService {// 核心组件private final ChatLanguageModel model;private final MessageWindowChatMemory memory;private final ToolRegistry toolRegistry;private final Retriever retriever;// 初始化所有组件public AiCustomerService() {model new OpenAiChatModel();// 对话记忆最大保存100条消息memory MessageWindowChatMemory.builder().maxMessages(100).build();toolRegistry new ToolRegistry();// 知识库检索器VectorStore vectorStore VectorStoreFactory.create();retriever new VectorStoreRetriever(vectorStore);// 初始化加载企业知识库this.loadKnowledgeBase(src/main/resources/knowledge/base.md);}// 智能客服核心方法整合记忆、工具、检索public String customerService(String userMessage) {ConversationalRetrievalChain chain ConversationalRetrievalChain.builder().chatLanguageModel(model).chatMemory(memory).toolRegistry(toolRegistry).retriever(retriever).build();return chain.execute(userMessage);}// 工具1企业产品知识库查询对接本地文档Tool(name productQuery, description 查询企业产品的功能、价格、使用方法入参为产品名称)public String queryProduct(String productName) {return retriever.retrieve(productName).get(0).text();}// 工具2物流查询Tool(name logisticsQuery, description 查询订单物流状态入参为订单编号)public String queryLogistics(String orderNo) {// 对接企业物流系统return 【订单 orderNo 物流】已到达杭州市余杭区预计今日送达;}// 工具3人工客服转接Tool(name transferService, description 当用户需要人工服务时调用无入参)public String transferToHuman() {return 已为您转接人工客服客服工号8008预计等待时间30秒请稍候...;}// 加载企业知识库文档private void loadKnowledgeBase(String docPath) {try {DocumentLoader loader new FileDocumentLoader(docPath);ListDocument docs loader.load();TextSegmenter segmenter TextSegmenterFactory.create();ListTextSegment segments segmenter.segment(docs);retriever.add(segments);System.out.println(企业知识库加载成功共加载 segments.size() 个文本片段);} catch (Exception e) {System.err.println(知识库加载失败 e.getMessage());}}}2.2 控制层提供 RESTful 接口创建控制器提供 HTTP 接口供前端或其他系统调用实现前后端分离import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;RestControllerRequestMapping(/api/ai/customer)public class AiChatController {// 注入智能客服服务Autowiredprivate AiCustomerService aiCustomerService;// 智能客服对话接口PostMapping(/chat)public String chat(RequestBody String userMessage) {return aiCustomerService.customerService(userMessage);}}2.3 启动类普通 SpringBoot 启动类无需额外配置import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplicationpublic class AiChatApplication {public static void main(String[] args) {SpringApplication.run(AiChatApplication.class, args);}}3. 接口测试启动 SpringBoot 项目后可通过 Postman、Apifox 等工具调用接口测试智能客服能力请求地址http://localhost:8080/api/ai/customer/chat请求方式POST请求体我的订单SF1234567890到哪了响应结果【订单SF1234567890物流】已到达杭州市余杭区预计今日送达五、总结与拓展1. 整合总结SpringBoot 与 LangChain4j 的整合让 Java 开发者无需深入大模型底层调用逻辑即可快速实现 AI 应用开发核心优势体现在开发高效基于 SpringBoot 的注解式开发符合 Java 开发者的编码习惯快速上手能力全面从基础对话到高级的 RAG、Function Calling覆盖大模型应用的核心场景高度可扩展支持自定义模型、工具、链适配企业个性化业务需求生态兼容无缝对接 SpringBoot 生态可与 Spring Security、MyBatis 等组件结合构建完整的企业级系统。本文的案例基于 LangChain4j 内置组件实现生产环境中可根据业务需求进行优化向量库替换将内置 VectorStore 替换为专业向量库如 Pinecone、Milvus、Elasticsearch提升海量知识库的检索性能模型集群对接大模型集群实现负载均衡提升接口并发能力缓存优化对高频查询的知识库片段和工具调用结果做缓存减少大模型和外部 API 的调用次数日志与监控添加详细的日志记录和接口监控跟踪大模型调用、工具执行的状态便于问题排查权限控制结合 Spring Security 对 AI 接口做权限控制避免未授权调用。