agentscope-ai / agentscope-ai/agentscope-java
Plan 完成态 hint 在最后一步与 finish_plan 同轮调用时无法触达
- Vorherrschende Sprache
- Java
- Sterne
- 5.6k
- Forks
- 1.3k
- Ø Merge
- 4 T. 12 Std.
- Gemergte PRs (30 T.)
- 77
Beschreibung
## 问题描述
在 PlanNotebook 的默认提示逻辑中,`DefaultPlanToHint` 存在一个“所有子任务均已 done/abandoned”时提示调用 `finish_plan` 的分支:
```java
if (nDone + nAbandoned == plan.getSubtasks().size()) {
hint = AT_THE_END.replace("{plan}", plan.toMarkdown(false));
}
```
但在实际 ReAct 流程中,LLM 很容易在完成最后一个子任务时,在同一轮 reasoning 里同时调用:
1. `finish_subtask`,完成最后一个 subtask
2. `finish_plan`,完成整个 plan
默认工具执行是串行的,因此 `finish_subtask` 会先把最后一个 subtask 标记为 done,随后 `finish_plan` 立刻将 `currentPlan` 归档并置为 `null`。等下一轮 `PreReasoningEvent` 触发 hint 注入时,PlanNotebook 已经没有 active plan,`DefaultPlanToHint` 无法再看到“所有 subtasks 已完成但 plan 尚未 finish”的状态窗口。
## 实际表现
- `AT_THE_END` 分支在单元测试或人工直接调用 `generateHint(plan)` 时可达。
- 但在真实 agent 执行路径中,如果模型一次性返回 `finish_subtask(last)` + `finish_plan` 两个工具调用,这个 end hint 不会被注入。
- 下一轮 prereason 时 `currentPlan == null`,hint 会变成 `NO_PLAN`,或者在带 iteration guard 的逻辑中被跳过。
## 预期表现
当最后一个 subtask 完成后,agent 应该有机会看到明确的完成态提示,或者框架应该避免/处理同一轮中同时调用 `finish_subtask(last)` 与 `finish_plan` 导致 end hint 状态窗口被跳过的问题。
## 影响
这个问题会让 `DefaultPlanToHint` 中“所有 subtasks 已完成,提示调用 finish_plan 并总结”的设计在真实多工具调用场景中不稳定。模型如果自行提前调用了 `finish_plan`,后续 hint 生命周期会直接进入无计划状态。
## 可能的改进方向
可以考虑以下任一方案:
- 在 `finish_subtask` 完成最后一个 subtask 后,通过工具返回消息明确提示下一步只应调用 `finish_plan` 并总结。
- 在 `finish_plan` 内部校验所有 subtasks 是否已完成,并对同轮调用场景提供更清晰的结果消息。
- 在 plan hint hook 或工具执行层面保留一个刚完成的 plan 状态,使下一轮仍可注入一次 end hint。
- 调整工具描述,约束模型不要在同一轮同时调用 `finish_subtask` 和 `finish_plan`。
## 相关位置
- `DefaultPlanToHint.generateHint(...)` 的全部子任务完成分支
- `PlanNotebook.finishSubtask(...)`
- `PlanNotebook.finishPlan(...)` 中 `currentPlan = null`
- `ReActAgent` 的 plan hint hook 注入逻辑
Beitragsleitfaden
Bewertung
Dieses Issue wurde noch nicht bewertet.