SwiftSage: A Generative Agent with Fast and Slow Thinking for Complex Interactive Tasks
NeurIPS 2023 (spotlight)
方法
问题建模 (Problem Formulation)
在交互式环境(如 ScienceWorld)中,智能体在初始时刻 $t=0$ 会获得任务描述 $D$ 和初始环境状态 。在每个时间步 $t$,智能体需要生成一个动作 $A_t$ 。随后,环境会返回四个维度的反馈:
- 观察 ($O_t$):动作对环境产生的直接影响或查询到的信息 。
- 环境 ($E_t$):智能体当前所在房间及可见物品的信息 。
- 物品栏 ($I_t$):智能体目前收集到的物品列表 。
- 得分 ($S_t$):范围在 0 到 100 之间的累积奖励分数 。
SWIFT 模块:基于模仿学习的快速思维
SWIFT 模块代表 System 1,主要用于快速、直觉式的关联推理 。
模型基础:使用参数量较小的编码器-解码器语言模型(作者选用 7.7 亿参数的 T5-large 模型)进行离线行为克隆(Behavior Cloning)训练 。
长期历史状态表示:为了克服传统方法只能参考单步历史的缺陷,SWIFT 引入了滑动窗口机制,将过去 $K=10$ 个时间步的动作、观察和奖励作为输入上下文 。其输入序列的数学化构建格式如下:
“Task: $D$; Time: $t-1$; Score: $S_{t-1}$; Action history: $[A_{t-i}(+R_{t-i})\rightarrow O_{t-i} \text{ | } i \text{ loops from } K \text{ to } 1]$; Current room: $E_{t-1}$; Inventory: $I_{t-1}$; Visited rooms: ${E_1^,…,E_{t-1}^}$”
其中,$R_t$ 表示在时间步 $t$ 获得的即时奖励,公式为 $R_t = S_t - S_{t-1}$ ,$E_t^*$ 代表在时刻 $t$ 所在的地点名称 。
为了防止序列到序列(seq2seq)学习中的数据不平衡偏差,研究者对训练数据中的特定任务和动作进行了下采样(Down-sampling)。
SAGE 模块:基于 LLM 提示的深思熟虑
SAGE 模块代表 System 2,专门处理需要泛化规划、子目标追踪和异常处理的复杂情况 。该模块使用如 GPT-4 这样的大语言模型(LLM),并被设计为两个连续的提示(Prompting)阶段 :
规划阶段 (Planning Stage)
系统将任务描述、动作历史($A_{<t}$ 和 $O_{<t}$)以及当前环境 $E_{t-1}$ 压缩后输入给 LLM ,并要求其在一次输出中回答五个关键问题:
- Q1 (定位物品):需要收集哪些物品及其可能的位置?
- Q2 (追踪物品):还有哪些物品尚未收集?
- Q3 (规划子目标):为了高效完成任务,需要实现哪些重要的子目标?
- Q4 (追踪进度):目前已经完成了哪些子目标,现在应该专注于哪一个?
- Q5 (处理异常):是否犯了阻碍下一步的错误?如果有,该如何修复?
落地阶段 (Grounding Stage)
由于 LLM 生成的宏观计划无法直接在环境中执行,这一阶段负责将计划转化为具体动作 。
- 动作模板约束:向 LLM 展示环境中支持的动作类型及其规范格式(例如
POUR (X, Y): pour object X into container Y)。 - 生成动作缓冲区:结合过去 10 步的历史记录以及规划阶段输出的 Q1-Q5 答案 ,提示 LLM 将下一个子目标转化为一个动作序列,而不是单一动作 。这个由 LLM 生成的动作缓冲区在数学上表示为 $B = {\hat{A}t, \hat{A}{t+1}, \dots}$ 。
模块整合与切换算法 (Integration Algorithm)
SWIFTSAGE 使用一种启发式算法来动态控制两个模块的激活状态 。系统在初始阶段默认使用高效的 SWIFT 模块 ,但当满足以下任意一个触发条件时,将立刻切换到 SAGE 模式:
陷入停滞 (Stuck):过去连续 $K=5$ 个时间步的累积奖励为 0,即:
$$\sum_{i=t-5}^{t-1} R_i = 0$$
动作无效 (Invalid):SWIFT 预测的下一个动作 $A’_t$ 在当前环境中不合法 。
关键决策 (Critical):预测的动作 $A’_t$ 涉及关键性决策(例如提交最终的实验结果)。
遭遇异常 (Unexpected):对 $A’_t$ 的观察结果表明环境中出现了意外或异常(如设备损坏)。
一旦切换至 SAGE 模块,系统会生成动作缓冲区 $B$ 并按顺序尝试执行其中的动作 。当缓冲区被清空(即 $B = \emptyset$)或缓冲区内动作导致连续失败时,智能体会再次切换回快速的 SWIFT 模块。