
1. 先搞清楚这两个框架到底解决什么问题如果你正在考虑把AI能力集成到Java项目中Spring AI和LangChain4j是目前最值得关注的两个选择。但很多人一上来就纠结哪个更好其实更该先弄明白它们各自擅长什么场景。Spring AI的核心价值是快速集成。它提供了一套统一的API接口让你能用几乎相同的代码调用不同的大模型服务比如OpenAI、Azure OpenAI等。如果你只需要基础的聊天对话、文本生成或简单的嵌入计算Spring AI能在几分钟内帮你搞定接入。它的设计理念很像Spring家族的其他成员——通过标准化降低使用门槛。LangChain4j则专注于复杂工作流。它不是为了快速调用单个模型而设计的而是为了构建多步骤的智能应用。比如你需要一个能先搜索资料、再分析数据、最后生成报告的系统或者需要管理对话历史、工具调用和条件判断的智能助手LangChain4j提供了一整套链式调用、Agent管理和记忆存储的机制。简单说Spring AI适合我要调APILangChain4j适合我要造一个会思考的系统。这个区别决定了你后续的学习路径、代码结构和团队投入。2. 环境准备别在配置环节踩坑无论选哪个框架环境准备都是第一步。我建议按这个顺序检查2.1 Java环境确认这两个框架都需要Java 17或更高版本。先确认你的环境java -version如果显示低于17需要先升级JDK。很多莫名其妙的兼容性问题其实都是版本不匹配造成的。2.2 依赖管理选择Spring AI自然更适合Spring Boot项目。在pom.xml中添加dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-bom/artifactId version2.0.0/version typepom/type scopeimport/scope /dependencyLangChain4j的依赖更灵活但也要注意版本兼容。当前稳定版是0.35.0dependency groupIddev.langchain4j/groupId artifactIdlangchain4j/artifactId version0.35.0/version /dependency2.3 模型API密钥配置两个框架都需要配置大模型访问权限。不要在代码里硬编码密钥用环境变量或配置文件Spring AI的application.yml配置spring: ai: openai: api-key: ${OPENAI_API_KEY}LangChain4j的代码配置OpenAiChatModel model OpenAiChatModel.builder() .apiKey(System.getenv(OPENAI_API_KEY)) .build();2.4 测试连接配置完后不要直接写业务代码先写个最简单的测试验证连接// Spring AI测试 Autowired ChatClient chatClient; public void testConnection() { String response chatClient.call(Hello); System.out.println(响应长度: response.length()); } // LangChain4j测试 OpenAiChatModel model OpenAiChatModel.builder().apiKey(key).build(); String response model.generate(Hello); System.out.println(模型响应: response);如果这一步都跑不通后续的所有开发都是空中楼阁。常见问题包括网络连接、密钥错误、依赖冲突等。3. Spring AI实战从快速集成到生产级配置3.1 基础聊天功能实现Spring AI最直观的使用场景就是聊天对话。创建一个简单的ControllerRestController public class ChatController { Autowired private ChatClient chatClient; PostMapping(/chat) public String chat(RequestBody String message) { return chatClient.call(message); } }这就是Spring AI的优势——几行代码就能提供AI服务接口。但实际生产中这样直接使用会有问题没有错误处理、没有限流、没有日志记录。3.2 生产级配置要点真正的项目需要更完善的配置超时控制大模型响应可能很慢必须设置超时spring: ai: openai: options: timeout: 60s重试机制网络波动时自动重试Bean Retryable(maxAttempts 3, backoff Backoff(delay 1000)) public ChatClient chatClient() { return new OpenAiChatClient(); }限流保护防止过度调用导致费用爆炸Bean public RateLimiter rateLimiter() { return RateLimiter.create(10); // 每秒10次 }3.3 高级功能提示词模板Spring AI支持提示词模板让AI输出更结构化Bean public PromptTemplate reviewTemplate() { return new PromptTemplate( 请分析以下产品评论的情感倾向{review} 返回JSON格式{sentiment: positive|negative|neutral, confidence: 0.95} ); } public AnalysisResult analyzeReview(String review) { Prompt prompt reviewTemplate.create(Map.of(review, review)); String result chatClient.call(prompt.getContents()); return objectMapper.readValue(result, AnalysisResult.class); }3.4 Spring AI的局限性虽然Spring AI使用简单但要认清它的边界多步骤推理复杂的逻辑链需要自己手动编排记忆管理对话历史要自己存储和管理工具调用无法像LangChain4j那样动态选择和执行工具复杂Agent构建智能代理需要大量额外代码如果你的需求超出了简单问答就需要考虑LangChain4j了。4. LangChain4j深度使用构建真正的智能应用4.1 核心概念理解LangChain4j的学习曲线比Spring AI陡峭主要是因为它引入了一些新概念链条(Chain)把多个步骤连接起来的工作流工具(Tool)AI可以调用的外部函数记忆(Memory)保存对话历史和上下文代理(Agent)能自主决定使用哪些工具的智能体4.2 构建第一个工具链假设我们要构建一个能查询天气并给出建议的AI应用首先定义工具接口Tool public class WeatherTool { Tool(获取指定城市的当前天气) public String getWeather(P(城市名称) String city) { // 调用天气API return 北京晴25°C; } } Tool public class AdviceTool { Tool(根据天气给出穿衣建议) public String getAdvice(P(天气描述) String weather) { if (weather.contains(雨)) { return 建议带伞; } return 天气不错适合出行; } }然后创建链条Assistant assistant AiServices.builder(Assistant.class) .chatLanguageModel(OpenAiChatModel.withApiKey(apiKey)) .tools(new WeatherTool(), new AdviceTool()) .build(); public interface Assistant { String chat(String userMessage); } // 使用 String response assistant.chat(北京天气怎么样我应该穿什么);AI会自动判断需要先调用天气查询再根据结果给出建议。4.3 记忆管理实战LangChain4j的记忆机制让对话更有连续性// 基于消息历史的记忆 TokenWindowMessageMemory memory TokenWindowMessageMemory.builder() .maxTokens(1000) .build(); Assistant assistant AiServices.builder(Assistant.class) .chatLanguageModel(model) .tools(tools) .messageMemory(memory) .build(); // 第一次对话 assistant.chat(我叫张三); // AI会记住这个名字 // 第二次对话 assistant.chat(我刚才说我叫什么); // AI能回答张三4.4 高级Agent配置对于更复杂的任务可以配置专门的AgentAgent agent Agent.builder() .model(model) .tools(searchTool, calculatorTool, databaseTool) .maxIterations(10) // 防止无限循环 .build(); String result agent.execute( 查询最近三年的Java就业市场趋势 分析薪资变化并预测明年的情况。 );这种多步骤任务Spring AI很难优雅处理而LangChain4j能自动规划执行路径。5. RAG项目实战企业级知识库系统5.1 RAG架构设计检索增强生成(RAG)是目前最实用的企业AI应用模式。核心流程文档处理PDF、Word等文档分段和向量化向量存储使用Redis、Chroma等存储向量语义检索根据问题查找相关文档片段增强生成把检索结果作为上下文提供给AI5.2 文档处理流水线使用LangChain4j构建文档处理系统// 文档加载器 DocumentLoader loader DocumentLoaders.pdfFile(企业手册.pdf); Document document loader.load(); // 文本分割 DocumentSplitter splitter new DocumentByParagraphSplitter(500, 50); ListTextSegment segments splitter.split(document); // 向量化嵌入 EmbeddingModel embeddingModel new OpenAiEmbeddingModel(apiKey); EmbeddingStoreTextSegment embeddingStore new InMemoryEmbeddingStore(); for (TextSegment segment : segments) { Embedding embedding embeddingModel.embed(segment.text()).content(); embeddingStore.add(embedding, segment); }5.3 检索增强生成实现核心的RAG查询逻辑Slf4j public class RagService { private final EmbeddingStoreTextSegment embeddingStore; private final EmbeddingModel embeddingModel; private final ChatLanguageModel chatModel; public String query(String question) { // 1. 问题向量化 Embedding questionEmbedding embeddingModel.embed(question).content(); // 2. 相似度检索 ListEmbeddingMatchTextSegment relevantMatches embeddingStore.findRelevant(questionEmbedding, 3); // 3. 构建上下文 String context relevantMatches.stream() .map(match - match.embedded().text()) .collect(Collectors.joining(\n\n)); // 4. 增强提示词 String prompt 请基于以下上下文信息回答问题。 如果上下文不足以回答问题请说明需要补充哪些信息。 上下文 %s 问题%s .formatted(context, question); return chatModel.generate(prompt); } }5.4 性能优化要点企业级RAG系统需要关注性能向量存储选择小规模用内存存储大规模用Redis Stack或专用向量数据库缓存策略常见问题结果缓存减少模型调用异步处理文档预处理使用异步任务不阻塞主流程监控指标记录检索命中率、响应时间、token消耗6. 生产环境部署与监控6.1 配置管理生产环境配置要与环境解耦# application-prod.yml spring: ai: openai: api-key: ${PROD_OPENAI_KEY} options: temperature: 0.1 # 生产环境降低随机性 langchain4j: openai: api-key: ${PROD_OPENAI_KEY} redis: host: ${REDIS_HOST} port: ${REDIS_PORT}6.2 健康检查添加专门的健康检查端点Component public class AiHealthIndicator implements HealthIndicator { Autowired private ChatClient chatClient; Override public Health health() { try { String response chatClient.call(健康检查); return Health.up().withDetail(response_length, response.length()).build(); } catch (Exception e) { return Health.down(e).build(); } } }6.3 可观测性配置使用OpenTelemetry实现链路追踪dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-opentelemetry/artifactId version0.35.0/version /dependency配置追踪OpenTelemetryTelemetry telemetry OpenTelemetryTelemetry.builder() .build(); Assistant assistant AiServices.builder(Assistant.class) .chatLanguageModel(model) .telemetry(telemetry) .build();6.4 安全考虑企业应用必须考虑安全输入验证防止提示词注入攻击public String safeChat(String userInput) { if (containsMaliciousContent(userInput)) { return 请求包含不安全内容; } return assistant.chat(userInput); }输出过滤敏感信息脱敏访问控制API调用权限管理审计日志记录所有AI交互记录7. 常见问题排查手册7.1 启动问题问题应用启动失败报类找不到或版本冲突排查检查依赖版本兼容性清理Maven本地仓库重新下载确认JDK版本符合要求问题API调用返回认证错误排查检查环境变量是否正确加载确认API密钥是否有余额或权限验证网络连接是否正常7.2 运行时问题问题响应速度慢或超时排查检查模型参数temperature、maxTokens是否合理确认网络延迟考虑使用区域相近的API端点检查是否有频限流限制问题记忆功能不正常排查确认Memory配置是否正确检查token限制是否过小验证对话历史存储是否正常工作7.3 性能问题问题向量检索速度慢排查考虑使用专用向量数据库优化分段大小和重叠窗口添加检索结果缓存问题Token消耗过高排查优化提示词长度控制上下文窗口大小使用更高效的模型实际项目中我建议先从一个小的功能点开始验证确保基础流程跑通后再扩展复杂度。很多团队一开始就规划大而全的系统结果在基础环节卡住很久。先让最简单的问答跑起来再逐步添加工具、记忆、检索等高级功能。