论文:Chain-of-Thought Prompting Elicits Reasoning in Large Language Models翻译笔记(链式思考、思维链)
论文:Chain-of-Thought Prompting Elicits Reasoning in Large Language Models翻译笔记(链式思考、思维链)
论文链接:https://arxiv.org/abs/2201.11903
arXiv:2201.11903v6 [cs.CL] 10 Jan 2023
文章目录
论文标题:链式思考提示激发大型语言模型中的推理能力
注解:链式思考是一种通过逐步分析和解决问题的过程,将一个复杂问题分解为多个相互关联的子问题,然后逐个解决的方法。
摘要
我们探讨了生成一系列中间推理步骤(链式思考)如何显著提高大型语言模型在执行复杂推理方面的能力。具体来说,我们展示了这种推理能力如何通过一种称为链式思考提示的简单方法自然地出现在足够大的语言模型中。在这种方法中,将一些链式思考的示例作为提示的示例提供。
在三个大型语言模型上的实验表明,chain-of-thought提示可以提高一系列算术、常识和符号推理任务的性能。实际的提升可以非常显著。例如,仅用八个chain-of-thought示例提示PaLM 540B,就能在数学文字问题的GSM8K基准测试中达到最先进的准确度,甚至超过了经过微调的GPT-3和验证器。
1 介绍
NLP领域最近被语言模型(Peters等人,2018年;Devlin等人,2019年;Brown等人,2020年,等等)所改变。研究表明,扩大语言模型的规模可以带来一系列好处,如提高性能和样本效率(Kaplan等人,2020年;Brown等人,2020年,等等)。然而,仅仅扩大模型规模并未证明足以在具有挑战性的任务(如算术、常识和符号推理)上实现高性能(Rae 等,2021)。
本文探讨了如何通过一个简单的基于两个想法的方法来释放大型语言模型的推理能力。首先,用于算术推理的技术可以从生成最终答案的自然语言理由中受益。以前的工作已经通过从头开始训练(Ling等人,2017)或微调预训练模型(Cobbe等人,2021)的方式,使模型具备生成自然语言中间步骤的能力。此外,还有神经符号方法使用形式语言而不是自然语言(Roy和Roth,2015;Chiang和Chen,2019;Amini等人,2019;Chen等人,2019)。其次,大型语言模型提供了令人兴奋的前景,即通过提示实现情境式少量样本学习。也就是说,与其为每个新任务微调一个单独的语言模型检查点,不如简单地“提示”模型一些输入-输出示例来演示任务。值得注意的是,这种方法在一系列简单的问答任务中取得了成功(Brown 等,2020)。
然而,上述两种方法都存在关键的局限性。对于理性的增强训练和微调方法,创建大量高质量的理性是非常昂贵的,这比正常机器学习中使用的简单输入-输出对要复杂得多。对于布朗等人(2020)中使用的传统少量提示方法,它在需要推理能力的任务上效果较差,而且随着语言模型规模的增加,效果往往没有显著改善(拉伊等人,2021)。在这篇论文中,我们以一种避免了它们局限性的方式结合了这两个思想的优点。具体来说,我们探讨了语言模型在给定包含三元组的提示符的情况下进行推理任务的少量提示的能力:⟨输入、思考过程、输出⟩。思考过程是一系列导致最终输出的自然语言推理中间步骤,我们将这种方法称为思考过程提示。示例提示如图1所示。
图1:链式思考提示使大型语言模型能够处理复杂的算术、常识和符号推理任务。链式思考推理过程是突出的。
我们对算术、常识和符号推理基准进行了实证评估,结果显示,链式思考提示优于标准提示,有时效果相当显著。图2展示了其中一种结果——在数学单词问题的GSM8K基准测试中(Cobbe等人,2021),链式思考提示与PaLM 540B一起大大超过了标准提示,并实现了新的最先进的性能。一种仅提示的方法很重要,因为它不需要大量的训练数据集,而且一个模型检查点可以执行许多任务而不会丧失通用性。这项工作强调了大型语言模型如何通过几个示例学习自然语言数据中的任务(参见通过大量训练数据集自动学习输入和输出潜在模式)。
图2:PaLM 540B使用链式思考提示来实现新的最先进的性能,用于数学单词问题的GSM8K基准。Finetuned GPT-3和之前的最佳性能来自Cobbe等人(2021)。
2 链式思考提示
考虑一下解决一个复杂推理任务时自己的思考过程,例如多步骤数学文字问题。通常会将问题分解为中间步骤,然后在给出最终答案之前解决每个步骤:“在简给她的妈妈2朵花之后,她还剩下10朵……然后在她给她的爸爸3朵花之后,她将剩下7朵……所以答案是7。”本文的目标是赋予语言模型生成类似思考过程的能力——一个连贯的中间推理步骤序列,这些步骤导致了一个问题的最终答案。我们将证明,足够大的语言模型可以生成思考过程,如果在示例中提供了思考过程的示范,以便于少量样本提示。
图1显示了一个模型在解决数学文字问题时产生思考过程的例子,如果没有这个思考过程,它可能会做错。在这种情况下,思维链类似于一种解决方案,可以被解释为一种解决方案,但我们仍然选择称其为思维链,以便更好地捕捉到这样一个想法:它模仿了一个逐步思考过程,以得出答案(同时,解决方案/解释通常在最终答案之后出现(Narang等人,2020;Wiegreffe等人,2022;Lampinen等人,2022,以及其他一些例子)。
链式思考提示作为一种促进语言模型推理的方法,具有几个吸引人的特性:
1.首先,链式思考在原则上允许模型将多步骤问题分解为中间步骤,这意味着可以将更多的计算资源分配给需要更多推理步骤的问题。
2.其次,一连串的思考过程为解释模型行为提供了一个窗口,暗示了它是如何得出某个答案的,并提供了调试机会,以找出推理路径哪里出了问题(尽管完全描述支持某个答案的模型计算仍然是一个未解决的问题)。
3. 第三,连贯思考推理可以用于数学文字问题、常识推理、符号操作等任务,原则上可以应用于任何人类可以通过语言解决的任务。
4. 最后,通过在少量示例提示中包含链式思考序列的例子,可以很容易地在足够大的现成语言模型中引发链式思考推理。
在实证实验中,我们将观察链式思考提示在算术推理(第3节)、常识推理(第4节)和符号推理(第5节)中的实用性。
3 算术推理
我们首先考虑如图1所示形式的数学文字问题,这些问题衡量了语言模型的算术推理能力。尽管对于人类来说很简单,但算术推理是语言模型经常遇到困难的任务(Hendrycks等,2021;Patel等,2021,以及其他文献)。令人惊讶的是,当使用540B参数语言模型与chain-of-thought提示时,在几个任务上与专门针对任务微调的模型表现相当,甚至在具有挑战性的GSM8K基准测试(Cobbe等人,2021)中取得了新的最佳状态。
3.1 实验设置
我们对多个语言模型在多个基准测试上进行了链式思考提示的探索。
基准
我们考虑以下五个数学文字问题基准:
(1) GSM8K数学单词问题基准(Cobbe等人,2021)
(2) 结构变化的数学单词问题SVAMP数据集(Patel等人,2021)
(3) 多样化的数学单词问题ASDiv数据集(Miao等人,2020)
(4) 代数单词问题AQuA数据集
(5) MAWPS基准(Koncel-Kedziorski等人,2016)。
示例问题请参见附录表12。
标准提示
对于基线,我们考虑了标准的少量提示,这种提示方法由Brown等人(2020)推广,其中语言模型在给出预测之前会接收到输入-输出对的上下文示例。示例以问题和答案的形式呈现。模型直接给出答案,如图1(左)所示。
链式思考提示
我们提出的方法是在少样本提示中的每个示例中增加一个与相关答案相关的链式思考,如图1(右)所示。由于大多数数据集只具有评估分割,我们手动编写了一组包含链式思考的少样本示例提示 - 图1(右)显示了一个链式思考示例,完整的示例集可以在附录表20中找到。(这些特定的示例并没有经过提示工程处理;鲁棒性研究在第3.4节和附录A.2中进行。)为了研究这种形式的链式思考提示是否能成功地引发一系列数学文字问题的成功推理,我们使用了这一套八个链式思考示例,用于所有基准测试,除了AQuA,AQuA是一个多项选择题,而不是自由回答题。对于AQuA,我们使用了来自训练集的四个示例和解决方案,如附录表21所示。
图3:算术、常识和符号推理基准测试中的<输入,思考过程,输出>三元组示例。思考过程被高亮显示。完整提示请参阅附录G。
语言模型
我们评估了五个大型语言模型。第一个是GPT-3(Brown等人,2020),我们使用了text-ada-001、text-babbage-001、text-curie-001和text-davinci-002,这些模型据推测对应于具有350亿、130亿、670亿和1750亿参数的InstructGPT模型(Ouyang等人,2022)。第二个是LaMDA(Thoppilan等人,2022),它具有422亿、2万亿、8万亿、68万亿和137万亿参数的模型。第三种是PaLM,它有8B、62B和540B的模型参数。
第四种是UL2 20B(Tay等人,2022年),第五种是Codex(Chen等人,2021年,OpenAI API中的code-davinci-002)。我们通过贪心解码从模型中采样(尽管后续研究表明,通过在多个采样生成中取多数最终答案,可以改进chain-of-thought提示(Wang等人,2022a))。对于LaMDA,我们报告了基于五个随机种子的平均结果,其中每个种子都有不同的随机示例顺序。由于LaMDA实验在不同种子之间没有显示出很大的方差,为了节省计算资源,我们报告了所有其他模型的单个示例顺序的结果。
3.2 结果
链式思考提示的最强烈结果总结在图4中,所有模型集合、模型大小和基准的实验输出如附录表2所示。有三个关键结论。首先,图4显示,链式思考提示是模型规模的新兴能力(Wei et al., 2022b)。也就是说,对于小型模型来说,连贯思考提示并不能提高性能,只有在使用约100B参数的模型时才能获得性能提升。我们定性地发现,较小规模的模型产生的连贯思考不切实际,导致性能低于标准提示。
图4:链式思考提示使大型语言模型能够解决具有挑战性的数学问题。值得注意的是,链式思考推理是模型规模增加的新兴能力。以前的最好数字来自Cobbe等人(2021)的GSM8K,Jie等人(2022)的SVAMP,以及Lan等人(2021)的MAWPS。
其次,链式思考提示对于更复杂的问题有更大的性能提升。例如,对于 GSM8K(基线性能最低的数据集),最大的 GPT 和 PaLM 模型的性能翻了一番以上。另一方面,对于 SingleOp(MAWPS 中最简单的子集,只需要一步就能解决),性能改进要么是负的,要么非常小(见附录表 3)。
第三,通过GPT-3 175B和PaLM 540B的链式思考提示与之前的最佳技术相比,具有更好的表现。之前的最佳技术通常是在一个标注的训练数据集上微调一个任务特定的模型。图4展示了PaLM 540B如何使用chain-of-thought提示来实现GSM8K、SVAMP和MAWPS的新纪录(尽管请注意,标准提示已经超过了SVAMP之前的最佳成绩)。在另外两个数据集AQuA和ASDiv上,使用chain-of-thought提示的PaLM达到了接近2%的最优效果(附录表2)。
为了更好地理解为什么连贯思考提示法有效,我们人工检查了LaMDA 137B为GSM8K生成的模型连贯思考。在50个随机例子中,模型返回了正确的最终答案,其中所有生成的连贯思考都是逻辑和数学上正确的,除了两个碰巧得出正确答案的(详见附录D.1和表8,其中有一些正确模型生成的连贯思考的例子)。我们还随机检查了50个模型给出错误答案的随机样本。分析总结是,46%的思考过程几乎是正确的,除了些微错误(计算器错误、符号映射错误或缺少一个推理步骤);另外54%的思考过程在语义理解或连贯性方面存在重大错误(详见附录D.2)。为了提供一些关于为什么扩大规模可以提高链式思维推理能力的见解,我们对PaLM 62B模型中出现的错误进行了一项类似的分析,并研究了将PaLM扩大到540B模型后这些错误是否得到了修复。总结起来就是,将PaLM扩大到540B模型可以修复62B模型中很大一部分的一步缺失错误和语义理解错误(参见附录A.1)。
3.3消融研究
注解:消融研究是一种科学实验方法,主要用于评估模型、算法或系统中某个组件的贡献。在这类研究中,研究人员会移除或修改某个组件,然后观察实验结果的变化。通过这种方式,可以深入了解各个组件在整体系统中的作用和重要性。
观察到的使用chain-of-thought提示的优势引发了自然的问题,即是否可以通过其他类型的提示实现相同的性能改进。图5显示了一个消融研究,其中描述了三种chain of thought的变体。
图5:对使用LaMDA 137B和PaLM 540B的不同提示变体进行消融研究。其他数据集的结果在附录表6和表7中给出。
只考虑方程式
链式思考提示可能有所帮助的一个原因是,它能生成待求解的数学方程,因此我们测试了一个变体,让模型在给出答案之前只输出一个数学方程。图5显示,仅通过方程提示对GSM8K并没有太大帮助,这表明GSM8K中的问题语义过于复杂,无法直接翻译成一个方程而不涉及自然语言推理步骤。然而,对于一步或两步问题的数据集,我们发现方程提示确实可以提高性能,因为方程可以很容易地从问题中推导出来(请参阅附录表6)。
只考虑变量计算
另一种直觉是,chain of thought(思维链)允许模型在更困难的问题上花费更多的计算(即,中间的标记)。为了将可变计算与chain-of-thought推理的影响分离开来,我们测试了一种配置,其中模型被提示输出等于解决问题所需的方程式字符数量的点号(…)序列。这个变体的性能与基线差不多,这表明变量计算本身并不是链式思考提示成功的理由,而且似乎可以通过自然语言表达中间步骤来获得一些好处。
回答后才给出思维链
链式思考提示的另一个潜在好处可能只是这样的提示可以让模型更好地利用预训练期间获得的相关知识。因此,我们测试了一种替代配置,其中只有在给出答案后才会给出思考过程提示,以隔离模型是否真正依赖于产生的思考过程来给出最终答案。这个变体的性能与基线差不多,这表明在思考过程中体现的顺序推理对于激活知识以外的其他原因也是有用的。
3.4 思维链的健壮性
对示例的敏感性是提示方法的一个关键考虑因素,例如,改变少量示例的排列顺序可以使GPT-3在SST-2上的准确度从接近随机(54.3%)到接近最先进的水平(93.4%)(Zhao等人,2021)。在本最后一小节中,我们评估了不同注释员编写的思考过程的稳健性。除了上述结果,这篇论文的另外两位合著者(注释者B和C)也独立为相同的几枪示例编写了思考链(见附录H)。注释者A还按照Cobbe等人(2021)中给出的解决方案的简洁风格,编写了另一个比原始思考链更简洁的思考链。
图6展示了LaMDA 137B在GSM8K和MAWPS上的结果(其他数据集的消融结果见附录表6/表7)。尽管不同链式思考注释之间存在差异,正如在使用示例驱动提示时所预期的那样(Le Scao和Rush,2021;Reynolds和McDonell,2021;Zhao等人,2021),但所有链式思考提示都大大超过了标准基线。这个结果意味着,成功运用思维链条并不依赖于特定的语言风格。
图6:链式思考提示(Chain-of-thought prompting)在不同的提示示例中具有方差(as expected),但相对于标准提示,其在各种注释者以及不同示例中表现更好。
为确保成功的chain-of-thought提示适用于其他示例集,我们还使用从GSM8K训练集随机抽取的三组8个示例(该数据集中的示例已经包含了类似于chain of thought的推理步骤)进行了实验。图6显示,这些提示与我们手动编写的示例表现相当,同时也大大超过了标准提示。
除了对注释者、独立编写的思考链、不同示例和各种语言模型的鲁棒性外,我们还发现,用于算术推理的思考链提示对不同的示例顺序和可变数量的示例也具有鲁棒性(请参阅附录A.2)。
4 常识推理
尽管连贯思维特别适合解决数学文字问题,但基于语言的连贯思维实际上适用于广泛的一类常识推理问题,这些问题涉及到在一般背景知识的前提下,对物理和人类互动进行推理。常识推理是与世界互动的关键,目前的自然语言理解系统还无法达到这一水平(Talmor等,2021)。
基准
我们考虑了五个涵盖各种常识推理类型的数据库。 流行的CSQA(Talmor等,2019)提出了关于世界的常识问题,这些问题涉及复杂的语义,通常需要预先了解知识。StrategyQA(Geva等,2021)要求模型推断出一种多步策略来回答问题。我们从BIG-bench项目中选择了两个专门的评估集(BIG-bench协作,2021年):日期理解,涉及从给定的上下文中推断日期;体育理解,涉及判断与体育相关的句子是否合理或不合理。最后,SayCan数据集(Ahn等人,2022年)涉及到将自然语言指令映射到离散集合中的一系列机器人动作。图3展示了所有数据集的思考过程注释示例。
提示
我们遵循与前一节相同的实验设置。对于CSQA和StrategyQA,我们从训练集中随机选择示例,并为它们手动编制思考链,以作为少量示例。这两个BIG-bench任务没有训练集,所以我们选择评估集中的前十个例子作为少量示例,并在评估集的其余部分报告数字。对于SayCan,我们使用了Ahn等人(2022)中使用的训练集的六个例子,还手动编写了思考过程。
结果
图7突出了这些结果对于PaLM(LaMDA、GPT-3和不同模型规模的完整结果请参见表4)。对于所有任务,扩大模型规模提高了标准提示的性能;链式思考提示带来了进一步的提升,其中PaLM 540B的改进幅度似乎最大。通过链式思考提示,PaLM 540B在基准测试中取得了强劲的性能,超过了之前在StrategyQA上的最佳水平(75.6%对69.4%),并在体育理解方面超过了未经辅助的体育爱好者(95.4%对84%)。这些结果表明,链式思考提示还可以提高需要一系列常识推理能力的任务的性能(尽管在CSQA上的提升很小)。
图7:链式思考提示同样提高了语言模型的常识推理能力。这里的语言模型是PaLM。此前的最佳成绩来自CSQA(Talmor等人,2019)和StrategyQA(Geva等人,2021)的排行榜(截至2022年5月5日,仅单个模型)。表4展示了使用不同大小的LaMDA、GPT-3和PaLM的额外结果。
5 符号推理
我们的最终实验评估考虑了符号推理,这对人类来说很简单,但可能对语言模型具有挑战性。我们证明了chain-of-thought提示不仅使语言模型能够在标准提示设置中执行具有挑战性的符号推理任务,而且还促进了长度泛化,以处理在少量示例中未见过的推理时间输入。
任务
我们使用以下两个玩具任务。
• 最后一个字母拼接。这个任务要求模型将名字中每个单词的最后一个字母拼接起来(例如,“Amy Brown” → “yn”)。这是一个比首字母拼接更具挑战性的版本,而语言模型已经可以在不使用思考链的情况下执行首字母拼接。3 我们通过随机拼接来自姓名普查数据的前一千个名字生成全名(https://namecensus.com/)。
• 硬币翻转。这个任务要求模型回答硬币在人们翻转或不翻转的情况下是否仍然正面朝上(例如,“一枚硬币正面朝上。菲比翻转了硬币。奥斯瓦尔多没有翻转硬币。硬币还是正面朝上吗?”→“否”)。
随着这些符号推理任务的构建明确,对于每个任务,我们考虑了一个领域内测试集,其中的例子与训练/少量示例具有相同数量的步骤,以及一个领域外(OOD)测试集,其中评估例子的步骤比示例中的步骤更多。对于最后一个字母的拼接,模型只看到了两个单词的名字的例子,然后在三个和四个单词的名字上进行了最后一个字母的拼接。我们在硬币翻转任务中对可能的翻转次数也做了同样的处理。我们的实验设置使用了与前两个部分相同的模型和方法。我们再次为每个任务的手动设计出少量示例的思考链,这些示例在图3中给出。
图8:使用连贯思维提示有助于在两个符号推理任务中推广到更长的序列。
结果
这些领域内和OOD评估的结果如图8所示,针对PaLM,而针对LaMDA的结果请参见附录表5。使用PaLM 540B,链式思考提示可以带来近100%的解决问题的比率(请注意,标准提示已经可以解决硬币翻转问题,尽管在LaMDA 137B上不行)。请注意,这些领域内的评估在某种程度上是“玩具任务”,因为完美的解决方案结构已经由几个示例中的思考链提供;模型所要做的就是用测试时间示例中的新符号重复相同的步骤。然而,小模型仍然会失败——对于这三个任务,只有在100B模型参数的规模上才能出现对未见符号进行抽象操作的能力。
关于OOD评估,标准提示对两项任务都不起作用。通过链式思考提示,语言模型实现了向上扩展的曲线(尽管性能低于域内设置)。因此,链式思考提示有助于语言模型在足够规模的情况下,实现长度泛化,超越已知的链式思考。
6 讨论
我们已经探索了chain-of-thought提示作为一种简单机制,用于在大型语言模型中激发多步推理行为。我们首先发现,chain-of-thought提示在算术推理方面提高了很大幅度的性能,其改进效果比减法(ablations)更强,并且对不同的注释员、示例和语言模型具有鲁棒性(第3节)。接下来,关于常识推理的实验强调了思考链推理的语言性质使其普遍适用(第4节)。最后,我们表明,对于符号推理,思考链提示有助于OOD概括到更长的序列长度(第5节)。在所有实验中,通过提示现成的语言模型来引发链式思维推理。在撰写本文的过程中,没有对任何语言模型进行微调。
链式思考推理随着模型规模的出现而成为了一个普遍的主题(Wei et al., 2022b)。对于许多标准提示具有平缓扩展曲线的推理任务,链式思考提示可以带来急剧增长的扩展曲线。链式思考提示似乎可以扩展大型语言模型成功执行的任务集,换句话说,我们的工作强调了标准提示只能提供大型语言模型能力的下限。这段观察可能引发的问题比解答的还要多,例如,随着模型规模的进一步增加,我们能期待推理能力提高多少?还有哪些其他的提示方法可以扩展语言模型能够解决的任务范围?
7 相关工作
这项工作受到了许多研究领域的启发,我们在一个扩展的相关工作部分(附录C)中详细介绍了这些领域。在这里,我们描述了两个可能最相关的方向和相关论文。
第一个相关方向是使用中间步骤来解决推理问题。Ling等人(2017)首次提出了使用自然语言推理来解决数学文字问题的方法,通过一系列中间步骤来实现。他们的工作与使用形式语言进行推理的文献(Roy等人,2015;Chiang和Chen,2019;Amini等人,2019;Chen等人,2019)形成了鲜明的对比。Cobbe等人(2021)扩展了Ling等人(2017)的工作,他们创建了一个更大的数据集,并将其用于微调预训练的语言模型,而不是从头开始训练模型。在程序合成领域,Nye等人(2021)利用语言模型来预测Python程序的最终输出,首先逐行预测中间计算结果,然后表明他们的逐步预测方法比直接预测最终输出表现更好。
自然地,本文也与关于提示的大量近期研究密切相关。自从Brown等人(2020)普及了少量样本提示以来,几种通用方法已经提高了模型的提示能力,如自动学习提示(Lester等人,2021)或给模型提供描述任务的指令(Wei等人,2022a;Sanh等人,2022;Ouyang等人,2022)。而这些方法主要是通过改进或增强提示的输入部分(例如,前置到输入的指令)来提高模型性能,但我们的工作则采取了正交方向,即通过增强语言模型的输出,附加上思考过程。
8 结论
我们已经探索了链式思考提示作为一种简单且广泛应用的方法,以增强语言模型中的推理能力。通过在算术、符号和常识推理方面的实验,我们发现,链式思考推理是模型规模的一种新兴属性,使得足够大的语言模型能够执行推理任务,这些任务在平滑的规模曲线中无法实现。拓宽语言模型可以执行的推理任务范围,有望激发更多关于基于语言的推理方法的研究。
A 常见问题解答
A.1 为什么提高模型规模可以改善链式思考提示?
研究发现,成功的思维链推理只在特定的模型规模上才会出现,这是非常有趣的。将语言模型扩大规模已被证明可以带来诸如提高性能和样本效率等好处(Kaplan等人,2020年),但链式思维推理是新兴的,因为它的成功不能仅通过推断小规模模型的性能来预测。实际上,对于大多数小于100亿参数的模型,链式思维会降低性能。
关于为什么模型规模可以提高连锁思考提示的问题,肯定是有多个方面的因素,我们初步尝试通过错误分析来深入了解这个问题。这个小规模的分析涉及手动阅读PaLM 62B所犯的45个错误,并将它们归类为语义理解(20个错误)、缺失一步(18个错误)和其他错误(7个错误)。“其他类别”包括幻觉、重复输出和符号映射错误。这种分类是粗略的,是从对LaMDA的初始错误分析中借用的,其中的类别是根据需要进行什么改进才能使思维过程正确来构思的。
如图9所示,将PaLM扩展到5400亿参数时,解决了三个类别中的大部分错误。图10给出了通过将PaLM扩展到5400亿参数来修复的语义理解和一步缺失错误的示例。这个结果似乎与一个假设相一致,即语言模型随着模型规模的增加,会获得一系列语义理解和逻辑推理技能(尽管请注意,模型规模通常与其他因素混淆,例如训练计算量)。
图9:对45个PaLM 62B错误问题的错误分析。这些错误被归类为语义理解错误、一步缺失和其他。其他类别包括妄想、重复输出和符号映射错误。将PaLM扩展到540B修复了所有类别中的大部分错误。
关于小型语言模型为何失败,还有三个值得注意的点。首先,小型语言模型甚至在相对简单的符号映射任务中也会失败。如第5节所示,即使在只需要使用与示例中相同的逻辑结构进行概括的新示例的符号推理任务中,小型语言模型仍然失败。第二个观察是,小型语言模型似乎在算术能力上具有固有的弱点,正如Brown等人(2020)所示,执行简单的算术运算(没有语义理解)需要足够的模型规模。最后,我们注意到小型语言模型在生成可以解析的最终答案方面存在质量问题,原因可能是重复或无法到达最终答案的逻辑。
总之,链式思维推理的成功是模型规模的结果,这是一个复杂的现象,可能涉及多种突发能力(语义理解、符号映射、保持主题、算术能力、忠诚度等)。未来的工作可以更彻底地研究预训练数据、模型架构和优化目标的哪些属性因果地使此类推理能力成为可能。
图10:将PaLM从62B扩展到540B后,修复的一些语义理解示例和一步缺失错误。
A.2 什么是提示工程的角色?
提示的一个关键考虑因素是对提示的敏感性。有大量的研究表明,提示以出人意料的方式影响语言模型(Min等人,2022)。我们创建链式思考注释的一般方法是,从训练集中选取8个示例,并将推理过程分解为多个步骤,最终得出最终答案。链式思考注释的示例在图3中提供,完整的提示在附录G中给出。为了分析链式思考对提示工程的敏感性,我们针对各种因素进行了鲁棒性实验。
• 不同的注释员。我们首先分析了对三位不同注释员的鲁棒性(第3.4节和图6)。尽管性能上存在显著的差异(我们稍后会讨论),但在算术、常识和符号推理的八个数据集上,链式思考的表现都优于基线,对于三位注释员都有较大的优势(表6和表7)。 类似于Cobbe等人(2021)中的注释过程,注释者没有得到关于如何编写链式思考注释的具体指示,除了简单地写出导致最终答案的逐步推理过程。因此,注释是用每个注释者自己独特的语言链式思考写作风格编写的。
• 无机器学习背景的注释者。GSM8K数据集(Cobbe等人,2021)方便地提供了一个由众包计算工作者编写的推理链训练集,这使我们能够研究推理链是否仍然可以在没有机器学习背景的独立来源的推理链上工作。因此,我们随机抽取了三组八篇GSM8K的示范作品和思考过程。这些思考过程的注释也大大超过了基线,适用于所有四个算术数据集(表6),表明思考过程并不依赖于特定的一组注释员。
• 不同示例。上述不同的GSM8K示例实验(表6)还表明,链式思考提示适用于不同的示例集。值得注意的是,我们在所有四个算术数据集上测试每组示例(而不是为每个数据集从训练集中选择示例),这表明示例不一定必须来自与测试示例相同的分布。
• 不同的示例顺序。以往的研究表明,在某些情况下(如分类),甚至提示的顺序也有所影响——改变少量示例的排列顺序可以使GPT-3在SST-2上的准确度从接近随机(54.3%)变为接近最先进(93.4%)(Zhao等,2021)。我们在表6和表7中展示了来自不同示例的性能标准差。在几乎所有情况下,与提示顺序的标准偏差相对较小。唯一的例外是硬币翻转任务,其示例顺序的标准偏差较高,原因可能与Zhao等人(2021)提到的原因相同,即对于分类任务,连续的相同类别的示例会偏向模型输出。
• 不同数量的示例。我们还发现,当有不同数量的少量示例时,从链式思考提示中获得的收益通常仍然成立。这在图11中展示了五个数据集的结果(我们没有足够的计算能力对所有数据集进行此操作)。我们还在初步实验中发现,标准提示中进一步增加示例数量并不能带来显著的提升(例如,从8个示例增加到16个示例并不能使标准提示的性能提高到足以赶上链式思考提示的水平)。
• 不同的语言模型。另一个有趣的问题是,某些适用于一个模型的提示是否对其他大型语言模型也更有效。我们发现,使用相同的提示,链式思考提示可以提高所有三个模型(LaMDA、GPT-3和PaLM)在所有数据集上的性能,除了GPT-3的CSQA和StrategyQA(表1、表4、表5)。事实表明,从思维链条中获得的收益并不能在不同模型之间完美转移,这是一个局限性;进一步的研究可以探讨为什么不同的预训练数据集和模型结构会影响从思维链条提示中获得的性能提升。
虽然提示工程仍然很重要
尽管在算术推理方面结果相对稳定,但我们需要明确的是,提示工程仍然很重要,并且在许多情况下可以显著提高性能。虽然大多数思维链注释超过了标准提示,但在许多情况下仍然存在很大的变化。例如,在硬币翻转任务中,虽然所有标注员的表现都超过了标准提示效果=50.0%,但标注员A的表现为99.6%,而标注员C的表现为71.4%(见表7)。甚至有些任务需要通过提示工程来实现良好的表现。在初步实验中,我们尝试使用思维链来使语言模型能够反转一个包含5个项目的列表的顺序。尽管两位合著者在尽最大努力的情况下无法编写解决任务的思维链提示,但第三位合著者能够编写一个完美解决任务的思维链。
如何以健壮的方式生成连贯思考的注释可能是未来研究的一个有趣方向。例如,这里的一个想法可能是使用大型语言模型通过提示自动生成连贯思考(并可能在验证集上优化这一点)。
A.3 连贯思考提示是否能提高我感兴趣的任务的性能?
虽然chain-of-thought提示原则上适用于任何文本到文本的任务,但对一些任务的帮助比其他任务更大。根据本文的实验,我们的直觉是,当满足以下三个条件时,chain of thought的帮助最大:(1) 任务具有挑战性,需要多步推理,(2) 使用大型语言模型,(3) 扩大曲线相对平坦。相反,当一个或多个这些条件不满足时,好处较小。
这些直觉可能得到了算术推理结果的支持。链式思考提示带来的性能提升在PaLM 540B的GSM8K(具有挑战性的多步骤问题,平坦的扩展曲线)中最大,这符合这些条件。对于只需要一到两步的MAWPS子集(SingleOP、SingleEq和AddSub),性能提升很小,因为PaLM 540B在这些任务上已经实现了90%或更高的性能(通常,在性能已经很强的情况下,改进的空间也会相对较小)。
尽管在本文中我们主要关注多步推理任务(算术、常识和符号),但链式思考提示可能潜在地应用于任何人类使用“思考链”来解决的任务(至少在理论上是这样)。我们将把链式思考提示在这些多样化任务(例如机器翻译等)上的实证评估留作未来的工作。
A.4 为什么对于一些算术推理数据集,仅用方程提示是不够的?
提示中使用方程仅作为中间步骤确实有助于许多数据集,特别是当数据集只需要几个推理步骤时(SVAMP,ASDiv,MAWPS)。然而,在GSM8K中,仅使用方程并没有显著提高性能。根据定性分析,我们认为这些问题在语义上对模型来说过于具有挑战性,以至于无法直接将它们翻译成数学方程。请考虑来自LaMDA 137B的这个例子:
注解:迈克打了40分钟乒乓球。在前20分钟,他得了4分。在接下来的20分钟里,他得了25%更多的分数。他总共得了多少分?
方程计算(错误答案):(4 + 20 * 0.25) = 6。答案是6。
思考过程(正确答案):迈克打了40分钟乒乓球。在前20分钟,他得了4分。在接下来的20分钟里,他得分提高了25%。所以他在第二段20分钟里得分提高了25%。4乘以1.25等于5。所以他在第二段20分钟里得了5分。所以总共得了9分。答案是9。
该模型很难将所有语义直接翻译成一个单一的方程式,但通过思维链,它能够更好地通过自然语言的中间步骤来理解问题的每一部分。
B 所有实验结果
本节包含在所有基准测试中,针对不同模型和模型大小的实验结果表格,比较了标准提示与链式思考提示。
对于算术推理基准测试,一些思维链(以及生成的方程式)是正确的,但模型在执行算术运算时出了错。类似的情况在Cobbe等人(2021)的研究中也有发现。因此,我们可以在生成的思维链中的所有方程式中添加一个Python程序作为外部计算器(使用Python的eval函数)。当思维链中有多个方程式时,我们通过字符串匹配将外部计算器的结果从一个方程式传递到下一个方程式。如表1所示,我们发现,在大多数任务中,添加计算器显著提高了思维链提示的性能。
表1:链式思考提示在五个算术推理基准上优于标准提示,适用于各种大型语言模型。所有指标为准确度(%)。Ext. calc.:事后外部计算器,仅用于算术计算。以前的最佳数字来自以下来源。a:Cobbe等人(2021)。b和e:Pi等人(2022),c:Lan等人(2021),d:Pi˛ekos等人(2021)。
表2:在五个算术推理基准测试中,标准提示与链式思考提示的比较。请注意,链式思考提示是模型规模的新兴能力,只有在使用足够规模的模型时,它才会对性能产生积极影响。
表格3:在MAWPS基准测试的四个子集上,标准提示与思考链提示的比较。将MAWPS基准测试进行分层的目的是展示在简单的一步或两步问题上,大型语言模型已经取得了很高的性能,因此性能提升是微乎其微的(例如,SingleOp、SingleEq和AddSub)。
表格4:标准提示与链式思考提示在五个常识推理基准测试中的对比。链式思考提示是模型规模的一种新兴能力,它只有在与足够规模的模型一起使用时才会对性能产生积极影响。
表格5:标准提示与思考链提示在两个符号操作任务上使推理示例的长度泛化到更长的示例。
表格6:算术推理数据集的去除和鲁棒性结果。链式思考通常比去除实验组高出很多。“方程仅” 在标准提示和链式思考提示之间表现,因为它允许通过方程进行中间推理步骤,但不利用自然语言。链式思考提示在使用不同注释者编写的提示或使用其他示例时具有变化(正如预期的那样),但仍然大大优于标准提示。所示的标准差是针对不同顺序的少量提示示例,使用五个不同的随机种子。这里的结果是针对LaMDA 137B,因为对GPT-3和PaLM的额外查询既有限又昂贵。
表格7:四个常识和符号推理数据集的消融和鲁棒性结果。链式思考通常大大优于消融实验。链式思考提示在使用不同注释员编写的提示或使用其他示例时存在差异(正如预期的那样),但仍然大大优于标准提示。标准差显示是在不同顺序的几拍提示示例中,使用五个不同的随机种子。这里的结果是针对LaMDA 137B的,因为对GPT-3和PaLM的额外查询既有限又昂贵。唯一的例外是,我们在这里使用PaLM运行SayCan,因为SayCan评估集只有120个例子,因此多次运行的成本较低。
C 扩展相关工作
C.1 提示
大型语言模型最近的成功引起了越来越多的关注,通过提示来提高它们执行任务的能力(Brown等人,2020年,以及Liu等人,2021年综述)。本文属于通用提示方法的范畴,其中输入提示被优化,以便单个大型语言模型更好地执行各种任务(Li和Liang,2021年;Lester等人,2021年;Reif等人,2022年,等等)。
最近的一项工作旨在通过提供描述任务的指令来提高语言模型执行任务的能力(Raffel等人,2020年;Wei等人,2022年a;Ouyang等人,2022年;Sanh等人,2022年;Wang等人,2022年b)。这项工作与之相关,因为它还使用元数据来增强输入-输出对。但是,虽然指令通常会附加在任务的输入前,但链式思考提示则会增强语言模型的输出。另一个相关方向是顺序地结合语言模型的输出。人机交互(HCI)工作(Wu et al., 2022a,b)已经表明,在20人的用户研究中,结合顺序生成的语言模型可以提高任务结果。
C.2 自然语言解释
另一个紧密相关的方向是使用自然语言解释(NLEs),通常旨在提高模型可解释性(Zhou等人,2020;Wiegreffe和Marasović,2021等)。该研究方向通常关注自然语言推理(Camburu等人,2018;Yordanov等人,2021;Bostrom等人,2021),并在最终预测的同时或之后生成解释(Narang等人,2020;Majumder等人,2021;Wiegreffe等人,2021, 2022)。相比之下,本文考虑的思维过程链发生在最终答案之前。虽然NLE主要旨在提高神经网络的可解释性(Rajagopal等,2021),但链式思考提示的目标是使模型能够将多步推理任务分解为多个步骤——可解释性只是副作用。Marasovi´c等人(2022)表明,使用NLE进行基于提示的微调可以提高NLI和分类性能,尽管他们主要关注评估解释的合理性。相比之下,我们的工作主要关注需要多步推理的算术、常识和符号任务。
C.3 程序综合与执行
使用中间推理步骤在程序综合与执行方面具有悠久的历史(Zaremba 和 Sutskever,2014 等)。近期在这个方向上的工作包括了许多创新的架构(Cai 等,2017;Dong 等,2019;Yan 等,2020),以及使用大型语言模型(Chen 等,2021;Austin 等,2021)。该程序执行的工作与我们的工作最接近的可能是Nye等人(2021),他们证明大型语言模型可以执行10位数的加法、评估多项式和执行Python程序。虽然生成程序然后执行它可以被视为一种推理,但我们的工作将这种特定领域的原语推广到自然语言,从原理上讲,自然语言是开放领域的,与任何文本到文本的NLP任务相关。
C.4 数值与逻辑推理
数值与逻辑推理在机器学习和自然语言处理(Lev等,2004等人)中一直是一个长期研究的任务。最近的研究还试图以各种方式为语言模型注入数值推理能力,例如通过为BERT添加预定义的可执行操作(Andor等,2019),包括一个图神经网络(Ran等,2019),以及使用专门的训练过程(Pi˛ekos等,2021)。另一项工作旨在使语言模型能够进行逻辑或形式推理,通常通过将自然语言形式规则用语言表达出来(Clark et al., 2020; Saeed et al., 2021; Liang et al., 2021)。也许这里最相关的工作是Recchia(2021),该研究表明,微调可以使长模块操作得以实现,这在以前对于执行者来说是困难的。而这个方向的工作通常是针对特定任务的,并使用微调,我们证明了链式思考提示适用于广泛的任务,无需任何微调。
C.5 中间语言步骤
大量的先前研究表明,通过训练或微调赋予神经网络产生中间步骤的能力可以在各种场景中带来各种好处。作为例子,已经证明自然语言中间步骤可以提高性能(Zaidan等人,2007年;Yao等人,2021年;Hase和Bansal,2022年;Gu等人,2022年),提高鲁棒性(Chen等人,2022年),加速训练(Hancock等人,2018年),减轻偏见(Dua等人,2020年),甚至在图像和强化学习环境中提供帮助(Andreas等人,2018年)。为了赋予模型产生中间步骤的能力,以往的工作通常会在手动注释的训练数据集(如Camburu等人,2018年;Rajani等人,2019年等)或生成合成数据集(如Talmor等人,2020年;Zelikman等人,2022年)上对模型进行微调。与这些训练或微调方法相比,我们的工作表明,各种自然语言推理能力可以在货架上的语言模型中通过提示来激发,前提是模型的规模足够大。这种提示设置非常重要,因为它可以在没有大量标注的情况下进行中间步骤的推理,而且一个模型可以在不需要任何梯度更新的情况下执行一系列推理任务。
D 附件:附加分析
D.1 正确的思维链分析
如主文中所述,我们分析了LaMDA 137B在GSM8K数据集中导致正确答案的50条思考链。在这50条中,只有一条通过错误的推理得出了正确的答案(如表9所示:“偶然正确”)。其他49条都有正确的逻辑和数学,示例如表8所示。其中5条有小瑕疵,但逻辑连贯且易于理解:
• 有一个表述不足的正确陈述(见表9:“正确但表述不足的陈述”)。
• 有一个无关但正确的陈述(见表9:“正确但无关的陈述”)。
• 有两个具有正确逻辑,但省略了方程中的具体步骤,尽管仍然可以理解(见表9:“正确但不完美的方程”)。
• 有一个数学正确,但语义颠倒的陈述(见表9:“正确但语义颠倒的陈述”)。
表格8:GSM8K数据集模型正确思维链条示例。
尽管我们发现,对于数学问题,思路连贯的推理通常是正确的,但这种情况可能是因为对于自由回答问题,很难偶然得出正确的最终答案。对于多项选择或二元分类问题,模型通过错误的推理路径得出正确答案的可能性要大得多(例如,我们评估的所有常识推理数据集)。这段内容描述了一个限制,未来的工作应该对这种思维链条的事实性进行分析。
表9:在50个模型正确解答的例子中,有7个显眼的案例,其中模型生成的思维链条并不完美。我们发现其他43个例子与人类可能生成的真相地面实证等效。
D.2 错误的思维链分析
我们还手动分析了50个LaMDA 137B在GSM8K上不正确的随机模型输出。有许多方式可以使思维链条不正确,从而使错误分类的设计变得不简单。我们决定将错误分类为需要进行哪些更改才能使思维链条正确,以阐明如何在未来改进模型。
我们发现,许多思考过程可以通过以下三种类型的修改之一来变得正确。
• 计算器错误。我们发现,8%的思想链路完全正确,除了计算器错误 - 换句话说,像Cobbe等人(2021)那样在方程式中应用外部计算器可以使思想链路正确。这种类型错误的一个例子如表10所示:“计算器错误”。实际上,在LaMDA 137B GSM8K上,当我们添加一个Python程序作为外部计算器时,连锁思考提示的解决率从14.3%提高到了17.3%,如表2所示。此外,34%的示例除了其他类型的错误外,还包含计算器错误。然而,我们是在不依赖计算器错误的情况下进行其余的错误分类。
• 符号映射错误。接下来,我们发现16%的思维链是正确的,除了我们称之为符号映射错误的情况。我们将符号映射错误定义为:思维链是正确的,除了数字符号,通过修改方程式而非文字,就可以使其完全正确。如有人可能会认为他们可以在任何思考过程中简单地放置正确的最终方程式,我们限制这一类别为那些可以修改为完全正确的推理过程的思考过程(不仅仅是最终答案)。表10中的示例展示了这种错误类别的一个例子:“符号映射错误”。
• 缺少一步错误。我们的下一种错误类型是正确的思维链,只是缺少了一个步骤。换句话说,这些思维链可以通过添加一个被模型遗漏的推理步骤来重写为正确。表10中的示例展示了这种错误类别的一个例子:“缺少一步错误”。我们发现,22%的错误属于这一类别。
表10:按照附录D.2中描述的分类,错误的思维链条示例。
我们发现,剩余的思维链条(50个中有27个,占54%)需要进行大量修改才能成为正确的思维链条。这里几乎所有情况都涉及某种语义理解错误(参见表11:“语义理解错误”),并且在27个中有8个还存在思维链条不连贯的问题,这意味着生成的思维链条中的一些陈述并未从前面的陈述中得出,或者违反了基本的常识知识(参见表11:“思维链条不连贯错误”)。
表11:按照附录D.2描述的分类,错误的思维链条示例。这些思维链条存在多个错误,无法通过小修小补来解决。
总的来说,大型语言模型产生的推理过程是否连贯或事实正确并没有保证,这一点在最近评估语言模型生成和解释真实性的工作中得到了强调(Maynez等人,2020年;Rashkin等人,2021年;Ye和Durrett,2022年;Marasovi´c等人,2022年;Wiegreffe等人,2022年)。错误的推理过程可能导致错误的最终答案以及意外正确的最终答案(对于二元分类等任务,意外正确的最终答案的可能性更大,而不是自由回答)。提高语言模型生成内容与世界知识之间事实性的研究方向是语言模型研究中的一个重要且尚未解决的问题,有望潜在地提高语言模型的多步推理能力。一种提高解码质量的潜在方法可能涉及生成多个推理路径,并用验证器对每个路径进行评分,尽管这需要训练验证器(Cobbe等人,2021年;Shen等人,2021年;Thoppilan等人,2022年)。
D.3 额外的鲁棒性分析
作为主论文中实验使用固定数量的少量示例(8个;由1024个标记的输入长度限制),我们验证了链式思考提示对于各种数量的少量示例的鲁棒性。我们在LaMDA 137B上进行了实验,比较了链式思考提示和标准提示在五个数据集上的性能,其中标准提示的扩展曲线基本平坦(最大的模型没有取得高性能)。如图11所示,链式思考提示相对于标准提示的改进在改变提示中的少量示例数量时仍然保持稳定。
图11:链式思维提示对标准提示的改进在一定程度上是稳定的,这表现在随着提示中少量示例数量的变化。
表12:本文中使用的数学文字问题评估基准的摘要,包括示例。N:评估示例的数量。
E 额外细节
版本控制
V5 → V6。在图3中修复了一个小错别字。
V4 → V5。添加了Codex和UL2结果。对论文的写作和风格进行了小幅修改。
V3 → V4。在图3中修复了一个错别字,并添加了几个参考文献。
V2→ V3。增加了GPT-3的结果,添加了SVAMP和AQuA数学评估数据集,添加了SayCan评估的常识部分,增加了扩展的相关工作部分(附录C),增加了对常识和符号推理的剥离实验(表7),增加了常见问题解答部分(附录A),在附录B中添加了原始结果。 V1→ V2。增加了PaLM的结果(V1只包含LaMDA)
E.1 可重复性声明
由于我们的结果使用了两组大型语言模型,目前尚未公开提供,我们采取以下行动以促进可重复性。首先,我们在附录G中的表20-表27中提供了所有任务的确切输入提示(并强调我们没有进行任何微调,仅将提示应用于现成的语言模型)。其次,我们使用公开可用的GPT-3 API进行实验,包括四个模型规模:text-ada-001、text-babbage-001、text-curie-001和text-davinci-002。最后,我们将LaMDA 137B的每个任务的精确输入、目标和预测作为压缩文件在补充材料中提供。
E.2 计算资源
对于我们评估的所有三种语言模型,我们只进行了基于提示的推断。本文没有进行微调。对于LaMDA 137B的推断,我们使用了TPU v3(8x8配置,64个芯片/128个核心),对于PaLM 540B的推断,我们使用了TPU v4(4x4x12配置,192个芯片/384个核心)。GPT-3的实验是使用公共API进行的。
E.3 数据集详细信息和许可证。
我们在本文中列出了所有用于算术和常识数据集的详细信息和许可证。符号推理数据集是通过合成创建的,如第4节所述。
算术推理
• 数学文字问题库(Koncel-Kedziorski 等人,2016):AddSub(Hosseini 等人,2014)
• ASDiv(Miao 等人,2020)
• AQuA (Ling et al., 2017)
• GSM8K (Cobbe et al., 2021)
• SVAMP (Patel et al., 2021):
常识推理
• CSQA(Talmor et al., 2019)
• StrategyQA (Geva et al., 2021)
• 日期理解与体育理解来自BIG-Bench(BIG-bench collaboration,
2021)。
• SayCan (Ahn et al., 2022)
F 附录:输入/输出示例
表13:LaMDA 137B在字母拼接任务中产生的正确和错误的思维链条示例。
表14:LaMDA 137B在硬币翻转任务中产生的正确和错误的思维链条示例。
表15:LaMDA 137B在CSQA上产生的正确和错误的思维链条示例。
表16:
LaMDA 137B在StrategyQA上生成的正确和错误的思维链条示例。
表17:LaMDA 137B在日期理解方面产生的正确和错误的思维链条示例。
表18:LaMDA 137B在体育理解方面产生的正确和错误的思维链条示例。
表19:PaLM 540B在SayCan机器人规划任务中产生的正确和错误的思维链条示例。
G 附录:完整提示
表20:用于数学文字问题的完整推理链提示的少量示例。这套示例用于所有数学文字问题数据集,除了AQuA。
表21:AQuA全思考过程提示的少量示例。
表22:最后一封信的全思维链提示的少量示例拼接任务。
表23:全思考链提示的硬币翻转任务的少量示例。
表24:CSQA的完整思考过程提示的少量示例。由于空间原因,答案选项之间的新行在表中省略了。
表格25:完整思维链提示的策略问答Few-shot示例。
表格26:完整思维链提示日期理解的少量示例。
表格27:体育理解全链思维提示的少量示例。
表格27:体育理解全链思维提示的少量示例。
H 附录:数学文字问题的备选注释者
表29:数学文字问题全思考过程提示的少量示例。这些示例与表20中的示例相同,只是思考过程由不同的注释者编写(“注释者B”而非“注释者A”)。注释者是合著者,熟悉思考过程提示的目标。
表格30:完整思考过程提示的数学语言问题的少量示例。这些示例与表格20中的示例相同,只是思考过程由另一位注释员(“注释员C”而非“注释员A”)编写。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)