前言
最近这阵子,技术圈里有一个名字频繁出现在各种讨论中------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的工作流程是这样的:
- 明确当前状态和目标
- 根据所有可用的行动(Action)及其前置条件和效果
- 动态规划出从当前状态到目标的最优行动序列
- 每执行一步,根据新的状态重新规划
这就好比你在用导航软件------不是出发前规划好全程就再也不变了,而是每到一个路口,根据实时路况重新计算接下来的路线。
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真正带进了企业核心业务。
开源地址: