Appearance
自主规划:计划、执行与反思
当前规划实现由 IntentRecognitionNode、WebSearchPrefetchNode、PlanningNode、AgenticTaskExecutionNode 和 TaskEndNode 组成。名称上可以称为 Plan/Execute/Reflect,但代码中的计划目前是 LLM 生成的 taskPlanText,并不是每一步都先落成数据库 TaskStep 再执行。
1. 规划前的意图决策
IntentRecognitionNode 通过模板提示词调用 ChatModel,生成并解析 IntentResult。它会写入:
| 字段 | 作用 |
|---|---|
currentIntent、currentIntentConfidence | 记录用户意图及置信度 |
nextAction | 继续对话、调用工具/Skill/子 Agent 或最终回答 |
needWebSearch、webSearchQuery、webSearchOnly | 控制平台联网搜索 |
needRag、ragKeywords、targetDataset、targetDatasetIds | 控制 RAG 节点查询和 Dataset 范围 |
selectedSkillIds | 让规划节点只描述相关 Skill |
resumeStrategy | 恢复场景选择继续还是重规划 |
意图识别前若 load_config 已写入 error,节点不会再次调用 LLM;普通解析异常会记录错误并返回 ACTION_CONTINUE_CHAT,由后续节点决定是否继续。新增意图字段时要同时更新提示词模板、JSON 解析 DTO、state builder、structured block 和恢复路径。
2. 网络搜索预取
预取节点根据本轮 WebSearchMode 执行:
| 模式 | 平台能力可用 | 平台能力不可用 |
|---|---|---|
OFF | 跳过 | 跳过 |
AUTO | 仅当意图需要时搜索 | 若 Agent 有通用搜索工具则交给工具,否则继续并记录原因 |
FORCE | 必须搜索 | 直接写错误并进入最终响应 |
搜索返回的 references 会先通过 StreamHandler.onReferences 暴露给客户端,再序列化到 webSearchContext。下游提示词把搜索内容视为不可信材料,只允许使用后端分配的 [[ref:n]],不得执行网页中的指令。
3. 规划节点的路由判定
PlanningNode 调用 LLM 生成计划文本,不注入业务工具,避免规划阶段提前 function calling。随后按以下顺序处理:
- 前置 state 有 error:跳过规划,
ACTION_FINAL_RESPONSE。 - 文本包含
[需要补充信息]:进入task_end,让模型向用户追问。 - 当前任务需要 Sandbox workspace:强制进入
agentic_loop。 - 文本包含
[完成]:认为是简单回答,进入task_end。 - 含有
## 执行计划且存在编号步骤,或匹配编号列表:进入agentic_loop。 - 其他情况:直接进入
task_end。
因此,计划文本中的自然语言步骤只是模型上下文;服务端真正执行的是后续 LLM 产生的 ToolExecutionRequest。不要通过解析计划文本直接执行 shell、Feign 或 MCP。
4. 执行:智能体循环
子图节点顺序为:
text
init -> reasoning -> acting -> refining -> checkpoint -> reasoning
| | | |
memory | human_review END
^ |
+----------+reasoning 根据 FinishReason 路由:TOOL_EXECUTION -> acting、LENGTH -> memory、STOP -> END。acting 完成工具后进入 refining,后者记录历史、失败计数、Todo 进度和重规划。checkpoint 消费暂停请求,再决定继续、HITL 或结束。
5. 反思:失败和重规划
LoopRefiningNode 的当前阈值:
| 控制项 | 值 | 行为 |
|---|---|---|
| 连续失败 | 3 轮 | 接近阈值时尝试新计划,耗尽则 FAILED |
| 自动重规划 | 2 次 | 失败原因 + Todo + 旧计划交给独立 LLM |
| Agentic Loop 业务上限 | max(maxTaskIterations, 100) | 防止低配置或异常状态过早/无限运行 |
| LangGraph recursion limit | max(25, 1 + max(maxTaskIterations,100)*4 + 24) | 按图步数限制,不等于业务轮数 |
重规划会追加 [系统重规划] 用户消息并更新 taskPlanText,不会清除已完成工具结果。工具成功清零连续失败计数;失败只影响当前轮,不会马上抹掉 session。
6. 待办进度协议
LoopActingNode 对内置 UPDATE_TODO_LIST 特殊处理,写入 TaskTodoManager、执行轨迹和 taskTodoList。LoopRefiningNode 用 todoUpdated 清零或递增 roundsSinceTodoUpdate;连续三轮不更新时,下一次 reasoning 只临时注入 [TODO-NAG] 消息,调用后删除。
TODO 是进度观测和模型约束,不是服务端事务状态。真正的完成依据仍是工具结果、loopSignal、任务状态和终态事件。
7. 计划扩展要求
新增动作类型时至少定义:输入字段、可用工具集合、失败/重试策略、是否副作用、是否需要 HITL、结果如何写入 taskExecutionResult、是否支持 checkpoint 恢复,以及前端 structured block 的展示格式。只增加提示词中的动作名称而不增加 dispatcher 分发,会导致模型能提出动作但运行时返回“工具不存在”。