数字员工模式
[!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 模式:
- JoyAgent-JDGenie 开源多智能体产品,超越 OWL、OpenManus,Java 福利——安装和介绍
- JoyAgent-JDGenie Java 智能体深入解析 React 模式,从原理代码到案例实战——React 模式
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_progress(in_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() 逐步推进