Skip to content

自主规划工作流详解 ​

本文档详细描述 AiChatbotAgent.createAutonomousPlanningGraph() 方法创建的自主规划工作流。 该流程实现类似 Claude Code / Manus 的自主规划能力。

工作流概览 ​

┌─────────────────────────────────────────────────────────────────────────────┐
│                         自主规划 (Autonomous Planning) 工作流                 │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│   START                                                                      │
│     │                                                                        │
│     ▼                                                                        │
│ ┌──────────────────┐                                                         │
│ │  load_config     │  加载Agent配置、LLM模型、子Agent、工具、知识库            │
│ └────────┬─────────┘                                                         │
│          │                                                                   │
│          ▼                                                                   │
│ ┌──────────────────┐                                                         │
│ │    planning      │  分析用户需求,生成任务执行计划                           │
│ └────────┬─────────┘                                                         │
│          │                                                                   │
│          ▼                                                                   │
│    ┌───────────────────┐                                                     │
│    │routeAfterPlanning │                                                     │
│    └─────────┬─────────┘                                                     │
│              │                                                               │
│     ┌────────┴────────┐                                                      │
│     │                 │                                                      │
│     ▼                 ▼                                                      │
│ ┌─────────────┐  ┌─────────────────┐                                         │
│ │final_response│  │ plan_execution  │◄──────────────────┐                    │
│ └──────┬──────┘  └────────┬────────┘                    │                    │
│        │                  │                             │                    │
│        │                  ▼                             │                    │
│        │        ┌───────────────────┐                   │                    │
│        │        │routeAfterExecution│                   │                    │
│        │        └─────────┬─────────┘                   │                    │
│        │                  │                             │                    │
│        │         ┌────────┴────────┐                    │                    │
│        │         │                 │                    │                    │
│        │         ▼                 │                    │                    │
│        │   ┌─────────────┐         │                    │                    │
│        │   │ reflection  │     execute_next_task        │                    │
│        │   └──────┬──────┘    (还有更多任务)            │                    │
│        │          │                                     │                    │
│        │          ▼                                     │                    │
│        │ ┌────────────────────┐                         │                    │
│        │ │routeAfterReflection│                         │                    │
│        │ └─────────┬──────────┘                         │                    │
│        │           │                                    │                    │
│        │    ┌──────┴──────┐                             │                    │
│        │    │             │                             │                    │
│        │    ▼             ▼                             │                    │
│        │ ┌────────┐  ┌─────────────┐                    │                    │
│        │ │planning│  │final_response│                   │                    │
│        │ │(重规划)│  └──────┬──────┘                    │                    │
│        │ └────┬───┘         │                           │                    │
│        │      │             │                           │                    │
│        │      └─────────────┼───────────────────────────┘                    │
│        │                    │                                                │
│        └────────────────────┴──────────────────► END                         │
│                                                                              │
└─────────────────────────────────────────────────────────────────────────────┘

核心设计理念 ​

Plan-Execute-Reflect 循环 ​

     ┌─────────────────────────────────────────────────────┐
     │                                                      │
     │    ┌──────────┐     ┌──────────┐     ┌──────────┐   │
     │    │          │     │          │     │          │   │
     └───►│  PLAN    ├────►│ EXECUTE  ├────►│ REFLECT  ├───┘
          │          │     │          │     │          │
          │ 制定计划  │     │ 执行任务  │     │ 评估结果  │
          │          │     │          │     │          │
          └──────────┘     └──────────┘     └──────────┘
                │                                │
                │                                │
                ▼                                ▼
           (无任务)                         (评估通过)
                │                                │
                └───────────► END ◄──────────────┘

节点详细说明 ​

1. load_config - 加载配置节点 ​

与标准 Chatbot 工作流相同,详见 chatbot-agent-workflow.md。

主要加载内容:

  • Agent 基础配置 (systemPrompt, userPrompt 等)
  • LLM 模型配置
  • 子 Agent 列表
  • 工具列表
  • 知识库配置

2. planning - 任务规划节点 ​

位置: PlanningNode.apply()

功能: 深度分析用户需求,自动生成结构化的任务执行计划。

┌─────────────────────────────────────────────────────────────────┐
│                       任务规划流程                               │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│   用户输入 (userInput)                                           │
│        │                                                         │
│        ▼                                                         │
│   ┌────────────────────┐                                         │
│   │ buildPlanningPrompt│  构建规划提示词                          │
│   └──────────┬─────────┘                                         │
│              │                                                   │
│              ▼                                                   │
│   ┌─────────────────────────────────────────┐                    │
│   │ 提示词内容:                              │                   │
│   │ - 用户输入                               │                   │
│   │ - 可用子Agent (ID/名称/描述)             │                   │
│   │ - 可用工具 (名称/描述/参数Schema)        │                   │
│   │ - 可用知识库数量                         │                   │
│   │ - JSON输出格式要求                       │                   │
│   │ - 规划原则                               │                   │
│   └──────────────────┬──────────────────────┘                    │
│                      │                                           │
│                      ▼                                           │
│   ┌────────────────────┐                                         │
│   │   调用 LLM 生成    │  支持流式/非流式                        │
│   │   任务计划         │  超时: 120秒                            │
│   └──────────┬─────────┘                                         │
│              │                                                   │
│              ▼                                                   │
│   ┌────────────────────┐                                         │
│   │parsePlanFromLlm    │  解析 JSON → TaskPlan                   │
│   │     Response       │                                         │
│   └──────────┬─────────┘                                         │
│              │                                                   │
│              ▼                                                   │
│   ┌────────────────────────────────────────┐                     │
│   │ TaskPlan                                │                    │
│   │ - planId: 计划唯一ID                    │                    │
│   │ - userIntent: 用户真实意图              │                    │
│   │ - intentAnalysis: 意图分析              │                    │
│   │ - summary: 计划概述                     │                    │
│   │ - complexity: 复杂度 (1-10)             │                    │
│   │ - steps: List<TaskStep>                │                    │
│   │ - status: created/executing/completed  │                    │
│   │ - replanCount: 重规划次数               │                    │
│   └────────────────────────────────────────┘                     │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

LLM 返回的计划 JSON 格式 ​

json
{
  "userIntent": "用户真正想要达成的目标",
  "intentAnalysis": "对用户意图的详细分析",
  "summary": "执行计划概述",
  "complexity": 5,
  "steps": [
    {
      "name": "步骤名称",
      "description": "步骤描述",
      "actionType": "call_tool|call_sub_agent|rag_query|llm_generate|mcp_call|aggregate",
      "targetResource": "工具名/子Agent ID/知识库ID等",
      "parameters": {"参数名": "参数值"},
      "dependencies": [0, 1],
      "importance": 0.8,
      "skippable": false
    }
  ]
}

TaskStep 结构 ​

字段类型说明
stepIndexint步骤索引
nameString步骤名称
descriptionString步骤描述
actionTypeString动作类型
targetResourceString目标资源
parametersMap执行参数
dependenciesList<Integer>依赖的步骤索引
statusStringpending/running/completed/failed/skipped
importancedouble重要性 (0-1)
skippableBoolean是否可跳过

动作类型 (actionType) ​

类型常量说明
call_toolACTION_CALL_TOOL调用工具
call_sub_agentACTION_CALL_SUB_AGENT调用子 Agent
rag_queryACTION_RAG_QUERYRAG 知识库检索
llm_generateACTION_LLM_GENERATELLM 生成
mcp_callACTION_MCP_CALLMCP 调用
aggregateACTION_AGGREGATE结果聚合

规划原则 ​

  1. 目标导向: 明确用户最终想要达成的目标
  2. 最小化步骤: 只规划必要的步骤,避免冗余
  3. 合理分解: 复杂任务应分解为可执行的小步骤
  4. 依赖明确: 清晰标注步骤间的依赖关系
  5. 容错设计: 标记可跳过的步骤,提高执行鲁棒性
  6. 简单问题: 如果是简单问答类问题,steps 可以为空

3. plan_execution - 计划执行节点 ​

位置: PlanExecutionNode.apply()

功能: 逐步执行任务计划中的每个步骤。

┌─────────────────────────────────────────────────────────────────┐
│                       计划执行流程                               │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│   taskPlan + currentTaskIndex                                    │
│        │                                                         │
│        ▼                                                         │
│   ┌────────────────────┐                                         │
│   │ 检查是否还有任务    │                                         │
│   │ currentIndex >=    │  是 → 进入反思节点                       │
│   │ taskPlan.size()    │                                         │
│   └──────────┬─────────┘                                         │
│              │ 否                                                │
│              ▼                                                   │
│   ┌────────────────────┐                                         │
│   │ checkDependencies  │  检查依赖是否满足                        │
│   └──────────┬─────────┘                                         │
│              │                                                   │
│     ┌────────┴────────┐                                          │
│     │ 依赖未满足       │ 依赖已满足                                │
│     ▼                 ▼                                          │
│ ┌───────────┐  ┌──────────────┐                                  │
│ │ skippable?│  │ executeTask  │                                  │
│ └─────┬─────┘  └──────┬───────┘                                  │
│       │               │                                          │
│  Yes  │  No           ▼                                          │
│   ▼   ▼        ┌──────────────┐                                  │
│ 跳过 抛异常    │ 根据actionType│                                  │
│               │ 执行具体任务  │                                  │
│               └──────────────┘                                   │
│                      │                                           │
│        ┌─────────────┼─────────────┬─────────────┐               │
│        │             │             │             │               │
│        ▼             ▼             ▼             ▼               │
│   ┌─────────┐  ┌─────────┐  ┌─────────┐  ┌─────────┐             │
│   │call_tool│  │call_sub │  │rag_query│  │llm_gen- │             │
│   │         │  │_agent   │  │         │  │erate    │             │
│   └────┬────┘  └────┬────┘  └────┬────┘  └────┬────┘             │
│        │            │            │            │                  │
│        └────────────┴────────────┴────────────┘                  │
│                          │                                       │
│                          ▼                                       │
│   ┌──────────────────────────────────────────┐                   │
│   │ 更新任务状态和结果                         │                  │
│   │ - taskPlan[index].status = completed     │                  │
│   │ - taskResults.add(result)                │                  │
│   │ - currentTaskIndex++                     │                  │
│   └────────────────────┬─────────────────────┘                   │
│                        │                                         │
│                        ▼                                         │
│   ┌────────────────────────────────────────┐                     │
│   │ 判断下一步:                             │                    │
│   │ - 还有任务? → execute_next_task        │                    │
│   │ - 全部完成? → reflect                  │                    │
│   └────────────────────────────────────────┘                     │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

各类型任务执行 ​

call_tool - 工具调用 ​
java
private String executeToolCall(String toolName, Map<String, Object> params) {
    // 1. 根据工具名获取工具配置
    AiToolEntity toolEntity = aiToolService.getByToolName(toolName);

    // 2. 根据 serviceType 获取执行器
    ToolExecutor executor = executorFactory.getExecutor(toolEntity.getServiceType());

    // 3. 执行工具
    return executor.execute(toolEntity, params);
}
call_sub_agent - 子 Agent 调用 ​
java
private String executeSubAgentCall(String subAgentId, String userInput) {
    Long agentId = Long.parseLong(subAgentId);
    return agentExecutionService.executeAgent(agentId, userInput);
}
rag_query - RAG 检索 ​
java
private String executeRagQuery(Map<String, Object> params, ChatbotAgentState state) {
    String query = (String) params.getOrDefault("query", state.userInput());

    // 使用 RagExecutor 执行检索
    var ragResult = ragExecutor.retrieve(query, state.datasetList(), state.retrievalConfig());

    // 格式化检索结果
    StringBuilder result = new StringBuilder();
    result.append("检索到 ").append(ragResult.size()).append(" 条相关内容:\n\n");
    // ...
}
llm_generate - LLM 生成 ​
java
private String executeLlmGenerate(Map<String, Object> params, ChatbotAgentState state) {
    String prompt = (String) params.getOrDefault("prompt", state.userInput());

    ChatModel chatModel = llmModelProvider.getChatModel(state.llmModelConfig());
    return chatModel.chat(prompt);
}
aggregate - 结果聚合 ​
java
private String executeAggregate(Map<String, Object> params, ChatbotAgentState state) {
    List<Map<String, Object>> taskResults = state.taskResults();

    StringBuilder aggregated = new StringBuilder();
    aggregated.append("执行结果汇总:\n\n");
    for (Map<String, Object> result : taskResults) {
        String status = (String) result.get("status");
        String name = (String) result.get("name");
        // 格式化输出
    }
    return aggregated.toString();
}

4. reflection - 反思节点 ​

位置: ReflectionNode.apply()

功能: 评估任务执行结果,决定是否需要重新规划。

┌─────────────────────────────────────────────────────────────────┐
│                       反思流程                                   │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│   taskResults + taskPlan                                         │
│        │                                                         │
│        ▼                                                         │
│   ┌────────────────────┐                                         │
│   │ 统计执行结果        │                                         │
│   │ - completedTasks   │                                         │
│   │ - failedTasks      │                                         │
│   │ - skippedTasks     │                                         │
│   └──────────┬─────────┘                                         │
│              │                                                   │
│              ▼                                                   │
│   ┌────────────────────────────────────────┐                     │
│   │ 判断反思策略:                           │                    │
│   │                                         │                    │
│   │ 无任务执行 → 直接生成响应                │                    │
│   │                                         │                    │
│   │ 全部失败 → 调用 LLM 反思                │                    │
│   │          → 判断是否需要重新规划          │                    │
│   │                                         │                    │
│   │ 有成功任务 → 简单评估,准备生成响应      │                    │
│   └────────────────────┬───────────────────┘                     │
│                        │                                         │
│                        ▼                                         │
│   ┌────────────────────────────────────────┐                     │
│   │ performReflection()                     │                    │
│   │ 调用 LLM 进行深度反思                   │                    │
│   └────────────────────┬───────────────────┘                     │
│                        │                                         │
│                        ▼                                         │
│   ┌────────────────────────────────────────┐                     │
│   │ ReflectionResult                        │                    │
│   │ - analysis: 分析评估                    │                    │
│   │ - goalAchieved: 目标是否达成            │                    │
│   │ - needReplan: 是否需要重新规划          │                    │
│   │ - replanReason: 重规划原因              │                    │
│   └────────────────────┬───────────────────┘                     │
│                        │                                         │
│                        ▼                                         │
│   ┌────────────────────────────────────────┐                     │
│   │ 决定下一步:                             │                    │
│   │ - needReplan && canReplan → replan     │                    │
│   │ - 否则 → final_response                │                    │
│   └────────────────────────────────────────┘                     │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

反思 LLM 返回格式 ​

json
{
  "analysis": "对执行结果的分析评估",
  "goalAchieved": true,
  "needReplan": false,
  "replanReason": "如果需要重新规划,说明原因",
  "suggestions": ["改进建议列表"]
}

重规划条件 ​

java
private boolean canReplan(ChatbotAgentState state) {
    // 检查重新规划次数限制
    Integer loopCount = state.loopCount();
    Integer maxLoops = state.maxLoops();

    return loopCount < maxLoops;  // 默认 maxLoops = 3
}

5. final_response - 最终响应生成节点 ​

位置: AiChatbotAgent.generateFinalResponse()

功能: 汇总所有执行结果,生成最终用户响应。

┌─────────────────────────────────────────────────────────────────┐
│                       最终响应生成流程                           │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│   taskResults + userInput + userIntent + reflection              │
│        │                                                         │
│        ▼                                                         │
│   ┌────────────────────┐                                         │
│   │ 收集执行结果        │                                         │
│   │ 遍历 taskResults   │                                         │
│   │ 提取成功的结果      │                                         │
│   └──────────┬─────────┘                                         │
│              │                                                   │
│              ▼                                                   │
│   ┌────────────────────────────────────────┐                     │
│   │ 构建响应上下文:                         │                    │
│   │ - 用户问题                              │                    │
│   │ - 理解的意图                            │                    │
│   │ - 各任务执行结果                        │                    │
│   │ - 反思分析总结                          │                    │
│   └────────────────────┬───────────────────┘                     │
│                        │                                         │
│                        ▼                                         │
│   ┌────────────────────────────────────────┐                     │
│   │ buildFinalResponsePrompt()              │                    │
│   │ 构建最终响应提示词                       │                    │
│   │ - 语言简洁明了                          │                    │
│   │ - 结合执行结果给出有价值信息             │                    │
│   │ - 如有失败,适当说明                     │                    │
│   │ - 使用友好语气                          │                    │
│   └────────────────────┬───────────────────┘                     │
│                        │                                         │
│                        ▼                                         │
│   ┌────────────────────────────────────────┐                     │
│   │ 调用 LLM 生成最终响应                    │                    │
│   │ 支持流式/非流式                          │                    │
│   └────────────────────┬───────────────────┘                     │
│                        │                                         │
│                        ▼                                         │
│   存入 State: final_response                                     │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

状态数据流 ​

自主规划特有的 State Key ​

Key类型说明
taskPlanList<Map>任务计划列表
currentTaskIndexInteger当前执行的任务索引
taskResultsList<Map>任务执行结果列表
planningModeBoolean是否为规划模式
reflectionString反思内容
needReplanBoolean是否需要重新规划
maxTaskIterationsInteger最大任务执行次数 (默认 20)

Action 常量 ​

常量值说明
ACTION_EXECUTE_NEXT_TASK"execute_next_task"执行下一个任务
ACTION_REFLECT"reflect"进入反思
ACTION_REPLAN"replan"重新规划
ACTION_FINAL_RESPONSE"final_response"生成最终响应

使用示例 ​

流式执行 ​

java
// 入口方法
aiChatbotAgent.autonomousPlanning(agentId, userId, sessionId, userInput, handler);

// 内部流程:
// 1. 获取会话
ChatSession session = sessionManager.getSession(sessionId);

// 2. 创建工作流
CompiledGraph<ChatbotAgentState> graph = createAutonomousPlanningGraph();

// 3. 初始化状态
Map<String, Object> initData = new HashMap<>();
initData.put(ChatbotAgentState.AGENT_ID_KEY, session.getAgentId());
initData.put(ChatbotAgentState.USER_INPUT_KEY, userInput);
initData.put(ChatbotAgentState.PLANNING_MODE_KEY, true);
initData.put(ChatbotAgentState.MAX_LOOPS_KEY, 3);  // 最多重规划3次
initData.put(ChatbotAgentState.MAX_TASK_ITERATIONS_KEY, 20);

// 4. 流式执行
RunnableConfig config = RunnableConfig.builder()
    .streamMode(CompiledGraph.StreamMode.VALUES)
    .build();

StreamContext.setStreamHandler(handler);
var streamOutput = graph.stream(initData, config);

for (var output : streamOutput) {
    String nodeName = output.node();
    ChatbotAgentState state = output.state();

    // 推送进度
    handler.onNodeComplete(nodeName, state);
    handler.onOverallProgress(current, total, progress);
}

同步执行 ​

java
String response = aiChatbotAgent.autonomousPlanningSync(agentId, userId, sessionId, userInput);

流式事件 ​

思维链事件 ​

java
// 规划阶段
handler.onThinkingStageStart("planning", "任务规划");
handler.onThinkingContent("planning", "正在分析需求并制定执行计划...");
handler.onThinkingStageEnd("planning");

// 任务执行阶段
handler.onThinkingStageStart("task_execution", "执行任务");
handler.onThinkingContent("task_execution", "执行任务 1/3: 调用工具...");
handler.onThinkingStageEnd("task_execution");

// 反思阶段
handler.onThinkingStageStart("reflection", "执行反思");
handler.onThinkingContent("reflection", "评估执行结果...");
handler.onThinkingStageEnd("reflection");

进度事件 ​

java
// 整体进度
handler.onOverallProgress(currentStep, totalSteps, percentComplete);

与标准工作流的对比 ​

特性Chatbot 工作流自主规划工作流
决策方式单次意图识别任务分解 + 规划
执行模式单步执行多步循环执行
容错机制简单错误处理依赖检查 + 可跳过 + 重规划
反思能力无LLM 反思评估
适用场景简单问答、单一任务复杂任务、多步骤流程

相关代码文件 ​

文件说明
AiChatbotAgent.java主工作流定义
ChatbotAgentState.javaState 定义
PlanningNode.java任务规划节点
PlanExecutionNode.java计划执行节点
ReflectionNode.java反思节点
TaskPlan.java任务计划 DTO
TaskStep.java任务步骤 DTO
StreamHandler.java流式处理接口