Java 开发者转 AI 这件事,这两年我从不同团队里见过太多版本。有人一上来就啃 Transformer 论文,两周后放弃;有人直接抄 Python 的 LangChain 示例,结果发现公司生产环境全是 Spring Boot,根本落不了地;还有人把 RAG 想得特别简单,以为向量库一接就完事,上线后召回率惨不忍睹。我自己是从 Java 后端一路摸到 AI 应用层的,中间踩的坑不算少,所以这篇不打算给你画大饼,而是把"一个 Java 开发者到底该怎么入门 AI、用什么工具链、按什么顺序推进"这件事讲透。核心关键词就几个:Java、AI、Spring AI、LangChain4j、RAG。适合有 Java 基础、想往 AI 应用方向转、但不知道从哪下手的人,也适合已经在做 Spring Boot 项目、想往里加 AI 能力的同学。
1. 先想清楚 Java 开发者做 AI 的真实定位
1.1 你不是要去训练大模型
很多人对"Java 入门 AI"有个误解,觉得得先学会 PyTorch、得懂反向传播、得能调参训模型。这个方向对绝大多数 Java 开发者来说是错的。训练大模型是算法团队、算力团队干的事,需要 GPU 集群、需要深度学习框架、需要数学功底,这跟 Java 生态基本不搭边。
Java 开发者在 AI 浪潮里的真实定位是AI 应用层工程师,也就是把已经训练好的大模型能力,通过工程手段接入到业务系统里。具体包括:调用大模型 API、做提示词工程、搭建 RAG 知识库、编排 Agent 工作流、做 AI 能力的服务化封装、处理并发和限流、保证数据一致性。这些活儿的本质还是后端工程,只不过多了一层"和大模型打交道"的逻辑。
我见过一个团队,让 Java 后端去学模型微调,折腾了三个月没出成果,最后发现业务真正需要的是"把公司文档做成能问答的知识库",用 RAG 两周就上线了。方向选错,努力全废。
1.2 Java 做 AI 应用的优势在哪
别觉得 Java 在 AI 领域没戏。恰恰相反,在企业级 AI 应用落地这块,Java 有天然优势:
- 存量系统全是 Java:银行、保险、电商、ERP、SaaS,核心业务系统大多是 Spring 生态,AI 能力要落地,绕不开这些系统。
- 工程化能力强:并发处理、事务管理、服务治理、监控告警,Java 这套东西成熟得不能再成熟,AI 应用上线后要面对的稳定性问题,Java 生态有现成答案。
- Spring AI 和 LangChain4j 已经补齐了工具链:以前 Java 调大模型确实别扭,现在这两个框架把主流能力都封装好了,写起来不比 Python 费劲多少。
所以定位很清楚:你不需要成为算法专家,你需要成为"能把大模型能力稳稳当当接进企业系统"的工程师。这个定位决定了你的学习路线——重工程、轻算法、重落地、轻论文。
1.3 一条被验证过的入门顺序
我把这条路线拆成四步,顺序很重要,跳步容易崩:
- 先跑通一次大模型调用:不管用哪个框架,先让 Java 代码能调通一个大模型,拿到返回结果。这一步建立信心。
- 理解提示词和上下文:学会怎么组织 prompt、怎么控制输出格式、怎么处理多轮对话。
- 上手 RAG:把私有知识接进去,这是企业场景最刚需的能力。
- 进阶 Agent 和工作流编排:让 AI 能调用工具、能多步推理。
下面几节我按这个顺序展开,每一节都讲清楚"为什么这么做"和"实际怎么做"。
2. 工具链选型:Spring AI 还是 LangChain4j
2.1 两个框架的定位差异
这是 Java 开发者问得最多的问题。我的结论先放这:做 Spring Boot 项目集成,优先 Spring AI;做复杂 AI 编排、想借鉴 Python LangChain 思路,用 LangChain4j。两者不是替代关系,很多项目里是共存的。
| 维度 | Spring AI | LangChain4j |
|---|---|---|
| 出身 | Spring 官方生态 | 社区驱动,对标 Python LangChain |
| 集成方式 | 和 Spring Boot 无缝,starter 开箱即用 | 独立库,也能和 Spring 集成 |
| 抽象层次 | 偏"统一 API",屏蔽各家模型差异 | 偏"组件化",Chain、Agent、Memory 概念丰富 |
| RAG 支持 | 有,偏基础 | 更完整,有 Easy RAG、多种检索策略 |
| 学习曲线 | 低,会 Spring 就会用 | 中等,概念多一些 |
| 适合场景 | 企业系统加 AI 能力 | AI 原生应用、复杂编排 |
Spring AI 的思路是"把大模型当成一个 Spring 里的 Bean",你注入 ChatClient 就能用,配置写在 application.yml 里,换模型改配置就行。这种设计对 Java 后端极其友好,几乎没有学习成本。
LangChain4j 的思路更接近 Python 那套,把 AI 应用拆成很多可组合的组件:ChatLanguageModel、EmbeddingModel、EmbeddingStore、Retriever、Chain。灵活度高,但概念多,新手容易晕。
2.2 选型时容易忽略的三个现实因素
光看功能对比不够,实际选型还得看这几个:
第一,团队技术栈。如果团队全是 Spring Boot,硬上 LangChain4j 会多一层集成成本。反过来,如果项目本身就是 AI 原生、要大量自定义编排,Spring AI 的抽象可能不够用。
第二,模型供应商的适配。国内项目经常要接国产大模型,Spring AI 有对应的 starter,LangChain4j 也有对应模块,但版本更新节奏不一样,选之前先确认你要用的模型两边都支持。
第三,RAG 的深度需求。如果只是简单文档问答,Spring AI 够用。如果要搞混合检索、重排序、多路召回,LangChain4j 的现成组件更多,省得自己造轮子。
提示:不要一上来就纠结选哪个。先用 Spring AI 跑通一个 Demo,感受一下大模型调用的基本形态,再根据项目需求决定要不要引入 LangChain4j。选型是迭代出来的,不是一开始就能拍板的。
2.3 一个最小可运行的 Spring AI 示例
先看依赖,Maven 里加:
<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-openai-spring-boot-starter</artifactId> </dependency>配置文件里写模型地址和密钥:
spring: ai: openai: api-key: ${AI_API_KEY} base-url: ${AI_BASE_URL} chat: options: model: gpt-4o-mini temperature: 0.7然后注入 ChatClient 就能用:
@Service public class ChatService { private final ChatClient chatClient; public ChatService(ChatClient.Builder builder) { this.chatClient = builder.build(); } public String ask(String question) { return chatClient.prompt() .user(question) .call() .content(); } }就这么几行,一个能对话的服务就出来了。这就是 Spring AI 的价值——把复杂的 HTTP 调用、参数拼装、响应解析全封装掉了。你专注在业务逻辑上就行。
3. 提示词工程:Java 开发者最容易轻视的一环
3.1 为什么提示词不是"随便写写"
很多后端同学觉得提示词就是写句话发给模型,能有多难。结果上线后发现:输出格式不稳定、该拒绝的不拒绝、该带上下文的不带。问题全出在提示词上。
提示词工程本质是用自然语言给模型编程。你写的每一句话都是在约束模型的行为。写得好,模型稳定输出;写得烂,模型自由发挥。这跟写 SQL 有点像——同样的数据,查询语句写得好坏,结果天差地别。
3.2 结构化提示词的四个组成部分
我习惯把提示词拆成四块,缺一块都容易出问题:
- 角色设定:告诉模型它是谁。"你是一个专业的客服助手"比什么都不说效果好得多。
- 任务描述:明确要它干什么。"根据用户问题,从提供的资料中找答案"。
- 约束条件:告诉它边界。"如果资料里没有答案,就回答'暂无相关信息',不要编造"。
- 输出格式:规定返回结构。"以 JSON 格式返回,包含 answer 和 confidence 两个字段"。
在 Spring AI 里,可以用系统提示词加用户提示词的方式组织:
String systemPrompt = """ 你是一个企业知识库助手。 规则: 1. 只根据提供的参考资料回答问题 2. 资料中没有的内容,回答"暂无相关信息" 3. 回答要简洁,不超过 200 字 """; String answer = chatClient.prompt() .system(systemPrompt) .user(u -> u.text("参考资料:{context}\n\n问题:{question}") .param("context", context) .param("question", question)) .call() .content();3.3 让输出稳定的几个实操技巧
技巧一:用 JSON 模式约束输出。如果下游要解析结果,别让模型自由发挥。Spring AI 支持结构化输出,直接映射成 Java 对象:
record Answer(String content, double confidence) {} Answer answer = chatClient.prompt() .user(question) .call() .entity(Answer.class);框架会自动处理格式转换,比你自己解析字符串靠谱得多。
技巧二:温度参数按场景调。temperature 控制随机性。做知识问答、数据抽取,调到 0 到 0.3,要稳定;做创意生成、文案,调到 0.7 到 1.0,要发散。这个参数很多人从来不调,默认值用到底,结果该稳的不稳,该活的不活。
技巧三:少样本示例比长篇描述管用。与其写一大段"你要这样那样",不如直接给两三个输入输出示例。模型模仿示例的能力很强,这比抽象描述有效。
注意:提示词是要版本管理的。上线后效果不好,你得知道改了什么。建议把提示词抽到配置文件或数据库里,别硬编码在代码里,方便调整和回滚。
4. RAG 落地:从"能问答"到"答得准"
4.1 RAG 到底解决了什么问题
大模型有两个硬伤:一是知识有截止日期,二是不知道你的私有数据。RAG(检索增强生成)就是来解决这个的。思路很直白:用户提问时,先从你的知识库里检索出相关内容,把内容塞进提示词,再让模型基于这些内容回答。
打个比方,大模型是个博学但没看过你公司文档的专家。RAG 就是每次提问前,先帮他从文档柜里找出相关几页,递给他,他再回答。这样答案就基于你的资料,而不是他的记忆。
4.2 一个 RAG 系统的完整链路
别以为 RAG 就是"向量库 + 大模型",中间环节多着呢:
- 文档加载:把 PDF、Word、网页、数据库内容读进来。
- 文本切分:长文档要切成小块,因为模型上下文有限,检索也要按块来。
- 向量化:用 Embedding 模型把每块文本转成向量。
- 存储:向量存进向量数据库。
- 检索:用户提问时,把问题也向量化,找最相似的几块。
- 重排序:对检索结果再排一次序,把最相关的放前面。
- 生成:把检索结果和问题一起给模型,生成答案。
每一环都有坑。切分粒度不对,检索就找不到;Embedding 模型选错,相似度算不准;不做重排序,噪声内容会干扰模型。
4.3 用 LangChain4j 搭 Easy RAG
LangChain4j 有个 Easy RAG 的概念,把上面链路封装得比较简单。核心代码大概是这样:
// 加载文档 Document document = FileSystemDocumentLoader.loadDocument( Paths.get("/data/manual.pdf"), new ApachePdfBoxDocumentParser() ); // 切分 DocumentSplitter splitter = DocumentSplitters.recursive(500, 50); List<TextSegment> segments = splitter.split(document); // 向量化并存储 EmbeddingModel embeddingModel = new AllMiniLmL6V2EmbeddingModel(); EmbeddingStore<TextSegment> store = new InMemoryEmbeddingStore<>(); EmbeddingStoreIngestor.ingest(segments, store, embeddingModel); // 检索 + 生成 ContentRetriever retriever = EmbeddingStoreContentRetriever.builder() .embeddingStore(store) .embeddingModel(embeddingModel) .maxResults(5) .minScore(0.7) .build(); Assistant assistant = AiServices.builder(Assistant.class) .chatLanguageModel(chatModel) .contentRetriever(retriever) .build(); String answer = assistant.answer("文档里提到的保修期是多久?");这段代码里有两个参数值得说:maxResults是检索返回几块,minScore是相似度阈值。这两个值直接决定召回质量,需要根据实际数据调。
4.4 提升 RAG 命中率的实战经验
RAG 上线后最常见的问题就是"答非所问"或"答不出来"。我总结几个调优方向:
切分策略要匹配内容结构。技术文档按标题切,合同按条款切,聊天记录按对话轮次切。一刀切固定长度,效果往往不好。LangChain4j 支持自定义切分器,别偷懒用默认的。
混合检索比纯向量检索稳。纯向量检索对关键词不敏感,用户搜"XX-2024 型号",向量可能找不准。加上 BM25 这类关键词检索,两路结果融合,命中率明显提升。
重排序模型值得加。检索回来的 Top 10 里,真正相关的可能排在第 5 位。加一个重排序模型(比如基于 Cross-Encoder 的),把最相关的顶到前面,生成质量立竿见影。
元数据过滤能救命。如果知识库分部门、分产品线,检索时带上元数据过滤条件,能大幅减少跨领域干扰。这个在 LangChain4j 里通过 Filter 实现。
提示:RAG 的效果评估不能靠感觉。准备一批"问题-标准答案"的测试集,每次调整后跑一遍,看命中率和准确率的变化。没有量化指标,调优就是瞎猜。
5. 从 RAG 到 Agent:让 AI 会调用工具
5.1 Agent 和普通问答的本质区别
普通问答是"你问我答",Agent 是"你给目标,我自己想办法"。区别在于 Agent 能调用工具、能多步推理、能根据中间结果调整策略。
举个例子:用户问"帮我查一下上个月的销售数据并生成报告"。普通问答答不了,因为它没有查数据库的能力。Agent 可以:先调用数据库查询工具拿到数据,再调用图表生成工具画图,最后组织成报告。这一串动作是模型自己编排的。
5.2 Spring AI 里的工具调用
Spring AI 支持把 Java 方法注册成工具,让模型按需调用:
public class WeatherTools { @Tool(description = "查询指定城市的天气") public String getWeather(String city) { // 实际调用天气服务 return city + " 今天晴,25 度"; } } String response = chatClient.prompt() .user("北京今天天气怎么样?") .tools(new WeatherTools()) .call() .content();模型看到用户问题,判断需要调用getWeather,自动生成调用参数,拿到结果后再组织语言回答。整个过程你只负责定义工具,编排交给模型。
5.3 Agent 落地的现实约束
Agent 听起来很美,但生产环境要谨慎。几个现实问题:
工具调用的可靠性。模型可能调错工具、传错参数。关键操作要有校验和兜底,不能完全信任模型。
多步推理的成本。每一步都是一次模型调用,token 消耗和延迟都会累积。简单任务别硬上 Agent,得不偿失。
循环和死锁。Agent 可能陷入反复调用同一个工具的循环。要设置最大步数限制,超了就中断。
可观测性。Agent 的决策链路要能追踪,出问题得知道它每一步干了什么。日志和链路追踪必须做。
我的建议是:先从单工具、单步的场景做起,跑稳了再逐步增加复杂度。别一上来就搞多 Agent 协作,那是给自己找麻烦。
6. 工程化落地:Java 开发者真正的主场
6.1 并发、限流和成本控制
AI 应用上线后,第一个撞上的就是并发问题。大模型调用是慢操作,几百毫秒到几秒不等,同步调用会拖垮线程池。
处理思路和普通远程调用一样:异步化 + 限流 + 降级。用 Spring 的@Async或响应式编程做异步,用 Resilience4j 做限流和熔断,模型服务不可用时降级到缓存答案或友好提示。
成本控制也得提前想。每次调用都是钱,要统计 token 消耗,设置单用户配额,对高频问题做缓存。我见过一个项目没做缓存,同样的热门问题每天被问几千次,全量调模型,账单吓人。
6.2 数据一致性怎么保证
这是 Java 开发者最该发挥的地方。AI 应用经常要写数据——比如 Agent 帮用户下单、更新记录。模型调用和数据库操作之间的一致性,是个真问题。
常见做法是把模型调用和业务操作解耦。模型只负责生成"意图"或"参数",真正的写操作由后端服务执行,走正常的事务流程。不要让模型直接操作数据库,那样既不可控也不安全。
如果流程跨多个服务,用消息队列做最终一致性,或者用 Saga 模式做补偿。这些是 Java 后端的看家本领,直接搬过来用就行。
6.3 可观测性和效果监控
AI 应用比传统应用更难排查问题,因为输出是不确定的。必须建立监控体系:
- 调用指标:QPS、延迟、错误率、token 消耗。
- 质量指标:答案采纳率、用户反馈、RAG 命中率。
- 链路追踪:每次请求经过了哪些环节、检索了什么、模型返回了什么。
把这些数据收集起来,才能持续优化。没有监控的 AI 应用,等于闭着眼睛开车。
7. 学习路线和常见误区
7.1 分阶段的学习清单
按我自己的经验,给个可执行的顺序:
第一阶段(1-2 周):跑通 Spring AI 的对话 Demo,理解 ChatClient、提示词、参数配置。目标:能写一个简单的问答接口。
第二阶段(2-3 周):学提示词工程,练结构化输出、少样本示例、参数调优。目标:让输出稳定可控。
第三阶段(3-4 周):上手 RAG,用 LangChain4j 或 Spring AI 搭一个文档问答系统。目标:理解完整链路,会调切分和检索参数。
第四阶段(持续):学 Agent、工具调用、工作流编排,同时补工程化能力(并发、限流、监控)。目标:能独立设计并落地一个 AI 应用。
7.2 几个我踩过的坑
坑一:过早追求"高级"技术。一上来就研究 GraphRAG、多 Agent 协作,基础没打牢,做出来的东西跑不通。先把简单 RAG 做扎实。
坑二:忽视评估。凭感觉调优,改来改去不知道有没有变好。一定要有测试集和量化指标。
坑三:把模型当万能。什么逻辑都交给模型判断,结果不稳定还费钱。能用规则解决的用规则,模型只处理它擅长的部分。
坑四:不做降级。模型服务挂了,整个功能就瘫了。必须有兜底方案。
坑五:忽略安全。提示词注入、敏感信息泄露、越权调用,这些安全问题在 AI 应用里很常见,要提前防。
7.3 关于"现在到底用 Spring AI 还是 LangChain4j"
回到这个高频问题。我的实际做法是:主框架用 Spring AI 做服务集成,RAG 和复杂编排部分按需引入 LangChain4j。两者可以共存,Spring AI 管模型调用和 Spring 集成,LangChain4j 管检索和链式编排。别把它当成二选一的站队问题,工具是为项目服务的。
至于 Spring AI Alibaba 这类国产化封装,如果项目要接国产模型、要符合国内部署要求,值得关注,它把一些本地化适配做好了。
最后分享一个我自己的体会:Java 开发者转 AI,最大的障碍不是技术难度,而是心态——总觉得自己"不是做 AI 的料"。其实你已有的工程能力,恰恰是 AI 落地最缺的。模型会调用、RAG 会搭、系统能稳住,这就已经超过大部分只会跑 Demo 的人了。剩下的,边做边补就行。