第 09 期 | 多轮对话与复杂任务分解
好的,作为技术教育专家,我将为你撰写这篇关于 Hermes Agent 复杂任务分解的深度教程。
副标题:学会引导 Agent 思考,掌握 /plan 命令和任务树管理,分而治之完成超难需求。
在之前的课程中,我们已经掌握了 Hermes Agent 的基础架构、技能扩展和记忆系统。这些功能使 Agent 能够响应单轮或简单的多轮请求。然而,现实世界中的任务往往是复杂的、多步骤的,需要周密的规划、执行和验证。例如,“调研市面上主流的 AI Agent 框架,对比它们的优缺点,并为我写一份摘要报告”,这样的需求无法通过一次简单的 Prompt 调用完成。
本期,我们将深入 Hermes Agent 的高级认知核心——规划器 (Planner) 与任务树 (Task Tree) 系统。你将学会如何将一个宏大的目标分解为一系列可执行的子任务,并像项目经理一样监督、调整和驱动 Agent 完成整个流程。这是从“聊天机器人”迈向“自主智能体”最关键的一步。
学习目标
完成本期课程后,你将能够:
- 理解任务分解的必要性:明白为何复杂任务必须被拆解成更小的步骤,以及这对 LLM 的重要性。
- 掌握核心概念:深入理解规划器 (Planner)、任务树 (Task Tree) 以及任务状态 (Task Status) 的概念。
- 精通
/plan命令:学会使用/plan命令启动 Agent 的规划模式,将高层级目标转化为具体的执行计划。 - 管理任务树:学会使用
/task系列命令查看、审批、执行和监控任务树的整个生命周期。 - 实践复杂任务:通过一个真实世界的场景,完整地走一遍从提出需求到获得最终成果的全过程,体验“人机协作”(Human-in-the-Loop) 的强大之处。
核心概念讲解
在深入实战之前,我们必须理解支撑复杂任务执行的几个核心概念。
1. 从单次调用到多步规划 (From Single-turn to Multi-step Planning)
传统的 LLM 交互模式类似于一个“函数调用”:输入一个 Prompt,得到一个输出。这种模式在处理信息查询、文本生成等原子性任务时非常高效。但面对一个需要“调研、分析、总结”的复杂任务时,它的局限性就暴露无遗:
- 上下文窗口限制:复杂的任务链可能需要处理海量信息,远超单个 LLM 的上下文窗口大小。
- “一步错,步步错”:在一个长链条的思考中,如果中间某个环节出错,整个结果都可能被污染,且难以追溯和修正。
- 工具使用的僵化:无法动态地决定在哪个步骤应该使用哪个 Skill (例如,先用
web_search,再用file_io写文件)。
Hermes Agent 的 规划器 (Planner) 正是为了解决这些问题而设计的。当你使用 /plan 命令时,你不再是要求 Agent “立即回答”,而是要求它“为我制定一个计划”。Agent 会调用一个专门用于规划的 LLM (或者使用特定的规划算法),将你的宏大目标分解成一个由多个子任务组成的、具有依赖关系的结构。
2. 任务树 (Task Tree):行动的蓝图
Planner 生成的计划并非一个简单的列表,而是一个任务树 (Task Tree)。这是一个层级结构,完美地表达了任务之间的关系。
- 根节点 (Root Task):代表你的原始、高层级的目标。
- 子节点 (Sub-tasks):代表为完成父任务而必须执行的具体步骤。一个子任务本身也可以有更下一级的子任务,形成嵌套。
- 依赖关系 (Dependencies):任务树隐含了执行顺序。通常,一个父任务的完成依赖于其所有子任务的成功完成。某些子任务之间也可能存在顺序关系(例如,必须先获取数据,然后才能分析数据)。
- 任务状态 (Task Status):每个任务节点都有一个状态,用于追踪整个计划的执行进度。常见的状态包括:
PENDING:待处理。计划已生成,但尚未被批准或执行。APPROVED: 已批准。用户已经确认计划,等待执行。RUNNING:执行中。Agent 正在处理这个任务。COMPLETED:已完成。任务成功执行,其结果 (output) 可被其他任务使用。FAILED:已失败。任务执行过程中遇到错误。
这个任务树就是 Agent 执行复杂任务的“行动蓝图”。它清晰、透明,并且允许人类在执行前、执行中进行干预。
3. 人机协作 (Human-in-the-Loop):你是总指挥
Hermes Agent 的规划系统并非一个“黑盒”。它将计划的最终决定权交还给了用户。在 Planner 生成任务树后,它会暂停并等待你的批准。
这种“人在环路中”的设计至关重要:
- 安全性:你可以审查 Agent 的计划,防止它执行有害或不符合预期的操作(例如,在不合适的网站上搜索,或删除重要文件)。
- 正确性:你可以修正 Agent 的误解。如果 Agent 对你的意图理解有偏差,生成的计划也会是错误的。此时,你可以修改、删除或添加任务节点,以确保计划的正确性。
- 灵活性:在任务执行过程中,如果遇到意外情况(例如,某个 API 不可用),你可以介入并调整后续的计划。
现在,让我们带着这些概念,进入激动人心的实战环节。
💻 实战演示
我们将模拟一个真实的研究任务:“分析过去三天关于 ‘Devin’ 这个 AI 软件工程师的最新新闻和技术社区讨论,总结其核心能力、争议点,并以 Markdown 格式生成一份简报。”
这个任务对于单轮 Prompt 来说几乎是不可能完成的。它需要:
- 在多个信息源(新闻网站、Hacker News、Reddit 等)进行搜索。
- 浏览和筛选搜索结果,识别高质量信息。
- 从多篇文章和讨论中提取关键信息。
- 对信息进行分类和综合(能力、争议点)。
- 将结果格式化为 Markdown 简报。
让我们看看 Hermes Agent 如何通过规划来解决它。
第一步:启动规划 (Initiating the Plan)
我们不用直接提问,而是使用 /plan 命令来陈述我们的目标。
/plan 分析过去三天关于 ‘Devin’ 这个 AI 软件工程师的最新新闻和技术社区讨论,总结其核心能力、争议点,并以 Markdown 格式生成一份简报。
提交后,Agent 不会立即给出答案。相反,它会告诉你它正在思考和制定计划。稍等片刻,你会收到 Planner 的初步响应。
> 好的,我已经理解了您的目标。正在为您制定一个详细的执行计划...
> ...
> 计划已生成!这是一个包含 5 个主要步骤的任务树。请您审查。
>
> **任务树预览:**
> - **Task #1 (Root)**: 生成关于 'Devin' 的简报
> - **Task #2**: [子任务] 搜索过去三天关于 'Devin' 的新闻和讨论
> - **Task #3**: [子任务] 从搜索结果中筛选 5-7 篇最相关的文章/帖子链接
> - **Task #4**: [子任务] 逐一访问链接,提取关于核心能力和争议点的关键信息
> - **Task #5**: [子任务] 综合所有提取的信息,撰写 Markdown 格式的简报
>
> 您可以使用 `/task list` 查看详细的任务树。
> 请问您是否批准此计划?(y/n)
第二步:审查与理解任务树 (Reviewing the Task Tree)
Agent 给出了一个清晰、合乎逻辑的计划。在批准之前,让我们使用 /task list 命令来查看更详细的任务树结构。
/task list
终端会返回一个格式化的树状结构,包含每个任务的 ID、父任务 ID、状态和简要描述。
ID PARENT STATUS DESCRIPTION
-- ------ ------- ------------------------------------------------------------------
1 - PENDING (Root) Generate a briefing about the AI software engineer 'Devin'.
2 1 PENDING Search for recent news and community discussions about 'Devin'.
3 1 PENDING Filter and select 5-7 most relevant links from search results.
4. 1 PENDING Visit each link and extract key points on capabilities and controversies.
5 1 PENDING Synthesize all extracted information and write a Markdown brief.
ID: 每个任务的唯一标识符,我们后续操作任务时会用到它。PARENT: 父任务的 ID。所有子任务的 PARENT 都是 1,即根任务。STATUS: 当前所有任务都处于PENDING状态,等待我们批准。DESCRIPTION: 任务的具体内容。
这个计划看起来非常合理。它遵循了“搜索 -> 筛选 -> 提取 -> 综合”的经典研究流程。
第三步:批准并启动任务 (Approving and Starting the Task)
我们对计划感到满意,现在可以批准它了。可以直接输入 y 或 yes,也可以使用 /task start 命令来启动整个计划。
y
或者,更明确地:
/task start 1
启动根任务会自动按顺序驱动其子任务的执行。Agent 会开始执行第一个待处理的子任务,即 Task #2。
> 计划已批准。开始执行任务树...
>
> **[Task #2: RUNNING]** 正在执行搜索...
> - 使用 Skill: `web_search`
> - 参数: `{"query": "AI software engineer Devin news and discussion last 3 days", "sources": ["google_news", "hacker_news", "reddit"]}`
> ...
Agent 会实时播报它的进展,包括正在执行哪个任务、调用了哪个 Skill 以及使用了什么参数。这是透明度的绝佳体现。
第四步:监控执行过程 (Monitoring the Execution)
几分钟后,Task #2 完成了。我们可以再次使用 /task list 查看进度。
/task list
输出现在会更新:
ID PARENT STATUS DESCRIPTION
-- ------ --------- ------------------------------------------------------------------
1 - RUNNING (Root) Generate a briefing about the AI software engineer 'Devin'.
2 1 COMPLETED Search for recent news and community discussions about 'Devin'.
3 1 RUNNING Filter and select 5-7 most relevant links from search results.
4 1 PENDING Visit each link and extract key points on capabilities and controversies.
5 1 PENDING Synthesize all extracted information and write a Markdown brief.
可以看到,Task #2 的状态已经变为 COMPLETED,而 Task #3 自动进入了 RUNNING 状态。根任务 #1 的状态也变成了 RUNNING,因为它下面的子任务正在被执行。
我们还可以查看某个已完成任务的结果。使用 /task show <ID>。
/task show 2
这会显示 Task #2 的详细信息,包括它的输入、输出、状态和执行日志。
{
"id": 2,
"parent": 1,
"status": "COMPLETED",
"description": "Search for recent news and community discussions about 'Devin'.",
"input": null,
"output": {
"type": "search_results",
"data": [
{ "title": "Cognition AI launches Devin, the first AI software engineer", "url": "...", "source": "techcrunch.com" },
{ "title": "Hacker News Discussion: Devin AI", "url": "...", "source": "news.ycombinator.com" },
{ "title": "My thoughts on Devin after trying it for a day - r/programming", "url": "...", "source": "reddit.com" },
...
]
},
"logs": [
"Starting task...",
"Executing skill 'web_search'...",
"Skill execution successful.",
"Task completed."
]
}
注意 output 字段。Task #2 的输出(搜索结果列表)将自动成为 Task #3 的输入。这就是任务链如何串联起来的。
第五步:人机交互与计划调整 (Handling Exceptions and Adjustments)
假设在执行 Task #4 时,其中一个链接访问失败了(例如,网站宕机或需要登录)。Agent 不会卡死,它会将该任务标记为 FAILED 并暂停,等待你的指示。
> **[Task #4.2: FAILED]** 访问链接 `http://example.com/paywall-article` 失败。原因: HTTP 403 Forbidden.
>
> 任务树执行已暂停。请检查问题并决定下一步操作。
> 您可以使用 `/task retry 4.2` 重试,或使用 `/task modify 4` 修改父任务的指令。
这是“人机协作”的魅力所在。我们发现这是一个付费墙文章,无法访问。我们可以决定跳过它,并稍微修改一下计划。比如,我们告诉 Agent 忽略失败的链接,继续处理其余的。
/task modify 4 "逐一访问【剩余的】链接,提取关于核心能力和争议点的关键信息。如果某个链接失败,请记录并跳过。"
修改后,我们可以重新启动任务。
/task start 4
Agent 会根据我们的新指令继续执行,从而展现出强大的鲁棒性和适应性。
第六步:获取最终成果 (Retrieving the Final Result)
当所有子任务都成功完成后,最后的 Task #5 会被执行。它会综合之前所有步骤收集到的信息,生成我们最终想要的 Markdown 简报。
当根任务 #1 的状态也变为 COMPLETED 时,整个工作流就结束了。
> **[Task #1: COMPLETED]** 所有任务已成功完成!
>
> 最终结果已生成。您可以使用 `/task show 1` 查看。
我们执行 /task show 1,并在其 output 字段中找到最终的报告。
/task show 1
{
"id": 1,
"status": "COMPLETED",
...
"output": {
"type": "markdown_report",
"content": "# AI 软件工程师 'Devin' 简报 (过去三天动态)\n\n## 核心能力\n\n- **端到端任务执行**: Devin 能够独立完成从需求理解、编码、调试到部署的整个软件开发流程。\n- **自主学习**: 能够通过阅读文档和API来学习新技术。\n- **强大的工具集**: 集成了 Shell、代码编辑器和浏览器,使其能模拟人类开发者的工作环境。\n\n## 主要争议点\n\n- **演示的真实性**: 社区有讨论质疑其公开演示视频可能经过剪辑,实际成功率未知。\n- **对开发者的替代性**: 引发了关于 AI 是否会大规模替代初级软件工程师的激烈讨论。\n- **泛化能力**: 目前尚不清楚其在复杂、真实世界项目中的表现如何。\n..."
}
}
任务圆满完成!我们通过引导 Agent 思考和规划,成功地完成了一个原本极其耗时耗力的研究任务。
涉及命令
| 命令 | 别名 | 功能 |
|---|---|---|
/plan <your goal> |
/p |
告诉 Agent 你的高层级目标,并让它生成一个任务计划。 |
/task list |
/tl |
显示当前会话中的任务树结构、状态和ID。 |
/task show <id> |
/ts <id> |
显示指定 ID 任务的详细信息,包括输入、输出和日志。 |
/task start <id> |
/ts <id> |
启动一个处于 PENDING 或 APPROVED 状态的任务。 |
/task approve <id> |
/ta <id> |
批准一个或多个任务,但不立即执行。 |
/task modify <id> <new desc> |
/tm <id> |
修改一个尚未执行的任务的描述或指令。 |
/task retry <id> |
/tr <id> |
重试一个 FAILED 的任务。 |
/task cancel <id> |
/tc <id> |
取消一个正在执行或待处理的任务。 |
要点回顾
- 分而治之 (Divide and Conquer):复杂任务的核心解决思路是将其分解为简单、可管理的子任务。这是 Agent 智能的体现。
/plan是入口:对于任何需要多个步骤才能完成的需求,都应该首先使用/plan命令,而不是直接提问。- 任务树是蓝图:任务树清晰地展示了 Agent 的思考路径和执行计划。学会阅读和理解任务树是使用高级功能的关键。
- 你是监督者:Hermes Agent 赋予了用户审查、批准和修改计划的权力。这种“人机协作”模式确保了任务执行的安全、可控和高效。
- 状态驱动执行:任务的状态 (
PENDING,RUNNING,COMPLETED,FAILED) 驱动着整个工作流的前进。监控任务状态可以让你随时了解项目进展。
通过掌握 Planner 和 Task Tree,你已经将 Hermes Agent 从一个简单的问答助手,升级为了一个能够规划和执行复杂项目的强大智能体。在下一期中,我们将探讨如何自定义 Agent 的行为和个性,让它更符合你的工作风格。
参考资料
- Hermes Agent 官方文档 - Planner 模块
- [论文推荐] "Tree of Thoughts: Deliberate Problem Solving with Large Language Models"
- [项目源码] Hermes Agent GitHub Repository
- [社区交流] Hermes Agent Discord Channel