Java开发者实战指南:Spring AI与LangChain4j集成大模型构建智能应用

📅 2026/7/1 10:00:12
Java开发者实战指南:Spring AI与LangChain4j集成大模型构建智能应用
如果你是一名Java开发者最近一定被“AI大模型”这个词刷屏了。从各种AI编程助手到智能客服、文档分析似乎一夜之间不懂点AI就没法做开发了。但当你真正想动手把大模型能力集成到自己的Spring Boot项目里时却发现困难重重OpenAI的API太贵且不稳定本地部署模型门槛高LangChain的Python生态虽好但Java开发者无从下手更别提设计一个能自主调用工具、完成复杂任务的智能体Agent了。这恰恰是大多数Java开发者面对AI时的真实困境概念很热但落地的路径很模糊。我们需要的不是又一个介绍ChatGPT有多厉害的视频而是一套能用Java语言、在Spring生态里、以可工程化的方式构建AI应用的实战指南。本文将为你彻底解决这个问题。我们不谈空泛的趋势直接聚焦于当前JavaAI领域最实用、最前沿的四大技术栈Spring AI、Spring AI Alibaba、LangChain4j以及Agent开发。我会带你从零开始理清它们各自的定位、优劣和适用场景并通过一个完整的电商客服智能体案例手把手教你如何将它们组合起来构建一个真正能跑起来的AI应用。无论你是想为现有系统增加智能问答还是开发全新的AI驱动功能这篇文章都将是你最实用的“脚手架”。1. 为什么Java开发者今天必须关注AI集成在深入技术细节之前我们必须先达成一个共识对于后端和服务端开发尤其是企业级应用AI能力的集成正在从“锦上添花”变为“不可或缺”。这背后有三个核心驱动力第一用户体验的代际升级。传统的软件交互基于固定的表单和流程而AI带来了自然语言交互的可能性。用户可以用一句话描述需求“帮我找出上个月金额大于1万元且状态为异常的订单”而不需要记住复杂的筛选条件。这种体验的提升是革命性的。第二开发范式的转变。过去我们通过编写精确的逻辑代码来处理业务。现在我们可以通过“提示词Prompt工程”和“智能体Agent编排”让大模型理解意图并协调各种工具Tool来完成工作。开发者的角色正在从“逻辑的实现者”部分转向“能力的定义者和编排者”。第三Java生态的迫切需求。全球有数百万的Java系统和Spring Boot应用。这些系统积累了海量的业务数据和逻辑但缺乏一个智能的“大脑”来理解和处理非结构化的需求。直接在现有Java技术栈上集成AI比用Python重写一套服务成本要低得多风险也更可控。然而挑战是明显的。大模型本身是Python/PyTorch生态的产物Java作为客户端调用者面临着API抽象不统一、流式响应处理复杂、上下文管理繁琐、工具调用Function Calling工程化困难等一系列问题。这正是Spring AI等项目诞生的背景。2. 核心框架全景解读Spring AI vs. Spring AI Alibaba vs. LangChain4j面对众多选择很多开发者会困惑我到底该用哪个下面这张对比表清晰地展示了三大主力的核心差异特性维度Spring AISpring AI AlibabaLangChain4j出身与定位Spring官方项目旨在为Spring生态提供统一的AI抽象。阿里云贡献基于Spring AI接口深度集成阿里云灵积等国内模型。Java版的LangChain提供一套链式Chain编排的DSL更灵活。核心优势1.官方背书与Spring Boot无缝集成。2.接口统一更换模型提供商只需改配置。3.自动配置开箱即用。1.专攻国内模型便捷接入通义千问、DeepSeek等。2.符合国内法规网络稳定。3. 提供阿里云特色功能集成。1.设计理念先进与Python版LangChain概念同步。2.组件丰富对记忆、检索、工具、智能体支持更细粒度。3.灵活性极高适合复杂AI应用编排。适用场景希望快速、稳定地将主流大模型如OpenAI、Azure能力嵌入Spring应用的团队。主要业务在国内需使用国产大模型且希望享受Spring便利性的项目。需要构建复杂AI工作流如多步推理、自定义记忆、复杂工具调用的进阶开发者。学习曲线较低熟悉Spring即可上手。低与Spring AI类似。中等需要理解其链、工具、记忆等概念。一个关键的判断是对于大多数刚开始尝试的Java团队Spring AI或Spring AI Alibaba是更好的起点。它降低了入门门槛让你能快速看到效果。而当你需要更精细的控制和更复杂的逻辑时LangChain4j的强大能力就会凸显出来。它们不是互斥的甚至可以结合使用。3. 环境准备与项目初始化我们以一个Spring Boot 3.x项目为基础演示如何集成这些框架。你可以使用 Spring Initializr 或你的IDE来创建项目。核心依赖JDK 17(Spring Boot 3.x 要求)Maven 3.6或GradleIDE(IntelliJ IDEA 推荐)3.1 创建Spring Boot项目使用Spring Initializr选择Project: MavenLanguage: JavaSpring Boot: 3.2.x (建议最新稳定版)Group Artifact: 按需定义例如com.exampleDependencies: 至少添加Spring Web生成项目后用IDE打开。3.2 添加AI框架依赖我们将演示如何添加Spring AI和LangChain4j的依赖。在实际项目中你通常只需要选择一个。方案A使用Spring AI (以OpenAI为例)在pom.xml中添加Spring AI的BOM物料清单和OpenAI Starter依赖。!-- 在 properties 标签内或附近添加Spring AI版本 -- properties spring-ai.version0.8.1/spring-ai.version !-- 请检查最新版本 -- /properties !-- 在 dependencies 标签内添加 -- dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-bom/artifactId version${spring-ai.version}/version typepom/type scopeimport/scope /dependency dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-openai-spring-boot-starter/artifactId /dependency方案B使用Spring AI Alibaba (以通义千问为例)Spring AI Alibaba的依赖组织方式类似但GroupId不同。dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-ai-alibaba-bom/artifactId version2023.0.1.0/version !-- 请检查最新版本 -- typepom/type scopeimport/scope /dependency dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-ai-alibaba-qwen-spring-boot-starter/artifactId /dependency方案C使用LangChain4jLangChain4j是一个独立的库不依赖Spring Boot但可以完美集成。dependency groupIddev.langchain4j/groupId artifactIdlangchain4j/artifactId version0.31.0/version !-- 请检查最新版本 -- /dependency dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-open-ai/artifactId version0.31.0/version /dependency为了后续的案例我们选择方案ASpring AI OpenAI作为主要演示因为它最通用。同时我们也会在Agent部分引入LangChain4j来展示其独特价值。4. 基础入门用Spring AI实现第一个AI对话让我们用最简单的代码验证环境是否成功并理解Spring AI的核心抽象。4.1 配置API密钥在application.yml或application.properties中配置你的OpenAI API密钥和基础URL如果你使用Azure OpenAI或第三方代理需要修改base-url。# application.yml spring: ai: openai: api-key: ${OPENAI_API_KEY:your-api-key-here} # 建议使用环境变量 chat: options: model: gpt-3.5-turbo # 或 gpt-4 temperature: 0.7重要提醒永远不要将真实的API密钥提交到代码仓库。请使用环境变量如OPENAI_API_KEY或配置中心来管理。4.2 创建Chat ServiceSpring AI的核心是ChatClient接口。我们可以通过自动注入来使用它。// 文件路径src/main/java/com/example/ai/demo/service/SimpleChatService.java package com.example.ai.demo.service; import org.springframework.ai.chat.ChatClient; import org.springframework.ai.chat.ChatResponse; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.chat.prompt.PromptTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Map; Service public class SimpleChatService { private final ChatClient chatClient; Autowired public SimpleChatService(ChatClient chatClient) { this.chatClient chatClient; } /** * 最简单的对话调用 */ public String chat(String message) { return chatClient.call(message); } /** * 使用PromptTemplate进行带变量的对话 */ public String chatWithTemplate(String topic, String style) { // PromptTemplate允许你定义带占位符的提示词模板 String template 请用{style}的风格写一段关于{topic}的简短介绍。; PromptTemplate promptTemplate new PromptTemplate(template); Prompt prompt promptTemplate.create(Map.of(topic, topic, style, style)); ChatResponse response chatClient.call(prompt); return response.getResult().getOutput().getContent(); } }4.3 创建REST Controller暴露接口// 文件路径src/main/java/com/example/ai/demo/controller/ChatController.java package com.example.ai.demo.controller; import com.example.ai.demo.service.SimpleChatService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; RestController RequestMapping(/api/ai) public class ChatController { private final SimpleChatService chatService; Autowired public ChatController(SimpleChatService chatService) { this.chatService chatService; } PostMapping(/chat) public String chat(RequestBody ChatRequest request) { return chatService.chat(request.getMessage()); } GetMapping(/chat/template) public String chatWithTemplate(RequestParam String topic, RequestParam String style) { return chatService.chatWithTemplate(topic, style); } // 简单的请求体 public static class ChatRequest { private String message; // getter and setter public String getMessage() { return message; } public void setMessage(String message) { this.message message; } } }4.4 运行与测试启动Spring Boot应用。使用curl、Postman 或浏览器测试简单对话curl -X POST http://localhost:8080/api/ai/chat \ -H Content-Type: application/json \ -d {message: Java编程的主要优点是什么}模板对话http://localhost:8080/api/ai/chat/template?topicSpring%20Bootstyle幽默如果一切顺利你将收到大模型的回复。至此你已经成功在Spring Boot中集成了AI对话能力。但这只是开始真正的价值在于让AI能操作你的系统和数据。5. 核心进阶Function Calling与工具调用大模型本身是“闭着眼睛”的它不知道你的数据库里有什么也不会调用你的业务方法。Function Calling函数调用或Tool Calling是让AI“睁开眼”、“伸出手”的关键机制。你通过Schema定义工具函数的描述、参数大模型在理解用户意图后会输出一个结构化的调用请求由你的代码来执行真正的函数。5.1 在Spring AI中定义工具Spring AI 提供了Tool注解可以方便地将Bean的方法暴露为AI可调用的工具。假设我们有一个简单的订单查询服务// 文件路径src/main/java/com/example/ai/demo/service/OrderService.java package com.example.ai.demo.service; import org.springframework.stereotype.Service; import java.util.*; Service public class OrderService { // 模拟一个订单数据库 private MapLong, Order orderDatabase new HashMap(); public OrderService() { // 初始化一些模拟数据 orderDatabase.put(1001L, new Order(1001L, user_001, 299.99, SHIPPED, new Date())); orderDatabase.put(1002L, new Order(1002L, user_001, 1500.50, DELIVERED, new Date())); orderDatabase.put(1003L, new Order(1003L, user_002, 89.99, PENDING, new Date())); } public ListOrder getOrdersByUserId(String userId) { return orderDatabase.values().stream() .filter(order - order.userId().equals(userId)) .toList(); } public Order getOrderById(Long orderId) { return orderDatabase.get(orderId); } public ListOrder getOrdersByStatus(String status) { return orderDatabase.values().stream() .filter(order - order.status().equalsIgnoreCase(status)) .toList(); } // 订单记录类 public record Order(Long orderId, String userId, Double amount, String status, Date createTime) {} }现在我们创建一个Tool Bean将订单查询能力暴露给AI// 文件路径src/main/java/com/example/ai/demo/tool/OrderTools.java package com.example.ai.demo.tool; import com.example.ai.demo.service.OrderService; import com.example.ai.demo.service.OrderService.Order; import org.springframework.ai.tool.Tool; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.List; Component public class OrderTools { private final OrderService orderService; Autowired public OrderTools(OrderService orderService) { this.orderService orderService; } Tool(description 根据用户ID查询该用户的所有订单) public ListOrder getOrdersByUserId(String userId) { return orderService.getOrdersByUserId(userId); } Tool(description 根据订单ID查询订单详情) public Order getOrderById(Long orderId) { return orderService.getOrderById(orderId); } Tool(description 根据订单状态查询订单列表状态可以是PENDING, SHIPPED, DELIVERED, CANCELLED) public ListOrder getOrdersByStatus(String status) { return orderService.getOrdersByStatus(status); } }5.2 创建能使用工具的Chat ServiceSpring AI 的ChatClient可以自动发现带有Tool注解的Bean并在对话中根据需要调用它们。// 文件路径src/main/java/com/example/ai/demo/service/ToolEnabledChatService.java package com.example.ai.demo.service; import org.springframework.ai.chat.ChatClient; import org.springframework.ai.chat.ChatResponse; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.chat.prompt.PromptTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Map; Service public class ToolEnabledChatService { private final ChatClient chatClient; Autowired public ToolEnabledChatService(ChatClient chatClient) { // 这个ChatClient已经被Spring AI自动配置为能够感知上下文中所有Tool的工具 this.chatClient chatClient; } public String chatWithTools(String userMessage) { // 构建一个系统提示词告诉AI它的角色和能力 String systemPrompt 你是一个智能电商客服助手。你可以帮助用户查询订单信息。 当用户询问订单相关问题时请使用你拥有的工具来获取准确数据然后基于数据回答用户。 如果用户的问题与订单无关请礼貌地告知你的能力范围。 ; // 将系统提示和用户消息组合成一个完整的Prompt Prompt prompt new Prompt(systemPrompt \n\n用户问题 userMessage); ChatResponse response chatClient.call(prompt); return response.getResult().getOutput().getContent(); } }5.3 测试工具调用更新Controller调用新的Service。// 在ChatController中添加 PostMapping(/chat/with-tools) public String chatWithTools(RequestBody ChatRequest request) { return toolEnabledChatService.chatWithTools(request.getMessage()); }现在你可以向这个接口提问“用户user_001的订单有哪些”“订单1001的状态是什么”“所有已发货的订单有哪些”AI会先理解你的自然语言问题然后自动选择并调用getOrdersByUserId、getOrderById或getOrdersByStatus工具获取真实数据后再组织成自然语言回复给你。这就是智能体Agent的雏形一个能理解目标、使用工具完成任务的大模型。Spring AI 让这个过程在Spring生态中变得非常简单。6. 构建复杂智能体LangChain4j的用武之地当你的需求超出简单的工具调用需要多步骤推理、长期记忆、复杂流程编排时Spring AI的基础抽象可能显得不够用。这时LangChain4j的设计理念就显示出优势了。它提供了更丰富的组件来构建复杂的Agent。让我们用LangChain4j实现一个更强大的客服Agent它不仅能查订单还能在查询后根据结果进行后续操作例如如果订单未发货可以触发一个“催促发货”的模拟操作。6.1 添加LangChain4j依赖并配置首先在pom.xml中添加依赖如果之前没加的话。dependency groupIddev.langchain4j/groupId artifactIdlangchain4j/artifactId version0.31.0/version /dependency dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-open-ai/artifactId version0.31.0/version /dependency创建一个配置类来构建LangChain4j的AI服务// 文件路径src/main/java/com/example/ai/demo/config/LangChain4jConfig.java package com.example.ai.demo.config; import dev.langchain4j.model.openai.OpenAiChatModel; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import static java.time.Duration.ofSeconds; Configuration public class LangChain4jConfig { Value(${spring.ai.openai.api-key}) private String openAiApiKey; Bean public OpenAiChatModel openAiChatModel() { return OpenAiChatModel.builder() .apiKey(openAiApiKey) .modelName(gpt-3.5-turbo) .temperature(0.7) .timeout(ofSeconds(60)) .build(); } }6.2 使用LangChain4j定义更复杂的工具在LangChain4j中工具是通过实现Tool接口或使用注解来定义的。我们定义两个工具一个查询一个“催促发货”。// 文件路径src/main/java/com/example/ai/demo/tool/langchain4j/OrderLangChainTools.java package com.example.ai.demo.tool.langchain4j; import com.example.ai.demo.service.OrderService; import dev.langchain4j.agent.tool.Tool; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.Collectors; Component public class OrderLangChainTools { Autowired private OrderService orderService; Tool(根据订单ID查询订单详情返回订单ID、金额、状态等信息。) public String getOrderDetail(Long orderId) { OrderService.Order order orderService.getOrderById(orderId); if (order null) { return 未找到订单ID为 orderId 的订单。; } return String.format(订单[ID:%d] 状态%s, 金额%.2f, 用户%s, order.orderId(), order.status(), order.amount(), order.userId()); } Tool(催促订单发货。这是一个会改变系统状态的操作需要谨慎使用。) public String urgeOrderShipment(Long orderId) { OrderService.Order order orderService.getOrderById(orderId); if (order null) { return 无法催促订单不存在。; } if (SHIPPED.equals(order.status()) || DELIVERED.equals(order.status())) { return String.format(订单[ID:%d]状态已是%s无需催促。, orderId, order.status()); } // 模拟一个发货操作在实际系统中这里会调用发货服务 // orderService.shipOrder(orderId); return String.format(已成功催促订单[ID:%d]发货。系统已通知仓库优先处理。, orderId); } }6.3 组装智能体并执行LangChain4j的核心概念之一是Agent它可以将模型、工具、记忆等组件组合起来。我们创建一个服务来组装并运行这个Agent。// 文件路径src/main/java/com/example/ai/demo/service/LangChainAgentService.java package com.example.ai.demo.service; import dev.langchain4j.agent.tool.ToolSpecification; import dev.langchain4j.memory.ChatMemory; import dev.langchain4j.memory.chat.MessageWindowChatMemory; import dev.langchain4j.model.openai.OpenAiChatModel; import dev.langchain4j.service.AiServices; import dev.langchain4j.service.tool.ToolExecutionRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; Service public class LangChainAgentService { // 定义Agent的接口。AI将实现这个接口的方法。 interface CustomerServiceAgent { String chat(String userMessage); } private final CustomerServiceAgent agent; Autowired public LangChainAgentService(OpenAiChatModel openAiChatModel, OrderLangChainTools orderTools) { // 1. 创建聊天记忆让Agent能记住上下文例如记住刚才查询的订单ID ChatMemory chatMemory MessageWindowChatMemory.withMaxMessages(10); // 2. 使用AiServices.builder()组装Agent this.agent AiServices.builder(CustomerServiceAgent.class) .chatLanguageModel(openAiChatModel) .chatMemory(chatMemory) // 注入记忆 .tools(orderTools) // 注入工具BeanLangChain4j会自动发现其中的Tool方法 .build(); } public String execute(String userMessage) { try { return agent.chat(userMessage); } catch (Exception e) { return 抱歉处理您的请求时出现了问题: e.getMessage(); } } }6.4 测试复杂Agent创建一个新的Controller端点// 在ChatController中添加 Autowired private LangChainAgentService langChainAgentService; PostMapping(/chat/agent) public String chatWithAgent(RequestBody ChatRequest request) { return langChainAgentService.execute(request.getMessage()); }现在你可以进行多轮对话测试Agent的记忆和复杂决策能力第一轮 “帮我查一下订单1001的详情。” (Agent调用getOrderDetail工具)第二轮 “这个订单还没发货能催一下吗” (Agent记得上一轮对话中的订单ID是1001并调用urgeOrderShipment工具)第三轮 “再查一下1002呢” (Agent能理解“再查一下”指的是订单并继续调用查询工具)你会发现这个Agent具备了简单的状态记忆和多步骤决策能力。而这只是LangChain4j能力的冰山一角你还可以为其添加检索增强生成RAG、多Agent协作等更高级的功能。7. 生产环境关键考量与最佳实践将AI集成到生产环境远不止是调通API。以下是必须关注的几个核心问题7.1 成本与性能优化模型选择GPT-4能力更强但价格昂贵GPT-3.5-Turbo性价比高。根据业务场景选择非核心交互可用小模型。提示词优化清晰的系统提示词System Prompt能极大提升模型表现减少无效token消耗。将固定的上下文、角色定义放在系统提示中。缓存策略对频繁且结果确定的AI查询如产品描述生成、固定问答实施缓存避免重复调用。超时与重试配置合理的超时时间并对可重试的错误如网络抖动、速率限制实现指数退避重试。# 在application.yml中配置重试需添加spring-retry依赖 spring: ai: openai: chat: options: model: gpt-3.5-turbo temperature: 0.7 # 自定义客户端配置示例 client: connect-timeout: 10s read-timeout: 30s max-retries: 37.2 稳定性与容错降级方案AI服务不可用时应有备选方案。例如智能客服降级为关键词匹配或转人工。限流与熔断使用Resilience4j或Sentinel对AI接口调用进行限流和熔断防止因某个模型服务故障导致系统雪崩。输入输出检查对用户输入进行清洗和长度限制对模型输出进行敏感词过滤和内容安全检查。7.3 可观测性与调试全链路日志记录每次AI调用的请求、响应、耗时、token使用量。这对成本分析和问题排查至关重要。结构化日志建议使用JSON格式日志便于后续用ELK等工具分析。Trace集成将AI调用纳入你的分布式追踪系统如SkyWalking, Zipkin查看它在整个业务链路中的表现。// 简单的AOP切面记录AI调用日志 Aspect Component Slf4j public class AiCallLogAspect { Around(within(org.springframework.stereotype.Service) execution(* *..*Chat*.call*(..))) public Object logAiCall(ProceedingJoinPoint pjp) throws Throwable { long start System.currentTimeMillis(); Object result pjp.proceed(); long duration System.currentTimeMillis() - start; log.info(AI_CALL - method: {}, duration: {}ms, result: {}, pjp.getSignature().getName(), duration, result.toString().substring(0, Math.min(100, result.toString().length()))); return result; } }7.4 安全与合规这是重中之重尤其是涉及用户数据和业务操作时。权限控制工具调用必须经过严格的业务权限校验。例如getOrdersByUserId工具必须确保当前登录用户只能查询自己的订单。操作确认对于修改类操作如urgeOrderShipmentAI应只提供建议或生成操作指令最终执行需经用户确认或由另一套安全流程触发。数据脱敏传入模型的业务数据需脱敏如手机号、身份证号防止敏感信息泄露。内容审核对模型生成的内容进行二次审核特别是对外发布的文本。8. 常见问题与排查指南在集成过程中你肯定会遇到各种问题。下表列出了典型问题及解决方案问题现象可能原因排查步骤解决方案启动报错No qualifying bean of type ChatClientSpring AI 相关依赖未正确引入或版本冲突。1. 检查pom.xml中spring-ai-bom和starter依赖。2. 运行mvn dependency:tree查看依赖。确保BOM版本与Starter兼容排除冲突的旧版本AI库。调用API返回401或403错误API密钥错误、过期或没有权限。1. 检查配置文件中api-key是否正确。2. 检查密钥对应的模型权限。使用正确的API密钥并在对应平台检查额度与权限。工具Tool未被调用1. 工具类未被Spring管理。2. 方法描述不清晰模型无法理解。3. Prompt未触发工具调用场景。1. 确认工具类有Component注解。2. 查看日志确认模型是否输出了工具调用请求。3. 简化Prompt明确指示模型使用工具。1. 确保工具Bean被扫描到。2. 优化Tool的description清晰描述功能和参数。3. 在系统Prompt中强调“请使用可用工具”。流式响应不工作或卡住网络超时、模型响应慢、客户端未正确处理流。1. 增加超时配置。2. 使用简单的非流式调用测试基础连通性。3. 检查客户端代码是否在循环读取流。1. 调整read-timeout。2. 对于生产环境考虑使用异步非阻塞方式处理流。LangChain4j Agent报ToolExecutionRequest错误工具方法签名与模型期望的参数不匹配。1. 检查Tool方法参数是否为简单类型String, Long等。2. 查看错误日志中模型期望的参数结构。1. 确保工具方法参数类型明确避免复杂对象。2. 使用Tool的name属性明确指定工具名。内存溢出OOM大模型返回内容过长或上下文累积过多。1. 监控应用内存使用情况。2. 检查ChatMemory配置的最大消息数。1. 设置maxTokens限制输出长度。2. 限制对话历史长度定期清理记忆。国内访问OpenAI超时网络连接问题。使用curl或telnet测试api.openai.com连通性。1. 考虑使用代理需确保符合法律法规和公司政策。2.更推荐切换至Spring AI Alibaba使用国内模型服务。9. 总结与路线图从集成到创造通过本文我们完成了从零到一的Java AI应用搭建认知层面理解了Spring AI、Spring AI Alibaba、LangChain4j的定位与选型。基础集成用Spring AI快速实现了大模型对话和简单的Function Calling。进阶实践用LangChain4j构建了具备记忆和复杂决策能力的智能体Agent。生产准备探讨了成本、性能、稳定性、安全等关键工程问题。接下来的学习方向深入提示词工程学习Chain of Thought、Few-Shot等高级技巧让你的Agent更聪明。探索检索增强生成RAG将你的内部文档、知识库作为上下文提供给模型构建专属知识问答系统。可以结合LangChain4j和向量数据库如Milvus, Redis。实现复杂工作流研究如何将多个Agent串联或并联完成像“用户咨询-订单查询-售后建议-满意度调查”这样的完整业务流程。关注国产模型生态随着国内大模型能力快速提升Spring AI Alibaba和深度集成了国产模型的LangChain4j扩展将是未来的重点。模型微调对于垂直领域考虑使用业务数据对开源模型进行微调以获得更专业、成本更可控的AI能力。AI与Java的融合不再是未来时而是现在进行时。最好的学习方式就是动手实践。建议你从本文的示例代码开始将其连接到你自己的业务数据和系统解决一个真实的小问题。在这个过程中你会遇到更多具体的挑战而解决它们的过程就是你构建下一代智能应用的核心能力。