数字员工模式

[!info] 阅读导览
全文 7 节:数字员工模式(1.1)→ 计划更新的两种模式(1.2)→ 关闭 / 开启动态更新(1.3 / 1.4)→ Plan-Execute 的过程(1.5)→ PlanningAgent 工作流程(1.6)→ 案例(1.7)

flowchart LR
    A[用户查询] --> B[PlanningAgent 规划]
    B --> C{动态更新?}
    C -->|是 isCloseUpdate=false| D[每步重新评估<br>thinks + act]
    C -->|否 isCloseUpdate=true| E[按计划逐步执行<br>stepPlan]
    D --> F[ExecutorAgent 执行工具]
    E --> F
    F --> G{计划完成?}
    G -->|否| B
    G -->|是| H[SummaryAgent 总结]

如果没有安装或者没有基础的,可以先看下面两篇文章(一个是安装,一个是 React 模式),然后再看本文的 Plan 模式:

1. 数字员工模式

1.1. 数字员工模式

数字员工模式是计划执行模式,执行的就是内部的工具。工具被赋予一个名字,就是数字员工。常用的工具有 4 个,可以把工具根据当前任务({{task}})、用户原始查询({{query}})和可用工具描述({{ToolsDesc}})来进行命名,例如:

{
  "file_tool": "数据记录员",
  "code_interpreter": "代码专家",
  "deep_search": "竞品分析员",
  "report_tool": "报告撰写专家"
}

主要目的是让前端界面更好看:前端可以显示"市场洞察专员正在处理文件",而不是冷冰冰的"file_tool 正在执行"。

  • 个性化:根据不同任务场景,同一个工具可以有不同的角色名称
  • 可追踪性:日志中可以清晰看到是哪个"数字员工"执行的操作

1.2. 计划更新的两种模式

计划模式有个很重要的区别:是一次规划完成,还是计划随着执行而动态变化。该值来自配置文件中的 autobots.autoagent.planner.close_update 属性,配置在 application.yml 第 47 行。默认是 close_update,也就是关闭了动态更新计划。

图片

下面是两种模式的对比:

维度 🔴 关闭动态更新(close_update: 1) 🟢 开启动态更新(close_update: 0)
核心特点 一次规划,按序执行 持续评估,动态调整
执行模式 线性执行,不重新评估 每步都重新思考和评估
LLM 调用 仅在初始规划时调用 每个任务执行前都调用
适用场景 任务明确、环境稳定的情况 复杂任务、需要容错和适应性的情况
优势 执行快速、成本低、逻辑简单 高度灵活、容错性强、结果质量高
劣势 缺乏灵活性,无法应对变化 执行较慢、成本较高、逻辑复杂

图片

1.3. 关闭动态更新(close_update: 1)

核心特点:一次规划,按序执行

  • 执行模式:线性执行,不重新评估
  • LLM 调用:仅在初始规划时调用
  • 适用场景:任务明确、环境稳定的情况
  • 优势:执行快速、成本低、逻辑简单
  • 劣势:缺乏灵活性,无法应对变化

1.4. 开启动态更新(close_update: 0)

核心特点:持续评估,动态调整

  • 执行模式:每步都重新思考和评估
  • LLM 调用:每个任务执行前都调用
  • 适用场景:复杂任务、需要容错和适应性的情况
  • 优势:高度灵活、容错性强、结果质量高
  • 劣势:执行较慢、成本较高、逻辑复杂

1.5. Plan-Execute 的过程

1.5.1. 类的继承关系

PlanningAgent (规划代理)
    ↓ 继承
ReActAgent (ReAct 模式代理)
    ↓ 继承
BaseAgent (代理基类)
    ↓ 组合
PlanningTool (规划工具)
Plan (计划数据结构)

PlanningAgent 的类继承关系

图片

1.5.2. 整体流程

因为流程比较多,所以图很长:

图片

基于代码分析,梳理了 PlanningAgent 的完整工作流程:

1.6. PlanningAgent 工作流程概述

1.6.1. 初始化阶段(构造函数)

  • 设置代理名称为 “planning”
  • 加载系统提示词和下一步提示词模板
  • 初始化 PlanningTool 工具
  • 配置 LLM 模型和最大步数
  • 设置动态更新标志 isCloseUpdate

1.6.2. 主要执行模式

PlanningAgent 有两种主要执行模式(即第 1.1 节提到的两种模式),下面看下 act 中会有什么动作:

1.6.2.1. 模式一:动态规划模式(isCloseUpdate = false)

thinks() 调用 LLM 分析当前情况并决定使用 PlanningTool
act() 执行工具调用,可能包括:
    create: 创建新的任务计划
    update: 更新现有计划
    mark_step: 标记步骤状态 (not_started/in_progress/completed)
    finish: 完成整个计划

1.6.2.2. 模式二:静态执行模式(isCloseUpdate = true)

  • 如果已有计划,直接调用 stepPlan() 推进到下一步
  • 跳过 LLM 思考过程,提高执行效率——就是让执行 agent 一步步地完成 PlanningAgent 中给出的计划

1.6.3. 核心方法详解

1.6.3.1. think() 和 act() 方法

think() 方法

think 的时候会将文件信息处理到系统提示词中,这一点非常重要:

// 更新文件信息到提示词
String filesStr = FileUtil.formatFileInfo(context.getProductFiles(), false);
setSystemPrompt(getSystemPromptSnapshot().replace("{{files}}", filesStr));

// 调用 LLM 获取工具调用决策
CompletableFuture<LLM.ToolCallResponse> future = getLlm().askTool(
    context,
    getMemory().getMessages(),
    Message.systemMessage(getSystemPrompt(), null),
    availableTools,
    ToolChoice.AUTO,
    null,
    context.getIsStream(),
    300);

act() 方法

act() 方法本身亮点不多,主要是运行工具(tool):

  • 执行 LLM 返回的工具调用
  • 处理 PlanningTool 的各种命令
  • 更新内存中的对话历史
  • 返回下一个要执行的任务

getNextTask() 方法

getNextTask() 方法就和名字一样,会给出下一个任务——毕竟 plan-execute 是在不断循环中解决问题的:

  • 检查计划中所有步骤是否完成
  • 如果全部完成:设置状态为 FINISHED,返回 “finish”
  • 如果有进行中的步骤:返回当前步骤内容

1.6.4. Plan 对象的状态管理

Plan 对象维护三个核心状态列表。这就像人做事一样:先列举 1、2、3、4、5 步骤,然后记录每个步骤的完成情况。当然,和我们工作一样,如果某件事没有完成或有问题,最好写点备注,方便解释。

steps: 任务步骤列表
stepStatus: 每个步骤的状态 (not_started/in_progress/completed)
notes: 每个步骤的备注信息

当某个步骤开始运行后,stepPlan() 方法会找到当前 in_progress 的步骤进行处理,完成后标记为 completed,并将下一个步骤标记为 in_progressin_progress 状态代表接下来要被执行处理的步骤)。

1.6.5. PlanningAgent 一句话明白运行机制

在 PlanSolveHandlerImpl 中会进行 Planning → Execution 循环:

  • PlanningAgent 生成任务计划
  • ExecutorAgent 执行具体任务
  • 结果反馈给 PlanningAgent 进行下一轮规划
  • 所有任务完成后,SummaryAgent 对整个执行过程进行总结

1.6.6. 关键特性

  • 🔄 迭代规划:支持根据执行结果动态调整计划
  • 高效模式:支持关闭动态更新,直接按既定计划执行
  • 🎯 状态追踪:精确管理每个步骤的执行状态
  • 📊 流式输出:支持实时输出思考过程和计划状态
  • 🔧 工具集成:通过 PlanningTool 实现计划的 CRUD 操作

1.7. 案例

这是一个分析京东财务的案例,有图有表,效果不错。

[!success] 核心要点

  • 数字员工:给内部工具赋予业务角色名(如 file_tool → 数据记录员),前端显示更友好、日志可追踪
  • 两种计划模式close_update: 1 一次规划按序执行(快、省、简单);close_update: 0 每步动态评估(灵活、容错、质量高)
  • 类继承链:PlanningAgent → ReActAgent → BaseAgent,组合 PlanningTool 与 Plan
  • 执行循环:PlanningAgent 规划 → ExecutorAgent 执行 → 结果回传再规划 → SummaryAgent 总结
  • 状态管理:steps / stepStatus / notes 三列表驱动 stepPlan() 逐步推进