1. 从Java到Agent:一个后端老兵的转型路线图
干了六七年Java后端,Spring那套东西闭着眼睛都能写,突然有一天发现招聘JD里开始频繁出现“Agent开发”“大模型应用”“RAG”这些词,心里多少有点慌。我大概是从去年下半年开始认真琢磨转型这件事的,踩了不少坑,也攒了一些还算靠谱的学习资料和路径。这篇文章不是那种“三个月从入门到精通”的爽文,而是把我自己从Javaer往Agent方向靠的过程中,真正觉得有用的资料、框架和思路整理出来,适合那些有Java基础、想往AI Agent方向转但不知道从哪下手的朋友。
先说清楚一个前提:Agent开发不是让你去训练大模型,那是算法岗的事。作为Java背景的开发者,我们的优势在于工程化能力——把大模型的能力集成到业务系统里,用Spring Boot搭服务、用LangChain4j做编排、用Spring AI对接模型API,这才是我们的主战场。所以学习资料的选择也要围绕这个定位来,别一上来就去啃深度学习那套东西,容易劝退。
下面我会从知识体系搭建、核心框架学习、实操项目练手、常见坑与排查几个维度展开,每个部分都会给出具体的学习资料和我的使用感受。文章会比较长,建议收藏后按需查阅。
2. 转型前必须想清楚的几个问题
2.1 Javaer做Agent开发的核心优势在哪
很多人一提到转AI就觉得要从零开始,其实不是。Agent开发本质上是一个系统工程问题,涉及服务编排、状态管理、工具调用、异常处理、并发控制这些,这些东西Java后端天天在干。你想想,一个Agent要调用多个工具、要维护对话上下文、要处理超时和重试、要做结果缓存,这不就是一个微服务编排的问题吗?只不过被编排的对象从REST接口变成了大模型和外部工具。
Spring AI和LangChain4j这两个框架之所以能火起来,恰恰是因为它们把Java生态的工程化优势带到了Agent开发领域。Spring AI让你用熟悉的@Bean、@Service注解来配置模型客户端,LangChain4j提供了Chain、Memory、Tool这些抽象,本质上都是在用Java开发者能理解的方式封装大模型能力。所以我的第一个建议是:别丢掉你的Spring功底,它就是你转型的最大本钱。
2.2 需要补哪些新知识
当然,光靠Spring那套也不够,有几个新领域是必须补的:
- 大模型基础认知:不需要懂Transformer的数学推导,但要知道Token是什么、上下文窗口怎么限制、Temperature参数怎么影响输出、Function Calling的机制是怎么回事。这些概念不理解,写出来的Agent基本没法调优。
- Prompt Engineering:这是Agent开发的基本功。同样的模型,Prompt写得好坏直接决定输出质量。建议系统学一下Few-shot、Chain-of-Thought、ReAct这些模式,后面做Agent编排的时候天天用。
- 向量数据库与RAG:Agent要基于私有知识回答问题,就离不开RAG(检索增强生成)。你需要了解Embedding是什么、向量检索的基本原理、常用的向量数据库(Milvus、Chroma、PgVector等)怎么选。
- Agent编排模式:ReAct、Plan-and-Execute、Multi-Agent协作这些模式,决定了你的Agent怎么拆解任务、怎么调用工具、怎么处理多轮交互。
2.3 学习路线的优先级排序
我的建议是按这个顺序来:先花一周时间把大模型的基础概念和Prompt Engineering搞清楚,然后直接上手Spring AI或LangChain4j写一个最简单的对话服务,跑通之后再逐步加入RAG、Tool Calling、Memory这些能力。不要一开始就追求大而全的Agent框架,先把最小闭环跑通,后面再扩展。
提示:如果你连OpenAI或国内模型的API都没调过,建议先花半天时间用curl或Postman调一次Chat Completion接口,感受一下请求和响应的结构,这对后面理解框架的封装非常有帮助。
3. 核心框架学习资料与选型对比
3.1 Spring AI:Spring开发者的第一选择
Spring AI是Spring官方推出的AI应用开发框架,目前已经更新到1.0 GA版本。它的最大优势就是和Spring Boot的无缝集成——你不需要学新的编程范式,用注解和配置类就能把大模型能力注入到现有的Spring应用里。
学习资料方面,我推荐几个:
- 官方文档(docs.spring.io/spring-ai):这是最权威的,但要注意版本对应关系。1.0 GA和之前的里程碑版本API差异较大,看文档时确认一下版本号。
- Spring AI Alibaba:这是阿里做的Spring AI增强实现,对国内模型(通义千问、智谱AI、DeepSeek等)的支持更好。如果你主要用国内模型,建议直接看这个,GitHub上有完整的示例仓库。
- Spring AI实战系列文章:国内技术社区有不少人写了Spring AI的实战教程,搜索“Spring AI 实战”能找到不少。建议找那种带完整代码仓库的,跟着敲一遍比光看强。
Spring AI的核心抽象包括ChatClient、EmbeddingClient、VectorStore、ToolCallback等。ChatClient是最常用的,你可以把它理解成一个封装好的HTTP客户端,只不过专门用来和大模型对话。下面是一个最简单的配置示例:
@Configuration public class AiConfig { @Bean public ChatClient chatClient(ChatClient.Builder builder) { return builder .defaultSystem("你是一个专业的Java技术助手") .build(); } }然后在Service里直接注入ChatClient就能用了:
@Service public class ChatService { private final ChatClient chatClient; public ChatService(ChatClient chatClient) { this.chatClient = chatClient; } public String chat(String message) { return chatClient.prompt() .user(message) .call() .content(); } }这种开发体验对Javaer来说几乎零学习成本。但要注意,Spring AI目前对复杂Agent编排的支持还在完善中,如果你要做Multi-Agent或者复杂的工具调用链,可能需要配合其他框架。
3.2 LangChain4j:功能更全面的Agent框架
LangChain4j是LangChain的Java移植版,功能比Spring AI更全面,尤其是在Agent编排、Memory管理、RAG pipeline方面。它的抽象层次更高,学习曲线也相对陡一些。
核心概念包括:
- ChatLanguageModel:模型接口,支持OpenAI、通义千问、Ollama等
- AiServices:声明式接口,用注解定义Agent行为
- ChatMemory:对话记忆管理
- EmbeddingStore:向量存储抽象
- RetrievalAugmentor:RAG检索增强
LangChain4j的AiServices是我最喜欢的功能,你可以用接口+注解的方式定义一个Agent:
interface Assistant { @SystemMessage("你是一个Java技术专家,擅长解答Spring相关问题") String chat(@UserMessage String message); } Assistant assistant = AiServices.builder(Assistant.class) .chatLanguageModel(model) .chatMemory(MessageWindowChatMemory.withMaxMessages(10)) .build();这种声明式的方式非常优雅,代码量少,可读性强。LangChain4j的官方文档和GitHub示例都比较全,建议从“LangChain4j开发文档”入手,先把Tutorial部分的示例跑一遍。
3.3 两个框架怎么选
我的建议是:如果你现有的项目是Spring Boot体系,优先用Spring AI,集成成本最低;如果你要做复杂的Agent编排、RAG pipeline、多模型切换,LangChain4j的抽象更合适。实际项目中两者也可以混用——用Spring AI做基础模型对接,用LangChain4j做Agent编排。
| 对比维度 | Spring AI | LangChain4j |
|---|---|---|
| 与Spring Boot集成 | 原生无缝 | 需要手动配置 |
| Agent编排能力 | 基础 | 丰富 |
| RAG支持 | 有但较基础 | 完整pipeline |
| 国内模型支持 | 通过Spring AI Alibaba | 原生支持多种 |
| 学习曲线 | 低 | 中等 |
| 社区活跃度 | 高 | 高 |
3.4 其他值得关注的工具
除了这两个主力框架,还有几个工具建议了解一下:
- Ollama:本地跑模型的神器,适合开发阶段用。Spring AI和LangChain4j都支持对接Ollama,你可以在本地跑一个DeepSeek或Qwen的小模型做开发测试,不用花API费用。
- PgVector:如果你已经在用PostgreSQL,直接加个PgVector扩展就能做向量检索,不用额外部署向量数据库。
- Spring Boot 3 + GraalVM:Agent服务对启动速度有要求的话,可以考虑GraalVM原生镜像,但要注意反射配置的坑。
4. 实操项目:从零搭一个RAG知识库Agent
4.1 项目需求与技术选型
光看文档不练手等于白学。我建议的第一个练手项目是:基于Spring Boot + LangChain4j + PgVector做一个RAG知识库Agent,能回答关于你公司内部文档的问题。这个项目覆盖了Agent开发的核心环节:文档加载、文本切分、向量化、检索、生成。
技术选型:
- Spring Boot 3.2 + Java 17
- LangChain4j 0.35 + langchain4j-spring-boot-starter
- PgVector作为向量存储
- Ollama本地跑Qwen2.5:7b做开发测试
- 前端用简单的HTML+fetch调用
4.2 文档加载与文本切分
RAG的第一步是把文档变成向量。LangChain4j提供了DocumentLoader和DocumentSplitter:
// 加载文档 DocumentLoader loader = new FileSystemDocumentLoader( Paths.get("/docs"), new ApachePdfBoxDocumentParser()); List<Document> documents = loader.loadDocuments(); // 切分文档 DocumentSplitter splitter = DocumentSplitters.recursive(500, 50); List<TextSegment> segments = splitter.splitAll(documents);这里有几个参数需要根据实际情况调:chunk size(每段文本的长度)和overlap(段与段之间的重叠)。我的经验是中文文档chunk size设在300-500个字符比较合适,overlap设50-100。设太大检索精度下降,设太小上下文不完整。
注意:PDF解析是个坑,Apache PDFBox对复杂排版的PDF支持一般,如果文档里有表格或图片,建议先转成Markdown再处理。
4.3 向量化与存储
用Ollama的Embedding模型把文本段转成向量:
EmbeddingModel embeddingModel = OllamaEmbeddingModel.builder() .baseUrl("http://localhost:11434") .modelName("nomic-embed-text") .build(); EmbeddingStore<TextSegment> embeddingStore = PgVectorEmbeddingStore.builder() .host("localhost") .port(5432) .database("agent_db") .user("postgres") .password("password") .table("embeddings") .dimension(768) .build(); EmbeddingStoreIngestor ingestor = EmbeddingStoreIngestor.builder() .embeddingModel(embeddingModel) .embeddingStore(embeddingStore) .build(); ingestor.ingest(documents);dimension参数要和Embedding模型的输出维度一致,nomic-embed-text是768维。如果维度对不上,插入数据时会报错。
4.4 检索增强生成
最后把检索和生成串起来:
RetrievalAugmentor augmentor = DefaultRetrievalAugmentor.builder() .contentRetriever(EmbeddingStoreContentRetriever.builder() .embeddingStore(embeddingStore) .embeddingModel(embeddingModel) .maxResults(5) .minScore(0.7) .build()) .build(); Assistant assistant = AiServices.builder(Assistant.class) .chatLanguageModel(chatModel) .retrievalAugmentor(augmentor) .build();maxResults控制返回几条相关文档,minScore控制相似度阈值。这两个参数需要根据实际效果调,建议先用默认值跑通,再根据回答质量微调。
4.5 效果调优的实操经验
跑通之后你会发现效果可能不太理想,常见问题和对策:
- 检索不到相关内容:检查Embedding模型是否适合中文,nomic-embed-text对中文支持一般,建议换bge-m3或text-embedding-3-small。
- 检索到了但回答不准确:调整Prompt,明确要求模型“基于以下参考资料回答,如果资料中没有相关信息,请直接说不知道”。
- 回答太长或太短:在Prompt里限制回答长度,或者调整maxTokens参数。
- 重复内容太多:LangChain4j的默认RRF去重逻辑在某些场景下确实有缺陷,可以考虑自己实现去重,或者换用MMR(最大边际相关性)检索策略。
5. 常见问题与排查技巧实录
5.1 模型对接类问题
问题一:API调用超时
国内访问OpenAI API经常超时,解决方案是设置合理的超时时间和重试策略。Spring AI和LangChain4j都支持配置:
spring: ai: openai: base-url: https://api.openai.com api-key: ${OPENAI_API_KEY} chat: options: timeout: 60s max-retries: 3如果还是不稳定,建议换国内模型,通义千问、智谱AI、DeepSeek的API在国内访问都很稳定。
问题二:返回内容被截断
检查maxTokens参数,默认值可能太小。另外注意上下文窗口限制,如果输入太长,模型会截断输出。解决方案是控制输入长度,或者用支持更大上下文的模型。
问题三:Function Calling不生效
检查模型是否支持Function Calling,不是所有模型都支持。另外检查Tool的定义是否正确,参数描述是否清晰。LangChain4j的Tool规范要求用@Tool注解标注方法,参数用@P描述。
5.2 性能与并发问题
问题一:响应太慢
大模型推理本身就慢,优化方向包括:用流式输出(Streaming)让用户先看到部分结果;用缓存减少重复调用;用更小的模型处理简单任务。
问题二:并发请求报错
模型API通常有并发限制,需要做限流。Spring AI可以用Resilience4j做熔断和限流,LangChain4j可以配合Spring的@Async做异步调用。
问题三:内存溢出
对话历史如果一直保留,内存会持续增长。解决方案是用MessageWindowChatMemory限制保留的消息数量,或者把历史存到Redis里。
5.3 常见问题速查表
| 问题现象 | 可能原因 | 排查方向 |
|---|---|---|
| 启动报Bean创建失败 | 配置缺失或版本不兼容 | 检查application.yml和依赖版本 |
| 调用返回401 | API Key无效或过期 | 检查Key配置和环境变量 |
| 检索结果不相关 | Embedding模型不适合 | 换用中文优化的Embedding模型 |
| 回答胡编乱造 | Prompt约束不够 | 加强System Prompt的约束 |
| 流式输出中断 | 网络不稳定或超时 | 检查超时配置和网络环境 |
| 向量插入报错 | 维度不匹配 | 检查dimension参数和模型输出维度 |
5.4 几个容易踩的坑
第一个坑是版本兼容性。Spring AI和Spring Boot的版本对应关系比较严格,Spring AI 1.0 GA需要Spring Boot 3.3+。LangChain4j的版本更新也很快,不同版本API差异较大,建议锁定版本号。
第二个坑是Embedding模型的维度。不同模型的输出维度不同,OpenAI的text-embedding-3-small是1536维,nomic-embed-text是768维,bge-m3是1024维。建表时dimension参数必须和模型一致,否则插入会报错。
第三个坑是Prompt的Token计算。中文的Token计算和英文不同,一个中文字大约对应1.5-2个Token。做上下文长度控制时要按中文的实际Token数来算,不然容易超限。
6. 进阶方向与持续学习建议
6.1 从单Agent到Multi-Agent
跑通单Agent之后,下一步可以尝试Multi-Agent协作。比如做一个“技术方案评审Agent”,包含架构师Agent、安全专家Agent、性能专家Agent,各自从不同角度评审方案,最后汇总。LangChain4j和Spring AI Alibaba都在逐步支持Multi-Agent编排,可以关注它们的更新。
6.2 Agent的可观测性
生产环境的Agent需要监控和追踪。建议了解OpenTelemetry和LangSmith(LangChain的观测平台),前者是通用的可观测性标准,后者专门针对LLM应用。Spring AI已经集成了Micrometer,可以方便地接入Prometheus和Grafana。
6.3 持续学习的资料源
- GitHub Trending:关注langchain4j、spring-ai、spring-ai-alibaba这几个仓库的更新
- Spring官方博客:Spring AI的版本发布和新特性都会在这里介绍
- 国内技术社区:搜索“Spring AI实战”“LangChain4j教程”能找到不少高质量的系列文章
- 论文:ReAct、Reflexion、Toolformer这几篇Agent领域的经典论文值得读一读,理解Agent的设计思想
6.4 我个人的学习节奏建议
如果你每天能投入2小时,我的建议是:第1周补大模型基础和Prompt Engineering,第2-3周学Spring AI并跑通对话服务,第4-5周学LangChain4j并做RAG项目,第6周开始尝试Tool Calling和简单Agent编排。两个月下来,你对Agent开发的理解会有一个质的飞跃。
提示:不要贪多,一个框架学透比两个框架都半吊子强。我见过太多人Spring AI和LangChain4j同时学,结果两个都一知半解,遇到问题不知道是框架的问题还是自己代码的问题。
最后分享一个我自己的习惯:每学一个新框架,先把它官方文档的Quick Start跑通,然后立刻改造成一个自己业务场景的小Demo。比如学Spring AI的时候,我直接把我们团队的接口文档做成了一个问答Agent,虽然粗糙,但跑通的那一刻对框架的理解就完全不一样了。学习资料再多,不动手都是别人的知识。