Spring AI Alibaba 与 JManus 入门指南
1. Spring AI Alibaba 介绍
背景
Spring AI Alibaba 是由阿里云基于 Spring AI 框架开发的一个开源 AI 应用开发框架,专为 Java 开发者设计。它深度集成了阿里云通义系列模型和百炼平台,旨在帮助开发者快速构建智能化的企业级 AI 应用。它的核心优势包括:
核心功能
- 统一接口:通过抽象化的 API,支持与多种 AI 模型(如通义千问 Qwen-2.5)无缝切换。
- 云原生集成:支持阿里云的百炼平台、ARMS 可观测性工具、Nacos MCP 注册中心等,提供从开发到生产的全链路解决方案。
- 多功能支持:包括聊天机器人、工作流、多智能体应用、RAG(检索增强生成)等功能。
- 低代码/高代码/零代码:通过 JManus 和 DeepResearch 等产品,支持灵活的开发方式。
适用场景
- 构建聊天机器人(如客服助手)。
- 开发智能工作流(如自动化文档处理)。
- 实现 RAG 驱动的知识管理系统。
- 支持企业级 AI 应用的快速部署。
2. JManus 介绍**
JManus 是基于 Spring AI Alibaba 开发的通用智能体平台,灵感来源于 OpenManus,专为构建任务驱动的 AI 智能体而设计。它不仅是一个智能体实现,还提供了一个开发平台,允许开发者创建定制化的、面向特定业务场景的智能体。
背景
- JManus 诞生于阿里云对多智能体系统(Multi-Agent Systems)的探索,目标是让 AI 智能体能够自主规划和执行复杂任务。
- 它利用 Spring AI Alibaba 的 Graph 框架,结合 ReAct(Reasoning + Acting)架构,适合企业级场景,如自动化客服、数据分析、行程规划等。
- JManus 支持从代码开发到低代码/零代码的开发方式,适合不同技术水平的开发者。
核心功能
- 任务规划:通过 Planning Agent 自动分解复杂任务,生成可执行的工作流。
- 工具调用:支持 Web 搜索、Python 脚本、外部 API 等工具,增强智能体的能力。
- 企业级确定性:通过定制化子智能体和工具,确保业务逻辑的稳定性。
- 可视化调试:结合 Dify DSL,提供工作流的可视化编辑和调试。
适用场景
- 自动化业务流程(如自动生成行程规划)。
- 智能数据处理(如从 Web 提取信息并生成报告)。
- 复杂任务的协同处理(如多部门协作的智能助手)。
3. 技术解析
`Spring AI Alibaba 的核心架构围绕 ChatClient 和 Graph 抽象,结合云原生基础设施,提供了强大的 AI 应用开发能力。以下是主要技术点的解析:
Spring AI Alibaba 技术架构
- ChatClient:核心接口,用于与大语言模型交互,支持对话、函数调用、流式输出等。
示例:调用通义千问模型回答用户问题。
- Graph 框架:支持多智能体协作和复杂工作流,基于 Dify DSL(领域特定语言)定义任务逻辑。
示例:设计一个工作流,分解“规划旅行”任务为查询航班、酒店和景点。
- RAG 集成:通过百炼平台的向量数据库,实现数据增强生成。
示例:从企业文档中提取信息,生成精准回答。
- MCP(Model Context Protocol):统一模型与外部系统的交互方式,简化集成。
- 可观测性:通过 ARMS 和 OpenTelemetry,监控模型性能和运行状态。
JManus 技术亮点
- ReAct 架构:结合推理(Reasoning)和行动(Acting),让智能体自主规划和执行任务。
- 工具调用:支持多种工具(如 Python 脚本、Web 爬虫),增强智能体功能。
- 子智能体:每个子智能体负责特定任务,确保模块化开发。
- 可视化支持:通过 Dify 平台,提供工作流的可视化编辑和调试。
4.简单实现
ai-assistant/
├── pom.xml
├── src/
│ └── main/
│ ├── java/
│ │ └── com.example.ai/
│ │ ├── AiAssistantApplication.java
│ │ ├── controller/AiController.java
│ │ └── service/AiService.java
│ └── resources/
│ ├── application.yml
application.yml 配置
server:
port: 8080
spring:
ai:
alibaba:
qwen:
api-key: sk-xxx # 替换为你在阿里云申请的 Key
model: qwen-turbo # 模型名称
options:
temperature: 0.7
AiService.java
package com.example.ai.service;
import org.springframework.ai.chat.ChatClient;
import org.springframework.ai.chat.messages.ChatMessage;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.ChatResponse;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
public class AiService {
private final ChatClient chatClient;
// 保存简单上下文
private final List<ChatMessage> history = new ArrayList<>();
public AiService(ChatClient chatClient) {
this.chatClient = chatClient;
}
public String ask(String question) {
ChatMessage message = new UserMessage(question);
history.add(message);
ChatResponse response = chatClient.call(history);
String answer = response.getResult().getOutput();
// 记录 AI 回复到上下文
history.add(response.getResult().getOutputMessage());
return answer;
}
public void resetContext() {
history.clear();
}
}
AiController.java
package com.example.ai.controller;
import com.example.ai.service.AiService;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/ai")
public class AiController {
private final AiService aiService;
public AiController(AiService aiService) {
this.aiService = aiService;
}
@PostMapping("/ask")
public String ask(@RequestBody String question) {
return aiService.ask(question);
}
@PostMapping("/reset")
public String reset() {
aiService.resetContext();
return "上下文已清除";
}
}
使用示例
提问
curl -X POST http://localhost:8080/api/ai/ask -d "杭州西湖有多美?"
清楚上下文
curl -X POST http://localhost:8080/api/ai/reset