工程经验 - 大模型基本原理

Ilya Sutskever:“神经网络学到的是生成文本的过程中的某种表示,这些模型的生成文本实际上是真实世界的投影……(语言模型)对下一个单词的预测越准确,(对于世界知识)保真度就越高,在这个过程中获得的分辨度就越高……”

本文为我阅读开源书籍 大语言模型 - 赵鑫 李军毅 周昆 唐天一 文继荣 著 的一些速记整理,用于了解近期大模型发展以及作为一名大模型算法工程师的基本工作内容(训练模型、优化模型)

一、时间线

大模型

image-20240506114508808.png
GPT

image-20240506171948273.png

二、训练

大语言模型采用了看起来非常简单的训练任务(即预测下一个词元),通过在大规模文本数据上进行无监督预训练,就能获得解决各种下游任务的通用潜力。在此之前的模型,通常需要尽可能地扩展训练任务或者标注数据以获得较好的多任务学习能力。

从机器学习的观点来说,神经网络是一种具有特定模型结构的函数形式,而大语言模型则是一种基于 Transformer 结构的神经网络模型。因此,可以将大语言模型看作一种拥有大规模参数的函数,它的构建过程就是使用训练数据对于模型参数的拟合过程。

2.1 Transform 架构

总览

Transformer 是由多层的多头自注意力(Multi-head Self-attention)模块堆叠而成的神经网络模型。原始的 Transformer 模型由编码器和解码器两个部分构成,而这两个部分实际上可以独立使用,例如基于编码器架构的 BERT 模型和解码器架构的 GPT 模型。

与 BERT 等早期的预训练语言模型相比,大语言模型的特点是使用了更长的向量维度、更深的层数,进而包含了更大规模的模型参数,并主要使用解码器架构,对于 Transformer 本身的结构与配置改变并不大。

优势

Transformer 的一个主要优势就是其模型设计对于硬件非常友好,可以通过 GPU 或者 TPU 进行加速训练,这为研发大语言模型提供了可并行优化的神经网络架构。基于 Transformer 架构,谷歌进一步提出了预训练语言模型 BERT,采用了仅有编码器的 Transformer 架构,并通过在大规模无标注数据上使用专门设计的预训练任务来学习双向语言模型。

核心组件

  • 输入编码:首先经过一个输入嵌入模块(Input Embedding Module)转化成词向量序列
  • 多头自注意力机制:多头自注意力是 Transformer 模型的核心创新技术。多头自注意力机制能够直接建模任意距离的词元之间的交互关系。RNN 循环神经网络迭代地利用前一个时刻的状态更新当前时刻的状态, 因此在处理较长序列的时候,常常会出现梯度爆炸或者梯度消失的问题。CNN 卷积神经网络中,只有位于同一个卷积核的窗口中的词元可以直接进行交互,通过堆叠层数来实现远距离词元间信息的交换。自注意力的计算过程对于基于硬件的并行优化(如 GPU、TPU 等)非常友好,因此能够支持大规模参数的高效优化。
  • 前馈网络层:对于每个位置的隐藏状态进行非线性变换和特征提取
  • 编码器:编码器(Encoder)的作用是将每个输入词元都编码成一个上下文语义相关的表示向量
  • 解码器:基于来自编码器编码后的最后一层的输出表示以及已经由模型生成的词元序列,执行后续的序列生成任务。
image-20240510143120301

2.2 基于 State Space Model 的架构

Transformer 的问题

Transformer 的自注意力机制在计算每个词元时都需要利用到序列中所有词元的信息,这导致计算和存储复杂度随输入序列长度的平方级别增长。在处理长序列时,这种复杂性会消耗大量的计算资源与存储空间。

为了解决这个问题,研究人员致力于新型模型架构的设计。这些新型模型大多基于参数化状态空间模型(State Space Model, SSM)进行设计,在长文本建模效率方面相比 Transformer 有了大幅改进,同时也保持了较好的序列建模能力。

概念

状态空间模型是一种动态时域模型,在控制系统、经济学等多个领域都有着广泛应用。近年来,深度学习领域也开始引入参数化状态空间模型对于序列数据进行建模。通俗来说,参数化状态空间模型可以看作是循环神经网络和卷积神经 网络的“结合体”。一方面,该模型可以利用卷积计算对输入进行并行化编码。另一方面,该模型在计算中不需要访问前序的所有词元,仅仅利用前一个词元就可以自回归地进行预测。因此,该模型在解码时展现出了更高的计算效率。

特点

状态空间模型计算效率较高,但是在文本任务上的表现相比 Transformer 模型仍有一定的差距。为此,一系列研究工作对于状态空间模型进行了性能改进,在保证计算效率的同时提高其语言建模的能力。代表性模型包括 Mamba、RWKV(Receptance Weighted Key Value)、RetNet(Retentive Network)和 Hyena 等

Mamba

相比于标准状态空间模型,Mamba 展现出了更好的文本建模性能,但是由于引入了关于 𝒙𝑡 的非线性关系,Mamba 无法利用快速傅里叶变换实现高效卷积计算。

RWKV

RWKV 尝试将 RNN 和 Transformer 的优点进行结合,继承了 Transformer 的建模优势和 RNN 的计算效率。类似于 Mamba,RWKV 在解码过程中可以像 RNN 一样只参考前一时刻的状态,但是在训练过程中缺乏并行计算的能力。

RetNet

类似于标准状态空间模型,RetNet 同时保留了循环计算和并行计算的优点。

Hyena

提出使用长卷积模块(Long Convolution)来替换 Transformer 架构中的注意力模块,从而借助卷积的快速傅里叶变换来提高计算效率。

2.3 LoRA 微调方法

低秩适配(Low-Rank Adaptation, LoRA),一种参数高效的微调方法

image-20240510143120301

大语言模型中包含大量的线性变换层,其中参数矩阵的维度通常很高。研究人员发现模型在针对特定任务进行适配时,参数矩阵往往是过参数化(Over-parametrized)的,其存在一个较低的内在秩。为了解决这一问题,LoRA 提出在预训练模型的参数矩阵上添加低秩分解矩阵来近似每层的参数更新,从而减少适配下游任务所需要训练的参数。

尽管 LoRA 能够有效地节省显存,但对于参数规模达到上百亿级别的模型而言,其微调所需的成本仍然相当高昂。

2.4 RLHF 基于人类反馈的强化学习

基于人类反馈的强化学习(Reinforcement Learning from Human Feedback, RLHF)

过程:

RLHF 首先需要收集人类对于不同模型输出的偏好,然后使用收集到的人类反馈数据训练奖励模型,最后基于奖励模型使用强化学习算法(例如 Proximal Policy Optimization, PPO [51]) 微调大语言模型。

关键步骤:

监督微调。为了让待对齐语言模型具有较好的指令遵循能力,通常需要收集高质量的指令数据进行监督微调。指令数据一般包括任务描述和示例输出,可以由人类标注员针对特定任务编写,也可以由大语言模型自动生成。

奖励模型训练。 第二步是使用人类反馈数据训练奖励模型。具体来说,首先使用语言模型针对任务指令生成一定数量的候选输出。随后,邀请标注员对于输出文本进行偏好标注,这个标注过程可以采用多种形式,其中最常用的是对候选文本进行排序标注,这样可以有效减少多个标注员之间的不一致情况。进一步,使用人工标注的偏好数据进行奖励模型的训练,使其能够建模人类偏好。

强化学习训练。在这一步骤中,语言模型对齐被转化为一个强化学习问题。 具体来说,待对齐语言模型担任策略实施者的角色(称为策略模型),它接收提示作为输入并返回输出文本,其动作空间是词汇表中的所有词元,状态指的是当前已生成的词元序列。奖励模型则根据当前语言模型的状态提供相应的奖励分数,用于指导策略模型的优化。为了避免当前训练轮次的语言模型明显偏离初始(强化学习训练之前)的语言模型,通常会在原始优化目标中加入一个惩罚项(如 KL 散度)。

2.5 基本过程

本质

本质上都是在做模型参数的优化。大语言模型的优化目标更加泛化,不仅仅是为了解决某一种或者某一类特定任务,而是希望能够作为通用任务的求解器,训练的三个过程:

  1. 大规模预训练
  2. 指令微调
  3. 人类对齐

大规模预训练

由于 GPT 系列模型的爆火,“解码器架构 + 预测下一个词”的有效性得到了充分验证,已经成为现有大语言模型主要采纳的技术路径。

为了预训练大语言模型,需要准备大规模的文本数据,并且进行严格的清洗, 去除掉可能包含有毒有害的内容,最后将清洗后的数据进行词元化(Tokenization) 流,并且切分成批次(Batch),用于大语言模型的预训练

经过大规模数据预训练后的语言模型已经具备较强的模型能力,能够编码丰富的世界知识,但是由于预训练任务形式所限,这些模型更擅长于文本补全,并不适合直接解决具体的任务。

预训练的步骤有:

  1. 数据预处理:当收集了丰富的文本数据之后,为了确保数据的质量和效用,还需要对数据进行预处理,从而消除低质量、冗余、无关甚可能有害的数据。主要使用以下两种数据清洗方法:(1) 基于启发式规则的方法(2)基于分类器的方法。
  2. 敏感内容过滤:基于分类器的过滤方法 & 使用启发式方法,如关键字识别,来检测、替换占位符和删除这些私人信息。
  3. 数据去重:去重可以在句子级别、文档级别和数据集级别等多种粒度上进行。例如,可以计算两个句子之间公共子串的长度,当其长度过长时直接删除某一个句子。对于精确匹配来说,通常使用后缀数组来匹配最小长度的完全相同子串。对于近似匹配来说,可以 采用局部敏感哈希(Locality-Sensitive Hashing, LSH)算法,如最小哈希(MinHash)来实现。
  4. 词元化:将原始文本分割成模型可识别和建模的词元序列,作为大语言模型的输入数据。子词分词器(Subword Tokenizer)被广泛应用于基于 Transformer 的语言模型中,包括 BPE 分词、WordPiece 分词和 Unigram 分词三种常见方法
  5. 数据调度:设计合适的调度策略来安排这些多来源的数据,进而用于训练大语言模型。主要关注两个方面:各个数据源的混合比例以及各数据源用于训练的顺序(称为数据课程,Data Curriculum)。

一些实例:

  • 代码能力。为了提高大语言模型的代码生成能力,研究人员基于 LLaMA 2 开发了 CodeLLaMA,能够更为有效地执行代码任务。采用的数据为: 2T 通用词元 → 500B 代码密集型词元。这CodeLLaMA 还提供了一个面向 Python 语言的特定代码大模型, 即 CodeLLaMA-Python,采用了如下的数据训练课程:2T 通用词元 → 500B 代码 相关的词元 → 100B Python 代码相关的词元。
  • 数学能力。 Llemma 是一个具有代表性的数学大语言模型,有效提升了通用大语言模型的数学能力。整体的数据课程为:2T 通用词元 → 500B 代码相关的词元 → 50∼200B 数学相关的词元。
  • 长文本能力。 长文本理解与生成是大语言模型的一项重要能力。很多研究工作通过继续预训练有效扩展了大语言模型的上下文窗口 ,主要是针对 RoPE 中的位置嵌入编码进行修改。CodeLLaMA 将 LLaMA-2 的上下文窗口从 4K 扩展到了 100K,所采用的数据课程为:2.5T 词元,4K 上下文 窗口 → 20B 词元,16K 上下文窗口。

指令微调

目前来说,比较广泛使用的微调技术是“指令微调”(也叫做有监督微调, Supervised Fine-tuning, SFT),通过使用任务输入与输出的配对数据进行模型训练, 可以使得语言模型较好地掌握通过问答形式进行任务求解的能力。这种模仿示例数据进行学习的过程本质属于机器学习中的模仿学习(Imitation Learning)。给定一个特定任务,虽然可能存在很多解答方式,模仿学习旨在加强对于标准答案(即师傅的示范动作)的复刻学习。

人类对齐

在指令微调后使用强化学习加强模型的对齐能力。具体来说,例如在 RLHF 算法中,需要训练一个符合人类价值观的奖励模型 (Reward Model)。为此,需要标注人员针对大语言模型所生成的多条输出进行偏好排序,并使用偏好数据训练奖励模型,用于判断模型的输出质量。

2.6 数据集

  1. 网页:网页是大语言模型训练语料中最主要的数据来源,包含了丰富多样的文本内 容,例如新闻报道、博客文章、论坛讨论等;有专门爬取这些数据的网站,Common Crawl、Colossal Clean Crawled Corpus 等
  2. 书籍:BookCorpus、 Project Gutenberg 等
  3. 维基百科
  4. 代码:Github、StackOverflow

2.7 长上下文研究

方向

在实际应用中,大语言模型对于长文本数据的处理需求日益凸显,尤其在长 文档分析、多轮对话、故事创作等场景下。

目前,增强大语言模型长文本建模能力的研究主要集中在两个方向:一是扩展位置编码,二是调整上下文窗口

扩展位置编码

在基于 Transformer 架构的大语言模型中,模型的上下文建模能力通常受到训练集中文本数据长度分布的限制。因此,当大语言模型面临超出其最大训练长度的任务时,需要对于位置编码进行扩展,以适应更长的绝对或相对位置。某些特定的位置编码在超出原始上下文窗口的文本上,也能够表现 出较好的建模能力,这种能力通常被称为外推(Extrapolation)能力。

直接微调

为了使大语言模型适应更长的上下文长度,一种直接的策略是使用相应的长文本数据对于模型进行微调。在这种情况下,模型可以直接根据相对位置计算出 对应的位置编码,而无需对 RoPE 本身进行任何修改。

位置索引修改

鉴于直接微调可能引发旋转角度增大和注意力值爆炸的问题,有必要对旋转角度施加限制,以确保拓展后的上下文窗口中的旋转角度得到充分且有效的训练。为实现这一目标,可以通过修改位置索引 𝑔(𝑡) 来调整所有子空间的旋转角度,从而保证其不超过原始上下文窗口所允许的最大值。

调整上下文窗口

采用受限的注意力机制来调整原始的上下文窗口,从而实现对更长文本的有效建模。

  • 并行上下文窗口:该方法将输入文本划分为若干个片段,每个片段都进行独立的编码处理, 并共享相同的位置编码信息。在生成阶段,通过调整注意力掩码,使得后续生成 的词元能够访问到前序的所有词元。然而,该方法无法有效地区分不同段落之间的顺序关系,在某些特定任务上可能会限制模型的表现能力。
  • Λ 形上下文窗口:有选择性地关注每个查询的邻近词元以及序列起始的词元,同时忽略超出这一范围的其他词元。在给定的有限内存资源下,这种方法能够生成几乎无限长的流畅文本。然而,由于无法有效利用被忽略的词元信息,这种方法无法充分利用所有的上下文信息。

三、能力

3.1 Scaling Law(扩展法则)

研究人员发现,通过规模扩展 (如增加模型参数规模或数据规模)通常会带来下游任务的模型性能提升,这种现象通常被称为“扩展法则”(Scaling Law)。扩展法则使用语言建模损失来衡量语言模型的整体性能,整体上展现出了较为平滑的性能提升趋势,具有较好的可预测性, 但是指数形式暗示着可能存在的边际效益递减现象

在较早期的研究中, OpenAI 从参数、数据、算力三个方面深入地研究了规模扩展对于模型性能所带来 的影响,建立了定量的函数关系,称之为“扩展法则”(Scaling Law),

后续 DeepMind 团队提出了 Chinchilla 扩展法则

越来越多的工作表明,现有的预训练语言模型对于数据的需求量远高于这些扩展法则中所给出的估计规模。例如,LLaMA-2 (7B) 的模型就使用了 2T 的词元进行训练,很多更小的模型也能够通过使用超大规模的预训练数据获得较大的模型性能提升。这种现象的一个重要原因是由于 Transformer 架构具有较好的数据扩展性,到目前为止,还没有实验能够有效验证特定参数规模语言模型的饱和数据规模(即随着数据规模的扩展,模型性能不再提升)。

根据 GPT-4 的 报告 [35],通过扩展法则可以准确预测某些任务能力(例如编码能力),但是对于有些任务的性能预测是非常困难的。此外,有些重要能力(例如上下文学习能 力 [23])根据扩展法则是不可预测的,只有当模型大小超过一定规模时才会出现,涌现能力。

3.2 Emergent Abilities(涌现)

例如,GPT-3 可以通过“上下文学习”(In-Context Learning, ICL)的方式来利用少样本数据解决下游任务,而 GPT-2 则不具备这一能力。这种大模型具 有但小模型不具有的能力通常被称为“涌现能力”(Emergent Abilities)。涌现能力通常使用任务性 能来衡量模型性能,整体上展现出随规模扩展的骤然跃升趋势,不具有可预测性,但是一旦出现涌现能力则意味着模型性能将会产生大幅跃升

大语言模型的涌现能力被非形式化定义为“在小型模型中不存在但在大模型中出现的能力”,具体是指当模型扩展到一定规模时,模型的特定任务性能突然出现显著跃升的趋势,远超过随机水平。

大模型中某些重要能力(如上下文学习能力)的涌现仍然缺乏形式化的理论解释,需要针对大语言模型基础能力的形成原因进行深入研究,从而揭示大语言模型内部的工作机理。

三种涌现能力:

  1. 上下文学习(In-context Learning, ICL):在提示中为语言模型提供自然语言指令和多个任务示例(Demonstration),无需显式的训练或梯度更新,仅输入文本的单词序列 就能为测试样本生成预期的输出
  2. 指令遵循(Instruction Following):大语言模型能够按照自然语言指令来执行对应的任务,为了获得这一能力,通常需要使用自然语言描述的多任务示例数据集进行微调,称为指令微调(Instruction Tuning)或监督微调(Supervised Fine-tuning)
  3. 逐步推理(Step-by-step Reasoning):对于小型语言模型而言,通常很难解决涉及多个推理步骤的复杂任务(如数学应用题),而大语言模型则可以利用思维链 (Chain-of-Thought, CoT)提示策略来加强推理性能。具体来说,大语言模型可以在提示中引入任务相关的中间推理步骤来加强复杂任务的求解,从而获得更为可靠的答案。

目前还缺少对于大语言模型涌现机理的基础性解释研究工作。与这一问题较为相关的研究叫做“顿悟”(Grokking),是指训练过程中的一种数据学习模式:模型性能从随机水平提升为高度泛化。

3.3 Reasoning (推理能力)

尽管有些研究工作 认为大语言模型不具备真正的推理能力,而是通过“记忆”数据模式来进行任务 求解,但在许多复杂应用场景中(参阅微软针对 GPT-4 的测试报告 [20]),大语言模型展现出了令人震撼的推理性能,这种现象很难完全通过数据模式的记忆与组合来进行解释。

3.4 特定能力增强

OpenAI 探索了两种主要途径来改进 GPT-3 模型,即代码数据训练和人类偏好对齐。

代码数据训练:

  1. OpenAI 于 2021 年 7 月推 出了 Codex ,这是一个在大量 GitHub 代码数据集合上微调的 GPT 模型。实验 结果表明,Codex 可以解决非常困难的编程问题,还能显著提升大模型解决数学问题的能力。
  2. GPT-3.5 模型是在基于代码训练的 GPT 模型(即 code-davinci-002)基础上开发的,这表 明在代码数据上进行训练有助于提高 GPT 模型的综合性能,尤其是代码能力。

人类对齐:

2022 年 1 月,OpenAI 正式推出 InstructGPT 这一具有重要影响力的学术工作,旨在改进 GPT-3 模型与人类对齐的能力,正式建立了基于人类反馈的强化学习算法,即 RLHF 算法。

四、成本优化

4.1 MoE(混合专家模型)

大语言模型能够通过扩展参数规模实现性能的提升。然而, 随着模型参数规模的扩大,计算成本也随之增加。为了解决这一问题,研究人员 在大语言模型中引入了基于稀疏激活的混合专家架构(Mixture-of-Experts, MoE), 旨在不显著提升计算成本的同时实现对于模型参数的拓展。目前具有代表性的混合专家模型是 Mixtral (8×7B),该模型在 Mistral (7B) 的 基础上,使用了混合专家模块。具体来说,Mixtral 每一层都配备了 8 个专家(7B);Mixtral 每一层都配备了 8 个专家(7B), 并对每个词元选择 2 个专家进行后续计算。在每次计算被激活的参数仅仅有 13B 的情况下,其性能超越了更熟规模更大的 LLaMA-2 (70B),

4.2 模型压缩

概念

由于大模型的参数量巨大,在解码阶段需要占用大量的显存资源,因而在实际应用中的部署代价非常高。因此需要模型压缩来减少大模型的显存占用。

模型量化(Model Quantization)

在神经网络压缩中,量化通常是指从浮点数到整数的映射过程,目前比 较常用的是 8 比特整数量化,即 INT8 量化。针对神经网络模型,通常有两种类型 的数据需要进行量化,分别为权重量化(也称为模型参数量化)和激活(值)量 化,它们都以浮点数形式进行表示与存储。模型量化方法可以分为两大类,即量化感知训练(Quantization-Aware Training, QAT)和训练后量化(Post-Training Quantization, PTQ)。量化感知训练方法需要更新权重进而完成模型量化,而训练后量化方法则无需更新模型权重。与小型语言模型相比,在为大语言模型设计或选择量化方法时需要侧重关注两个主要因素。首先,大语言模型由大规模神经网络参数组成,在设计量化算法时需要考虑到所需要花费的计算开销。一般来说,训练后量化方法需要更少的算力开销,实践中应用更为广泛。

实例工具:

  1. bitsandbytes 基于 LLM.int8()和 8 比特优化器方法开发而成。该库主要专注于大语言模型的 INT8 量化,主要提供对 8 比特矩阵乘法和 8 比特优化器的支持。在使用上,bitsandbytes 已 经集成在 Hugging Face 中,可以在加载模型时直接通过运行参数指定实现对模型 权重的量化。例如,可以使用参数 load_in_8bit 和 load_in_4bit 对模型进行 8 比特和 4 比特量化。
  2. GPTQ-for-LLaMA,在使用该库的情 况下,完成如 LLaMA (7B) 模型的解码实验只需要单张 RTX3090 (24G) 即可,能够有效降低模型对于显存资源的需求。

模型蒸馏(Model Distillation)

模型蒸馏(Model Distillation)的目标是将复杂模型(称为教师模型)包含的知识迁移到简单模型(称为学生模型)中,从而实现复杂模型的压缩。一般来说, 通常会使用教师模型的输出来训练学生模型,以此来传递模型知识。以分类问题 为例,教师模型和学生模型在中间每一层会输出特征表示(特指神经网络模型), 在最后一层会输出针对标签集合的概率分布。模型蒸馏的核心思想是,引入额外的损失函数(称为蒸馏损失函数),训练学生模型的输出尽可能接近教师模型的输出。

模型剪枝(Model Pruning)

模型剪枝(Model Pruning)的目标是,在尽可能不损失模型性能的情况下,努 力消减模型的参数数量,最终有效降低模型的显存需求以及算力开销。

结构化剪枝。 结构化剪枝(Structured Pruning)旨在去除对于性能影响较小的模型组件,可以删除神经元、通道甚至中间层。大语言模型都是由多个 Transformer 层叠加而成。结构化剪枝的核心思想是,在尽量保持模型预测精度的条件下,去除那些对于结果影响不大的结构单元,如注意力机制中的注意力头、前馈层权重中的特定维度等。可以显著减少所需的矩阵乘法次数,实现模型的压缩和加速。

非结构化剪枝。非结构化剪枝 并不修改模型的结构。一般来说,模型权重都是以矩阵形式进行表示与存储的,非结构化剪枝通过创建一个包含 0/1 的掩码矩阵,并将这一矩阵与原始的权重相乘, 其中 0 所在位置的权重则不会在模型的计算中产生作用。当剪枝完成后,那些被剪枝掉的位置只会存储数值 0,从而节省了存储空间。非结构化剪枝一般可以实现更高的剪枝比率,但是不会显著加速模型的计算过程,因为被掩码的部分可能仍然需要参与计算。要想实现加速,则需要特定软件和硬件的支持

工作实例:

  1. SparseGPT:非结构化剪枝,只需要使用 1 张 A100 (80G) 显卡就可以完成对于 175B 参数规模大语言模型(如 OPT 模型)的剪枝,实现 60% 模型参数的剪枝,并较好地保持了困惑度不升。
  2. LLM-prune:结构化剪枝,在 LLaMA (7B) 上实现了剪枝 20% 参数但是依然保持原始模型 93.6% 的预测精度。
  3. Sheared LLaMA:结构化剪枝,将 LLaMA-2 (7B) 剪枝得到 2.7B 参 数规模,保持原始模型 87.8% 的预测精度。

五、规划能力

5.1 概念

规划旨在为目标任务制定包含一系列动作的解决方案,是大语言模型解决复 杂问题能力的重要体现,也是自主智能体最重要的核心能力。基本规划框架主要包含方案生成与反馈获取两大关键步骤。

iShot_2024-05-11_17.46.21.png

5.2 方案生成

概念

方案生成主要是基于大语言模型的综合理解与推理能力,通过合适的提示让大语言模型生成目标任务的解决方案。一般来说,解决方案(或者其中包含的中间步骤)可以采用自然语言表达或者代码表达的形式。自然语言的形式较为直观,但由于自然语言的多样性与局限性,不能保证动作被完全正确执行,而代码形式则较为严谨规范,可以使用外部工具如代码解释器等保证动作被正确执行。

在现有的研究中,任务规划器主要采用两种规划方法:一次性的方案生成和迭代式的方案生成。

一次性方案生成

通过特殊设计的提示方法让大语言模型一次性生成完整的解决方案,生成的方案通常包含一系列供规划执行器执行的动作描述

迭代式方案生成

大语言模型基于历史动作和当前环境的反馈逐步规划下一步的执行动作。一个具有代表性的方法是 ReAct ,其核心动机是在让大语言模型在规划动作时模拟人类“先思考-再决策”的行为方式。可以使用回溯策略(Back-tracing)让任务规划器回退到上一步所对应的状态,从而通过探索其他执行动作来优化最终的解决方案。思维树就采用了类似的回溯策略