说实话,报名 Java + AI 实战营之前,我心里想得特别简单:大模型不就是把 Prompt 扔进去,等个几秒钟,拿返回的文本拼到项目里完事吗?我当时甚至觉得,只要能调通大模型的 API,写上几个「请帮我总结一下」「请帮我分类一下」的提示词,就已经算是能做 AI 应用开发了。
学完整个实战营之后,这种想法被彻底纠正了。我最大的收获不是「学会调用大模型」——这个其实一天就能搞定——而是真正理解了「能做 AI 应用」是怎么一回事。两者的差距,大概相当于「会用微波炉」和「能开一家餐厅」的区别:前者解决的是加热一次食物,后者要做的是把食材、设备、流程、人员、品控全部串起来,输出稳定可复用的结果。今天这篇文章不聊玄乎的理论,也不罗列一堆 API 参数,我就从一个 Java 程序员的角度,把实战营里那些真正刷新认知的点、踩过的坑,以及最后沉淀下来的一套可操作方法,完整地分享给你。
1. 重新理解 AI 应用的边界:从「接一个 API」到「做一个系统」
1.1 「调用大模型」只解决了一个很短的环节
先说结论:调用大模型,本质上是「给模型发一个 HTTP 请求,拿回一个响应」。不管用哪个厂商的接口,做的事情都差不多:组装请求体(model、messages、temperature、stream 这些参数),发出去,解析响应,把 content 字段取出来。熟练之后,这套代码的工作量跟你平时调第三方短信接口、支付接口没什么区别,个把小时就能搞定。
但一个 AI 应用的完整工作流远远不止这一步。它至少包含:业务需求分析、数据收集与清洗、提示词工程、模型服务封装、业务逻辑编排、前后端打通、效果评估、监控与迭代。注意,模型调用只是「模型服务封装」里的一个小环节。
实战营最后一天,老师让我们复盘整个项目周期里的精力投入。我们小组算了一笔账:提示词工程大约占 20%,模型服务封装占 15%,数据预处理占 30%,业务集成占 20%,测试与效果评估占 15%。而「发起一次模型调用」本身,连 10% 都不到。看到这个比例的时候我是真挺吃惊的——原来我以为的核心环节,在一整个 AI 应用面前竟然这么小。
1.2 用一条「生产链路」看透 AI 应用的真实结构
拿一个最常见的知识库问答系统来举例。大多数人第一反应是:把用户问题发给大模型,让它回答。但一个真正能上线的知识库问答,完整链路是这样的:
- 文档预处理:解析 PDF、Word,清洗掉页眉页脚,按语义段落切分。
- 向量化:调用 embedding 接口,把每个文本块转成向量。
- 向量存储:把向量写入向量数据库或者支持向量检索的引擎,比如 ES 或 Milvus。
- 检索:用户提问时,先把问题向量化,然后做相似度检索,召回最相关的 TopK 文本块。
- 拼装上下文:把召回结果按顺序拼进 Prompt,告知模型「只根据这些资料回答」。
- 生成答案:调用 chat 模型,得到最终回答。
- 后处理:在答案里标注引用来源,过滤无权限内容。
- 评估与迭代:准备测试集,持续跑分,看回答准确率和拒答率。
这八步里,真正由大模型完成的核心计算只有第 6 步,其余七步全是工程活。我在实战营里最深的体会就是:很多人把 AI 应用想简单了,以为找了个「聪明大脑」接上就万事大吉。但实际上,这个大脑不会自己读文档,不会自己检索资料,不会自己控制成本,也不会自己保证输出的格式合法。所有这一切,都得由应用开发者用工程手段去搭起来。这也是「会调用大模型」和「能做 AI 应用」最本质的区别——前者是链路上的一环,后者是把整条链路稳定地跑起来。
2. Java 在 AI 应用中的真实位置:不只是陪跑,而是主战场
2.1 为什么企业里用 Java 接大模型,而不是全员转 Python
很多人一聊到 AI 应用开发,第一个想到的就是 Python。这个印象没错,Python 在模型训练、算法实验、Notebook 分析这些场景下确实是第一选择。但真到企业生产环境,尤其是金融、电商、制造这类已经有大量存量系统的行业,Java 反而是 AI 应用接入的主力。
原因有三点:
- 存量系统决定了技术选型。大部分企业的核心系统是 Java 写的,订单、支付、用户、权限、库存,清一色的 Spring Boot。AI 能力要成为这些业务的子模块,直接嵌进去,而不是另起炉灶做一个 Python 服务再跨语言调用。用 Java 接入,连服务拆分的成本都省了。
- Java 生态的稳定性兜底能力更强。模型接口天然是外部依赖,高延迟、不稳定、有配额限制。而 Java 有非常成熟的线程池、熔断、限流、事务、监控体系,这些就是 AI 服务最需要的基础设施。
- 团队结构不用大动。现有的 Java 开发工程师学的就是 Spring Boot、MySQL、Redis 这套,补充 AI 应用工程的知识之后,立刻就能上手干活,不需要额外招一支 Python 团队。
我不否认 Python 在原型验证阶段更快,但原型快和上线稳是两件事。在企业里,AI 应用最后大多是要嵌进核心业务流程的,这时候 Java 的工程化能力就是实打实的主场优势。
2.2 Java + AI 的典型技术栈
实战营后,我自己沉淀了一套标准的 Java + AI 技术栈,直接抄作业也没问题:
- Spring Boot 3.x:服务骨架,负责 HTTP 接口、依赖注入、配置管理。
- WebClient 或 RestClient:调用大模型 HTTP 接口,支持流式响应。
- Jackson:解析模型返回的 JSON,用 Java record 定义响应结构。
- Redis:存放会话上下文、临时状态。
- MyBatis-Plus:保存业务数据,比如调用记录、生成结果、用户反馈。
- Spring AI 或 LangChain4j:如果不想重复造轮子,可以用这些 Java 生态里的 AI 框架。
先看一个最基础的调用示例,感受一下「会调用」的代码长什么样:
public ChatResult chat(String systemPrompt, String userInput) { // 组装请求 ChatRequest req = new ChatRequest( "qwen-plus", List.of( new SystemMessage(systemPrompt), new UserMessage(userInput) ), 0.7, // temperature false // stream ); // 调用模型 String resp = webClient.post() .uri("/chat/completions") .bodyValue(req) .retrieve() .bodyToMono(String.class) .block(); // 解析响应 JsonNode node = objectMapper.readTree(resp); return new ChatResult( node.at("/choices/0/message/content").asText(), node.at("/usage/prompt_tokens").asInt(), node.at("/usage/completion_tokens").asInt() ); }这段代码已经能完成「调用」了。但注意,它没有流式输出、没有重试、没有错误分类、没有 token 成本控制、没有上下文管理、没有输出格式校验。这些「没有」的东西,恰恰是「能做 AI 应用」的关键。后面这几个跨越,才是实战营价值最大的部分。
3. 从「会调用」到「能做」的五个关键跨越
3.1 提示词设计:从「聊天话术」变成「工程配置」
我一开始写的提示词是「你是一个助手,请帮我回答用户问题」。这种话术聊天用没问题,放在生产系统里就是在给自己埋雷。真正能用的系统提示词,应该是一份严谨的「工程配置」:
- 角色定位:你是谁,用什么语气,能做什么,不能做什么。
- 任务边界:这个接口只处理什么任务,超出范围怎么回复。
- 输入说明:你期望收到什么格式的输入。
- 输出格式:要求模型返回什么结构,JSON 还是 Markdown,字段定义是什么。
- 边界情况:信息不足时怎么办,敏感内容怎么处理,不确定时怎么拒绝。
- 示例(Few-shot):给 1 到 2 个输入输出样例,让模型照着格式走。
我在实战营里写的一个工单分类提示词大概是这样的:
你是电商平台的工单分类助手。你的任务是把用户留言分到以下类目之一: REFUND(退款)、COMPLAINT(投诉)、ACCOUNT(账号问题)、LOGISTICS(物流问题)、OTHER(其他)。 要求: 1. 只输出 JSON,格式为 {"category":"类目代码", "confidence":0.0-1.0, "reason":"一句话解释"} 2. 如果一条留言包含多个意图,选择最主要的一个。 3. confidence 低于 0.6 时,category 固定输出"OTHER"。 4. 不要输出任何解释性文字,不要使用 Markdown 代码块。 输入:{{user_input}}这个提示词的生产属性在于:它规定了输出格式、置信度阈值、多意图处理策略,还禁用了 Markdown 包裹。提示词越结构化,下游代码越好处理。模型不是不够聪明,而是你需要给它明确的操作手册,它才能按你的流程工作。
3.2 结构化输出与数据校验:模型说的 JSON 不一定是合法 JSON
这是实战营里让我印象最深的一课。模型在回答里输出 JSON 时,偶尔会在 JSON 前后加一句「好的,以下是提取结果:」或者把大括号包在```json 代码块里。甚至有时候输出的字段值是错的,比如把「金额」填成了订单号。如果你的业务代码直接把响应字符串交给 Jackson 解析,那线上就是定时炸弹。
我的做法现在是三层防线:
第一层,提取。先尝试全文解析,失败则用正则把 JSON 块抠出来,再去掉首尾的解释性文字。
第二层,校验。用 Jackson 反序列化后,做必填字段校验、类型校验、枚举值校验。比如 category 必须是枚举里的一个,confidence 必须在 0 到 1 之间。
第三层,重试。校验不通过时,把错误信息拼到新 Prompt 里,让模型重新生成一次,最多重试两次。如果两次都不行,走人工兜底队列。
这个流程的代码很简单,但价值极高。因为模型输出不稳定的问题,不是换一个更强的模型就能解决的,你必须从工程上做容错。我把这套逻辑写成了一个小工具类,所有调用模型的地方统一走这个入口,线上跑了一周,无效输出率从最初的 12% 降到了 1% 以下。
3.3 上下文管理:模型记不住东西,你要帮它记住
大模型的 API 是无状态的。每一轮对话,都要把之前的聊天内容重新发给它。这意味着两个问题:一是上下文管理必须自己做,二是 Token 消耗会随着对话变长而失控。
实战营里做客服场景时,我们用了这套方案:
- 会话存 Redis,以 sessionId 为 key,保存最近 N 轮消息。
- 每次请求前做 Token 估算,超出预算就触发「摘要压缩」:把更早的消息让模型总结成一段短摘要,然后丢弃原始消息。
- 给会话设置 TTL,比如 30 分钟无交互就清除,避免内存泄漏和隐私风险。
具体实现里有个细节:Token 估算不能用字符数硬算,中英文混合场景下,比较稳妥的方法是按「每 1 个汉字约 1.5 Token、每 1 个英文单词约 1.3 Token」做粗略估算,或者直接用模型厂商提供的 Tokenizer 工具。如果预算算得不准,多轮对话很容易在窗口长度临界点上报错,那个错误信息你还得专门做一次文案翻译,不然用户看到的就是天书。
3.4 把大模型安全地接进业务流程
大模型输出是不可完全信任的。这不是说模型「坏」,而是它的本质是概率生成,不是数据库查询。所以接入业务流程时,必须做好「护栏」。
实战营里我们总结了四类护栏:
- 超时控制。连接超时设 5 秒,读超时设 60 秒。模型接口慢了,宁可让用户稍后再试,也不能让业务线程无限等下去。
- 重试与幂等。模型接口返回 5xx 或限流时要做重试,用指数退避,最多三次。每次请求带一个 requestId,防止重试造成重复处理。
- 业务规则校验。模型生成的 SQL 要在测试库里真实执行验证;模型生成的代码必须跑编译和单元测试;模型给用户的操作建议要过一遍规则引擎,把高风险动作拦截掉。
- 人工兜底。凡是模型给出了低置信度结果、或触发敏感场景的,一律进人工审核队列,不能自动执行。
这套护栏做完以后,我明显感觉项目的性质变了:它不再是一个「AI 实验」,而是一个「带 AI 能力的正经业务系统」。上线之后,最大的收获不是模型效果提升了多少,而是出了问题我能快速定位、快速回滚,不用担心模型一句话把业务流程带沟里去。
3.5 可观测性与降级兜底:模型挂了,你的系统不能跟着挂
模型接口是可观测之后才知道疼的。实战营第二天开始,我们在所有调用入口统一打了结构化日志,字段大概是这样:
{"event":"llm_call","model":"qwen-plus","prompt_tokens":1250,"completion_tokens":320,"latency_ms":1543,"http_status":200,"scene":"ticket_classify","request_id":"uuid"}这些日志汇总到监控面板之后,三个指标必须盯着看:调用量、平均延迟与 P95 延迟、错误率(含超时、限流、无效输出)。Token 消耗也要单列一个成本报表,不然月底账单出来的时候,财务会让你解释为什么这个「AI 功能」比一个员工的工资还贵。
降级兜底这件事,是我的压轴心得:不要让你的核心业务流程强依赖模型。我在工单分类系统里加了一个开关:模型不可用时,自动切换到关键词规则引擎,先按敏感词和正则粗分类,顶住服务不宕机,等模型恢复了再把积压工单批量补分类。这个降级方案只花了半天就写完,但它救了项目不止一次。记住,AI 应用的第一原则是把业务保住,而不是把模型调通。
4. 实战营里最让我「破防」的三个项目
4.1 工单自动分类:卡住我的不是模型,是标签体系
第一个项目是做客服工单自动分类,需求很清晰:把用户留言归到退款、投诉、账号、物流这些类目里。我一开始觉得,这不就是个分类任务吗,直接调模型分类就完事了。但真正做起来,卡住我整整两天的是标签体系本身。
客服团队的类目表有 17 个分类,很多分类是重叠的。比如「收到的商品有破损想退货」,算退款还是算投诉?两个类目都沾边。还有一条留言里出现了「申请退款」和「账号被冻结」两个意图,怎么定主分类?这些业务问题不解决,模型就算再聪明,给出来的分类也是随机的。
最后我们是这么定的:把 17 个分类合并成 5 个互斥的一级类目,每个类目写清楚判定标准,并规定一条留言只取最主要意图。类目标签体系收敛之后,模型的分类准确率一口气从 68% 提到了 87%。这件事给我最大的教训是——AI 项目里最难的往往不是模型调参,而是把业务规则梳理清楚,让模型有明确的边界可循。
4.2 用 AI 生成 SQL:输出「能用的代码」比「能看的代码」难多了
第二个项目是让 AI 根据自然语言查询生成 SQL,帮运营同学查数据。模型生成的 SQL 看起来有模有样,但直接拿去查询,问题一堆:表名对不上、字段名编造、WHERE 条件写错、甚至查全表。
我们被迫做了一个约束方案:给模型的提示词里写明允许查询的表清单、字段清单、以及字段的类型枚举;模型输出的 SQL 不允许包含 DELETE、UPDATE、DROP,只允许 SELECT;生成之后自动在测试库执行,拿执行计划和结果集做校验,有异常就把报错信息回喂给模型,让它重新生成。经过这三重约束之后,SQL 的可执行率才达到了 95% 以上。
这件事让我想明白一个问题:模型生成的代码,「看着能用」和「真的能用」之间有巨大的鸿沟。唯一的解法是用测试集去验证,而不是靠人眼评审。这跟程序员写的代码要走 CI 是一个道理。
4.3 知识库问答:幻觉问题让项目差点没法交付
第三个项目是知识库问答,也是最难的一个。我们往模型里塞了一批内部技术文档,希望它能回答「某某服务怎么部署」这类问题。结果模型经常一本正经地「编」出文档里不存在的内容,还挺像真的。这就是网上天天说的幻觉问题。
我们最后的应对策略是这样的:检索增强(RAG)不能省,必须让模型基于检索结果回答,并且每条答案都要带引用来源编号。再往下走一步,就是准备评估集。我们从真实问题里挑出 50 条,人工写好标准答案,然后每次改完 Prompt 或者调整检索策略之后,全量跑一遍,看准确率和拒答率的变化。这个评估体系做了以后,我们的优化不再是「我觉得效果变好了」,而是「准确率从 78% 涨到了 86%,有价值」。
这个过程时间线拉得很长,但它教会我一件事:做 AI 应用,没有评估就没有迭代。你说模型回答得好不好,得有数字说话,不能凭感觉。
5. 给准备走 Java + AI 方向的程序员一条可落地的学习路线
5.1 先把 Java 基本功补牢:你真正需要掌握的核心清单
很多同学一看 Java + AI,就急着去学 Spring AI、LangChain4j,结果底子不稳,遇到问题无从下手。我个人的经验是:AI 应用开发对 Java 基础的要求比传统 CRUD 开发更高,而不是更低。因为你要处理的东西是网络通信、数据流、并发控制、状态管理。
建议先对着清单自查一遍:
- 集合与 Stream:Map、List、Collectors 用得溜不溜,能不能熟练用流做分组、去重、排序。
- 并发编程:线程池参数、CompletableFuture 编排多个异步任务。AI 应用里经常要并行调用多个接口,这个能力是刚需。
- IO 与文件处理:读取大文件、按行解析、处理不同编码,做文档预处理时天天用。
- Spring Boot 核心:Controller、AOP、异步任务、配置装配、异常处理。
- 数据访问:MyBatis-Plus 的基本操作、事务管理、SQL 调优。
- Redis:String、List、Hash 的数据结构使用以及过期策略,上下文管理要靠它。
这些内容也是 Java 面试题里出现频率最高的几块。把基础补牢,再进入 AI 方向,你会发现自己看模型 API 的文档都轻松很多,因为不管哪家的接口,底层都是 HTTP、JSON、流式响应那套东西。
5.2 大模型应用的 6 个核心概念,别被术语吓住
学习过程中你一定会碰到一堆术语,这里用大白话过一遍:
- Token:模型读文字的最小计数单位。简单理解,1000 Token 大约相当于几百个汉字。计费、限流、上下文管理,全绕不开它。
- 上下文窗口:模型一次能「看到」的最大 Token 数量,比如 128K 就表示能看大约十万字级别的内容。窗口越大,能塞进去的上下文越多,但成本也越高。
- temperature:控制模型回答的随机性。0 到 1 之间,值越低回答越保守稳定,值越高越有创造性。做业务系统,多数场景用低值。
- RAG:检索增强生成。先查资料再回答,是解决幻觉的主流手段。核心是把文档拆块、向量化、检索、拼 Prompt 四步走。
- Agent:让模型能够自己规划任务、调用工具、根据工具结果继续行动。本质是一个「思考-行动-观察」的循环。
- 微调:用业务数据继续训练模型,让它变成某一领域的专家。但绝大多数业务场景用不到,先学 RAG、提示词工程更划算。微调成本高、周期长、数据要求高,入门阶段不用碰。
这些概念搞明白之后,你再看各种技术文章和工具文档,视野会完全不同。你会发现 AI 应用开发的套路本质上都是相通的:数据进来、模型处理、结果校验。
5.3 一条可执行的 90 天学习路线
最后分享一条我自己验证过的学习路线,直接照着做就行:
阶段一(第 1 到 2 周):会调 API。目标是用 Java 跑通一个大模型的 HTTP 调用,包括同步调用和流式输出,能解析 JSON、能打印 Token 消耗。选一个大厂免费的大模型 API 或者便宜的套餐就行,不用纠结哪家最强。验收标准:你写出了一个不依赖他人代码的调用 Demo。
阶段二(第 3 到 4 周):做业务集成。目标是把模型调用嵌进一个真实业务场景,比如工单分类、内容摘要、日志分析。必须包含:系统提示词、结构化输出、JSON 解析与校验、Redis 存会话。验收标准:做一个带接口的服务,输入一段文字能输出合法的结构化结果。
阶段三(第 5 到 8 周):做 RAG 知识库问答。目标是做一个基于内部文档的问答系统。需要学文档切分、向量化、向量检索、Prompt 拼装、结果评估。验收标准:准备 30 条测试问题,手算准确率能稳定在 80% 以上。
阶段四(第 9 到 12 周):Agent 入门。目标是让模型能调用工具解决问题,比如查天气、查订单、发通知。可以用 Spring AI 或者 LangChain4j 里的现成框架去理解 Agent 的编排逻辑。验收标准:做一个多轮对话助手,它能根据用户意图自动选择工具并完成任务。
这条路线整体坚持下来,你至少会亲手跑完三个完整的 AI 小应用,积累出真实项目经验。到了这个阶段,「能做 AI 应用」就不再是一句口号,而是你简历里一个扎扎实实的项目经历。
最后说点个人体会。实战营结束之后,我反复想了很久,为什么一开始我会把「调用大模型」和「做 AI 应用」混为一谈。后来想明白了:因为我当时只看到了模型这个最亮眼的环节,忽略了整个系统里沉默的大多数工程细节。而恰恰是这些细节,决定了你的功能到底能不能稳定上线、能不能扛住真实流量、能不能让业务方真的用起来。我踩过的最大的坑,就是花了太多时间比较哪个模型效果好,却很少去想我的业务数据长什么样、我的输出怎么校验、我的服务挂了怎么兜底。如果你也正准备走 Java + AI 这个方向,真心建议你从手头最繁琐、最重复的日常工作开始,先做一个能自动跑的辅助小工具,把链路完整跑通一遍。这个过程里遇到的那些「真实的数据问题、真实的格式问题、真实的边界情况」,才是让你从一个调用者变成构建者的真正起点。