原子任务图:将规划代理的工作表示为依赖图
Atomic Task Graph框架如何将智能体任务分解为带类型的节点,模拟计划,并仅修复失败的子图,从而助力小型开放模型参与竞争。
来源: This New AI Framework Turned 7B Models Into GPT-4 Competitors (Without Any Training)
大多数提升大语言模型智能体可靠性的尝试都是从使用更大规模的模型开始的。由清华大学和华南理工大学的研究人员提出的原子任务图(ATG)框架则采取了不同的路径:它改变了智能体组织工作的方式。根据相关论文,在两个知名的智能体测试基准中,经过ATG封装的7B和8B开源模型无需任何微调、强化学习或权重更新,其表现就优于运行标准ReAct循环的GPT-4。下文将解释为什么线性推理链会失效,ATG如何用依赖图替代它们,以及你可以借鉴哪些理念来打造自己的智能体。
为什么线性智能体循环在长任务中会失败
以“生成一份包含图表的2024年销售报告”这样的请求为例。典型的ReAct风格智能体会将此视为一系列相互关联的步骤,每个步骤都依赖于前一个步骤。
Step 1
↓
Find database
↓
Query data
↓
Analyze numbers
↓
Create graphs
↓
Write report
只要每一步都成功,整个流程就不会出问题。一旦出现失败,麻烦就开始了。如果数据库查询失败,后续的所有步骤都将基于错误或缺失的数据进行。
Database query
↓
Everything after it becomes wrong
此时,该智能体可以选择从头开始重新处理,或者利用已有的信息继续执行。很多智能体选择后者,而这正是产生幻觉的主要原因:模型会编造看似合理的数据来填补空白,后续的所有决策都会继承这一错误。
上下文不断累积
第二个问题是这些智能体如何保持状态。每次执行动作后,相应的思考内容、工具调用结果以及观察数据都会被添加到不断增长的记录中。
User
↓
Thought
↓
Action
↓
Observation
↓
Thought
↓
Action
↓
Observation
↓
Thought
↓
Action
最终,模型会基于大量历史记录进行推理。上下文变得混乱不堪,早期的错误依然清晰可见,从而持续影响后续决策。就像传话游戏一样,每一轮都会略微扭曲计划,直至其偏离现实。
核心理念:用图而非链
ATG用任务图取代了单一的序列结构。每个节点代表一个工作单元,每条边则记录两个单元之间的依赖关系。
Report
/ \
Analysis Charts
/ \
Database Statistics
这种结构使得各部分之间的独立性显而易见:无关的工作不再需要等待,某个分支的失败也不会影响其他分支。
ATG如何构建和运行该图结构
该框架分为五个阶段来运作。
1. 递归分解为原子级任务
一切始于用户的请求。
Create sales report
ATG会将该目标拆分为多个子任务。
Create sales report
↓
Load data
↓
Analyze sales
↓
Create charts
↓
Write summary
然后它会继续拆分那些仍然过于宽泛的子任务,比如分析步骤。
Analyze sales
↓
Revenue
↓
Profit
↓
Growth
↓
Regional trends
当每个叶节点都对应一次工具调用时,分解过程就会停止,例如:
SQL query
Python calculation
Matplotlib chart
Markdown writer
这些叶节点就是原子任务:规模小到再进一步拆分就没有意义了。停止规则很重要:过于模糊的节点会让模型有太多自由发挥的空间,而一个SQL查询则能产生明确且可验证的结果。
2. 每个节点的明确定义的输入与输出
每个节点都有一个类似函数签名那样的接口。规划器描述的不是诸如“进行分析”之类的指令,而是该节点的输入和输出内容。
def analyze_sales(data):
return summary
该代码片段仅用于说明,而非框架代码,但它展示了相关契约。由于图结构仅依赖于该契约,因此某个节点可以被重试或替换为其他工具,而其相邻节点不会察觉到变化,这正是模块化代码具有可维护性的原因。
3. 独立分支的并行执行
顺序型代理会依次执行任务,即便其中某些任务彼此之间并无关联。
Task A
↓
Task B
↓
Task C
如果B和C只需要A的结果,而无需彼此的结果,ATG可以直接表达这一需求。
Task A
/ \
Task B Task C
\ /
Task D
此时B和C可以同时运行,D则需等待两者完成。相关研究在所有测试基准中都显示出显著更短的执行时间,这是因为将独立步骤合并为并行步骤所带来的自然结果。
4. 在使用实际工具之前的模拟运行
在执行任何操作之前,ATG会先在内部模拟整个计划,实质上是询问模型:如果按照原定方案执行,是否能够成功。该模拟会检查以下问题:
- 缺失的步骤
- 节点被分配了错误的工具
- 节点之间的依赖关系不正确
- 接口不匹配,即一个节点的输出无法适配下一个节点的输入
- 实际上无法完成的执行路径
- 违反任务约束的情况
这相当于在部署之前运行测试,而且由于无需调用外部工具,成本很低。不过,检查的准确性取决于执行模拟的模型:制定计划的模型本身可能存在缺陷,因此应将其视为一种过滤手段,而非绝对保证。
5. 有针对性地修复出问题的子图
最值得注意的一点是ATG在运行时处理故障的方式。以一个简单的图为例:
Database
↓
Analysis
↓
Charts
↓
Report
假设分析节点出现了故障。传统的智能体通常会丢弃已有的进展并重新开始。
Database
↓
Analysis
↓
Charts
↓
Report
↓
Start over
而ATG则保留原有的图结构,将所有已生成有效结果的节点冻结。下方的图表刻意与原图保持一致:结构没有变化,只有分析节点被标记为需要重新处理,而数据库、图表和报告节点则保持原样。
Database
↓
Analysis
↓
Charts
↓
Report
只有出故障的子图会被重新生成,一旦该子图处理成功,整个图就会基于新的结果继续运行。
Database
↓
New Analysis
↓
Charts
↓
Report
这是应用于规划过程的增量编译。需要注意的是,即使修复后的分析结果产生的数值有所不同,依赖这些结果的下游节点仍需重新运行;而得以节省的是上游任务以及无关分支的处理。
为何更小的上下文能减少幻觉现象
在ReAct循环中,每一步都能看到完整的历史记录。而在ATG中,每个节点仅接收其接口所定义的输入,因此噪声更少,早期错误渗入的可能性也更低。
该论文在ALFWorld上对这一现象进行了量化分析:
- 使用ReAct时,42.86%的轨迹包含幻觉行为
- 使用ATG后,这一比例降至12.14%
这意味着在无需更改底层模型的情况下,幻觉现象减少了约72%。
基准测试的结果
评估过程中使用了三种开源模型:
- Mistral 7B
- Gemma 7B
- Llama 3 8B
以及三个智能体基准测试:
- ALFWorld
- WebShop
- ScienceWorld
该对比将Llama 3 8B与ATG组合,与GPT-4与ReAct组合进行对比。在ALFWorld测试中,GPT-4基线的得分为:
GPT-4 + ReAct
41.24
而使用ATG的小型模型的得分则为:
Llama 3 8B + ATG
63.65
在WebShop测试中,GPT-4基线的得分达到:
GPT-4 + ReAct
64.34
而使用ATG的Llama 3 8B的得分则为:
Llama 3 8B + ATG
68.36
这些是论文中报告的数值。GPT-4的相关数据是基于ReAct基线得出的,因此该对比显示的是结构设计能在多大程度上弥补模型规模的不足,并不意味着8B模型的性能就一定优于GPT-4。
为何这一理念能引起软件工程师的共鸣
该行业的常规策略一直是扩大模型规模、集群数量及预算。而ATG则探讨如何更好地组织工作,这更多是一个软件工程问题而非机器学习问题。它与Git、依赖图、构建系统、任务调度器、编译器优化以及分布式系统有着相似之处。大多数软件早已不再严格遵循顺序执行,现在代理技术也在逐步赶上。
一个具体示例:构建网站
如果让代理来构建一个网站,线性型的代理往往会生成如下计划:
Think
↓
Write HTML
↓
Write CSS
↓
Write JavaScript
↓
Debug
↓
Deploy
而采用ATG风格的规划器则可能会生成由多个独立部分构成的树结构:
Website
│
├── HTML
├── CSS
├── Images
├── API
└── Tests
每个分支都可以独立开发。如果CSS出错,只需重新生成对应的CSS节点即可。这听起来很显然,但如今大多数智能体并未采用这种方式。相关的防御性设计模式可在《防止智能体图中的幻觉累积的架构》一文中找到。
何时无需使用任务图
规划、模拟以及节点管理都会增加开销。对于仅需两到三次工具调用的任务,使用普通的ReAct循环更为简单。只有当任务长度较长、部分独立且重启成本较高,并且规划器能合理分解任务时,任务图才能发挥优势——即便执行效率很高,糟糕的规划依然会是糟糕的结果。
关键要点
- 线性循环会导致一次失败就会影响后续所有步骤,而不断增长的记录会放大早期的错误。