Java程序员转型Agent开发:Spring AI与LangChain4j实战指南
1. 从Javaer到Agent开发者的转型逻辑1.1 为什么Java程序员转Agent有天然优势先说一个我观察到的现象身边不少写了五六年Spring Boot的Java工程师一听到“Agent开发”四个字第一反应是“这是Python的活儿吧”。这个认知其实已经过时了。Agent开发的核心不是写Python脚本而是构建一套能自主决策、调用工具、管理上下文、串联多步推理的系统。这套系统的本质是什么是工程化。而Java生态最擅长的恰恰就是工程化。你想想一个Agent要跑在生产环境里需要什么需要稳定的依赖注入、需要可观测的日志链路、需要事务管理、需要缓存、需要限流熔断、需要和现有的业务系统对接。这些东西Spring生态已经帮你解决了十几年了。Python那边LangChain虽然火但真到了企业级落地你会发现大量时间花在“怎么把这个链路的日志打全”“怎么让这个工具调用有重试机制”“怎么把Agent的会话状态持久化到数据库”这些工程问题上。而这些恰好是Javaer的舒适区。所以我的判断很明确Javaer转Agent不是从零开始而是把已有的工程能力迁移到一个新的问题域上。你不需要重新学编程你需要学的是Agent的思维模型和对应的框架API。1.2 Agent开发到底在做什么很多人把Agent想得很玄乎其实拆开来看就三件事感知与决策接收输入用户消息、系统事件、工具返回结果决定下一步做什么工具调用根据决策去执行具体操作查数据库、调API、读文件、发消息记忆与状态管理在多轮交互中保持上下文管理短期记忆和长期记忆传统Java后端开发是“请求-处理-响应”的线性模型Agent开发是“感知-决策-行动-再感知”的循环模型。这个思维转变是最关键的比学任何框架都重要。我刚开始接触Agent的时候总想着用写Controller的思路去写Agent结果发现根本跑不通。因为Controller是被动等待请求的而Agent是主动决定下一步的。这个“主动性”是本质区别。1.3 学习路线的整体设计思路基于上面的分析我给Javaer设计的学习路线是这样的第一阶段建立Agent思维模型。不急着写代码先理解ReAct、Plan-and-Execute、Reflection这些核心范式。推荐读几篇经典论文的摘要和流程图不用啃全文。第二阶段选一个框架深入。Spring AI和LangChain4j选一个作为主力另一个作为补充了解。我的建议是如果你团队已经在用Spring Boot直接上Spring AI如果你需要更灵活的链式编排LangChain4j的API设计更接近Python LangChain的体验。第三阶段动手做一个完整项目。不要停留在跑Demo要做一个有真实工具调用、有状态管理、有错误处理的小项目。比如一个“智能运维助手”能查日志、能重启服务、能发告警。第四阶段深入源码和原理。到了这个阶段你自然会遇到框架解决不了的问题这时候去读源码、去理解底层实现收获最大。这个路线的好处是每一步都有明确的产出不会陷入“学了很多但不知道能干什么”的困境。2. 核心框架选型与学习资料拆解2.1 Spring AISpring生态的原生Agent方案Spring AI是Spring官方推出的AI应用开发框架它的设计哲学和Spring Boot一脉相承约定优于配置、自动装配、开箱即用。如果你是一个资深Javaer看Spring AI的文档会有一种“似曾相识”的感觉。核心抽象ChatClient类似RestTemplate是对LLM调用的统一封装Advisor类似HandlerInterceptor可以在请求前后插入逻辑ToolCallback工具调用的抽象类似Controller的映射机制ChatMemory会话记忆管理类似HttpSession我实测下来Spring AI最舒服的地方是它的自动配置。你只需要在application.yml里配好API Key和模型名称注入ChatClient就能用。对于已经在用Spring Boot的团队接入成本极低。学习资料建议官方文档的“Getting Started”和“Concepts”部分必读大概花2小时GitHub上的spring-ai-examples仓库把里面的chat-client、tool-calling、rag三个示例跑一遍关注Spring AI Alibaba这是国内团队做的适配层对接通义千问等国内模型更方便注意Spring AI的版本迭代很快网上很多教程是基于0.8或1.0版本的API可能有变化。建议直接看官方最新文档不要依赖二手教程。2.2 LangChain4j更灵活的链式编排LangChain4j是Python LangChain的Java移植版但又不是简单翻译。它的API设计更符合Java开发者的习惯同时保留了LangChain的核心概念。核心抽象ChatLanguageModel底层模型接口AiServices声明式接口类似Spring Data JPA的RepositoryChain链式编排把多个步骤串起来EmbeddingStore向量存储抽象ContentRetrieverRAG的检索抽象LangChain4j最让我惊喜的是AiServices的设计。你可以定义一个接口用注解标注每个方法要做什么框架自动生成实现。比如interface Assistant { SystemMessage(你是一个Java技术专家) String chat(UserMessage String message); }然后AiServices.create(Assistant.class, model)就能得到一个实例。这种声明式风格对Javaer非常友好。学习资料建议LangChain4j官方文档的“Tutorials”部分从HelloWorld到RAG到Agent循序渐进GitHub上的langchain4j-examples仓库重点看spring-boot-example和rag-example关注langchain4j-community下的各种集成模块比如langchain4j-ollama、langchain4j-pgvector2.3 两个框架的对比与选择建议维度Spring AILangChain4j设计哲学Spring式约定优于配置LangChain式灵活编排学习曲线低Spring开发者上手快中需要理解Chain概念工具调用注解式简洁接口式灵活RAG支持内置Advisor机制内置ContentRetriever国内模型适配Spring AI Alibaba社区模块丰富生产成熟度较新但背靠Spring较成熟社区活跃适合场景已有Spring Boot项目需要复杂链式编排我的建议是两个都了解主攻一个。如果你团队用Spring Boot主攻Spring AI如果你需要做复杂的多步推理链主攻LangChain4j。不要两个都浅尝辄止那样反而浪费时间。2.4 那些容易被忽略的基础资料除了框架文档有几类资料我觉得被严重低估了第一类是LLM的基础原理。不需要深入Transformer的数学细节但至少要理解Token、上下文窗口、Temperature、Top-P这些参数的含义。推荐看Andrej Karpathy的“Intro to Large Language Models”视频一小时讲清楚核心概念。第二类是Prompt Engineering。Agent的行为很大程度上取决于Prompt的设计。推荐看OpenAI的Prompt Engineering Guide和Anthropic的Prompt Engineering文档。这些资料虽然是英文的但内容质量极高。第三类是Agent范式论文。ReAct、Reflexion、Toolformer这几篇是必读的。不用啃全文读摘要和核心流程图就够了。理解这些范式你才能理解框架为什么要这样设计。3. 实操环境搭建与第一个Agent3.1 开发环境准备清单在开始写代码之前先把环境准备好。我踩过的坑是一开始用最新版本的依赖结果和Spring Boot版本不兼容折腾了半天。基础环境JDK 17或21Spring AI 1.0要求JDK 17Maven 3.8或Gradle 8IntelliJ IDEA社区版够用一个可用的LLM API KeyOpenAI、通义千问、智谱AI都行Spring AI项目依赖dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-openai-spring-boot-starter/artifactId version1.0.0-M6/version /dependency注意Spring AI的版本号带-M后缀的是里程碑版本API可能变化。生产环境建议等正式版。如果要用国内模型把spring-ai-openai换成对应的starter。LangChain4j项目依赖dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-open-ai-spring-boot-starter/artifactId version0.35.0/version /dependency配置文件以Spring AI为例spring: ai: openai: api-key: ${OPENAI_API_KEY} chat: options: model: gpt-4o-mini temperature: 0.73.2 第一个Agent从ChatClient开始不要一上来就搞复杂的Agent先跑通最简单的对话。RestController public class ChatController { private final ChatClient chatClient; public ChatController(ChatClient.Builder builder) { this.chatClient builder.build(); } GetMapping(/chat) public String chat(RequestParam String message) { return chatClient.prompt() .user(message) .call() .content(); } }跑通这个之后你就能理解Spring AI的基本调用模式了。prompt()开始构建请求user()设置用户消息call()执行调用content()获取文本结果。3.3 加入工具调用让Agent能干活光会聊天不算Agent能调用工具才算。Spring AI的工具调用用注解实现Component public class WeatherTools { Tool(description 查询指定城市的天气) public String getWeather(ToolParam(description 城市名称) String city) { // 实际项目中这里调用天气API return city 今天晴25度; } }然后在ChatClient中注册this.chatClient builder .defaultTools(new WeatherTools()) .build();这样当你问“北京天气怎么样”时模型会自动决定调用getWeather工具。这个“自动决定”的过程就是Agent的核心能力。实操心得工具描述description写得越清楚模型调用越准确。我试过把描述写成“查天气”结果模型经常不调用改成“查询指定城市的实时天气信息输入参数为城市中文名称”调用准确率明显提升。3.4 加入记忆让Agent记住上下文默认情况下每次调用都是无状态的。要让Agent记住之前的对话需要配置ChatMemorythis.chatClient builder .defaultAdvisors(new MessageChatMemoryAdvisor(new InMemoryChatMemory())) .build();InMemoryChatMemory适合开发测试生产环境建议用JdbcChatMemory或RedisChatMemory把会话状态持久化。踩坑记录我一开始用InMemoryChatMemory重启服务后会话全丢了。后来换成基于Redis的实现才解决了持久化问题。另外要注意记忆是有Token成本的对话轮次多了之后上下文会变得很长需要考虑截断策略。3.5 完整Agent的最小闭环把上面几个部分串起来一个最小可用的Agent就成型了用户发消息Agent判断是否需要调用工具如果需要调用工具并获取结果Agent根据工具结果生成最终回复把对话存入记忆这个闭环虽然简单但已经包含了Agent的核心要素。后续的复杂Agent都是在这个基础上扩展的。4. 进阶方向与常见问题排查4.1 RAG让Agent拥有私有知识Agent再强也不知道你公司的内部文档。RAG检索增强生成就是解决这个问题的。核心流程文档加载把PDF、Word、Markdown等文档读进来文档切分把长文档切成小块Chunk向量化用Embedding模型把每个Chunk转成向量存储把向量存入向量数据库检索用户提问时先检索相关Chunk生成把检索结果作为上下文让模型生成回答Spring AI的RAG实现Bean public VectorStore vectorStore(EmbeddingModel embeddingModel) { return new SimpleVectorStore(embeddingModel); } // 加载文档 vectorStore.add(new TokenTextSplitter().split(new Document(readFile())));然后在ChatClient中加一个QuestionAnswerAdvisorthis.chatClient builder .defaultAdvisors(new QuestionAnswerAdvisor(vectorStore)) .build();LangChain4j的RAG实现ContentRetriever retriever EmbeddingStoreContentRetriever.builder() .embeddingStore(embeddingStore) .embeddingModel(embeddingModel) .maxResults(5) .minScore(0.7) .build(); Assistant assistant AiServices.builder(Assistant.class) .chatLanguageModel(model) .contentRetriever(retriever) .build();实操心得RAG的效果80%取决于文档切分策略。我试过固定长度切分、按段落切分、按语义切分最后发现按标题层级切分适当重叠效果最好。另外minScore这个阈值很关键设太低会引入无关内容设太高会漏掉相关内容。建议从0.7开始调。4.2 常见问题速查表问题现象可能原因排查方向模型不调用工具工具描述不清晰优化Tool的description调用工具报错参数类型不匹配检查ToolParam的类型上下文丢失未配置ChatMemory检查Advisor配置RAG检索不准切分策略或阈值问题调整Chunk大小和minScore响应超时模型推理慢或网络问题设置合理的timeoutToken超限上下文太长配置截断策略或摘要依赖冲突版本不兼容统一Spring Boot和AI框架版本4.3 那些文档里不会写的避坑经验第一个坑不要用生产API Key做开发测试。我见过有人把生产Key写在代码里提交到Git结果被扫到后产生大量费用。建议用环境变量并且开发环境用独立的Key。第二个坑注意模型的上下文窗口限制。不同模型的上下文窗口不一样GPT-4o是128K有些模型只有8K。做RAG的时候检索回来的内容加上系统Prompt很容易超限。建议在代码里加一个Token计数和截断逻辑。第三个坑工具调用要有超时和重试。模型决定调用工具后如果工具执行失败要有兜底逻辑。我试过工具调用超时导致整个请求卡死后来加了CompletableFuture的超时控制才解决。第四个坑Prompt要版本管理。Agent的行为很大程度上取决于Prompt改Prompt就像改代码一样要有版本记录和回滚机制。我现在的做法是把Prompt放在配置中心每次修改都记录变更原因。第五个坑不要迷信框架的默认配置。Spring AI和LangChain4j的默认配置是为了Demo设计的生产环境需要根据实际情况调整。比如默认的Temperature是0.7但做工具调用时建议调到0.1或0让模型更确定性地选择工具。4.4 后续学习方向当你把上面这些内容都跑通之后可以往这几个方向深入多Agent协作多个Agent各司其职通过消息传递协作完成任务。这个方向目前还在早期但很有前景。Agent的可观测性如何追踪Agent的每一步决策如何调试Agent的行为。这是生产落地的关键。Agent的安全与护栏如何防止Agent执行危险操作如何限制Agent的权限。这个在企业场景下尤其重要。性能优化如何减少Token消耗如何缓存常用结果如何并行化工具调用。这些是降本增效的关键。我个人在实际操作中的体会是Agent开发最难的不是技术而是思维方式的转变。从“我告诉系统怎么做”变成“系统自己决定怎么做”这个转变需要时间适应。但一旦适应了你会发现很多之前觉得复杂的问题用Agent的思路去解会简单很多。最后分享一个小技巧如果你在学Spring AI或LangChain4j的过程中遇到问题先去GitHub的Issues里搜一下大概率有人已经遇到过了。这两个项目的社区都很活跃响应也快。另外不要只看中文资料英文的官方文档和Stack Overflow上的讨论质量更高值得花时间啃。