尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

智能体面试准备(十七):HTN 任务分解与规划——让 Agent 面对复杂目标会自己拆计划

智能体面试准备(十七):HTN 任务分解与规划——让 Agent 面对复杂目标会自己拆计划 智能体面试准备十七HTN 任务分解与规划——让 Agent 面对复杂目标会自己拆计划前面几篇讲了单 AgentReAct、多 AgentB15、安全B16、工具调用B18 待发。但有一个核心能力一直没讲当目标很复杂、步骤很长时Agent 怎么知道先做什么、再做什么、怎么拆这就是任务规划Planning。这一篇聚焦最工程化的规划范式——HTNHierarchical Task Network分层任务网络对比 ReAct 式边走边看讲清楚先计划后执行的价值、实现与自我纠错。每节给原理 → 图解 → 代码 → 面试速答 高频追问。一、为什么 ReAct 不够规划能力的缺失ReAct 是thought → action → observation循环属于反应式reactive每步只基于当前观察决定下一步。面对多步长程任务有两个痛点ReAct 的困境: 目标: 调研竞品并出一份对比报告 问题1: 没有全局计划容易走一步看一步、东一榔头西一棒 问题2: 中途失败不知道回到哪一步重来只能从头再来规划式deliberativeAgent 的答案先生成一份结构化计划再按步执行失败可回滚到计划节点。反应式 规划式 ┌────────────────┐ ┌──────────────────────┐ │ 想一步做一步 │ │ 先 Plan 出任务树 │ │ 易迷路/难回滚 │ │ 再按节点执行可回滚 │ └────────────────┘ └──────────────────────┘二、HTN 是什么用任务网络描述怎么拆HTN 的核心概念原始任务Primitive Task不可再分、可直接执行如打开浏览器调用 search_api。复合任务Compound Task需进一步拆解如调研竞品。方法Method把复合任务拆成子任务序列的规则。任务网络复合任务 方法 约束构成一棵可展开的任务树。复合任务: 写竞品报告 └─ 方法 M1: [调研竞品, 整理数据, 撰写报告, 排版导出] ├─ 调研竞品(复合) │ └─ M1a: [搜索, 筛选Top5, 抓官网] ├─ 整理数据(复合) → [清洗, 建表] ├─ 撰写报告(原始) → 调用 write_agent └─ 排版导出(原始) → 调用 export_tool可以看成自顶向下的递归分解直到所有叶子都是原始任务。三、HTN vs ReAct一张表说清维度ReActHTN 规划决策时机边执行边决策先计划再执行全局观弱只看当前 observation强有完整任务树可回滚难易回退到某计划节点适合任务单步/短程/探索性多步/长程/可分解可控性低高计划可人工审阅LLM 用量每步一次计划一次 每步一次面试速答什么时候用 HTN 而不是 ReAct当任务可预先分解、步骤长、要求可控可回滚如订机票酒店行程用 HTN当任务探索性强、无法预先计划如在网页里找某个隐藏信息ReAct 更合适。工程上常两者结合HTN 出高层计划叶子节点用 ReAct 执行。四、最小可运行一个 LLM 驱动的 HTN 规划器思路让 LLM 充当分解器把复合任务递归拆成计划 JSON执行器逐节点跑失败时触发重规划。importjson,openaidefdecompose(task,depth0,max_depth4):让 LLM 把复合任务拆成子任务列表(原始任务直接返回)ifdepthmax_depth:return[{type:primitive,name:task}]promptf把任务拆成有序子任务JSON。若是不可再分的具体动作返回 typeprimitive否则返回 typecompound 及其子任务列表。任务:{task}respopenai.chat.completions.create(modelgpt-4o,messages[{role:user,content:prompt}])planjson.loads(resp.choices[0].message.content)out[]forsubinplan[steps]:ifsub[type]compound:outdecompose(sub[name],depth1,max_depth)else:out.append({type:primitive,name:sub[name]})returnoutdefexecute(plan):results[]forstepinplan:try:rrun_tool(step[name])# 叶子节点调用具体工具/Agentresults.append((step[name],OK,r))exceptExceptionase:return{failed_at:step[name],done:results,error:str(e)}return{done:results}plandecompose(调研竞品并出对比报告)resultexecute(plan)五、自我纠错失败如何重规划HTN 的真正威力在计划是可执行的树所以失败可定位到节点并重规划而非全盘重来执行: [搜索] OK → [抓官网] 失败(网站 403) ↓ 重规划: 把抓官网替换为 [换源搜索]→[抓镜像]→[摘要] ↓ 继续: 从失败节点往后执行前面 OK 的不重做实现上给执行器加一个重规划钩子defexecute_with_replan(plan,max_retry2):i0whileilen(plan):try:run_tool(plan[i][name]);i1exceptExceptionase:ifmax_retry0:raise# 从失败节点重新分解该子目标plan[i:]decompose(plan[i][name]f(避免:{e}))max_retry-1returndone面试速答HTN 的自我纠错比 ReAct 强在哪ReAct 失败往往只能从头或靠模型回忆HTN 有显式任务树能精准定位失败节点、只对该子树重规划已完成的兄弟节点不浪费效率和可控性都更高。五之二、HTN 与现有框架的混合落地纯 HTN 适合可预先分解的任务但真实业务常是部分可知、部分要探索。工程上的主流折中是分层混合架构高层: HTN 规划器LLM 出任务树可人工审阅 │ ├─ 节点A(复合) → 派给 ReAct Agent 执行探索性子任务 ├─ 节点B(原始) → 直接调工具 └─ 节点C(复合) → 派给多 Agent 协作见 B15这种计划在上、执行在下的结构兼顾了可控性和灵活性计划层保证不跑偏、可回滚执行层用 ReAct/多 Agent 处理不确定性。一个把 HTN 和 ReAct 拼起来的伪代码defrun_agent(goal):plandecompose(goal)# HTN: 先出计划fornodeinplan:ifnode.needs_explore:# 探索性子任务交给 ReActnode.resultreact_loop(node.desc)else:# 确定性子任务直接执行node.resultdispatch(node.tool,node.args)returnsummarize(plan)面试速答为什么工业级 Agent 多用 HTNReAct 混合而非纯 HTN 或纯 ReAct纯 HTN 难处理未知分支纯 ReAct 难控长程混合让已知的提前规划、未知的现场反应兼顾可控与灵活。六、面试速答 高频追问清单汇总速答 TOP 81. HTN 分层任务网络复合任务按方法递归拆成原始任务树。2. 三类要素复合任务 / 原始任务 / 方法拆解规则。3. ReAct 反应式、HTN 规划式长程可控任务选 HTN。4. HTN 优势全局计划、可回滚、可人工审阅。5. 工程上常 HTN 出高层计划 叶子用 ReAct 执行。6. 自我纠错靠失败定位到节点 子树下重规划。7. max_depth 防止无限递归分解。8. LLM 在这里当分解器也可换成规则引擎。追问清单- HTN 的计划质量问题怎么保证LLM 拆错了怎么办- 和经典规划如 PDDL/STRIPS比LLM-HTN 的优劣势- 多 Agent 下HTN 的计划如何分配给不同 Agent结合 B15- 计划里的约束先后顺序/互斥怎么表达- 怎么让计划可解释、可被人工编辑七、下一篇预告规划讲完怎么拆下一篇B18讲Function Calling 全链路——Agent 真正动手的最后一公里从工具 schema 定义、模型如何决定调用、参数解析、并行调用到错误处理。评论区告诉我你想先听哪个。
返回列表