目录

一、背景与问题域

1、为什么需要“Java 原生”AI 框架?

2、JManus 的定位:把“多智能体”做成 Spring Bean

二、核心概念模型

1、LLM 三元组

2、Tool 三元组

3、Agent 三元组

4、Workflow 三元组

三、架构详解

1、模块依赖图

2、线程模型

3、状态机

4、MCP(Manus Communication Protocol)

四、快速开始

1 、环境准备

2、项目骨架

3、引入 BOM

4、声明 ChatClient

5、第一个单 Agent

五、深度实战:订单退款机器人

1、需求拆解

2、定义 Tool

3、定义 Agent

4、编排工作流

5、REST 入口

六、可观测性

1、指标

2、Tracing

3、日志

七、性能调优

1、Token 优化

2、并发模型

3、JVM 参数

八、高可用与弹性

1、多活架构

2、断点续跑

3、灰度发布

九、多租户与权限

1、租户隔离

2、工具权限

十、常见坑与规避

十一、Roadmap

十二、总结

附录 A:参考链接

附录 B:一键部署 Helm Chart


一、背景与问题域

1、为什么需要“Java 原生”AI 框架?

  • 语言生态壁垒:Python 生态虽成熟,但企业 70 % 的微服务、网关、消息总线仍跑在 Java/Spring 体系。
  • 治理一致性:熔断、限流、灰度、链路追踪、配置中心、服务网格都是 Java 侧现成的。重写意味着双倍成本。
  • 工程团队经验:大量 CRUD 工程师熟悉 Spring Boot,却缺乏 Python AI 工程能力。

Spring AI Alibaba(下文简称 SAA)应运而生:
“让 Java 工程师用三天时间,把 LLM 能力接入现有 Spring Cloud 体系,而不需要换语言、换协议、换监控。”

2、JManus 的定位:把“多智能体”做成 Spring Bean

OpenManus(Python)已证明:

  • 多 Agent 协作可将复杂任务端到端成功率提升 4–6 倍;
  • 但 Python 长进程 + 单线程 + 无状态,难以水平扩展。

JManus 用 Java 改写,核心目标:

维度 目标值
单 Pod 并发 10 k req/s
水平扩展 无状态,秒级弹性
故障恢复 断点续跑,幂等重试
监控粒度 每个 Task 的 Token/Latency/异常

二、核心概念模型

1、LLM 三元组

SAA 把一次 LLM 调用抽象为:
PromptTemplate → ChatClient → ChatResponse

  • PromptTemplate:支持 SpEL、嵌套子模板、占位符验证。
  • ChatClient:统一接口屏蔽 OpenAI、通义、DeepSeek、Bedrock。
  • ChatResponse:包含 Generation 列表 + Usage 计量 + RateLimit 元数据。

2、Tool 三元组

ToolDefinition → ToolExecutor → ToolCallback

  • ToolDefinition:JSON Schema 描述输入/输出,自动生成 Swagger/OpenAPI。
  • ToolExecutor:线程池隔离,防止外部 API 拖死 LLM 线程。
  • ToolCallback:支持重试、熔断、Mock、缓存。

3、Agent 三元组

SystemPrompt → Tools → State

  • SystemPrompt:支持多语言、版本化、热更新(Spring Cloud Bus)。
  • Tools:运行时动态装配,按租户/灰度/特性开关注入。
  • State:KV 存储,Redis / Mongo / PostgreSQL 插件化。

4、Workflow 三元组

StateGraph → Node → Edge

  • StateGraph:有向图,支持 DAG 与循环。
  • Node:Agent 或函数。
  • Edge:条件表达式(SpEL + Groovy)。

三、架构详解

1、模块依赖图

spring-ai-alibaba
 ├─ spring-ai-core
 ├─ spring-ai-chat
 ├─ spring-ai-vector-store
 ├─ spring-ai-observability
 └─ jmanus
     ├─ jmanus-engine
     ├─ jmanus-planner
     ├─ jmanus-memory
     └─ jmanus-mcp

2、线程模型

  • Boss 线程:Netty EventLoop,负责 IO。
  • Worker 线程:Virtual Thread(JDK21),1 MB 栈 → 10 k 并发。
  • Tool 线程池:ThreadPoolTaskExecutor,隔离外部调用。
  • LLM 线程池:Semaphore 限流,防止 Token 爆炸。

3、状态机

使用 Spring Statemachine 3.x:

enum States  { PLANNING, EXECUTING, WAITING, COMPLETED, FAILED }
enum Events  { TASK_CREATED, TOOL_RETURN, ERROR, TIMEOUT }

状态快照持久化到 Redis Stream(XADD workflow:{id}),支持断点续跑。

4、MCP(Manus Communication Protocol)

  • 传输层:gRPC + Protobuf。
  • 鉴权:mTLS + JWT。
  • 插件:官方已提供 30+ 实现(钉钉、飞书、支付宝、OSS、Kafka、MySQL…)。

示例声明:

mcp:
  clients:
    dingtalk:
      endpoint: dingtalk-mcp.default.svc.cluster.local:9000
      auth:
        type: hmac-sha256
        secret: ${DING_SECRET}

四、快速开始

1 、环境准备

  • JDK 17+

  • Spring Boot 3.2+

  • Redis 7+(带 Stream)

  • Kubernetes(可选,HPA 弹性)

2、项目骨架

spring init \
  --dependencies=web,data-redis,actuator \
  --groupId=com.example \
  --artifactId=order-bot \
  order-bot
cd order-bot

3、引入 BOM

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-ai-alibaba-dependencies</artifactId>
      <version>1.2.0</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

4、声明 ChatClient

spring:
  ai:
    tongyi:
      api-key: ${ALI_API_KEY}
      chat:
        options:
          model: qwen-max
          temperature: 0.3
          max-tokens: 2048

5、第一个单 Agent

@RestController
@RequiredArgsConstructor
public class HelloController {
    private final ChatClient chatClient;

    @GetMapping("/chat")
    public String chat(@RequestParam String q) {
        return chatClient.prompt()
                .user(q)
                .call()
                .content();
    }
}

五、深度实战:订单退款机器人

1、需求拆解

角色 任务
用户 “我要退昨天的订单”
Planner 1. 识别意图 → 2. 查询订单 → 3. 校验规则 → 4. 调用退款接口 → 5. 通知用户
RefundAgent 执行步骤 4
NotifyAgent 执行步骤 5

2、定义 Tool

@Component
public class OrderTool implements ToolCallback<OrderRequest, OrderResponse> {
    @Override
    public String getName() { return "orderQuery"; }

    @Override
    public String getDescription() {
        return "根据订单号查询订单,返回金额、状态、物流信息";
    }

    @Override
    public OrderResponse call(OrderRequest req) {
        return restTemplate.getForObject(
            "http://order-svc/orders/{id}", OrderResponse.class, req.id());
    }
}

3、定义 Agent

@Bean
public Agent refundAgent(ChatClient chatClient, List<ToolCallback> tools) {
    return Agent.builder()
        .name("refundAgent")
        .system("""
            你是退款助手。请遵循:
            1. 金额>100元需主管审批
            2. 必须输出 JSON {"action":"refund","amount":99}
            """)
        .tools(tools)
        .chatClient(chatClient)
        .build();
}

4、编排工作流

@Configuration
public class WorkflowConfig {

    @Bean
    public StateGraph refundWorkflow(Agent classifyAgent,
                                     Agent refundAgent,
                                     Agent notifyAgent) {
        return StateGraph.of("refundWorkflow")
            .node("classify", classifyAgent)
            .node("refund", refundAgent)
            .node("notify", notifyAgent)
            .edge(START, "classify")
            .conditional("classify",
                ctx -> ctx.get("intent").equals("refund") ? "refund" : "notify")
            .edge("refund", "notify")
            .edge("notify", END);
    }
}

5、REST 入口

@RestController
@RequiredArgsConstructor
public class RefundController {
    private final ManusEngine engine;

    @PostMapping("/refund")
    public String refund(@RequestBody Map<String, Object> payload) {
        return engine.start("refundWorkflow", payload).block();
    }
}

六、可观测性

1、指标

名称 含义
jmanus_agent_latency_seconds 每个 Agent 的 P99 延迟
jmanus_token_total 按模型、租户、Agent 维度
jmanus_workflow_failures_total 失败原因标签化

Grafana 大盘 JSON 已内置,导入 ID 18686

2、Tracing

  • OpenTelemetry:自动透传 TraceId 到 LLM 调用。

  • Baggage:把租户 ID 带到 Tool 调用,方便灰度。

3、日志

  • Logback Encoder:JSON 格式,字段包括 workflowIdagentNametokenUsage

  • Loki:Grafana 直接索引。


七、性能调优

1、Token 优化

  • Prompt 压缩:滑动窗口 + 摘要,减少 30 % Token。

  • 模型分级:简单任务 qwen-1.5b,复杂推理 qwen-max。

  • 缓存:相同问题 Redis 缓存 TTL 10 min。

2、并发模型

场景 建议
CPU 密集 Virtual Thread 数量 ≈ CPU × 2
IO 密集 Virtual Thread 数量 = 10 k
LLM 调用 限流 semaphore = 100

3、JVM 参数

-XX:+UseZGC
-XX:MaxGCPauseMillis=20
-Djdk.virtualThreadScheduler.parallelism=256

八、高可用与弹性

1、多活架构

  • 双集群:北京 + 上海

  • Redis 跨地域同步:阿里 DTS

  • 模型网关:就近路由(华北调用北京节点)

2、断点续跑

  • 快照:每 30 s 写入 Redis Stream

  • 故障:Pod Crash 后,新 Pod 读取 Stream 恢复

  • 幂等:TaskId + 幂等 Token

3、灰度发布

  • Spring Cloud LoadBalancer 权重

  • 模型灰度:10 % 流量 → 新模型

  • 回滚:修改 ConfigMap,30 s 生效


九、多租户与权限

1、租户隔离

  • 逻辑:Redis key 前缀 tenant:{id}:workflow:{wfId}

  • 资源:HPA 按租户打标签,独立扩缩容

2、工具权限

  • MCP 鉴权:JWT + Scope

  • 白名单:每个租户可使用的 Tool 列表动态下发


十、常见坑与规避

问题 现象 解决
Token 超限 502 from LLM Prompt 压缩 + 模型升级
Tool 超时 99th 延迟飙高 线程池隔离 + 熔断
状态膨胀 Redis 内存暴涨 快照 TTL + 压缩
版本漂移 线上结果不一致 锁定 system prompt 版本

十一、Roadmap

  • 2025 Q3:支持 Function Calling V2(并行工具调用)

  • 2025 Q4:Workflow DSL 图形化编辑器(VS Code 插件)

  • 2026 Q1:Serverless 模式,Pod 冷启动 < 300 ms


十二、总结

Spring AI Alibaba + JManus 提供了:

  1. Java 工程师最熟悉的编程模型(Bean、注解、配置中心)。

  2. 面向生产的可观测、弹性、灰度、多租户。

  3. 与现有 Spring Cloud 网关、配置、注册中心无侵入集成。

一句话:“用写 CRUD 的心智,写 AI 时代的复杂 Agent 系统。”


附录 A:参考链接

附录 B:一键部署 Helm Chart

helm repo add spring-ai https://charts.spring-ai-alibaba.io
helm install jmanus-demo spring-ai/jmanus \
  --set image.tag=1.2.0 \
  --set redis.enabled=true \
  --set autoscaling.enabled=true

 🫡🫡🫡

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐