掘金 人工智能 前天 15:30
joyagent智能体学习(第1期):项目概览与架构解析
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

JoyAgent-JDGenie项目旨在解决多智能体系统开发中的“最后一公里”问题,提供端到端、轻量化部署的完整解决方案。项目采用微服务架构,结合Java后端、Python客户端/工具层及React前端,支持ReAct模式与Plan-Execute模式的混合应用。其核心优势在于开箱即用的体验、高度可扩展的插件化设计,以及通过SSE实现流畅的实时交互。该项目在多智能体领域提供了不同于SDK、框架或闭源产品的全新选择,尤其在性能验证和部署灵活性上表现突出。

🎯 **解决多智能体开发“最后一公里”痛点**:JoyAgent-JDGenie定位为完整的多智能体产品,而非仅提供SDK或框架。它解决了开发门槛高、生态依赖性强、完整度不足等行业痛点,用户无需大量二次开发即可直接获得结果,实现端到端的产品体验,并支持本地化部署,确保数据可控,极大地降低了部署成本和时间。

🚀 **开箱即用与多格式交付**:项目提供直接可用的能力,用户输入简单指令(如“分析美元和黄金走势”)即可获得完整的分析报告,支持HTML网页、PowerPoint演示文稿、Markdown文档等多种格式交付,满足不同场景下的展示和分享需求,无需额外代码开发或配置。

🔧 **高度可扩展的架构设计**:JoyAgent-JDGenie采用插件化智能体系统和标准化接口协议,允许用户轻松挂载新的子智能体或工具,支持自定义智能体开发,工具生态也可无限扩展。通过兼容MCP(Model Context Protocol)标准,促进了第三方工具的集成,为系统的持续演进和功能丰富提供了坚实基础。

🔄 **融合ReAct与Plan-Execute模式**:项目创新性地结合了ReAct(思考-行动-观察)模式和Plan-Execute(规划-执行)模式。ReAct模式适用于需要动态调整策略的任务,而Plan-Execute模式则擅长处理复杂、长期的任务。这种多层级、多模式的思考方式,使得智能体能够更灵活、高效地应对各种挑战。

🐳 **现代化的技术栈与部署**:项目采用Java Spring Boot构建后端服务,React+TypeScript负责前端界面,Python生态支持工具层,并利用Docker进行容器化部署。这种技术选型兼顾了企业级成熟度、开发效率、AI生态优势及部署的便捷性与一致性,确保了系统的稳定性和可维护性。

本章导读: 深入解析JoyAgent-JDGenie项目的背景定位、技术架构和核心设计理念,为后续章节的深度学习打下坚实基础。


1.1 项目背景与定位

1.1.1 多智能体领域现状分析

当前市场格局

在AI技术快速发展的今天,多智能体系统已成为人工智能应用的重要发展方向。然而,当前市场上的解决方案存在明显的层次划分:

🔧 SDK/框架类产品

🏗️ 框架类产品

💡 完整产品类

行业痛点分析

    开发门槛高: 现有开源方案大多只提供基础框架,需要大量开发工作生态依赖性: 许多方案绑定特定云平台,限制了部署灵活性完整度不足: 缺乏端到端的完整解决方案性能验证缺失: 少有产品提供权威的性能基准测试

1.1.2 JoyAgent-JDGenie的核心价值主张

🎯 解决"最后一公里"问题

JoyAgent-JDGenie的核心使命是解决快速构建多智能体产品的最后一公里问题。具体体现在:

端到端完整性

轻量化部署

🏆 性能表现验证

在国际权威的GAIA榜单上,JoyAgent-JDGenie取得了优异成绩:

评测集JoyAgent-JDGenie行业对比
Validation集75.15%超越OWL、Smolagent、LRC-Huawei等
Test集65.12%达到行业先进水平

🔄 产品定位对比

graph TD    A[多智能体解决方案] --> B[SDK/框架类]    A --> C[完整产品类]        B --> D[SpringAI-Alibaba\n部分开源+平台依赖]    B --> E[Coze\n部分开源+平台依赖]    B --> F[Dify\n开源框架需二次开发]        C --> G[ChatGPT/Claude\n闭源商业产品]    C --> H[JoyAgent-JDGenie\n完全开源+开箱即用]        H --> I[端到端完整产品]    H --> J[无平台依赖]    H --> K[高性能验证]    H --> L[轻量化部署]

1.1.3 项目特色与技术优势

🚀 开箱即用的产品体验

直接可用的能力

多格式交付能力

🔧 高度可扩展的架构设计

插件化智能体系统

标准化接口协议


1.2 整体技术架构

1.2.1 微服务架构设计

JoyAgent-JDGenie采用现代化的微服务架构,将系统分解为四个独立但协作的核心模块:

graph TB    subgraph "用户层"        UI[React前端界面\nui]    end        subgraph "服务层"        Backend[Java后端服务\ngenie-backend]        Client[Python客户端\ngenie-client]        Tool[Python工具服务\ngenie-tool]    end        subgraph "外部服务"        LLM[大语言模型\nOpenAI/DeepSeek/...]        MCP[MCP工具生态\n第三方工具]    end        UI -->|HTTP/SSE| Backend    Backend -->|HTTP| Client    Client -->|HTTP| Tool    Backend -->|API| LLM    Tool -->|Protocol| MCP        style UI fill:#e1f5fe    style Backend fill:#f3e5f5    style Client fill:#e8f5e8    style Tool fill:#fff3e0

🏗️ 模块职责划分

1. genie-backend (Java后端服务)

2. genie-client (Python客户端)

3. genie-tool (Python工具模块)

4. ui (React前端)

1.2.2 服务间通信机制

📡 通信协议选择

HTTP RESTful API

Server-Sent Events (SSE)

MCP (Model Context Protocol)

🔄 数据流转设计

sequenceDiagram    participant U as 用户    participant F as React前端    participant B as Java后端    participant C as Python客户端    participant T as Python工具    participant L as LLM服务        U->>F: 输入查询    F->>B: HTTP请求    B->>L: 调用LLM    L->>B: 返回工具调用    B->>C: 工具执行请求    C->>T: 具体工具调用    T->>C: 工具执行结果    C->>B: 返回结果    B->>F: SSE推送进展    F->>U: 实时显示

1.2.3 技术栈选型分析

🎯 后端技术选择:Java + Spring Boot

选择Java的考量

Spring Boot的优势

🎨 前端技术选择:React + TypeScript

React生态的优势

TypeScript的价值

🐍 工具层技术选择:Python生态

Python的天然优势

关键库选择

🐳 部署技术选择:Docker容器化

容器化的优势

多阶段构建策略

# 前端构建阶段FROM node:20-alpine as frontend-builderWORKDIR /appRUN npm install -g pnpmCOPY ui/package.json ./COPY ui/ .RUN pnpm build# 后端构建阶段  FROM maven:3.8-openjdk-17 as backend-builderWORKDIR /appCOPY genie-backend/pom.xml .COPY genie-backend/src ./srcCOPY genie-backend/build.sh ./RUN chmod +x build.sh && ./build.sh# 最终运行阶段FROM python:3.11-slimWORKDIR /app# 安装系统依赖RUN apt-get update && apt-get install -y --no-install-recommends \    openjdk-17-jre-headless \    netcat-openbsd \    nodejs \    npm \    && npm install -g pnpm# 复制前端构建产物COPY --from=frontend-builder /app/dist /app/ui/dist# 复制后端构建产物COPY --from=backend-builder /app/target /app/backend/target# 复制和配置Python服务COPY genie-client/ /app/client/COPY genie-tool/ /app/tool/EXPOSE 3000 8080 1601CMD ["./start_genie.sh"]

1.3 核心概念与术语

1.3.1 多智能体系统基础概念

🤖 智能体 (Agent)

定义: 智能体是能够感知环境、做出决策并执行行动的自主实体。

JoyAgent-JDGenie中的智能体类型:

// 智能体基础类 - 管理代理状态和执行的基础类@Slf4j@Data@Accessors(chain = true)public abstract class BaseAgent {    // 核心属性    private String name;    private String description;    private String systemPrompt;    private String nextStepPrompt;    public ToolCollection availableTools = new ToolCollection();    private Memory memory = new Memory();    protected LLM llm;    protected AgentContext context;    // 执行控制    private AgentState state = AgentState.IDLE;    private int maxSteps = 10;    private int currentStep = 0;    private int duplicateThreshold = 2;    // emitter    Printer printer;    // digital employee prompt    private String digitalEmployeePrompt;    /**     * 执行单个步骤     */    public abstract String step();        /**     * 运行代理主循环     */    public String run(String query) {        setState(AgentState.IDLE);        // 实现省略...    }}

核心智能体类型:

🔧 工具 (Tool)

定义: 工具是智能体用来与外部环境交互或执行特定功能的接口。

// 工具基础接口public interface BaseTool {    String getName();                    // 工具名称    String getDescription();             // 工具描述    Map<String, Object> toParams();      // 参数定义    Object execute(Object input);        // 执行逻辑}

核心工具分类:

🧠 上下文 (Context)

定义: 上下文是智能体运行时的环境信息,包括任务状态、历史记录、可用资源等。

// 智能体上下文@Data@Builder@Slf4j@NoArgsConstructor@AllArgsConstructorpublic class AgentContext {    String requestId;    String sessionId;    String query;    String task;    Printer printer;    ToolCollection toolCollection;    String dateInfo;    List<File> productFiles;    Boolean isStream;    String streamMessageType;    String sopPrompt;    String basePrompt;    Integer agentType;    List<File> taskProductFiles;}

1.3.2 ReAct模式 vs Plan-Execute模式

🔄 ReAct模式 (Reasoning and Acting)

核心理念: 将推理(Reasoning)和行动(Acting)结合,通过观察(Observation)形成闭环。

执行流程:

graph LR    T[Think 思考] --> A[Act 行动]    A --> O[Observe 观察]    O --> T    O --> D[Done 完成]

适用场景:

ReactImplAgent在JoyAgent-JDGenie中的实现:

@Overridepublic boolean think() {    // 获取文件内容    String filesStr = FileUtil.formatFileInfo(context.getProductFiles(), true);    setSystemPrompt(getSystemPromptSnapshot().replace("{{files}}", filesStr));    setNextStepPrompt(getNextStepPromptSnapshot().replace("{{files}}", filesStr));    if (!getMemory().getLastMessage().getRole().equals(RoleType.USER)) {        Message userMsg = Message.userMessage(getNextStepPrompt(), null);        getMemory().addMessage(userMsg);    }    try {        // 获取带工具选项的响应        context.setStreamMessageType("tool_thought");        CompletableFuture<LLM.ToolCallResponse> future = getLlm().askTool(                context,                getMemory().getMessages(),                Message.systemMessage(getSystemPrompt(), null),                availableTools,                ToolChoice.AUTO, null, context.getIsStream(), 300        );        LLM.ToolCallResponse response = future.get();        setToolCalls(response.getToolCalls());        // 记录响应信息        if (!context.getIsStream() && response.getContent() != null && !response.getContent().isEmpty()) {            printer.send("tool_thought", response.getContent());        }        // 创建并添加助手消息        Message assistantMsg = response.getToolCalls() != null && !response.getToolCalls().isEmpty() && !"struct_parse".equals(llm.getFunctionCallType()) ?                Message.fromToolCalls(response.getContent(), response.getToolCalls()) :                Message.assistantMessage(response.getContent(), null);        getMemory().addMessage(assistantMsg);    } catch (Exception e) {        log.error("{} react think error", context.getRequestId(), e);        getMemory().addMessage(Message.assistantMessage(                "Error encountered while processing: " + e.getMessage(), null));        setState(AgentState.FINISHED);        return false;    }    return true;}

📋 Plan-Execute模式

核心理念: 先制定完整计划,再按计划逐步执行。

执行流程:

graph TD    P[Plan 制定计划] --> E1[Execute 执行任务1]    E1 --> E2[Execute 执行任务2]    E2 --> E3[Execute 执行任务3]    E3 --> S[Summary 总结结果]

适用场景:

PlanningAgent在JoyAgent-JDGenie中的实现:

// 规划代理 - 创建和管理任务计划的代理@Slf4j@Data@EqualsAndHashCode(callSuper = true)public class PlanningAgent extends ReActAgent {        private List<ToolCall> toolCalls;    private Integer maxObserve;    private PlanningTool planningTool = new PlanningTool();    private Boolean isColseUpdate;    private String systemPromptSnapshot;    private String nextStepPromptSnapshot;    private String planId;    public PlanningAgent(AgentContext context) {        setName("planning");        setDescription("An agent that creates and manages plans to solve tasks");        ApplicationContext applicationContext = SpringContextHolder.getApplicationContext();        GenieConfig genieConfig = applicationContext.getBean(GenieConfig.class);        StringBuilder toolPrompt = new StringBuilder();        for (BaseTool tool : context.getToolCollection().getToolMap().values()) {            toolPrompt.append(String.format("工具名:%s 工具描述:%s\n", tool.getName(), tool.getDescription()));        }        String promptKey = "default";        String nextPromptKey = "default";        setSystemPrompt(genieConfig.getPlannerSystemPromptMap().getOrDefault(promptKey, PlanningPrompt.SYSTEM_PROMPT)                .replace("{{tools}}", toolPrompt.toString())                .replace("{{query}}", context.getQuery())                .replace("{{date}}", context.getDateInfo())                .replace("{{sopPrompt}}", context.getSopPrompt()));        setNextStepPrompt(genieConfig.getPlannerNextStepPromptMap().getOrDefault(nextPromptKey, PlanningPrompt.NEXT_STEP_PROMPT)                .replace("{{tools}}", toolPrompt.toString())                .replace("{{query}}", context.getQuery())                .replace("{{date}}", context.getDateInfo())                .replace("{{sopPrompt}}", context.getSopPrompt()));        setSystemPromptSnapshot(getSystemPrompt());        setNextStepPromptSnapshot(getNextStepPrompt());        setPrinter(context.printer);        setMaxSteps(genieConfig.getPlannerMaxSteps());        setLlm(new LLM(genieConfig.getPlannerModelName(), ""));        setContext(context);        setIsColseUpdate("1".equals(genieConfig.getPlanningCloseUpdate()));        // 初始化工具集合        availableTools.addTool(planningTool);        planningTool.setAgentContext(context);    }}

🔀 Multi-level and Multi-pattern思考

JoyAgent-JDGenie的创新在于结合了两种模式:

Multi-level (多层级):

Multi-pattern (多模式):

1.3.3 工具调用与函数执行机制

🔧 工具调用流程

标准化调用接口:

// 工具调用类@Data@NoArgsConstructor@AllArgsConstructor@Builderpublic class ToolCall {    private String id;    private String type;    private Function function;    /**     * 函数信息类     */    @Data    @NoArgsConstructor    @AllArgsConstructor    @Builder    public static class Function {        private String name;        private String arguments;    }}

执行流程:

sequenceDiagram    participant A as Agent    participant T as ToolManager    participant C as CodeInterpreter    participant S as SearchTool        A->>T: 工具调用请求    T->>T: 解析工具名称和参数    alt 代码执行        T->>C: 执行Python代码        C->>T: 返回执行结果    else 搜索请求        T->>S: 执行搜索查询        S->>T: 返回搜索结果    end    T->>A: 统一格式结果

🛡️ 安全执行机制

代码执行安全:

网络访问控制:

1.3.4 流式输出与实时交互

📡 Server-Sent Events (SSE)

技术原理: SSE是HTML5标准的一部分,允许服务器向客户端推送数据。

在JoyAgent-JDGenie中的应用:

/** * 执行智能体调度 * @param request * @return * @throws UnsupportedEncodingException */@PostMapping("/AutoAgent")public SseEmitter AutoAgent(@RequestBody AgentRequest request) throws UnsupportedEncodingException {    log.info("{} auto agent request: {}", request.getRequestId(), JSON.toJSONString(request));    Long AUTO_AGENT_SSE_TIMEOUT = 60 * 60 * 1000L;    SseEmitter emitter = new SseEmitter(AUTO_AGENT_SSE_TIMEOUT);    // SSE心跳    ScheduledFuture<?> heartbeatFuture = startHeartbeat(emitter, request.getRequestId());    // 监听SSE事件    registerSSEMonitor(emitter, request.getRequestId(), heartbeatFuture);    // 拼接输出类型    request.setQuery(handleOutputStyle(request));    // 执行调度引擎    ThreadUtil.execute(() -> {        try {            Printer printer = new SSEPrinter(emitter, request, request.getAgentType());            AgentContext agentContext = AgentContext.builder()                    .requestId(request.getRequestId())                    .sessionId(request.getRequestId())                    .printer(printer)                    .query(request.getQuery())                    .task("")                    .dateInfo(DateUtil.CurrentDateInfo())                    .productFiles(new ArrayList<>())                    .taskProductFiles(new ArrayList<>())                    .sopPrompt(request.getSopPrompt())                    .basePrompt(request.getBasePrompt())                    .agentType(request.getAgentType())                    .isStream(Objects.nonNull(request.getIsStream()) ? request.getIsStream() : false)                    .build();            // 构建工具列表            agentContext.setToolCollection(buildToolCollection(agentContext, request));            // 根据数据类型获取对应的处理器            AgentHandlerService handler = agentHandlerFactory.getHandler(agentContext, request);            // 执行处理逻辑            handler.handle(agentContext, request);            // 关闭连接            emitter.complete();        } catch (Exception e) {            log.error("{} auto agent error", request.getRequestId(), e);            emitter.completeWithError(e);        }    });        return emitter;}

流式输出的优势:

💬 实时交互设计

前端流式渲染:

// SSE配置接口interface SSEConfig {  body: any;  handleMessage: (data: any) => void;  handleClose: () => void;}// 创建服务器发送事件(SSE)连接export default (config: SSEConfig, url: string = DEFAULT_SSE_URL): void => {  const { body = null, handleMessage, handleError, handleClose } = config;  fetchEventSource(url, {    method: 'POST',    credentials: 'include',    headers: {      'Content-Type': 'application/json',      'Cache-Control': 'no-cache',      'Connection': 'keep-alive',      'Accept': 'text/event-stream',    },    body: JSON.stringify(body),    openWhenHidden: true,    onmessage(event: EventSourceMessage) {      if (event.data) {        try {          const parsedData = JSON.parse(event.data);          handleMessage(parsedData);        } catch (error) {          console.error('Error parsing SSE message:', error);          handleError(new Error('Failed to parse SSE message'));        }      }    },    onerror(error: Error) {      console.error('SSE error:', error);      handleError(error);    },    onclose() {      console.log('SSE connection closed');      handleClose();    }  });};// 在React组件中的使用const sendMessage = useMemoizedFn((inputInfo: CHAT.TInputInfo) => {  const {message, deepThink, outputStyle} = inputInfo;  const requestId = getUniqId();  let currentChat = combineCurrentChat(inputInfo, sessionId, requestId);  chatList.current =  [...chatList.current, currentChat];    setLoading(true);  const params = {    sessionId: sessionId,    requestId: requestId,    query: message,    deepThink: deepThink ? 1 : 0,    outputStyle  };    const handleMessage = (data: MESSAGE.Answer) => {    const { finished, resultMap, packageType, status } = data;    if (packageType !== "heartbeat") {      requestAnimationFrame(() => {        if (resultMap?.eventData) {          currentChat = combineData(resultMap.eventData || {}, currentChat);          const taskData = handleTaskData(currentChat, deepThink, currentChat.multiAgent);          setTaskList(taskData.taskList);          updatePlan(taskData.plan!);                    if (finished) {            currentChat.loading = false;            setLoading(false);          }                    const newChatList = [...chatList.current];          newChatList.splice(newChatList.length - 1, 1, currentChat);          chatList.current = newChatList;        }      });    }  };    // 调用SSE连接  querySSE({    body: params,    handleMessage: handleMessage,    handleClose: () => {      setLoading(false);    }  });});

消息类型定义:


本章小结

通过本章的深入分析,我们全面了解了JoyAgent-JDGenie项目的核心价值和技术架构:

🎯 核心价值

🏗️ 架构优势

🧠 设计理念

下一章我们将深入探讨智能体的核心设计模式,详细分析每种智能体的实现原理和协作机制。

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

JoyAgent-JDGenie 多智能体 AI Agent ReAct模式 微服务架构
相关文章