Spring之父再次出山,开发了新的AI框架!

前言

最近这阵子,技术圈里有一个名字频繁出现在各种讨论中------Rod Johnson

如果你不知道他是谁,那你一定知道他做的东西------Spring Framework

没错,就是那个几乎重新定义了企业级Java应用该怎么写的Spring。

二十多年前,Rod Johnson用一本书(《Expert One-on-One J2EE Design and Development》)和一个框架(Spring),终结了EJB那个让人欲哭无泪的时代。

二十多年后的今天,他又回来了。

2026年4月,Rod Johnson在Microsoft JDConf开发者大会上正式发布了Embabel------一个面向企业AI Agent的JVM开源框架。

2026年7月20日,Embabel正式发布了1.0.0 GA版本 。项目采用Apache 2.0协议开源,目前已在GitHub上公开。

今天这篇文章,我就把Embabel从设计理念到底层原理、从代码实战到性能数据,从头到尾给你深度拆解一遍。

希望对你会有所帮助。

12个项目实战在Java突击队网:susan.net.cn/project

一、为什么是现在?

在聊框架本身之前,我们先理解一个关键问题------Rod Johnson为什么要在这个时间点做这件事?

SpringSource被VMware收购后,Rod Johnson做了很多年董事会和投资的事情。直到2022年底ChatGPT的出现,让他重新坐不住了。

他意识到行业正处在一个巨大的转折点上。

但他看到的不是"AI多厉害",而是**"AI的承诺和现实之间有一条巨大的鸿沟"**。

"你实际上是在用一个'九成时间有效、一成时间无效'的东西去构建系统,从效果上看,它就等于'完全没用'。"

这句话点出了企业AI落地的核心困境:

  • 个人助理场景下,90%的正确率已经足够好
  • 但企业业务系统容不得那10%的错误

生成式AI是一种随机的、非确定性的系统------同样的提示,每次生成的结果可能都不一样。

这对个人聊天来说无所谓,但对金融交易、订单处理、合规审计来说,不可预测就意味着不可用

这就是Embabel要解决的问题。

二、Embabel到底是什么?

有些小伙伴可能会问:"Spring AI不是已经有了吗?Embabel跟它是什么关系?"

这是个非常关键的问题。

Embabel和Spring AI是不同层面的东西

打个比方:Spring AI相当于Servlet API,Embabel相当于Spring MVC

Spring AI解决的是"怎么接入AI模型"------提供统一的ChatModel接口、向量存储抽象、工具调用机制。

它让你能调用大模型,但怎么组织Agent的逻辑、怎么规划多步任务、怎么保证流程可控------这些需要你自己写代码来实现。

Embabel解决的是"怎么让AI Agent在企业系统里稳定工作"------提供一套完整的Agent编程模型,包括行动(Action)、目标(Goal)、条件(Condition) 等核心抽象。

简单说:Spring AI是"零件箱",Embabel是"装配图纸+流水线"。

Rod Johnson自己的定位更直接:"你可以在Java中构建比Python更好的Agent,JVM对于真实世界的生成式AI应用是更优选择。"

Embabel整体架构图:

Embabel的核心理念可以用一句话概括:通过确定性规划,让非确定性的AI在确定性的企业系统里稳定工作

三、从游戏AI借来的"秘密武器"

GOAP算法是Embabel最引人注目的设计,也是它和所有其他AI框架最本质的区别

3.1 什么是GOAP?

GOAP全称Goal-Oriented Action Planning(面向目标的行动规划) ,原本用于游戏中的NPC(非玩家角色)AI------比如《最后生还者》里的敌人、《星际争霸》里的单位,它们需要根据当前状态自主决定下一步行动。

在GOAP中,Agent的工作流程是这样的:

  1. 明确当前状态和目标
  2. 根据所有可用的行动(Action)及其前置条件和效果
  3. 动态规划出从当前状态到目标的最优行动序列
  4. 每执行一步,根据新的状态重新规划

这就好比你在用导航软件------不是出发前规划好全程就再也不变了,而是每到一个路口,根据实时路况重新计算接下来的路线

3.2 为什么GOAP对企业AI如此重要?

Rod Johnson认为,现有AI Agent方案走向了两个极端:

  • 要么让LLM完全自主决策------结果不可预测,无法审计
  • 要么人工预先穷举所有可能情形------工作量巨大,无法扩展

GOAP在两者之间找到了平衡------规划逻辑是确定性的(可解释、可审计),但规划结果是动态的(适应性强)

更重要的是:GOAP规划器完全不用LLM

这意味着什么?

每次规划不消耗Token。

在一次包含多个Action的工作流中,这一刀砍下去,直接省掉40%-60%的LLM调用

GOAP规划流程详解:

理解GOAP和LLM规划的本质区别:LLM规划是把"怎么走"这件事交给一个会犯错、会幻觉、会偏离目标的随机系统。

GOAP规划是把"怎么走"这件事交给确定性的算法------它根据Action的前置条件、效果、成本和价值,计算出最优路径。

GOAP不会"想歪",不会"跑偏",不会"编造不存在的Action"。它的每一步决策都是可追溯、可解释、可审计的。

四、强类型、面向对象的Agent编程

如果你写过Spring,Embabel会让你感觉很亲切。

4.1 核心抽象:Agent、Action、Goal

Embabel的核心抽象非常清晰:

  • Agent:一个自包含的组件,封装了领域逻辑、AI能力和工具使用,代表用户完成特定目标
  • Action :Agent可以执行的离散步骤,用@Action注解标记,输入输出都是强类型领域对象
  • Goal :Agent要达成的目标,用@Goal注解标记
java 复制代码
// 定义一个Action------纯粹的Java代码,没有字符串拼接
@Action(description = "从知识库中检索相关文档")
class RetrieveDocumentsAction {
    @ActionMethod
    fun execute(
        @Parameter(description = "用户问题") query: String
    ): List<Document> {
        return vectorStore.similaritySearch(query, topK = 5)
    }
}

4.2 类型安全:告别字符串地狱

Python的LangChain/LangGraph生态有一个核心问题------大量使用字符串、dict、动态Graph和手写节点边 。这些在Python里"还行",搬到Java里就变成了维护噩梦

Embabel的设计原则是强类型和面向对象。所有的LLM交互都是强类型的,提供了编译时检查、重构支持和IDE辅助。

不再靠字符串拼接Prompt,不再靠JSON解析------一切都用Java/Kotlin的类型系统来保证

java 复制代码
// Embabel中,Action的输入输出都是强类型领域对象
@Action(description = "查询订单状态")
public OrderStatus getOrderStatus(
    @Parameter(description = "订单ID") String orderId
) {
    // 纯Java代码,没有字符串拼接
    return orderService.findStatus(orderId);
}

4.3 两种规划模式

Embabel支持两种规划模式:

① GOAP(默认) :基于成本和价值计算最优Action序列,不用LLM做规划

② Utility AI:每个Action由可配置的效用函数打分,每步执行得分最高的Action。在Stashbot(RAG文档助手)中,Utility AI模式让LLM自主决定何时以及如何搜索文档。

4.4 为什么用Kotlin写?

Embabel的核心代码是用Kotlin写的。

Rod Johnson解释说:

  • 他个人更喜欢Kotlin的编码体验
  • 空安全、更简洁的语法、reified泛型减少类型擦除影响

但关键点来了------实现框架的语言选择,不意味着在上面构建应用的语言选择。Embabel与Java有出色的互操作性,用Java构建应用时,你永远不会看到Kt导入。

无论你用Kotlin还是Java,Embabel的类型安全性和丰富领域模型的核心价值都很突出

五、代码实战

光说理论不够,我们来看看Embabel的实际代码。

以下是基于Embabel官方示例的简化版本。

5.1 定义领域模型

java 复制代码
// 订单领域模型
public class Order {
    private String orderId;
    private OrderStatus status;
    private BigDecimal amount;
    // getters/setters...
}

// 订单状态枚举
public enum OrderStatus {
    PENDING, CONFIRMED, SHIPPED, DELIVERED, CANCELLED
}

5.2 定义Action

java 复制代码
import com.embabel.agent.api.annotation.Action;
import com.embabel.agent.api.annotation.ActionMethod;
import com.embabel.agent.api.annotation.Parameter;

@Action(description = "查询订单状态")
public class GetOrderStatusAction {
    
    private final OrderService orderService;
    
    public GetOrderStatusAction(OrderService orderService) {
        this.orderService = orderService;
    }
    
    @ActionMethod
    public OrderStatus execute(
        @Parameter(description = "订单ID") String orderId
    ) {
        return orderService.findStatus(orderId);
    }
}

@Action(description = "取消订单")
public class CancelOrderAction {
    
    private final OrderService orderService;
    
    @ActionMethod
    public Order execute(
        @Parameter(description = "订单ID") String orderId,
        @Parameter(description = "取消原因") String reason
    ) {
        return orderService.cancel(orderId, reason);
    }
}

5.3 定义Agent

kotlin 复制代码
import com.embabel.agent.api.Agent
import com.embabel.agent.api.Goal

@Agent(
    name = "订单管理助手",
    description = "帮助用户查询和管理订单"
)
class OrderManagementAgent(
    private val getStatusAction: GetOrderStatusAction,
    private val cancelAction: CancelOrderAction
) {
    @Goal
    fun handleOrderRequest(
        @Parameter(description = "用户指令") instruction: String
    ): String {
        // GOAP引擎会自动规划:分析指令 → 选择Action → 执行 → 返回结果
        // 不需要手动写 if-else 或流程控制
        return agent.planAndExecute(instruction)
    }
}

5.4 启动应用

kotlin 复制代码
@SpringBootApplication
class Application

fun main(args: Array<String>) {
    runApplication<Application>(*args)
}

这段代码的精髓 :你没有写任何流程控制代码(if-else、switch、for循环),没有指定"先执行A再执行B"。你只是定义了有哪些Action可用最终目标是什么,GOAP引擎自动规划出最优行动序列。

每个Action可以是一段纯代码逻辑(零LLM调用),也可以由一小段Prompt驱动。这种设计让开发者可以精确控制哪些环节用AI、哪些环节用确定性代码

六、Embabel vs Spring AI:本质区别

我把Embabel和Spring AI放在一起做了个深度对比:

对比维度 Embabel Spring AI
核心定位 企业Agent编程模型 AI模型集成框架
规划方式 GOAP算法(确定性、不用LLM) 开发者手动编排ReAct循环
规划Token消耗 0 Token(规划不用LLM) 每次规划都调用LLM
类型安全 ✅ 强类型领域对象 ✅ 强类型
可审计性 ✅ 规划过程可解释、可追溯 ⚠️ 取决于实现
开发者体验 声明式(定义Action和Goal,GOAP自动规划) 命令式(自己写循环)
LLM调用量 仅Action内部按需调用 每次决策都调用
开源协议 Apache 2.0 Apache 2.0

Embabel和Spring AI的本质区别在于:谁来做决策?

  • Spring AI :开发者手动编排ReAct循环------写一个prompt、调用tool、再写一个prompt、再调用tool。决策逻辑在开发者的代码里,每一步怎么走是写死的
  • Embabel :开发者定义Action和Goal,GOAP引擎在运行时动态计算 最优路径。决策逻辑在算法里,每一步怎么走是动态计算的

这导致了一个根本性的差异

在Spring AI里,如果你需要Agent做三件事(查库存、计算价格、生成报告),你必须在代码里明确写出执行顺序。如果某个环节失败,你需要自己写重试逻辑。

在Embabel里,你只需要定义三个Action和最终目标,GOAP引擎根据当前状态动态决定先做哪个、后做哪个、失败了怎么办。

Rod Johnson自己的话说得很直白:"你可以在Java中构建比Python更好的Agent"。

七、性能与成本数据

Embabel在成本和性能上的优势有明确的数据支撑

优化点 效果
GOAP规划器(不用LLM) 直接砍掉40-60%的LLM调用
强类型Domain Model精确契约 节省20-40%的Token消耗
整体成本优化 50-70%的总体降本空间

为什么强类型Domain Model能省Token?

传统AI Agent用自然语言或dict传递上下文,每次传给LLM的上下文会恶性循环式膨胀

Embabel用精确的输入输出契约取代自然语言上下文,杜绝了Token的无效消耗。

2026年7月20日,Embabel正式发布1.0.0 GA版本

一个框架进入GA,意味着它已经经过了足够的生产验证,API稳定性有了保障。

八、优缺点

优点

1. GOAP确定性规划,可解释、可审计

GOAP规划器完全不用LLM,决策过程可追溯、可解释。对企业来说,这意味着合规和审计不再是问题

2. 成本优势显著

GOAP规划不用LLM,直接砍掉40-60%的LLM调用 ;强类型Domain Model精确契约节省20-40%的Token消耗 。总体成本优化空间50-70%

3. 类型安全,编译时检查

所有LLM交互都是强类型的,IDE能提供完整的代码补全和重构支持。

4. 与Spring生态无缝集成

基于Spring Boot构建,Java/Kotlin开发者零学习成本接入。

5. 避免LLM"过度设计"

GOAP规划最大限度地减少了不必要的LLM调用,提升了效率和成本控制。

6. 可扩展性强

可以在不修改现有代码的情况下添加新的Action、目标、条件和领域对象。

缺点

1. 项目相对年轻

Embabel 1.0 GA于2026年7月才发布,生态和社区还在早期阶段。

2. 核心用Kotlin编写

虽然Java完全兼容,但阅读框架源码需要理解Kotlin语法。

3. 学习曲线

GOAP、Utility AI等概念对大多数Java开发者来说是全新的。

4. 文档尚在完善中

作为新项目,文档和示例正在逐步完善。

5. 与Python生态的差距

虽然Rod Johnson的目标是"不仅追上Python生态,还要超越",但目前Python AI生态的成熟度仍然领先。

九、适用场景

场景 推荐程度 理由
企业级AI Agent ✅✅✅ 强烈推荐 可解释、可审计、成本可控
已有Spring Boot技术栈 ✅✅✅ 强烈推荐 零学习成本接入
金融/合规/审计场景 ✅✅✅ 强烈推荐 GOAP确定性规划,每条决策都可追溯
多步复杂任务自动化 ✅✅✅ 强烈推荐 GOAP自动规划最优路径
传统企业系统AI赋能 ✅✅✅ 强烈推荐 不需要重写技术栈
RAG知识库问答 ✅✅ 推荐 Stashbot等官方示例
高成本敏感场景 ✅✅✅ 强烈推荐 直接砍掉40-60%的LLM调用
快速原型验证 ⚠️ 可能偏重 Spring AI可能更轻量

12个项目实战在Java突击队网:susan.net.cn/project

十、写在最后

回到最初的问题:Spring之父再次出山,开发的AI框架到底是什么?

Embabel不是又一个"调用大模型的库"

它是一个企业级Agent编程模型,试图回答一个核心问题:

怎么让非确定性的AI,在确定性的企业系统里稳定工作?

它的答案是:

  • 用GOAP算法提供确定性的规划------规划不用LLM,直接砍掉40-60%的调用
  • 用强类型系统提供编译时安全------精确契约节省20-40%的Token消耗
  • 用Spring生态提供企业级集成------基于Spring Boot,零学习成本
  • 用Apache 2.0协议提供商业友好------自由使用、修改、商用
  • 用1.0 GA提供生产级稳定性------2026年7月20日正式GA

二十多年前,他写了一本书、做了一个框架,终结了EJB时代。

二十多年后,他带着Embabel回来了。

这一次,他想终结的,是"AI只能做Demo、上不了生产"的困局。

而且这一次,他手里多了一把Python生态没有的武器------GOAP确定性规划

当Python生态还在用"大量字符串、动态Graph、手写节点边"的方式堆叠Agent时,Embabel已经在用类型安全、成本可控、可审计可追溯的方式,把AI Agent真正带进了企业核心业务。

开源地址: