首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Java × AI:从「语言之争」到工程底座

Java × AI:从「语言之争」到工程底座

原创
作者头像
用户12502707
修改于 2026-09-24 10:25:13
修改于 2026-09-24 10:25:13
1930
举报

一、先把一个吵了三年但毫无意义的问题结束掉

"Java 在 AI 时代会不会被淘汰?"——这个问题本身问错了对象。

AI 有两层工作:模型层(训练、微调、推理内核)和应用层(把模型能力接进业务流程,变成能上线、能计费、能追责的系统)。模型层从来不是 Java 的主场,也永远不会是。Python 在那里的地位由 PyTorch 生态、学术共同体和二十年累积的数值计算文化共同决定,不存在"取代"这回事。

Java 的主场在第二层。而恰好,企业花钱买的是第二层。

一个很朴素的账:一家银行要上智能客服、智能风控、信贷报告生成,它面对的不是"选什么语言写模型",而是"怎么在不推翻核心系统的前提下,让现有 Java 服务具备调用模型、检索私有数据、记录审计日志、扛住每秒上万次请求的能力"。这个系统的 90% 代码依然是事务、权限、幂等、重试、监控——和十年前一样。多出来的那 10%,就是 Java AI 的全部内容。

所以更准确的命题是:Java 不是 AI 语言,它是 AI 的工程化载体。 接受这个定位,后面所有的技术选择才讲得通;不接受,就会陷入"用 Java 训模型"这种方向性错误。

二、Java 的真实优势,以及被严重夸大的部分

2.1 站得住脚的四条

1. 存量即护城河。 金融、电信、政务、电商、制造的核心系统大量运行在 JVM 上。这些系统不可能为了接入大模型重写一遍,只能"嵌入"。这意味着 Java AI 的需求不是风口驱动的,而是存量系统升级驱动的——它的持续性远好于任何新概念。

2. 强类型是 AI 时代被低估的资产。 这一点后面展开,它是全文最重要的技术论点之一:LLM 的输出天然是非结构化的、概率性的,而企业系统要求确定性和契约性。强类型 + JSON Schema + 编译期检查,恰好是这两端之间最窄的桥。

3. 并发与运行时工程成熟度。 虚拟线程(Project Loom)把"每个会话一个线程"的编程模型变得可行,ZGC 把停顿压到亚毫秒级,GraalVM 原生镜像解决了冷启动和内存占用。这些不是 AI 专属能力,但 AI 应用恰恰是高并发、长连接、流式输出的场景,红利直接命中。

4. 可观测、可治理、可审计。 OpenTelemetry、Actuator、APM、分布式追踪、权限体系、事务管理——Python 生态不是没有,但 Java 生态的标准化程度和企业级渗透率明显更高。当 AI 应用从 Demo 走向生产,这条差距会从"不重要"变成"决定性"。

2.2 需要打折看的三条
  • "Java 推理比 Python 快 X%":这类数字在不同报告里能从 30% 跑到 78%,口径差异巨大(是否同模型、同量化、同硬件、P99 还是均值)。Java 在服务层吞吐和稳定性上有优势是真的,但别拿它当采购依据。
  • "Java 将取代 Python":这是厂商调研的典型叙事。现实是分工固化而非谁吃掉谁——Python 做模型与数据,Java/TS 做应用与服务,中间靠 HTTP/gRPC/MCP 通信。
  • "有了 Spring AI 就不需要懂 AI":框架只解决"怎么调通",不解决"为什么答错"。后者才是项目成败的关键。

三、技术栈全景:2026 年的四个梯队

第一梯队:应用框架(三足鼎立,定位不同)

Spring AI

LangChain4j

AgentScope-Java

出身

Spring 官方

社区独立

阿里开源

哲学

模型可移植性,约定优于配置

不被任何框架绑架

Agent 的运行平台,而非开发工具包

绑定

强绑定 Spring Boot

无绑定(Spring/Quarkus/纯 Java)

自带分布式底座

长处

自动配置、MCP 原生、Actuator 可观测、结构化输出 .entity()

复杂 RAG(路由/重排序)、Agent 编排、本地模型

长任务、多租户、沙箱、HITL、技能自进化

短板

复杂 Agent 编排较弱,版本间破坏性变更多

无自动配置,文档分散,向量层不如前者

重,小项目用不上

几个必须知道的事实(避免踩坑):

  • Spring AI 1.0 GA 于 2025 年 5 月发布,2.0.0 GA 于 2026 年 6 月发布,基于 Spring Boot 4.1 / Spring Framework 7.0,强制 Java 17+(推荐 21)。2.0 做了大量重构:工具调用循环统一到 ChatClient 的 ToolCallingAdvisor、Anthropic 模块迁至官方 Java SDK、MCP SDK 升级至 2.0、配置属性扁平化(移除 .options. 层级)、Options 全面 Builder 化、对话记忆要求显式传入 conversation ID。结论:现在新开项目,如果团队吃得起 Boot 4 的升级成本,直接上 2.0;否则明确规划迁移路径,不要指望 1.x 长期维护。
  • 2.0 同时移除了一批模型和向量库集成(部分国内模型、Azure OpenAI 独立模块、Vertex AI 除 embedding 外的模块等,有的移至社区或外部维护)。选型前务必核对你要的提供商是否还在主仓库——这是最容易在立项时忽略的风险。
  • LangChain4j 在 2026 年完成了 agentic API 的声明式重构(@Agent、Agent Skills、执行状态持久化与恢复、A2A 协作)。如果你要做多步、可中断、可恢复的长流程,它比 Spring AI 顺手。
  • 三者不是互斥的。常见组合是:LangChain4j 做核心 AI 能力 + Spring AI 做生态集成,或者 Spring AI 做日常接口 + AgentScope 跑长时 Agent。
第二梯队:模型接入层

原则只有一条:永远用兼容层 + 路由抽象,绝不把 provider 写死在业务代码里。

代码语言:javascript
复制
1// 坏:provider 泄漏到业务里
2OpenAiChatModel model = new OpenAiChatModel(..., "gpt-4o", ...);
3
4// 好:业务只依赖 ChatClient,模型由配置和路由决定
5ChatClient client = builder
6        .defaultSystem(SYS)
7        .defaultAdvisors(retryAdvisor, safetyAdvisor, ragAdvisor)
8        .build();

生产环境几乎必然需要:主备模型 failover、按任务难度分流(贵的模型只做决策,便宜模型做摘要/格式化)、超时与熔断、prompt 缓存命中率监控。这些都不是框架默认给你的,得自己包一层 ModelRouter。

国产模型接入要注意:很多是通过 OpenAI 兼容接口提供的,走 spring-ai-openai 改 base-url 就能通;但也有少数需要专用 SDK 或存在 tool calling 语义差异。凡是涉及 tool calling 的模型,必须单独做一轮契约测试,这是最常见的线上故障来源。

第三梯队:数据与检索层(RAG 的真实瓶颈在这里)

一个残酷的经验:80% 的"AI 答不准",问题出在检索,不在模型。 换模型通常没用,改分块策略、加元数据过滤、上重排序才有用。

选型建议(按规模递增):

  • PGVector:复用现有 PostgreSQL,运维成本最低,中小规模首选。别因为"Milvus 更先进"就引入一个新集群。
  • Qdrant:中等以上规模、需要过滤与混合检索时的甜点区。
  • Milvus:亿级以上向量、有专门运维人力时才考虑。
  • Elasticsearch/OpenSearch:已有 ES 栈的团队,先用关键词 + 向量的混合检索,性价比往往高于纯向量方案。

RAG 流水线必须拆成可独立调优的环节:解析 → 分块 → 向量化 → 检索 → 重排序 → 注入 → 生成。每一环都要有独立的评估集和指标(召回率、MRR、幻觉率)。否则你根本不知道改了哪里起了作用。

另外两个常被忽略的点:

  1. 文档解析是最大的脏活。PDF 的表格、扫描件、双栏排版、页眉页脚,会系统性污染你的知识库。预算里要给这部分留时间,比例可能比你想象的高。
  2. 增量更新与失效策略。知识库不是一次性导入就完事的,文件改了怎么办、权限变了怎么办(员工离职后不该再检索到他的薪酬文档)、向量过期怎么清理——这是 RAG 从 Demo 到生产的分水岭。
第四梯队:可观测与评估

没有这一层,AI 项目就是黑箱运营。最低配置:

  • 链路追踪:每次用户请求一个 trace id,贯穿 prompt、检索、模型调用、工具调用、token 消耗。OpenTelemetry LLM 语义约定 + 现有 APM 即可,不必强求新平台。
  • 指标:首 token 延迟、总延迟、token 成本/请求、缓存命中率、工具调用失败率、拒答率。
  • 留存与回放:把 prompt 和输出落库(注意脱敏),才能做回归评估。
  • 评估集:哪怕只有 50 条黄金问答,也比没有强。任何模型切换、prompt 修改、检索参数调整,都必须过评估集。 这是唯一能对抗"感觉变差了"的手段。

Langfuse 这类平台可以加速起步,但别把它当成必选项——核心是有没有评估纪律,不是用了哪个工具。


四、Java 独有的那张牌:用类型系统约束概率输出

这是我认为 Java 在 AI 应用层最实在的优势,也是最少被讲清楚的一点。

LLM 的输出是概率性的,而下游业务(账务、库存、权限)要求确定性。两者之间的缝隙,传统做法是用字符串解析去填——脆弱、难测、出了错难以定位。Java 的做法是把契约提到编译期:

代码语言:javascript
复制
1public record OrderQueryResult(String orderId, String status, LocalDate shipDate, BigDecimal amount) {}
2
3OrderQueryResult result = chatClient.prompt(userMsg)
4        .advisors(new RetrievalAugmentationAdvisor(...))
5        .call()
6        .entity(OrderQueryResult.class);   // 框架自动生成 JSON Schema,校验失败走异常路径

这件事的价值链条很长:

  1. Schema 即约束:生成的 JSON Schema 传给支持 structured output 的模型,等于在解码层面收窄搜索空间,准确率直接提升。
  2. 失败显式化:解析失败不是返回一个怪字符串,而是抛异常,进入你已有的重试/降级/人工兜底流程。
  3. 可演进:Record 加了字段、改了类型,编译器和 CI 会告诉你哪些调用点要修。换成 Python 的 dict,这个错误要到线上才会被发现。
  4. 可审计:输入输出都是可序列化的结构体,落库、回放、对账都顺理成章。

再往上走一层:工具(Tool)的参数也是类型契约。@ToolParam(description = "...") 里的描述文案,本质上是给模型的接口文档。这里有一条硬纪律——描述文案要和代码一起 review、一起版本化。实践中大量"模型乱调工具"的问题,根源是描述写得含糊(比如没写清单位、没写清什么情况下不该调用)。

顺带一提:工具函数本身必须是幂等的、只读的或有明确副作用边界的。模型可能会重复调用、会以你意想不到的顺序调用。如果你的 cancelOrder() 没有幂等保护,迟早会出事。


五、六种落地形态,以及各自的正确做法

按复杂度从低到高,Java 侧的 AI 落地大致分为六类。绝大多数项目的失败,源于用高复杂度形态的预算,做了低复杂度形态的事,或者反过来。

1. 嵌入式辅助(Copilot 式) 在现有页面或工单里加一个"帮我总结/帮我起草"按钮。风险最低、回报最快、最容易证明价值。建议所有团队从这里起步,先拿到一次成功上线的经验。

2. 智能问答 / 知识检索(RAG) 最常见,也最容易被高估。关键判断标准:你的内容是不是结构化程度低、更新频繁、且允许一定容错? 如果是查订单状态、查余额、查库存——不要用 RAG,走工具调用查数据库,准确率高一个数量级。RAG 适合政策、制度、手册、故障预案这类文本。

3. 工具增强型助手(Tool Calling) 自然语言 → 解析意图 → 调既有服务 → 组织结果。这是 Java 团队最舒服的位置:模型只负责意图理解和结果表达,业务逻辑全部留在原有的 Service 层里,一行都不用动。 请务必守住这条线——不要让模型生成业务逻辑。

4. 流程编排型 Agent 多步规划、条件分支、循环、失败重试、人工介入。到这里就必须考虑状态持久化和断点恢复:进程重启了会话还在不在?跑了半小时的任务超时了能不能续跑?这就是 LangChain4j 的执行状态持久化、AgentScope 的会话恢复要解决的问题。也要注意:能做成状态机的,优先做成状态机,把 Agent 的自由度限制在必要的少数节点上。

5. 后台异步智能处理 报表生成、批量审核、工单分类、日志归因。这一类往往 ROI 最高,因为不需要实时、不需要流式、失败可以重试、人可以事后抽检。很多团队盯着实时对话场景死磕,其实价值更大的在后台。

6. MCP 供给方 / 消费方 MCP(Model Context Protocol)正在成为"给 Agent 暴露能力"的标准接口。对 Java 团队最有价值的用法是:把你现有的内部服务通过 MCP Server 暴露出去,让各种 Agent(包括外部的)安全地调用。这相当于给企业的存量系统装了一个统一的 AI 适配层。注意做好工具鉴权、参数白名单和速率限制——MCP 的本质是扩大攻击面。


六、工程化的六个硬问题(框架不帮你解决的部分)

① 确定性边界 必须事先定义清楚:哪些环节允许概率性(摘要、措辞、推荐排序),哪些环节必须确定性(金额、权限、状态流转、合规结论)。后一类要么不用模型,要么模型输出必须经过规则引擎二次校验。金融场景尤其如此:宁可拒答,不可错答。

② 上下文与记忆的成本 上下文窗口变大不等于可以无限塞东西。token 是真金白银,也是延迟的主要来源。需要建立:上下文预算(每轮最多多少 token)、压缩策略(摘要历史、保留关键事实)、分层记忆(短期对话 / 会话级事实 / 长期画像)、以及明确的遗忘策略。记忆存什么、存多久、谁能看,这三个问题要在设计阶段回答,后期补非常痛苦。

③ 成本模型 不要只看"每百万 token 多少钱"。要看单次业务动作的成本:一次客服对话平均多少 token、一天多少万次、乘以单价。很多项目上线才发现单笔成本高于人工。降本手段按性价比排序:prompt 缓存 > 小模型分流 > 上下文压缩 > 结果缓存(相同提问命中) > 降低采样温度减少重试。

④ 安全 三条最容易漏的:

  • Prompt 注入:用户输入或检索到的网页内容里藏指令,诱导模型越权操作。对策:把外部内容放在 system prompt 之外并明确标注为"数据不可信",工具侧做权限二次校验(不能信模型说"这个用户有权限")。
  • 凭证管理:API key 绝不能进代码库、不能进日志、不能进 prompt 回显。用密钥管理服务 + 细粒度 key + 用量告警。
  • 输出合规:敏感词、PII 脱敏、医疗/法律免责声明。SafetyAdvisor 可以做一层,但别指望它兜住全部。

⑤ 测试 AI 功能的测试金字塔和普通软件不同:

  • 单元测试:测你的工具函数、解析器、路由逻辑——这部分和普通代码一样,覆盖率该多少就多少。
  • 契约测试:对每个模型 provider 测 tool calling 的入参出参是否符合预期(模型升级会静默改变行为)。
  • 评估集回归:黄金问答集 + 打分规则(可用模型辅助打分,但要人工抽检)。
  • 探索性/对抗性测试:专门构造注入、越权、诱导、超长输入。
  • 取消"断言精确字符串相等"这类测试,改为断言结构、断言约束、断言禁止项。

⑥ 人的回路(HITL) 重要决策必须留人工确认点,且要设计成低成本确认(给出理由、依据原文、一键通过/驳回),而不是让人重新做一遍。同时记录人的修正,作为下一轮优化的数据源。


七、反模式清单(可以直接拿去 code review)

  1. 把整个业务逻辑写进 system prompt,Service 层空转。
  2. 一个 prompt 干十件事,失败后靠"你再想想"循环重试。
  3. 检索 Top-K 凭感觉设成 5,从未测过召回率。
  4. PDF 直接丢进去解析,不做表格和版式处理。
  5. API key 写在 application.yml 里提交到 Git。
  6. 没有评估集,效果好坏全靠产品"感觉"。
  7. 工具函数有副作用且不幂等。
  8. 把用户原始输入原样拼进 system prompt,无任何隔离标注。
  9. 对话历史无限累积,直到超出窗口或账单爆炸。
  10. 模型返回的 JSON 用字符串解析而不是结构化绑定。
  11. 在生产环境开启 prompt/completion 全量日志(含用户隐私)。
  12. 立项第一天就决定自研 Agent 平台。
  13. 用 RAG 解决本该走数据库查询的问题。
  14. 认为"换个更好的模型"能解决数据质量问题。

八、人和组织:比技术更难的那一半

岗位确实在变,但不是"Java 工程师消失",而是分化。

  • 纯 CRUD 型岗位需求收缩是真实的,因为这部分工作最容易被自动化,也最容易被外包或削减。
  • 新增的需求集中在交界地带:能把模糊业务意图拆成可验证契约的人。这项能力一半是领域建模(老本行),一半是理解模型的能力边界(新东西)。
  • 一个现实的提醒:"会用 AI"不会让你自动变强,它会放大你原有的水平。 资深工程师用它十倍速,初级工程师用它十倍速地制造难以维护的代码。所以团队引入这套技术栈时,配套的必须是更严格的 review 和评估纪律,而不是更宽松的。

组织层面的三个建议:

  1. 先立护栏再推工具。 写清楚:哪些场景鼓励用、哪些禁止(资金、权限、合规结论必须有真人签字)、key 怎么管、日志怎么留、责任怎么认定。没有这份文档,推广越快风险越大。
  2. 衡量指标要换。 别用代码行数或工时,用需求吞吐、缺陷率、返工率、上线周期、单次交互成本。而且要做好心理准备:前三个月数字可能不好看,因为团队在学习曲线上。
  3. 不要把它包装成人力缩减计划。 一旦团队相信引入的目的是替代自己,反馈就会失真,坑会被藏起来,最后烂尾。正确的叙事是:它解放的是重复劳动,省下来的资源去做以前没精力做的事(比如补测试、补文档、清技术债)。

九、结语:Java 这次拿到的,是一个"基础设施"的角色

回顾过去几年,关于 Java 和 AI 的讨论经历了三个阶段:

  • 2024 年前后是焦虑期:"AI 会不会让 Java 没用"——这个问题基于一个误解,以为 AI 主要改变的是写代码这件事。
  • 2025 年是追赶期:Spring AI 1.0、LangChain4j 成熟,Java 终于有了体面的接入层,讨论变成了"Java 能不能追上 Python"——这个问题依然问错了,因为它预设了这是一场竞赛。
  • 到了 2026 年,应该进入分工期:没人再争论谁取代谁,而是默认 Python 在模型与数据侧、Java 在企业应用侧,两边通过清晰的协议对接。

Java 这次拿到的角色并不性感,但极其稳固:做 AI 的基础设施,而不是 AI 本身。 基础设施的特点是——不站在聚光灯下,但所有流量都经过它;不常被谈论,但一旦出问题所有人都知道是谁。这对一门三十多岁的语言来说,是最合适的位置。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 一、先把一个吵了三年但毫无意义的问题结束掉
  • 二、Java 的真实优势,以及被严重夸大的部分
    • 2.1 站得住脚的四条
    • 2.2 需要打折看的三条
  • 三、技术栈全景:2026 年的四个梯队
    • 第一梯队:应用框架(三足鼎立,定位不同)
    • 第二梯队:模型接入层
    • 第三梯队:数据与检索层(RAG 的真实瓶颈在这里)
    • 第四梯队:可观测与评估
  • 四、Java 独有的那张牌:用类型系统约束概率输出
  • 五、六种落地形态,以及各自的正确做法
  • 六、工程化的六个硬问题(框架不帮你解决的部分)
  • 七、反模式清单(可以直接拿去 code review)
  • 八、人和组织:比技术更难的那一半
  • 九、结语:Java 这次拿到的,是一个"基础设施"的角色
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档