要让大型语言模型(llm)充分发挥其能力,有效的 prompt 设计方案是必不可少的,为此甚至出现了 prompt engineering(提示工程)这一新兴领域。
在各种 prompt 设计方案中,思维链(cot)凭借其强大的推理能力吸引了许多研究者和用户的眼球,基于其改进的 cot-sc 以及更进一步的思维树(tot)也收获了大量关注。
近日,苏黎世联邦理工学院、cledar 和华沙理工大学的一个研究团队提出了更进一步的想法:思维图(got)。让思维从链到树到图,为 llm 构建推理过程的能力不断得到提升,研究者也通过实验证明了这一点。他们也发布了自己实现的 got 框架。
研究论文:https://arxiv.org/pdf/2308.09687v2.pdf
官方实现:https://github.com/spcl/graph-of-thoughts
论文概览
大型语言模型正在变成人工智能世界的主导技术。近些年高速发展的模型主要基于仅解码器 transformer 的变体,比如 gpt、palm 或 llama。
而在解决不同的 llm 任务时,prompt 工程设计是一种能高效利用资源的方法。简单来说,就是在发送给 llm 的输入中包含对任务的描述。如果能以适当的形式描述该任务,那么 llm 就能借助其用于生成文本的基于自回归 token 的机制来解决该任务。这样的 prompt 可能包含带有解答的示例任务(少样本 prompt 设计,也被称为上下文学习(icl),也可能完全不包含示例任务(零样本 prompt 设计)。近些年的研究和应用表明,这一机制可用于解决涉及数学、常识或符号推理的多种类型的任务。
思维链(cot)便是一种用于设计 prompt 的方法,即 prompt 中除了有任务的输入和输出外,还包含推理的中间步骤(中间思维)。研究表明,cot 能极大地提升 llm 的能力,使之无需任何模型更新便能解决一些难题。
也有研究者改进了 cot,提出了使用 cot 实现自我一致的方法(cot-sc);这个方案是生成多个 cot,再选出其中最佳的结果。
最近还有研究者更进一步提出了思维树(tot),其做法是通过树(tree)来建模 llm 推理过程。这能让模型使用不同的思维路径,并能提供全新的功能,比如基于不好的结果反向回溯推理过程。不幸的是,由于 tot 方法为思维过程强加了严格的树结构,所以会极大限制 prompt 的推理能力。更多详情请参阅本站文章《思考、思考、思考不停歇,思维树 tot「军训」llm》。
苏黎世联邦理工学院、cledar 和华沙理工大学的这个研究团队认为,如果能将 llm 的思维构建成任意的图结构,那么就能为 prompt 的能力带来重大提升。他们表示,这一想法受到了多种现象的启发,比如人类的推理方式、大脑结构和算法的执行方式。
在进行思考时,人类不会像 cot 那样仅遵循一条思维链,也不是像 tot 那样尝试多种不同途径,而是会形成一个更加复杂的思维网。举个例子,一个人可能会先探索一条思维链,然后回溯再探索另一条,然后可能会意识到之前那条链的某个想法可以和当前链结合起来,取长补短,得到一个新的解决方案。类似地,大脑会形成复杂的网络,呈现出类似图的模式,比如循环模式。算法执行时也会揭示出网络的模式,这往往可以表示成有向无环图。
研究者表示,如果将这种对应的图使能的变换用于 llm 思维,那么有望创造一种强大的设计 prompt 的方法,但这种变换无法通过 cot 或 tot 自然地表达出来。
然后他们观察到:如果将 llm 的推理过程建模成图,那么就能自然地实现这些以及其它许多思维变换。基于这一观察,他们提出了思维图(got/graph of thoughts),这种方法可以通过网络形式的推理来增强 llm 的能力。
在 got 中,一个 llm 思维会被建模成一个顶点,顶点之间的依赖关系则建模为边。使用 got,通过构建有多于一条输入边的顶点,可以将任意思维聚合起来。整体而言,got 使用的图抽象方法可无缝地将 cot 和 tot 泛化到更复杂的思维模式,而且这个过程无需更新模型。
然而,要实际实现 got,还需要解决一些设计上的挑战。比如,对于不同的任务,最佳的图结构是什么样的?为了最大化准确度和最小化成本,聚合思维的最好方法是什么?
为了解答这些问题以及更多其它问题,这些研究者设计了一种实现 got 的模块化架构。该设计有两大亮点。
一是可实现对各个思维的细粒度控制。这让用户可以完全控制与 llm 进行的对话并使用先进的思维变换,比如将正在进行的推理中两个最有希望的思维组合起来得到一个新的。
二是这种架构设计考虑了可扩展性 —— 可无缝地扩展用于新的思维变换、推理模式(即思维图)和 llm 模型。这让用户可使用 got 快速为 prompt 的新设计思路构建原型,同时实验 gpt-3.5、gpt-4 或 llama-2 等不同模型。
研究者也展现了 got 的一些用例(排序、摘要的关键词计数、集合运算、文档合并),他们还详细说明了如何使用基于图的范式来实现它们。他们通过实验评估了 got,展现了其相对于其它当前最佳方法的优势。
研究者表示,整体而言,got 尤其适用于可自然分解成更小子任务的任务,并且这些子任务可以分开解决,然后融合成一个最终解答。在这方面,got 的表现优于其它方案,比如在排序任务上,got 分别优于 cot 和 tot 约 70% 和 62%,同时成本还比 tot 低 31% 以上。
表 1 给出了 got 与其它 prompt 设计方案的定性比较。got 是唯一一种能在一个 prompt 内实现任意基于图的思维变换的方案(比如聚合),从而能将之前的所有方案囊括进来。
他们还有另一项贡献,即提出一种新的评估指标 —— 思维容量(the volume of a thought),可用于评估 prompt 设计策略。研究者表示,使用这一指标的目标是更好地理解 prompt 设计方案之间的差异。
对于一个给定的思维 v,v 的容量是指 llm 思维的数量,用户可以基于此使用有向边得到 v。直观上说,这些就是有望对 v 做出贡献的所有 llm 思维。
作者通过研究表明,通过整合聚合等思维变换技术,got 能让思维容量比其它方案显著更大。
got 框架
下面详细介绍一下 got 框架。其示意图见图 1,图中还给出了其它 prompt 设计策略的示意图。
在数学形式上,got 可以建模为一个元组 (g, t, e, r),其中 g 是 llm 推理过程(即上下文中的所有 llm 思维及其关系),t 是可能的思维变换,e 是用于获得思维分数的评估器函数,r 是用于选择最相关思维的排序函数。
推理过程
这里,推理过程被建模为一个有向图 g = (v, e),其中 v 是一组顶点,e ⊆ v × v 是一组边。g 是有向的,因此边是有序顶点对 e ⊆ v × v 的子集。一个顶点包含对当前问题的一个解答,不管这个问题是最初的问题、还是中间问题或最后的问题。这种思维的具体形式取决于用例;其可能是一段文本(在写作任务中),也可能是一个数值序列(在排序任务中)。有向边 (t_1, t_2) 表示思维 t_2 的构建方式是将 t_1 用作「直接输入」,即通过明确指示 llm 使用 t_1 来生成 t_2。
在某些用例中,图节点属于不同类别。举个例子,在写作任务中,某些顶点建模写出一段文本的计划,其它节点则建模实际的文本段。在这种情况下,got 采用异构图 g = (v, e, c) 来建模 llm 推理,其中 c 将顶点 v 映射到各自的类 c(在上述案例中,c = {plan, par} )。这样一来,任何顶点 v 都可以建模推理的不同方面。
于是 g 就与 llm 推理过程关联了起来。为了推进这一过程,用户可对 g 使用思维变换。举个这种变换的例子:将目前为止分数最高的思维融合成一个新的。另一个例子是对一个思维进行循环,以对其增强。注意,这些变换严格扩展了 cot、cot-sc 或 tot 中可用转换的集合。
思维变换
得益于将基于图的模型用于推理,got 能实现全新的思维变换。研究者称之为图使能的变换(graph-enabled transformation)。比如,在写作任务中可以将多篇输入文章组合成一篇连贯一致的摘要。在排序时,可将多个已排序的数值子数组合并为一个最终已排序数组。图 2 给出了聚合和生成的示例。
从数学形式上讲,每个这样的变换都可以建模成 t (g, p_θ),其中 g = (v, e) 是反映推理当前状态的图,p_θ 是所使用的 llm。t 修改 g 的方式通常是通过添加新顶点及其传入边。于是有 g′ = t (g, p_θ) = (v′, e′),其中 v′ = (v ∪ {v^+}) \ {v^−} 且 e′ = (e ∪ {e^+}) \ {e^−}。v^+ 和 e^+ 是注入到 g 中的新顶点和边,它们分别建模的是新的思维和它们的依赖关系。
为了最大化 got 的表达能力,用户还可以删除思维,做法是指定要删除的相应顶点和边(分别为 v^− 和 e^−)。在这里,确保集合 v^+、e^+、v^− 和 e^− 有一致的变换是用户的责任(举个例子,用户不会尝试删除不存在的顶点)。这使得 prompt 方案能无缝整合,其中用户可以为了节省上下文中的空间而移除无法带来提升的推理部分。
t 的具体形式及其影响 g 的方式取决于具体的变换。下面首先详细介绍主要几个图使能的思维变换,然后会描述 got 何以囊括之前方案的变换。除非另有说明,v^− = e^− = ∅。
聚合变换:用户可以使用 got 将任意思维聚合成新思维,实现取长补短。这里看看只创建一个新顶点的基础形式:v^+ = {v^+} 且 e^+ = {(v_1, v^+), ...,(v_k, v^+)},其中 v_1, ..., v_k 是被融合的 k 个思维。更一般而言,这能实现对推理路径的聚合,即更长的思维链,而不只是单个思维。使用图模型,可以轻松实现聚合变换:通过添加来自建模了几条链中最后思维的顶点 v_1, ..., v_k 的传出边,使之指向组合这些链的单个思维 v^+。
细化变换:另一种思维变换是通过修改内容对当前思维 v 进行细化:v^+ = {} 和 e^+ = {(v, v)}。图中的这个循环表示与原始思维有同样连接的迭代版思维。
生成变换:最后,用户还可以基于已有的单个思维 v 生成一个或多个新思维。这一类别中包含 tot 或 cot-sc 等更早期方案中的类似推理步骤。从数学形式上讲,有
对思维进行评分和排名
对思维评分的目的是为了理解当前的解答是否足够好。分数被建模为一个一般函数 e (v, g, p_θ),其中 v 是所要评估的思维。为了尽可能让 e 更普适通用,e 中还使用了推理的整个过程 (g),因为在某些评估场景中,分数可能与其它思维相关。
got 也能排名。研究者使用了函数 r (g, p_θ, h) 来建模,其中 h 指定了要被 r 返回的 g 中排名最高的思维的数量。虽然 r 的具体形式取决于用例,但最常使用一个简单而有效的方法是返回分数最高的 h 个思维,即 v_1, ..., v_h = r (g, p_θ, h)。
e 和 r 的具体形式取决于用例。
系统架构和扩展能力
got 由一组交互式模块构成,见图 3(蓝色部分)。这些模块是 prompter(准备用于 llm 的消息)、parser(解析器,提取 llm 答复中的信息)、评分模块(验证 llm 答复并评分)、controller(控制器,协调整个推理过程,并决定如何推进推理)。controller 中包含另外两个重要组件:操作图(goo)和图推理状态(grs)。goo 是一个静态结构,其指定了对给定任务的图分解,即它规定了应用于 llm 思维的变换及其顺序和依赖关系。grs 是一个动态结构,其维持着正在进行的 llm 推理过程的状态(其思维及其状态的历史)。
用例示例
研究者描述一些 got 的一些用例,包括排序、集合运算、关键词计数、文档合并;下图 4 便是 got 的排序用例中一个图分解示例。这里我们不对用例做详细介绍,详情参阅原论文。
延迟与容量的权衡
延迟(在思维图中抵达给定最终思维的跳数)和容量之间的权衡也非常重要,研究者表明:got 在这一权衡上也优于之前的 prompt 设计方案。这篇论文定义了一个新指标 —— 思维容量,即可以影响给定思维 t 的之前 llm 思维的数量。从数学上看,思维 t 的容量就是在思维图中,与 t 之间存在路径的思维的数量。研究者假设输出单个思维的成本为 o (1),并将每个提示方案的总成本固定为 θ(n)。
各种方案的结构如下。cot-sc 由源自单个起始思维的 k 条独立链构成。tot 是一条完全 k 叉树。而在 got 中,会在其叶节点处加入一个完全 k 叉树,并带有一个「镜像」k 叉树 —— 其大小一样而边是反向的。
详细分析见表 2。cot 的容量较大,最大可至 n,但也有 n 的高延迟成本。cot-sc 将延迟降低了 k 倍(对应于其分支因子),但同时其容量也会减小 k 倍。tot 的延迟为 log_k n,但容量也很低。got 是唯一能做到低延迟 log_k n 和高容量 n 的方案。got 之所以能做到这一点,是因为其利用了思维聚合,使其可从图分解中任何其它中间思维得到最终思维。
评估
研究者通过实验展现了 got 相对于其它方案的优势。其中重点比较的是 got 和 tot,因为 tot 的表现已经优于其它方案了。当然,他们也还是用 io、cot 和 cot-sc 做了些实验。
图 5(排序)、6(集合交集)、7(关键词计数)、8(文档合并)展示了实验结果。
总体而言,在实验评估过的所有基准上,got 的输出质量都优于 tot,并且还实现了更低的推理成本。
以上就是思维链cot进化成思维图got,比思维树更优秀的提示工程技术诞生了的详细内容。