AgentKit: 用图而不是编码进行流程工程
论文名称:AgentKit: Flow Engineering with Graphs, not Coding
论文链接:https://arxiv.org/pdf/2404.11483
Github:https://github.com/holmeswww/AgentKit
摘要
我们提出了一种直观的 LLM 提示框架(AgentKit),用于多功能代理。AgentKit 提供了一个统一的框架,用于从简单的自然语言提示中显式构建复杂的“思维过程”。AgentKit 中的基本构建块是节点,包含特定子任务的自然语言提示。用户然后将节点链在一起,就像堆叠乐高积木一样。节点链可以被设计成显式强制执行自然结构化的“思维过程”。例如,对于撰写论文的任务,可以从以下思维过程开始:1) 确定核心信息,2) 确定之前的研究空白等。AgentKit 中的节点可以以不同方式设计和组合,以实现多种高级功能,包括即时的层次化规划、反思和从互动中学习。此外,由于模块化的特性和直观的设计来模拟明确的人类思维过程,基本代理可以实现得像一系列子任务的提示列表一样简单,因此可以由没有任何编程经验的人设计和调整。在定量方面,我们展示了通过 AgentKit 设计的代理在 WebShop 和 Crafter 上实现了 SOTA 的性能。这些进步凸显了 AgentKit 在使 LLM 代理对更广泛的应用领域有效和可访问的潜力。
1 引言
最近,大型语言模型(LLM)在各种任务中展现出了显著的性能,包括体现规划和行动( W u \mathrm{Wu} Wu等,2024a; Ahn等,2022; Du等,2023; Wang等,2023c; Wu等,2023a;b; Wang等,2023a)、问答或对话(Ouyang等,2022; Hendrycks等,2020; Bubeck等,2023; Madaan等,2023)以及一般问题求解(Brown等,2020; Yao等,2022b; Shinn等,2023)。然而,将LLM应用于一般的现实世界代理任务仍然面临两个挑战。
第一个挑战是遵循程序要求。例如,自动驾驶汽车在进行情境适应时必须严格遵守安全规则。现有的代理框架(Significant-Gravitas; Chase,2022; Khattab等,2023; Shinn等,2023)并不遵循明确的推理程序。一个步骤中的错误可能会传播并影响后续步骤。Wu等(2024b)观察到,简单的思维链代理(Wei等,2022)在汉诺塔的前几步中生成良好的动作,但它们的性能在后续步骤中很快下降。代码生成(Wang等,2023c;a;b)试图通过将程序要求转换为代码来解决第一个挑战。
然而,基于代码的代理提出了第二个挑战:可访问性和易用性。基于代码的代理依赖于专门针对任务的手工 API 平台,并且通常需要许多可能难以产生的代码示例。另一方面,人类可以通过追踪一系列自然语言中的思想或指令有效地利用或转移程序知识。
为了弥合这一差距,我们介绍了 AgentKit,一个为将简单的自然语言子任务组装成复杂任务解决方案而设计的LLM提示框架。这种设计直观地指导LLM按照预定义的“思维过程”完成所有子任务,然后到达最终解决方案。
图 1:用户将任务分解为子任务(节点),代表“思维过程”,并为子任务(节点)创建提示。AgentKit 中的子任务(节点)可以以不同方式设计和组装,以实现多种功能,类似于乐高积木。
AgentKit 中的代理由标准化单元节点组成。每个节点旨在通过依次执行以下步骤来完成特定子任务:1)预处理输入(汇总依赖节点和外部数据库的输出)并提示LLM,2)对LLM的结果进行后处理以供存储和使用。例如,为了操作自动驾驶汽车,可以设计一个代理,首先明确列出和预测诸如行人或其他车辆的实体的意图 [节点1],然后决定采取哪种驾驶行为 [节点3]。遵循自定义的“思维过程”,AgentKit 为用户提供了对整个问题解决过程的精确模块化控制,而无需编写一行代码。这种设计还带来了模块化可解释性的好处,允许通过检查每个节点的自然语言输出来准确定位导致错误的子任务。
为了扩展功能,可以通过编码在推断时动态添加和移除节点和依赖关系,实现复杂的路由,如 IF…ELSE 分支或 FOR…LOOPS 循环。例如,当道路状况不佳时,自动驾驶智能体可以添加一个子任务来识别滑道 [node2],然后再决定驾驶动作 [node3]。
动态节点和依赖关系的集合自然形成一个动态有向无环图(DAG),其中节点为提示,依赖关系为边。在我们的智能体设置中,我们按照动态图的拓扑顺序遍历 DAG,计算每个节点的大语言模型结果。我们设计图中的一个后续节点直接输出环境动作。
为了展示 AgentKit 的全部潜力,我们在 Crafter 游戏中实现了一个智能体,具有多项先进功能:规划和动态目标优先级确定;错误识别和反思;从经验中学习。该智能体始终实现了最先进的性能,并从环境中学习了丰富的知识库。为了展示 AgentKit 的泛化能力,我们将我们在 Crafter 中的提示的成本效益版本移植到 Web 智能体任务,并在 WebShop 上超过了最先进技术 5%(Yao 等,2022a)。
我们的主要贡献是提出了一种自然语言“编码”端到端多功能 AI 智能体的框架,具有在挑战性情境下规划、反思和学习的能力。
2 AgentKit
要使用 AgentKit,用户首先将“思考过程”定义为一组相互依赖的自然语言子任务(提示)。每个子任务被呈现给 AgentKit 作为一个节点,围绕子任务的自然语言提示为中心。这些节点通过依赖规范在一个有向无环图(DAG)中连接在一起,以实现不同的逻辑和思考过程。节点的不同排列可以代表不同的功能,允许用户集成各种功能以构建多功能智能体(图 1 (b))。
图 2: AgentKit 中的每个节点接收来自其依赖项的输出,并输出一个字符串以完成预定义的子任务。橙色组件(After-query)是可选的,并可以通过 AgentKit API 进行最少编程的进一步定制。左图:节点内部的评估过程包括 compose 和 after-query。右图:节点可以在推理时动态添加/移除。例如, n 7 n_{7} n7 的 after-query 操作根据 LLM 对节点查询的是/否答案添加一个条件节点 n + / n − n_{+} / n_{-} n+/n−。这引发了条件分支。
所有节点都可以访问数据库 D B D B DB。通过中央数据库,用户可以将任务规范、指令和当前游戏观察传递给图中的每个节点。数据库还允许节点存储和传递永久信息(例如计划或知识库)以供将来步骤使用。
在本节中,我们解释 AgentKit 背后的实现细节以及它如何使用,以自动驾驶汽车为运行示例。请参见我们的代码库在 B 中的优势。
2.1 节点组件
对于每个节点 v v v,用户通过指定提示 q v q_{v} qv 和依赖项列表 D D D 来定义一个子任务。在节点内部,AgentKit 运行一个内置流程,对输入进行预处理(Compose),使用预处理的输入和提示 q v q_{v} qv 查询 LLM,并可选择后处理 LLM 的输出(After-query)。例如,节点 n 4 n_{4} n4 可以被设计为“识别其他道路使用者的意图。”(图 2 左侧)。
2.1.1 Compose:将信息收集、编译和格式化为提示
Compose 操作获取所有依赖项的输出,并可选地从数据库中获取信息,以生成 LLM 的单个提示。AgentKit 自带一个无需编程即可使用的默认 compose 操作。设 v v v 的输出为 O v O_{v} Ov,
C v = concat ( D B [ " { $ d b . Q U E R Y $ } ′ ′ ] , { O d ∣ d ∈ D } , q v ) \begin{equation*} C_{v}=\operatorname{concat}\left(D B\left["\{\$ \mathrm{db} . \mathrm{QUERY} \$\}^{\prime \prime}\right],\left\{O_{d} \mid d \in D\right\}, q_{v}\right) \tag{1} \end{equation*} Cv=concat(DB["{$db.QUERY$}′′],{Od∣d∈D},qv)(1)
例如, n 4 n_{4} n4 的 compose 操作将收集 n 2 n_{2} n2 的输出 - “列出您周围的任何道路使用者。”(图 2)。
通过编写“compose 函数”,可以进一步定制 compose 操作。这使得支持特殊系统提示甚至 RAG(Lewis 等,2020)成为可能。
2.1.2 Query/After-query:基于 LLM 输出进行解析、格式化、修改
Query 操作使用 C v C_{v} Cv 提示 LLM 以获得 L L M ( C v ) LLM\left(C_{v}\right) LLM(Cv),可选的 after-query 操作解析或重新格式化 L L M ( C v ) LLM\left(C_{v}\right) LLM(Cv),并编辑数据库 D B D B DB。例如, LLM ( C 4 ) \operatorname{LLM}\left(C_{4}\right) LLM(C4),“其他道路使用者的意图”,可能需要被后处理为 Json 格式并添加到数据库中,如算法 1 和图 2 所示。
2.2 动态组件
为了支持诸如分支等高级功能,AgentKit为用户提供了API,使其能够在推理时动态修改有向无环图(DAG)(见图2右侧)。所有动态修改都是临时的,并将在图遍历过程结束时恢复。需要注意的是,在此次遍历中已经评估的节点的修改是被禁止的,并将自动被拒绝。在自动驾驶的示例中,识别出其他道路用户的意图后, n 7 n_{7} n7可能是"确定是否有任何道路用户构成碰撞风险"的任务。如果LLM的输出是"是",则在 n 7 n_{7} n7的后查询中可以添加一个节点 n + n_{+} n+,用于"调整路线以避开道路用户"。
临时移除边/节点。典型用例是有条件地跳过一组不必要的节点,以节省计算量,如果节点结果可以在此次遍历中被重用的话。例如,在第3节中,如果计划不需要更新,那么规划器的问题就会被跳过。
添加临时节点/边。典型用例是创建条件分支。例如,一个节点可以根据LLM的"是/否"答案来添加条件边和节点,从而指导流程。
2.3 动态图遍历
我们实现了Kahn算法(算法2)来遍历包含静态节点和动态添加/移除节点的DAG。由于给定图可能存在多个拓扑顺序,动态添加/移除组件可能导致非确定性或意外行为。我们已经设置了保障措施来捕获潜在的意外行为。
3 AgentKit驱动的示例代理
我们展示了一个用于《Crafter》(Hafner, 2021)游戏的代理,具有几个高级功能:分层规划、反思以及从交互中学习。在每个步骤 T T T,代理接收游戏的文本描述 ( o T ) \left(o_{T}\right) (oT),以及指令手册 I \mathcal{I} I(附录C)作为输入,类似于Wu等人(2024b),并输出一个动作索引 ( a T ) \left(a_{T}\right) (aT)和动作应重复的次数 ( n T ) \left(n_{T}\right) (nT)。所有功能都在AgentKit的单个图中实现(附录E.1中包含完整的功能列表)。
如图3(a)所示,在游戏的每一步中,代理总结并跟踪以下内容:
- 观察 ( O n s-obs T ) \left(O_{n_{\text {s-obs }}}^{T}\right) (Ons-obs T);
- 计划和推理 ( O n s-plan T ) \left.\left(O_{n_{\text {s-plan }}}^{T}\right)\right. (Ons-plan T);
- 根据观察变化推断前一动作的成功与否 ( O n s-action T − 1 T − 1 ) \left(O_{n_{\text {s-action }}^{T-1}}^{T-1}\right) (Ons-action T−1T−1)。
3.1 具有短期反思的分层规划器(图3b)
在步骤 T T T,LLM首先生成前25步的摘要和反思( n reflect n_{\text {reflect }} nreflect ):
$$
\begin{equation*}
\mathcal{M}{L L M}\left(\operatorname{concat}\left(\left{\operatorname{concat}\left(O{n_{\text {s-obs }}}^{t}, O_{n_{\text {s-plan }}}^{t}, O_{n_{\text {s-action }}}^{t}\right) \mid t \in(T-25, T]\right}\right), q_{\text {reflect }}\right) \tag{2}
\end{equation*}
$$
反思 n reflect n_{\text {reflect }} nreflect 作为上下文提供给行动者和规划器。
图 3: 为节省空间,节点名称被缩写。(a) 在游戏的每一步中,三个摘要节点(绿色) n s -obs , n s -plan , n s -action n_{\mathrm{s} \text {-obs }}, n_{\mathrm{s} \text {-plan }}, n_{\mathrm{s} \text {-action }} ns-obs ,ns-plan ,ns-action 分别总结当前步骤的观察、计划和动作。(b) 在步骤 T T T,所有规划节点(蓝色)以 o T − 1 , o T o_{T-1}, o_{T} oT−1,oT 和手动输入 I \mathcal{I} I 作为输入,输出3个子目标和一个技能 s T s^{T} sT。 n reflect n_{\text {reflect }} nreflect 反映了最近25个步骤的摘要, n challenge, , n gate n_{\text {challenge, }}, n_{\text {gate }} nchallenge, ,ngate 确定了是否保留或更新 ( T − 1 ) (T-1) (T−1) 的子目标。© 在技能 s T s^{T} sT 下的每3步,(紫色 n feed n_{\text {feed }} nfeed )反映了在 s T s^{T} sT 下的所有游戏历史,并为规划器(b)生成特定于技能的反馈。(d) 每一步 T , n kb-add T, n_{\text {kb-add }} T,nkb-add (灰色)检查 o T − 1 , o T o_{T-1}, o_{T} oT−1,oT 和 I \mathcal{I} I,以从 L unk L_{\text {unk }} Lunk 中识别新信息。 n unknown n_{\text {unknown }} nunknown 通过识别当前子目标中来自 I \mathcal{I} I 的缺失信息,将其添加到 L unk L_{\text {unk }} Lunk 。
大语言模型(LLM)随后被提示识别出3个最重要的高层挑战(节点 n challenge n_{\text{challenge}} nchallenge)。然后节点 n gate n_{\text{gate}} ngate 根据 O n refect O_{n_{\text{refect}}} Onrefect、 O n challenge O_{n_{\text{challenge}}} Onchallenge和“完成标准”确定是否需要根据上一步 ( T − 1 ) (T-1) (T−1)的子目标进行更新。
如果不需要更新,规划器和知识库将直接跳过到执行者节点,节省了超过1/3的 Token 数量。否则,节点 n subgoal n_{\text{subgoal}} nsubgoal提示LLM按执行顺序识别出3个子目标,每个子目标都与一个“完成标准”配对。
利用顶层子目标的信息,智能体跟踪“技能”列表 ( n skills ) \left(n_{\text{skills}}\right) (nskills),促使LLM检索和创建新技能,构建类似于Wang等人(2023a)的技能库 S \mathcal{S} S,实现为一个Python字典,包含LLM生成的属性,如:skill_name、skill_description等。详细信息请参见图3(b)和附录D.2。
3.2 长期反思(图3c)
在技能 s ∈ S s \in \mathcal{S} s∈S下的每3个步骤,我们通过提示LLM与技能 s s s下的所有先前步骤进行计算,生成一个特定于技能的反馈:
$$
\begin{equation*}
O_{n_{\text {feed }}}^{T}=\mathcal{M}{L L M}\left(\operatorname{concat}\left(\left{\operatorname{concat}\left(O{n_{\text {s-obs }}}^{t}, O_{n_{\text {s-plan }}}^{t}, O_{n_{\text {s-action }}}^{t}\right) \mid s^{t}=s \wedge t \leq T\right}\right), q_{\text {feed }}\right) \tag{3}
\end{equation*}
$$
反馈 O n feed O_{n_{\text {feed }}} Onfeed 作为上下文提供给行动者和规划器。
3.3 与知识库互动中的学习(图3d)
代理使用两个精心设计的提示(节点) n unknown , n kb-add n_{\text {unknown }}, n_{\text {kb-add }} nunknown ,nkb-add 来维护未知信息列表 L u n k L_{\mathrm{unk}} Lunk和知识库 K B K B KB。
在每一步 T T T, n kb-add n_{\text {kb-add }} nkb-add 提示LLM根据观察的最后两步 o T − 1 , o T o_{T-1}, o_{T} oT−1,oT推理 L unk L_{\text {unk }} Lunk 中的信息。识别出的信息存储在知识库 K B K B KB中。然后, n unknown n_{\text {unknown }} nunknown 提示LLM列出当前子目标所需的缺失信息(来自指令手册和知识库)。缺失信息列表随后添加到 L unk L_{\text {unk }} Lunk 。我们在附录D.3中展示了一个学习到的知识库。
表 1: AgentKit 与流行的强化学习算法在奖励和训练步骤方面的比较表。AgentKit 的结果总结自 3 次独立试验。*我们的 AgentKit 实现采用了 GPT-4-0613、GPT-4-turbo 和 GPT-3.5turbo 的组合,以平衡成本和性能。 ¥ ¥ ¥ 得分是在一组 3 上计算的,我们没有对标准差运行多个组。 + { }^{+} + 从 GPT-4-turbo 的 Token 计数估算出的 GPT-4 的成本。
4 实验结果
我们按照以下方式呈现我们的实验。首先,我们使用 Crafter(Hafner, 2021)对不同模块进行基准测试和分析,这些模块在第 3 节中有描述。然后,我们描述我们对 WebShop(Yao 等,2022a)的实验结果,以展示 AgentKit 的泛化能力。
4.1 Crafter
Crafter(Hafner, 2021)是一个开放世界的生存游戏,具有程序生成功能,旨在对强化学习算法进行基准测试。游戏包括一个拥有 22 项成就跨越 7 个级别的科技树。游戏的原始观察是一个 ( 7 × 9 ) (7 \times 9) (7×9) 的俯视图形状,离散动作空间包括 17 个选项。游戏从 Minecraft 中汲取灵感,包括制作、探索、生存和推进科技树等类似挑战。根据 Du 等(2023);Wu 等(2023b;2024b),我们将 Wu 等(2023b)提供的文本描述和说明作为智能体的输入。文本描述包括:智能体周围的 4 个方块,视野内每种物体的最近 2 个对象,智能体的生命指标,以及剩余成就列表。我们在附录 D.1 中展示了一个描述示例。此外,我们允许智能体输出一个 repeat_number,以重复选择的动作而无需重新查询智能体。这个功能平均减少了 1 / 3 1 / 3 1/3 的成本。
值得注意的是,IATEX 源代码(Hafner, 2021)中,Wu 等(2023b)提取了说明,但省略了关于实际游戏的许多关键细节,因为研究论文从未旨在成为游戏手册。省略的细节包括:制作桌子(2 个木头)和熔炉(4 块石头)所需的具体材料数量,武器或敌人的伤害/攻击范围。这种省略对于第一次玩家来说构成了巨大挑战,使得游戏本质上无法在没有尝试并从环境中学习的情况下解决。
4.1.1 制作者的结果
我们将AgentKit的性能与SPRING(Wu等人,2023b)和RL基线进行了比较[1]。值得注意的是,SPRING的原始版本使用的是GPT-4,但在Crafter上运行成本较高。GPT-4-turbo的成本显著降低,并且具有改进的可复制性和指令跟随功能[2]。尽管一致性和指令跟随通常被认为是一种理想的特性,但它会增加陷入困境的风险,例如,当指令手册不准确时。此外,我们观察到,与GPT-4相比,GPT-4-turbo在空间推理方面的表现较差。我们假设上述两个差异是导致GPT-4-turbo性能下降的原因(表1第7行)。
图4: 左侧三列:Crafter中的示例轨迹。计划、反思、反馈、知识发现等不同节点共同完成了前11个步骤,并成功制作了桌子。通过环境交互和错误识别/更正,代理发现了有关“每次动作所需的木材”和“桌子木材消耗”的两个信息,这些信息最初被指令遗漏了(Hafner,2021)。右列:代理为技能库中的每个技能执行的所有操作(分类为Move、Do Interact、Craft)的游戏结束分布。动作分布与基于技能名称的人类预期非常一致。
与SPRING相比,AgentKit具有主动反思和学习能力,以及显式规划。因此,我们的代理不依赖于随机性来应对意外情况[3.1.2节]。总体而言,我们的代理在奖励方面比SPRING(GPT-4-turbo)提高了80%,并且在与SPRING(GPT-4)相媲美的奖励情况下成本降低了45%。我们代理的一致性也反映在评分指标中,该指标倾向于对于更多成就的低解锁率优于对于较少成就的一致高解锁率(Hafner,2021)。从经验上来看,我们观察到,SPRING往往会随机解锁一些不太重要的成就,例如,吃植物、收集样本等。这种行为可以提高评分指标,但不会影响奖励[1]。
4.1.2 计划、反思和与交互学习
我们在图4.1.1中展示了我们Crafter代理的前11个步骤的图示示例。代理在环境中空手开始(步骤0),并决定接近“资源收集”的挑战 n c 0 n_{c}^{0} nc0。在面对挑战时,它生成了“朝树移动”的子目标。在第6步达到树之后,短期反思节点 n r 6 n_{r}^{6} nr6和计划节点 n g 6 n_{g}^{6} ng6检测到了子目标的完成,并更新了计划和动作以收集木材并放置桌子。同时,“桌子木材消耗”被识别为手册中遗漏的信息,并由 n unknown n_{\text {unknown }} nunknown 添加到未知信息列表 ( L unk ) \left(L_{\text {unk }}\right) (Lunk )。
然而,由于手册中遗漏的信息(Hafner,2021)关于制作桌子所需木材的数量,代理尝试用1块木材放置桌子并失败了(步骤8)。观察节点 ( o s − a c t i o n 8 ) \left(o_{s-a c t i o n}^{8}\right) (os−action8)通过将当前观察与预期动作结果进行比较,自动检测到了失败。然后,观察节点参考了 L unk L_{\text {unk }} Lunk 和手册 I \mathcal{I} I,并确定了“木材不足”是失败的原因。计划和动作相应地更新以在放置桌子之前收集更多的木材。最后,“桌子木材消耗”被发现为2,并添加到知识库KB中(步骤11)。
最后,长期反思节点 n feed n_{\text {feed }} nfeed 识别出由于障碍物和资源收集不足导致的移动尝试失败。规划者建议“确保移动前地面平坦”和“优先考虑木材收集”。
4.2 网络商店
创建用于网络的自主智能体可能会给我们的生活带来便利。我们展示了一个零样本智能体,用于 Webshop(Yao 等,2022a),这是一个模拟的虚拟购物环境。在 Webshop 中的购物任务包括在模拟电子商务平台上搜索、浏览和识别所需产品。由于购物任务的特殊性,所有先前的大语言模型(LLM)智能体都依赖于完整人类轨迹的少样本演示(Yao 等,2022b;Shinn 等,2023;Liu 等,2023)来指导智能体的行为。由于 AgentKit 可以使用节点自定义智能体,我们的智能体不需要演示。
受 Crafter(第3节)智能体设计的启发,我们设计了一个简单的具有短期反思和规划的 6 节点智能体,类似于 Crafter 智能体。我们在附录 E.2 中包含了完整的提示。如表2 所示,我们的零样本智能体在 Webshop 上相较于最先进的少样本智能体 ReAct(Yao 等,2022b)实现了5% 的性能提升。
表 2: 在 WebShop(Yao 等,2022a)上将我们的智能体与基准进行比较的表格。出于成本考虑,我们报告了 WebShop 的前100个样本的得分。我们的智能体在使用 GPT-4 和成本较低的 GPT-4-turbo 时均实现了最先进的性能。
5 相关工作
5.1 用于规划的大语言模型
早期尝试使用大语言模型进行智能体任务往往涉及解决高层规划任务。Huang 等(2022);Ahn 等(2022)提出了为具体任务生成抽象高层计划,限制动作空间和轨迹长度。Song 等(2022);Wu 等(2023a)改进了Ahn 等(2022),在任务和规划器中引入了更多复杂性。Du 等(2023);Wang 等(2023c);Yuan 等(2023)在 Crafter 和 Minecraft 等开放世界游戏领域采用了类似的大语言模型规划框架。沿着这条线的先前工作都共享相同的提示设计,为大语言模型提供专家或人类轨迹示例作为上下文。大语言模型的输出被用作静态高层计划,独立于智能体的情况。
5.2 大语言模型智能体
在更具互动性的环境中,大语言模型(LLM)通常可以访问智能体的某些状态信息,并能够对环境信号做出反应。姚等人(2022b)通过LLM与“思维链”提示的互动解决了简单的自然语言任务。辛等人(2023)进一步增加了阅读任务反馈信号的能力。王等人(2023a)与一个可以从技能库中创建、检索和完善代码的LLM一起玩《我的世界》。王等人(2023b)在《我的世界》中使用了一个VLM进行高层规划和重新规划。然而,实际生成的计划往往不超过10个步骤。此外,LLM独立于智能体的其余部分运行(即,低级控制器执行计划,LLM规划器接收成功/失败消息),无法积极地对环境信号做出反应。这种设计限制了《我的世界》中的智能体处于和平模式(王等人,2023b),因为无法对生存情况做出反应,这是 Crafter(哈夫纳,2021)的一个重要部分。
值得注意的是,上述所有工作都依赖于少样本提示。尽管少样本示例对于强制执行特定输出格式很有用,但对于复杂任务来说,它们往往变得冗长且无助。即使是撰写高级家务也需要多达17个完整演示(安等人,2022),这对于像 Crafter(吴等人,2023b)这样的长期任务来说成本很高。
5.3 LLM 结构化提示
魏等人(2022)首次展示了通过“思维链”提示进行明确推理的好处。姚等人(2023);贝斯塔等人(2023)展示了用LLM评分函数引导传统搜索算法取得成功,但应用仅限于基于搜索的问题。卡塔布等人(2023)使用可训练的神经网络层对提示进行参数化,针对特定指标进行优化。查斯(2022);博伊勒-凯尔纳等人(2023)提供了不同提示框架的预构建实现,但引入了大量编码麻烦。与现有工作不同,这些工作确定了结构化提示的特定结构(姚等人,2022b;辛等人,2023;马丹等人,2023)(例如生成、自我评估、自我反思的顺序),我们提出了一种模块化视角(安德烈亚斯等人,2016),从简单子任务设计和构建智能体,主要通过直观的自然语言规范。
与AgentKit最相似的是吴等人(2023b),他们通过遍历固定的有向无环图(DAG)使用LLM推理,在 Crafter 上实现了最先进的性能。我们的框架在吴等人(2023b)的基础上增加了动态组件、预/后处理和数据库。这些额外的功能使我们能够实现诸如:分层规划、反思和知识库等附加功能。
6 结论
在这项工作中,我们提出了一个框架(AgentKit),允许用户通过组装子任务的提示来直观地为复杂问题创建特定的“思维过程”。AgentKit按照依赖关系定义的顺序为每个提示评估LLM,以实现一致和结构化的推理。虽然AgentKit中的基本功能可以在无编程经验的情况下使用(见图 F),但自定义的Python预处理和后处理函数可以实现高级功能,如数据库、条件分支和输出格式化/解析。为了展示AgentKit的强大和多功能性,我们实现了一个 WebShop(姚等人,2022a)智能体和一个 Crafter(哈夫纳,2021)智能体,两者都取得了最先进的性能。我们进一步展示了高级功能,包括即时分层规划、反思和从 Crafter 智能体的互动中学习。
我们的工作通过明确地将人类思维过程写入提示来展示了一种直观提示LLM解决具有挑战性任务的方法。鉴于良好的结果,我们将AgentKit视为“编码”端到端多功能AI智能体解决具有挑战性任务的早期演示,即使对于人类也是如此,而且使用自然语言。