论文阅读_使用有向无环图实现流程工程_AgentKit

英文名称: AgentKit: Flow Engineering with Graphs, not Coding
中文名称: AgentKit:使用图而非编码进行流程工程
链接: https://arxiv.org/pdf/2404.11483.pdf
代码: https://github.com/holmeswww/AgentKit
作者: Yue Wu, Yewen Fan, So Yeon Min, Shrimai Prabhumoye, Stephen McAleer, Yonatan Bisk, Ruslan Salakhutdinov, Yuanzhi Li, Tom Mitchell
机构: 卡内基梅隆大学, NVIDIA, 微软, 波士顿大学
日期: 2024-04-17
引用次数: 80

1 摘要

  • 目标:提出了 LLM 提示框架 AgentKit,用于构建能通过自然语言提示进行复杂“思考过程”的多功能代理。
  • 方法:AgentKit 使用节点作为基本构建块,每个节点包含一个特定子任务的自然语言提示。用户可以将这些节点像乐高积木一样堆叠起来,形成一个复杂的思考过程。
  • 结果:AgentKit 设计的代理在 WebShop 和 Crafter 上实现了最先进的性能。

2 相关知识

2.1 Agent

在不同的上下文中,"Agent" 可能有不同的含义。有时 "Agent" 被用来指代一个完整的系统,它可以解决复杂的问题,通过将大任务拆分成小块,并使用各种工具或 LLM 来处理这些小块。有时 "Agent" 用来指代这些小块,这些小块各自执行特定的任务,并协同工作以完成更大的任务。

在 Langchain 或类似的系统中,Agent 常被分为思考模块和行动模块。思考模块负责处理信息、做出决策和规划,而行动模块则负责执行这些决策和规划。这是一种根据角色和职责的分类,与具体工具或方法无关。

2.2 问题分析

在处理复杂问题或者提供多元化功能时,一个 Agent 执行完之后,可能需要多个 Agent 来进行后续操作。如果需要手动指定,则需要编写大量的逻辑来管理这些 Agent 之间的关系。当增加或修改功能时,会面临复杂的逻辑修改。

许多时候,行动模块的功能已经比较完善。如果我们能清晰地描述模块间的依赖关系,从而避免穷举;思考模块会根据当前的环境来构建解决问题的流程,并对这个流程进行反思和优化,那么整个链路就打通了。

3 读后感

前几天,和朋友讨论了如何让 Agent 自我构建知识体系,自我进化。刚好看到了这篇论文,作者对 Agent 结构进行了更为深入和丰富的思考,并提出了流程工程,或者思维工程的概念。

以前,Agent 的组合相对较简单。一种方法是通过程序限定当前步骤可以使用哪些 Agent,这需要大量人工干预。另一种方法是将当前环境和所有可用的 Agent 一起交给思考 Agent 自由选择,但这可能会引发许多错误,出及 token 的浪费。

这篇论文提出的方法,类似于使用强化学习通过精调 LLM 优化 Agent。不同之处在于本篇中知识存储在模型的外部,更具有可解释性。这两种方法各有千秋。

这篇论文针对思考和行动这两个目标,在结构上分别进行了优化:在行动方面,将每个子功能都抽象成模块,可灵活组合。同时,通过图形的方式建立并约束了模块之间的关系。在执行过程中,根据具体情况进行动态路由,而非预先设定好具体逻辑。在思考方面,结合了反思,分层规划,长短期记忆,并在探索过程中构建知识库,以优化 Agent 的调用过程。

4 引言

图 1:用户将任务分解为代表“思维过程”的子任务(节点),并为子任务(节点)创建提示。AgentKit 中的子任务(节点)可以以不同的方式设计和组装,以实现不同的功能,类似于乐高积木。

本文的主要贡献是提出了一个端到端多功能人工智能代理的自然语言“编码”框架。这个框架具备进行计划、反思和学习的能力。

具体方法是生成了一个有向无环图,该图由动态节点和依赖关系的集合构成。在执行过程中,遍历这个图,根据动态图的拓扑顺序计算每个节点的 LLM 结果。使用最后一个节点直接输出环境操作。为了提高功能性,可以通过编码在推理过程中动态添加和删除节点和依赖项,从而完成复杂的路由。

5 优化行动

首先,将“思维过程”定义为一系列相互关联的自然语言子任务。每个子任务都以节点形式呈现,这些节点通过有向无环图(DAG)中的依赖关系链接,以实现各种逻辑和连贯的过程。

每个节点都能够接触到中央数据库。用户可以通过此数据库将任务规范、指令和当前的游戏观察结果传递到图中的每个节点。此外,数据库还使节点能够存储持久信息(例如,计划或知识库),并将这些信息传递给未来的步骤。

图 -2 展示了子节点内部和外部的构造。

5.1 节点组件

对于每个节点 v,用户通过指定提示 q 和依赖项 D 列表来定义子任务。在节点内部,AgentKit 运行一个内置流,该流对输入进行预处理(Compose),LLM 使用预处理的输入和提示 q 进行查询,并选择性地对 LLM(After-query)的输出进行后处理,如:图 -2 的左侧所示。(图 -2 已经画得非常清楚,就不在此展开了,细节请见论文)

5.2 动态组件

为了支持如分支等高级功能,AgentKit 提供了 API,供用户在推理过程中可以动态地修改 DAG。如图 -2 的右侧显示,节点 n7 可以根据当前的状态,动态地在图中增加(或删除)组件。值得注意的是,所有这些修改都是临时性的,并且,禁止对已在此阶段的评估节点进行修改。

5.3 动态图遍历

使用了 Kahn 算法来遍历有向无环图的静态节点和动态添加/删除的节点。这种算法特别适用于拓扑排序。由于给定图可能存在多种拓扑排序,因此组件的动态添加/删除可能引发不确定性或意外行为。为了防止这种情况,采取了相应的保护措施,以捕捉潜在的意外行为。

6 优化思考

这里演示了 Crafter(Hafner,2021)游戏的代理,下面按图 -3 中的 a-d 分别说明。

6.1 总结并跟踪

图 3(a),在每一步,Agent 会总结并跟踪:1)观察(OTns-obs);2)计划和推理(OTns-plan);3)观察变化以推断基于前一动作是否成功(OT−1ns-action)。

6.2 具有短期反思的分层规划器

图 3(b),在步骤 T 中,所有的规划节点将 oT−1、oT 和手册 I 作为输入,并输出 3 个子目标和一个技能 sT。nreflect 反思最近 25 步的总结,而 nchallenge 和 ngate 决定是否保留(T - 1)的子目标或进行更新。

利用关于最重要的子目标的信息,代理会跟踪一个“技能”列表(nskills),提示 LLM 检索和创建新的技能,以构建一个技能库 S。

6.3 长期反思

图 3(c),每 3 个步骤,通过 LLM 提示技能 s 下的所有先前步骤来计算特定于技能的反馈。

Onfeed 将成为后续计划和行动决策的上下文。

6.4 在与知识库交互的过程中学习

图 3(d),代理使用两个精心设计的提示(节点):nunknown 和 nkb-add,维护未知信息列表 Lunk 和知识库 KB。在每个步骤 T 中,nkb-add 提示 LLM 通过理解最后两步的观察 oT−1 和 oT,从 Lunk 中识别信息。识别的信息被存储在知识库 KB 中。然后,nunknown 提示 LLM 列出当前子目标需要的缺失信息(来自说明手册和知识库)。缺失的信息列表随后被添加到 Lunk 中。

7 实验结果

8 相关论文

  • SPRING: Studying Papers and Reasoning to play Games

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/8466.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Julia 语言环境安装与使用

1、Julia 语言环境安装 安装教程:https://www.runoob.com/julia/julia-environment.html Julia 安装包下载地址为:https://julialang.org/downloads/。 安装步骤:注意(勾选 Add Julia To PATH 自动将 Julia 添加到环境变量&…

C语言 函数的嵌套与递归 调用

本文 我们来说函数的嵌套调用和递归调用 在很多大型项目中 我们肯定不可能将所有逻辑都写在一个函数中 肯定要按功能拆解成多个特定的功能函数 函数并不允许嵌套调用,但是 允许在逻辑代码中嵌套调用 所谓函数嵌套调用 就是在一个函数中调用另一个函数,而…

【计算机毕业设计】基于SSM++jsp的菜匣子优选系统【源码+lw+部署文档+讲解】

目录 第一章 绪 论 第二章 关键技术的研究 2.1 JSP技术介绍 2.2 JAVA简介 2.3 ECLIPSE 开发环境 2.4 Tomcat服务器 2.5 MySQL数据库 第三章 系统分析 3.1 系统设计目标 3.2 系统可行性分析 3.3 系统功能分析和描述 3.4系统UML用例分析 3.4.1管理员用例 3.4.2用户用例 3.5系统流…

C语言 计数控制循环

今天 我们来说 计数控制的循环 对于循环次数 我们已知的循环 我们称之为 计数控制的循环 这种情况 我们一般选择 for来实现 更为方便 先看一个案例 求 1 到 N 的累加合 我们代码可以这样写 #define _CRT_SECURE_NO_WARNINGS//禁用安全函数警告 #pragma warning(disable:6031…

信创基础硬件之芯片

信创基础硬件之芯片 文章目录 信创基础硬件之芯片服务器服务器的定义服务器的功能服务器的构成服务器的性能 处理器(CPU)CPUGPUDPU CPU的分类按CPU指令集架构分类按CPU体系架构分类 CPU产业链六大国产CPU公司详解海光飞腾鲲鹏兆芯龙芯申威 国产CPU对比从…

Linux网络编程:TCP编程实现

目录 1、前言 2、函数介绍 2.1 socket函数 与 通信域 2.2 bind函数 与 通信结构体 2.2.1 domain通信地址族 与 通信结构体 2.2.2 IPv4地址族结构体 2.2.3 通用地址族结构体 2.2.4 示例:为套接字fd绑定通信结构体addr 2.3 listen函数 与 accept函数 …

了解外汇询价和锁价,全球交易中的关键概念

外汇市场是全球交易量最大的金融市场之一,每天都有大量的货币买卖活动。在外汇交易中,询价和锁价是两个关键概念,它们不仅影响交易者的决策,还关系到交易的成本和风险控制。为了帮助交易者更好地理解和应用这两个概念,…

Linux课程机房虚拟机

Linux课程机房虚拟机 机房虚拟机(默认不能联网的): 百度网盘:https://pan.baidu.com/s/1WqSvqB3Y7b_D4690CDBlJA?pwdaugc 123网盘:https://www.123pan.com/s/tQ0UVv-LiolA.html提取码:F4xm ‍ 联网使用说明&…

小trick

https://codeforces.com/gym/105104/problem/C const int N 1e6 10;int T, n, x; ull v[N];int main() {mt19937_64 rng(random_device{}()); // 注意这种生成随机数的方法!!!F(i, 0, N - 10)v[i] rng();for (R(T); T --; ) {R(n);map &…

笔记2:cifar10数据集获取及pytorch批量处理

(1)cifar10数据集预处理 CIFAR-10是一个广泛使用的图像数据集,它由10个类别的共60000张32x32彩色图像组成,每个类别有6000张图像。 CIFAR-10官网 以下为CIFAR-10数据集data_batch_*表示训练集数据,test_batch表示测试…

分成互质组

题目描述: 给定 n 个正整数&#xff0c;将它们分组&#xff0c;使得每组中任意两个数互质。 至少要分成多少个组&#xff1f; 输入格式 第一行是一个正整数 n。 第二行是 n 个不大于10000的正整数。 输出格式 一个正整数&#xff0c;即最少需要的组数。 #include<iostream…

DDR5和LPDDR4/5 命令解析

关键名称介绍 DDR5 SDRAM和LPDDR4/5都采用了高级的命令集来支持更高效的内存管理和操作,其中“Multi-purpose command (MPC)”、“Mode Register Read (MRR)”、“Mode Register Write (MRW)”,以及“Write Pattern Command”是几种关键的命令类型,它们在内存初始化、配置和…

Windows 虚机扩容C盘

Windows 虚机扩容C盘 操作思路1、新增磁盘容量2、划分磁盘空间3、扩容对应盘 操作步骤 操作思路 1、新增磁盘容量 2、划分磁盘空间 3、扩容对应盘 操作步骤 1、虚机新增磁盘空间 先确认宿主机是否有足够空间&#xff0c;有足够空间后&#xff0c;编辑虚机&#xff0c;增加…

【Java】山外有山,类外还有类

【Java】山外有山&#xff0c;类外还有类 内部类是Java语言中的一种特性&#xff0c;它允许在另一个类中定义一个类。 内部类可以是静态的&#xff08;不依赖于外部类的实例&#xff09;&#xff0c;也可以是非静态的&#xff08;依赖于外部类的实例&#xff09;。 在本篇博…

不止是搭建 | 极空间虚拟机安装一个可做生产力的Ubuntu桌面系统以及后续优化

不止是搭建 | 极空间虚拟机安装一个可做生产力的Ubuntu桌面系统以及后续优化 哈喽小伙伴们好&#xff0c;偶是Stark-C~ 我在上篇极空间文章中不是给小伙伴们分享了使用虚拟机安装软路由固件『iStoreOS』的教程嘛&#xff1a; 打造Docker完全体&#xff0c; 开箱即用的各类插…

通过 Java 操作 redis -- hash 哈希表基本命令

目录 使用命令 hset&#xff0c;hget 使用命令 hexists 使用命令 hdel 使用命令 hkeys&#xff0c;hvals 使用命令 hmget&#xff0c;hmset 关于 redis hash 哈希表类型的相关命令推荐看Redis - hash 哈希表 要想通过 Java 操作 redis&#xff0c;首先要连接上 redis 服务…

手撕多线程

用一个双线程轮流打印1-100 // 定义一个类&#xff0c;用于交替打印奇偶数 public class AlternatePrinting {// 当前待打印的数字&#xff0c;初始为1private int currentNumber 1;// 用作线程间同步的锁对象private final Object lock new Object();// 程序入口public sta…

企业做网站,如何设计才有创意?

企业做网站&#xff0c;如何设计才有创意&#xff1f;我们都希望能打造一个有创意的网站建设&#xff0c;能在众多网站中脱颖而出&#xff0c;能够营销推广公司的产品&#xff0c;为公司带来更多的经济效益收益。广州网站建设的时候&#xff0c;记住直观的设计可以让用户体验更…

福州网站建设如何设计极简风格合理?

福州网站建设如何设计极简风格合理&#xff1f;企业网站逐渐流行&#xff0c;每个人的审美也发生着巨大的改变&#xff0c;开始追求一种极简的风格。简单的 风格才能够凸显原有的主题&#xff0c;不会太过主次不分。 越来越多的网站建设中选择极简的风格&#xff0c;简单的页面…

在Leaflet中点对象使用SVG和Canvas两种模式的对比

目录 前言 一、关于SVG和Canvas 1、SVG知识 2、Canvas知识 3、优缺点 二、SVG和Canvas在Leaflet的使用 1、相关类图 2、Leaflet的默认展示方式 三、SVG和Canvas实例及性能对比 1、SVG模式及性能对比 2、Canvas优化 总结 前言 众所周知&#xff0c;在Leaflet当中&#…