GoalAct 论文解读:全局规划 + 分层执行,LLM Agent 的 SOTA 框架

今天来聊一篇来自清华大学的最新工作 —— GoalAct,一个通过全局规划和分层执行来增强 LLM Agent 的框架。论文在 LegalAgentBench 上取得了 SOTA,平均成功率提升 12.22%,并获得了 NCIIP 2025 Best Paper。
一、现有 Agent 框架的两大痛点
当前 LLM-based Agent 在规划和执行层面都存在明显短板:
1. 规划层面:缺乏全局视野
- ReAct 采用增量式推理(Thought → Action → Observation),没有全局目标指引,容易在多分支任务中陷入局部死胡同
- Plan-and-Execute 虽然生成全局计划,但计划往往不可执行(超出 Agent 的动作空间)
2. 执行层面:复杂度与稳定性难以平衡
- 纯文本/JSON 执行(如 ReAct):简单稳定,但表达能力有限,无法处理循环、分支等复杂逻辑
- 代码执行(如 CodeAct):动作空间大,能处理复杂逻辑,但在不可预测环境中更容易出错,且不适用于法律写作等生成任务
二、GoalAct 的核心设计
GoalAct 引入了两个关键创新:
创新 1:持续更新的全局规划
GoalAct 维护一个动态演化的全局计划 G_t = (P₁A₁, P₂A₂, ..., PₙAₙ),其中 Pᵢ 是计划步骤,Aᵢ 是对应的高层级技能(而非底层细节)。最终步骤永远是 Finish。
关键特性:
- 计划基于实时执行反馈动态调整
- 同时保证战略连贯性和可执行性
- 避免静态计划的僵化和 ReAct 的局部最优
创新 2:分层执行策略
GoalAct 将任务执行分解为高层级技能,模拟人类工作方式:先识别技能类型,再选择工具,最后配置参数。
| 技能 | 执行格式 | 优势 | 局限 |
|---|---|---|---|
| 查询 (Searching) | Text/JSON 工具调用 | 简单稳定,适合不可预测环境,便于错误分析 | 表达能力有限,无法处理循环/分支 |
| 编程 (Coding) | Python 代码 | 支持复杂逻辑(分支、循环、排序、聚合),大幅扩展动作空间 | 复杂度高,在不可预测环境中更易出错 |
| 写作 (Writing) | 领域专用推理 + 内容生成 | 解决法律文档起草等代码/查询无法完成的任务 | 需要领域知识,多阶段处理(信息收集→起草→润色) |
技能集是可扩展的(如推理、创意、研究等技能),可根据任务动态选择。
三、实验验证:LegalAgentBench
基准测试
- LegalAgentBench:300 个任务,无法律数据泄露风险
- 6 种任务类型:1-hop 到 5-hop 逻辑推理(解决方案路径长度递增)+ 写作(答辩书生成)
- 任务需要法律知识和外部工具调用
实验设置
- 测试模型:GPT-4o-mini、Qwen-max、GLM-4-Plus(temperature=0)
- 基线方法:Plan-and-Solve、Plan-and-Execute、ReAct、CodeAct
- 评估指标:Success Rate(关键词匹配率)
核心结果
| 模型 | GoalAct | 最佳基线 | 提升幅度 |
|---|---|---|---|
| GPT-4o-mini | 0.7720 | 0.6275 (CodeAct) | +14.45% |
| Qwen-max | 0.8603 | 0.7594 (CodeAct) | +10.09% |
| GLM-4-Plus | 0.8710 | 0.7499 (ReAct) | +12.11% |
平均提升:12.22%
关键发现
- 任务难度越高,GoalAct 优势越明显:1-hop 提升 3.26%,3-hop 提升 20%,5-hop 提升 15.5%
- 写作任务相对提升 12.74%,证明分层执行对生成任务同样有效
- CodeAct 在写作任务上表现极差(无法生成法律文档),而 GoalAct 通过专用 Writing 技能完美解决
四、代码实现解析
GoalAct 的代码实现非常简洁(约 4,500 行 Python),核心架构清晰:
文件结构
| 文件 | 职责 | 行数 |
|---|---|---|
GoalAct.py | 项目入口,问题预处理 + 并行执行 | ~230 |
act.py | 核心执行循环:全局规划 + 行动路由 | ~153 |
action.py | 三大技能实现:查询 / 编程 / 写作 | ~108 |
prompt.py | 所有 Prompt 模板(全局规划、技能分类、示例) | ~528 |
LLM.py | LLM 接口封装 | ~50 |
memory.py | 记忆管理(few-shot 示例检索) | ~80 |
api.py | 工具集定义(法律数据库 API) | ~200 |
eval.py | 评估脚本(关键词匹配) | ~93 |
核心执行流程(act.py)
执行循环采用经典的 ReAct 结构,但增加了全局规划层和技能路由层:
- 全局规划生成:每步通过 LLM 生成「思考 + 行动」,行动必须是四种类型之一(查询/编程/写作/结束)
- 行动去重:维护 action_list 避免重复执行相同行动,若重复则通过 LLM 重新规划
- 技能路由:根据行动类型路由到对应执行器
- 「查询」→
Retrive():Text/JSON 工具调用 - 「编程」→
Code():Python 代码生成 + 子进程执行 - 「写作」→
Write():检索法条/类案/知识后生成文档
- 「查询」→
- 观察反馈:执行结果写入 scratchpad,作为下一步规划的历史上下文
编程技能的巧妙设计
Code 技能不是简单的代码生成,而是包含完整的错误恢复机制:
- 代码通过
subprocess.run在独立进程中执行,避免污染主进程 - 执行失败时自动捕获 stderr,将错误信息反馈给 LLM 要求重新编程(最多 5 次重试)
- 临时文件使用秒级时间戳 + 随机数命名,避免冲突
Prompt 工程亮点
- 问题改写:预处理阶段对查询进行去噪、标准化(如案号格式统一、公司名称补全省份)
- 表格筛选:通过 LLM 判断问题涉及哪些数据表,减少上下文噪音
- Few-shot 记忆:从 memory.json 中检索相似问题的解决方案作为示例,提升规划质量
- 编程示例:Prompt 中包含 3 个详细的 Python 代码示例,覆盖筛选、排序、统计等常见操作
五、论文 vs 代码:一致性评估
| 论文声明 | 代码验证 | 状态 |
|---|---|---|
| 全局规划机制 | act.py 每步调用 LLM 生成规划,scratchpad 维护历史 | ✅ 已实现 |
| 分层执行(查询/编程/写作) | action.py 中三个独立函数实现 | ✅ 已实现 |
| LegalAgentBench 评估 | eval.py 关键词匹配 + BERTScore 双指标 | ✅ 已实现 |
| 12.22% 平均提升 | 可复现(代码完整,数据集需申请) | ✅ 可验证 |
| 技能可扩展 | Prompt 中硬编码 3 种技能,扩展需修改 act.py 路由逻辑 | ⚠️ 需手动扩展 |
六、实用洞察与集成建议
GoalAct 适合什么场景?
- 多步推理任务:需要跨多个数据源查询、筛选、聚合的复杂工作流
- 混合任务类型:同时包含信息检索、数据处理和内容生成的场景
- 领域专用 Agent:法律、医疗、金融等有明确工具集和输出格式的领域
集成到 Hermes 的潜在路径
- MCP Server 化:将 GoalAct 的查询/编程/写作技能封装为 MCP Tools,Hermes 通过 MCP 协议调用
- Prompt 层借鉴:将 GoalAct 的全局规划 Prompt 和技能路由逻辑融入 Hermes 的 agent 配置
- 法律领域扩展:GoalAct 的法律工具集(LegalDoc、CourtInfo、CompanyInfo 等)可作为垂直领域 MCP Server 参考
局限性
- 领域耦合:当前实现深度绑定中国法律数据库,通用化需要重构 api.py 和 schema
- 单 Agent 架构:没有多 Agent 协作,复杂任务完全依赖单实例的 10 步循环
- 硬编码技能:新增技能需要修改 act.py 的路由逻辑和 prompt.py 的模板
- 中文特化:问题改写、法条检索等模块对中文法律文本有强依赖
七、总结
GoalAct 的核心价值在于证明了「全局规划 + 分层执行」这一设计范式在复杂 Agent 任务中的有效性。它不是通过更复杂的架构取胜,而是通过更合理的任务分解和更灵活的执行策略,在已有 LLM 能力基础上榨取更多性能。
对于构建垂直领域 Agent 的开发者来说,GoalAct 提供了一个极具参考价值的实现模板:如何用不到 5,000 行代码,在特定领域实现 SOTA 性能。
论文: arXiv:2504.16563
代码: github.com/cjj826/GoalAct
作者: Junjie Chen, Haitao Li, Jingli Yang, Yiqun Liu, Qingyao Ai (清华大学)
奖项: NCIIP 2025 Best Paper