背景

LLM具有很强的推理能力,但是在现实世界中,将推理转变为行动依然存在着一定的问题。LLM从预训练中获得了大量的先验知识,但在现实世界中它本质上依然是无状态无根据,因此采取的决策往往不是最优的。为了解决这一问题,就使用外部反馈来迭代优化行动。

似乎是会引入强化学习方面的知识,最近强化学习的课也在学马尔可夫决策,最优策略、最优价值什么的。看了导言说是用prompt模板作为驱动,依据外部反馈的历史信息更新prompt,再由prompt驱动决策产生和优化,感觉像这个形式,如果是这样的话其实我写的小说创作大模型的生成过程和这一框架非常地接近

他们特别考虑了样本效率这一因素,也就是他们的目标是让智能体在与环境少交互的情况下依然能完成给定任务。

强化学习确实在引言部分被提到了,说强化学习技术与大模型由于种种原因存在一定差异

强化学习技术在数字系统中,而大模型则是语法系统
大模型由通用语料库训练,强化学习则在反馈与迭代中学习

看了一下框架图,这个框架主要由2个部分组成,一个外部memory buffer,一个agent, agent内部又包含有学习以及推理两个部分,学习是通过外部记忆缓存输入到prompt然后又大模型更新基于外界反馈的后验知识然后生成价值函数或者奖励转换模型,再将这一结果送到推理模块,依据价值函数或奖励模型产生一个树状的决策过程(?)然后选择价值最大的决策过程,并在其中选择下一步的行动立即行动,并将外部结果转存到外部记忆中。

通过一次生成长远的决策过程,每次依据外界环境对当前决策进行优化,来避免频繁地与外部环境交互

然后就是一些相关技术的介绍,比如大模型和in-context learning

in-context learning就是一种让大模型仅通过观察给定的一系列例子(即上下文)来学习和执行新的任务,而无需外部的参数更新或显式的训练过程。
贝叶斯框架下的强化学习,大模型各种形式的推理、以及与外部环境交互的闭环框架等等,以及这些内容与RAFA的联系

在与外部环境交互的闭环框架中,我看到文章中提到了反射框架,语言模型能够从反馈中学习来修改预先生成的轨迹的当前行为,特别是当他们犯错误时,这个论文我在课程上听到过学生进行汇报,作者特意强调了这个框架的局限性在与对局部策略的修改是短视的,忽略了对长期决策的影响。

但我觉得这两个框架的思想是挺像的

后续有个对于这个框架的改进用来手工避免非最优决策的产生,然后这一方法在没有足够领域知识下也很难达到最优的结果。然后作者就说了自己的框架怎么怎么好.

衔接大模型和强化学习

首先介绍符号意思,与课上讲的马尔可夫决策过程几乎相近。最优价值、最优策略等等.

算法

算法框架

与我之前讲的一致,学习模块利用大模型从buffer中学习外部环境的变化,然后给出长远规划,并由计划模块给出计划轨迹(行动决策),再将反馈存入buffer中,在外部环境发生状态转换时,LLM 代理重新调用推理例程,以从新状态重新规划另一个未来轨迹。

为了避免环境的改变可能让大模型一直在改变规划,作者设置了一个判断,就是判断一个差值,然后决定是否合并反馈信息到buffer中,在下一个改变之前一直使用之前的buffer来达到模型的稳定,具体如何判断等我往下看,这里符号我有点每太搞懂就暂时先略过去.

推理未来

  • Learning subroutine
    主要是将历史数据Dtk映射到转移核和值函数,用于规划子例程。Learning subroutine内部主要有两个大模型实例,一个是Model,用来生成转移核,一个是Critic,用来生成价值函数,用这两个大模型预测出可能的状态和奖励,并返回转移核Pθ和值函数Vπtθ。随着 Dtk 积累越来越多的来自外部环境的反馈,减少了关于未知环境的后验不确定性,以提高Model和Critic的准确性,从而使planning subroutine能够更准确地评估行动的长期结果。

  • Planning subroutine
    主要是生成一个最优策略或多个未来步骤的轨迹,以最大化值函数。Planning subroutine通过模拟规划预言者PL⋆(这个是我没搞清楚的,看起来像是将后验分布参数映射到决策序列的函数)来实现这一目标。planning subroutine将Model和Critic映射到未来轨迹。Planning subroutine的任务是评估θ的最优策略π⋆θ或相应的动作at = π⋆θ(st),从而最大化值函数。Planning subroutine通过最大化未来累积奖励(而不是即时奖励)来返回优化的行动,从而改善长期结果。

在整个推理未来算法介绍下来,我理解的流程是这样的,有一个外部反馈的历史缓存区Dtk,只有在满足一定条件的时候Dtk才会改变成Dtk+1,否则将一直采用Dtk以保证算法的稳定,然后在learning subroutine中有两个大模型Model和Critic,依据特殊设计的prompt与Dtk,分别生成状态转移P和价值函数V,在planning subroutine中有一个Elite大模型用来生成多种动作候选集,迭代次数U作为想要预测的未来长度,从0到U的迭代中,每次取当前状态Su由Elite生成B个动作候选加入到动作集合中,再由Model依据这些动作集合生成它们未来的状态加入到Su+1。迭代完成后,将S0、A0、、SU、AU交由Critic计算最优价值函数,然后选取使其最优的s0、a0、、su、au的序列作为预测,并返回动作a0。

现在行动

在推理未来给出了未来最优的动作与状态序列s0、a0、、su、au后,采取最优动作a0作为当前动作,并忽视后续序列,然后在下一个状态s1的时候重新规划基于s1作为初始状态的最优状态序列。

其实就是在每个状态下都会由推理未来模块给出当前长期价值最大的状态动作序列,并采取该序列的第一个动作并执行
能这么做我认为是由大模型很好地预测了每个动作的下一个状态是什么,并给出了状态下最好的动作(也就是按照这个动作走在未来能取得最好的价值),这样就保证了框架能一直朝着价值最优的方向前进,即使环境会发生变化,框架也能根据变化及时调整。

理论推导

目前还不想看,看完实验就去玩代码去

实验

实验在文本环境中进行Game of 24, ALFWorld, BlocksWorld, and Tic-Tac-Toe.

使用大模型在文本环境中进行比较我觉得其实,,,可能,,,用一些稍微有点设计的框架,在框架中给出prompt是让模型朝着目标行动的,(如果这个大模型性能非常好的话)都能获得一个非常好的提升,这一感想来自于多智能体课程中同学分享的反思框架,也是这篇论文之前专门提到和对比的一个框架。
要看一个框架是否真的在下游任务中有效我觉得要对比不同参数量的模型在使用这个框架后,与仅仅依靠prompt的模型在处理任务进行比较。

在Game of 24中,RAFA取得了最优的成绩,RAFA和reflexion相比,RAFA从GPT3.5到GPT4提升非常明显,从{29%,46%}到{89%, 93%}(B = {1,2},这个是之前Elite生成候选动作集的大小,当B=1的时候生成一条链,当B=2的时候就是生成一个二叉树),而reflexion只是从16%到21%。

ALFWorld,一个文本描述的环境提供大模型进行交互,要求大模型在该环境中完成任务,
总而言之是在一次迭代之后性能就优于其它框架了。

BlocksWorld,移动盒子的任务达到特定状态,有点像多智能体课程上讲的偏序规划和图规划能解决的问题。这里选用的模型是Vicuna的各种参数量级的模型,分别是13B和33B模型在4步和6步问题上进行求解,这两个模型的正确率最终其实差不多,只是一开始的正确率13B会低一点。

Tic-Tac-Toe 三子棋(井字棋)在,这个实验使用的GPT4模型,在B={3,4}进行实验,越多的动作候选保证了更高的胜率。

感想

刚看完实验准备吃饭去,下午看代码了,如果可以的话说不定可以用在我的小说模型上面
理论推导证明我都没看,有空再看,还有下面的prompt的设计(我看看也就这样)可以稍微借鉴一下。

然后就是这个框架的设计思路,将大模型与强化学习结合起来,由大模型给出状态转移、价值判断和动作候选(论文似乎没写这个大模型的prompt是如何设计的)

不过一个框架有3个大模型实例,我觉得计算开销会不会非常大代码里看到是调用api🥲(那对网络要求很高吧,最近一直想搞本地部署大模型,先入为主了),而且除了环境buffer,大模型本身好像也会有历史上下文的存在,不知道如果环境buffer进行更新后大模型本身的上下文是否会对新的环境下的决策产生影响?

我的想法是也可以使用几个大模型分别帮我生成历史文章概要、小说人物历史、未来小说大纲三个部分,并更新驱动prompt,每次迭代过程中由小说创作模型接收驱动prompt写出小说片段(类似于Dt),然后再由总结模型依据驱动prompt和当前小说片段对历史文章概要进行总结,由人物模型更新小说人物历史,再有预测模型依据前两者的结果以及小说总体走向对未来小说大纲进行一个编写

代码

这个实验的代码看着挺奇怪的,明明提出的是一个框架,但是这几个实验的代码几乎完全没有复用这个框架,差不多是一个实验一个代码,与我本科学习的设计模式主旨挺违背的。

代码可读性也不是很高。看着好累。

  1. ALFWorld

    这个实验都不能运行! 我按照他们给的环境配置方式配置了环境,但是在运行的时候一个外部库报错没有对函数的定义。

    在看论文的时候就挺好奇的这个历史环境buffer是如何实现的,就先看了这部分代码,里面主要的结构就是字典列表,我对于buffer状态的改变是比较好奇的,论文中似乎对Dtk的改变情况有一个证明(我没看)。

    很奇怪的是这个历史环境buffer我只在这个实验中看到了,其它实验并没有看到对于这个类的引用或者另外的实现

    1
    2
    3
    4
    5
    6
    class EnvironmentHistory:
    def __init__(self, base_query: str, start_info, memory: List[str], history: List[Dict[str, str]] = []) -> None:
    self._cur_query: str = f'{_get_base_query(base_query, start_info, memory)}'
    self._history: List[Dict[str, str]] = history
    self._last_action: str = ''
    self._is_exhausted: bool = False

    其中的is_exhausted就是判断状态改变的,判断依据的话我看代码是如果两次agent选择的行动相同则说明环境穷尽了需要更换策略。

    1
    2
    3
    4
    5
    6
    def add(self, label: str, value: str) -> None:
    assert label in ['action', 'observation', 'critic', 'human_edit']
    self._history += [{
    'label': label,
    'value': value,
    }]

    这个类存储这四个键,后续会从这个类取值组成prompt

    其实感觉学习这个框架,更像是学习他们对于特定任务的prompt的设计

关于这个框架代码我觉得其实没什么看到必要,因为框架设计本身就很简单,他们对于代码的设计也就是考虑了prompt的格式以及何时将prompt喂给大模型而已。

还有关于多智能体课程上对这类大模型决策框架,有些同学就说框架做了白做对于大模型本身没有什么提升。我觉得框架的提出只是让大模型能和下游任务对齐,在某一方面更好地发挥大模型的能力而不是让大模型提升某一方面的能力,就像之前的卷积神经网络应用在各种视觉任务中,引入它们的目的都是为了让它们能对齐下游任务,发挥应有的能力而已,对于本身提升都是没有的,在卷积神经网络方面,人们还能对特定任务进行特定网络结构的设计,到大模型就要考虑计算成本而不轻易改变网络结构的。

我认为这种框架的提出算是一种启发性的方式,让人们知道如何引入大模型到决策层面的东西,将原本可能需要人来设计特定的决策范式变为现在通用大模型的特化应用,虽然大模型的训练可能硬件和时间成本非常高,但是一旦训练完就可以应用到各种领域中,而特定设计的决策范式则只能应用在某一领域中,相比较来说大模型也是具有很大的优势的,特别是在智能体领域需要个体自行决策运行具有自主性的领域(这也是为什么在过去大模型还没有提出的时候,在智能体领域方面没有特别出现令人震撼的产出,或者其实是有很让人震惊的结果但是时效性过强被淹没在智能发展的洪流中,但随着大模型的提出越来越多有趣让人振奋的应用被提出,越来越多人将大模型投入智能体领域的研究)。

当然这种框架设计我觉得可能长远来看在论文发表上是走不太远的,越设计到后面,泛用性普适性的框架可能就会越来越重要,这个时候仅仅依赖框架的设计可能回归到大模型之前的情况,引入越来越多人手工设计、引入特别多的先验知识、一直在trade-off泛用性和有效性,我觉得没有通用智能的技术是难以实现的,需要更加通用的人工智能技术像是AGI的实现,或者在决策方面专门提出一个模型能进行通用输入同时产生一种通用输出(这个应该也算是AGI了)。

来自我的臆想