论文翻译 | LEAST-TO-MOST: 从最少到最多的提示使大型语言模型中的复杂推理成为可能

摘要

        思维链提示(Chain-of-thought prompting)在多种自然语言推理任务上展现了卓越的性能。然而,在需要解决的问题比提示中展示的示例更难的任务上,它的表现往往不佳。为了克服从简单到困难的泛化挑战,我们提出了一种新颖的提示策略,即最少到最多提示(least-to-most prompting)。这个策略的核心思想是将复杂问题分解为一系列更简单的子问题,然后按顺序解决它们。解决每个子问题都得益于之前解决的子问题的答案。我们在与符号操作、组合泛化和数学推理相关的任务上进行了实验,结果显示最少到最多提示能够泛化到比提示中看到的更难的问题。一个值得注意的发现是,当使用最少到最多提示的GPT-3 code-davinci-002模型时,它可以在任何分割(包括长度分割)中以至少99%的准确率解决组合泛化基准测试SCAN,而仅使用了14个示例,相比之下,思维链提示的准确率仅为16%。这一点尤其值得关注,因为文献中专注于解决SCAN的神经符号模型是在包含超过15,000个例子的整个训练集上训练的。我们在附录中包含了所有任务的提示。

1 引言

        尽管深度学习在过去十年取得了巨大的成功,但人类智能与机器学习之间仍然存在巨大的差异:(1)给定一个新的任务,人类通常可以从几个演示示例中学会完成它,而机器学习需要大量的标记数据进行模型训练;(2)人类可以清楚地解释其预测或决策的基本原理,而机器学习本质上是一个黑盒子;(3)人类可以解决比他们以前见过的任何困难的问题,而对于机器学习,训练和测试中的示例通常处于相同的难度水平。

        最近提出的思维链提示方法(Wei et al ., 2022;Chowdhery et al, 2022)为缩小人类智能和机器智能之间的差距迈出了重要的一步。它结合了自然语言原理的思想(Ling et al, 2017;Cobbe等人,2021),并辅以少量提示(Brown等人,2020)。当进一步与自一致性解码(Wang et al ., 2022b)相结合,而不是使用典型的贪婪解码时,在许多具有挑战性的自然语言处理任务上,几次思维链提示在很大程度上优于文献中最先进的结果,这些任务是由经过数百倍注释示例训练的特殊设计的神经模型获得的,同时是完全可解释的。

        然而,思维链提示有一个关键的局限性——它在需要泛化的任务上表现往往不佳,这些任务涉及解决比演示示例更难的问题,例如组合泛化(Lake & Baroni, 2018; Keysers et al., 2020)。为了解决这种从简单到困难的泛化问题,我们提出了最少到最多提示。它包括两个阶段:首先将一个复杂问题分解为一系列较简单的子问题,然后依次解决这些子问题,其中解决给定的子问题是通过之前解决的子问题的答案来辅助的。这两个阶段都是通过少样本提示来实现的,因此在任一阶段都没有训练或微调。最少到最多提示的一个使用示例在图1中展示。

图1:最小到最多提示分两个阶段求解数学单词问题:(1)查询语言模型,将问题分解为子问题;(2)查询语言模型,依次求解子问题。第二个子问题的答案建立在第一个子问题的答案之上。本图中省略了每个阶段提示符的演示示例。

        “最少到最多提示”一词是从教育心理学中借用来的(Libby et al, 2008),在那里它被用来表示使用渐进提示序列来帮助学生学习新技能的技术。在这里,我们将这种技术应用于教授人类语言模型。关于符号操作、组合泛化和数学推理的经验结果表明,从最少到最多的提示确实可以泛化到比所演示的更难的问题。

2 从最少到最多的提示

        最小到最大提示教导语言模型如何通过将复杂问题分解为一系列更简单的子问题来解决复杂问题。它由两个连续的阶段组成:

  1. 分解。此阶段的提示包含演示分解的固定示例,然后是要分解的特定问题。
  2.  子问题解决。这一阶段的提示由三部分组成:(1)演示如何解决子问题的恒定示例;(2)之前回答的子问题和生成的解决方案的潜在空列表,以及(3)接下来要回答的问题。

        在图1所示的示例中,首先要求语言模型将原始问题分解为子问题。传递给模型的提示包含演示如何分解复杂问题的示例(图中未显示),然后是要分解的特定问题(如图所示)。语言模型指出,原始问题可以通过解决中间问题“每次旅行需要多长时间?”来解决。

        在下一阶段,我们要求语言模型从问题分解阶段依次解决子问题。原问题作为最后一个子问题追加。解决开始于向语言模型传递一个提示,该提示由说明如何解决问题的示例组成(图中未显示),然后是第一个子问题“每次旅行需要多长时间?”。然后我们使用语言模型生成的答案(“……每次行程需要5分钟”),并通过将生成的答案附加到前一个提示,然后添加下一个子问题来构造下一个提示,该子问题恰好是本例中的原始问题。然后将新的提示传递回语言模型,语言模型返回最终答案。

        最少到最多提示可以与思维链(Wei et al ., 2022)和自洽(Wang et al ., 2022b)等其他提示技巧相结合,但并不一定要结合。此外,对于某些任务,最少到最多提示的两个阶段可以合并成一个单遍提示。

3 结果

        我们给出了符号操作、组合泛化和数学推理任务的最少到最多提示结果,并将其与思维链提示进行比较。

3.1 符号操作

        我们采用了末字母拼接任务(Wei et al., 2022)。在这个任务中,每个输入是一个单词列表,相应的输出是列表中单词的最后一个字母的拼接。例如,“thinking, machine”的输出是“ge”,因为“thinking”的最后一个字母是“g”而“machine”的最后一个字母是“e”。当测试列表的长度与提示示例中的列表相同时,思维链提示能够完美完成工作。然而,当测试列表的长度远长于提示示例中的列表时,它的表现就很差。我们展示了最少到最多提示克服了这个局限性,并且在长度泛化上显著优于思维链提示。

        最少到最多提示。末字母拼接任务的最少到最多提示上下文分别显示在表1和表2中。表1中的示例展示了如何将一个列表分解为一系列子列表。表2中的示例展示了如何将输入映射到期望的输出。给定一个新列表,我们首先将其附加到表1中的示例以构建分解提示,然后将该提示发送到语言模型以获得列表的分解。接着,我们为每个子列表S构建一个解决方案提示,该提示由表2中的示例组成,后面跟着之前的子列表/响应对(如果有的话),然后是S。我们依次将这些提示发送给语言模型,并使用最后一个响应作为最终解决方案。

表1:末字母拼接任务的最少到最多提示上下文(分解)。它可以以100%的准确率将任意长度的列表分解为顺序子列表。

表2:末字母拼接任务的最少到最多提示上下文(解决方案)。这个提示中的两个示例实际上展示了一个基本情况和一个递归步骤。


        值得仔细研究表2中的示例。本质上,它们教会语言模型如何利用之前解决过的问题的答案来构建新问题的答案:(1) 第二个示例中的列表(“think, machine, learning”)是第一个示例中列表(“think, machine”)的扩展,而不是一个完全独立的列表;(2) 对“think, machine, learning”的响应是建立在“think, machine”的输出之上的,起始句子表明“think, machine”的输出是“ke”。这两个示例一起展示了一个基本情况和一个递归步骤。

        思维链提示。末字母拼接任务的思维链提示上下文列在表3中。它使用了与表2中最少到最多提示相同的列表。唯一的区别在于,在思维链提示中,对第二个列表(“think, machine, learning”)的响应是从头开始构建的,而不是使用第一个列表(“think, machine”)的输出。

        我们比较了从最少到最多的提示(表1和2)、思维链提示(表3)和标准少样本提示。标准少样本提示的提示是通过删除思维链提示中的中间解释来构建的。也就是说,它只由这两个例子组成:(1)“think, machine”输出“ke”;(2)“think, machine, learning”输出“keg”。我们不考虑训练或微调基线,因为基于两个示例的机器学习模型泛化效果非常差。

表3:最后一个字母连接任务的思维链提示上下文。与表2中的最小到最大提示不同,思维链提示中的示例彼此独立。

        结果。我们随机抽取Wiktionary1中的单词,以构建长度从4到12不等的测试列表。对于每个给定的长度,将构造500个列表。GPT-3中编码为davici -002的不同方法的精度见表4。标准提示以0的精度完全失败所有测试用例。思维链提示比标准提示显著提高了性能,但它仍然远远落后于从最少到最多的提示,特别是当列表很长时。此外,随着提示长度的增加,思维链提示的性能下降速度比从最小到最多提示快得多。

表4:不同提示方法在最后一个字母连接任务上的准确率。测试列表的长度从4个增加到12个。

        在附录7.2和7.3中,我们展示了使用不同连锁思维提示和不同语言模型的额外实验。请注意,与最少到最多提示相比,思维链提示中的示例可以是相互独立的。对于末字母拼接任务,这意味着我们不需要呈现作为其他示例子列表的示例。实际上,包含独立列表的思维链提示往往优于包含依赖列表的提示,因为前者传达了更多信息。此外,我们可以通过引入额外的示例来增强思维链提示。这似乎是公平的,因为最少到最多提示由于其额外的分解而包含更多的单词。如表13(附录7.3)所示,对于长度为12的列表,思维链提示在使用4个独立示例时达到了37.4%的准确率(附录7.2.2),在使用8个独立示例时达到了38.4%的准确率(附录7.2.3)。尽管与表3中原始提示的31.8%的准确率相比已经有了显著的进步,但思维链提示仍然落后于最少到最多提示,后者拥有74.0%的准确率。

        误差分析。虽然从最少到最多的提示明显优于思维链提示,但对于长列表,它仍远未达到100%的准确性。在附录7.4中,我们给出了详细的误差分析。我们发现只有很少的错误是由于不正确的最后一个字母,而大多数是连接错误(减少或增加一个字母)。例如,给定列表“gratified, contract, fortitude, blow”,该模型会去掉“dte”和“w”的最后一个字母,从而预测结果是“dte”而不是“dtew”。在另一个例子“hollow, supplies, function, gorgeous”中,模型以某种方式复制了“wsn”和“s”串联中的最后一个字母“s”,因此预测结果变成了“wsnss”而不是“wsns”。

3.2 组合泛化

        SCAN (Lake & Baroni, 2018)可能是评估构图泛化最流行的基准。它需要将自然语言命令映射到动作序列(表5)。序列到序列模型在长度分割下表现不佳,训练集中的动作序列(约占20,000多个样本的完整集合的80%)比测试集中的动作序列短。已经提出了许多专门的神经符号模型来解决SCAN (Chen et al ., 2020;Liu et al ., 2020;Nye et al, 2020;Shaw等人,2021;金正日,2021)。我们展示了使用最少到最多提示的大型语言模型可以仅使用几个演示示例来解决SCAN问题。不需要训练或微调。

表5:SCAN中的示例命令及其相应的动作序列。agent通过执行相应的动作序列成功执行自然语言命令。

        Least-to-most提示。与第3.1节中的最后一个字母连接任务类似,SCAN的最小到最大提示基于两种提示:(1)包含8个示例的命令分解提示,用于演示如何将长命令分解为短命令列表(其中一些示例参见表6);(2)包含14个示例的命令映射提示符,用于演示如何将自然语言命令映射到动作序列(其中一些示例参见表7)。分解和映射的完整提示上下文列在附录8中。命令映射提示符中使用的示例旨在完全涵盖SCAN命令的语义。

表6:将长命令分解为短命令序列的两个示例,从提示符最少到最多。

表7:从最少到最多/思维链提示中获取的两个示例,用于将命令映射到动作序列。Python表达式被用作中间表示。

        我们使用Python表示法来使我们的最少到最多提示以及基线(标准少样本提示和思维链提示)简洁,并满足语言模型的输入大小限制(通常最多2048个令牌)。例如,在我们的提示设计中,我们将“look twice”映射为“LOOK” * 2,而不是“LOOK LOOK”。我们需要指出的是,这些Python表达式只是中间表示。从语言模型获得响应后,我们运行一个后处理脚本来扩展Python表达式以生成最终结果。然而,我们也可以进一步教授语言模型正确处理表达式,这并不令人惊讶。在附录8.4中,我们展示了通过几个演示示例,语言模型能够以接近完美的99.7%的准确率扩展Python表达式。

        思维链提示。用于SCAN的思维链提示使用了与最少到最多提示相同的命令映射上下文(见表7),但它不使用命令分解,这是最少到最多提示所独有的。

        结果。我们将最少到最多提示与思维链提示和标准的少样本提示进行比较。标准的少样本提示范例是通过去掉中间解释,从思维链提示中得到的。不同语言模型下不同提示方法的准确率如表8所示。示例输出可以在附录8.3中找到。使用代码-davinci-002,在长度分割下,最小到最大提示的准确率达到99:7%。我们还在所有其他分割甚至整个SCAN数据集上测试了从最少到最多的提示。我们发现它的求解速度保持不变。此外,值得注意的是,代码- davincii -002始终优于文本- davincii -002,而与提示方法无关。

表8:长度分割下SCAN测试集上不同提示方式的准确率(%)text- davici -002的结果基于100个命令的随机子集。

        误差分析。在长度分割的测试集中,提示从少到多共有13个错误,其中6个错误地将“twice”和“three”解释为“around”后面的“twice”和“three”,其余错误地将“after”解释为“and”。让我们为每个类别展示一个失败的例子。在示例“在向右跑三圈后向右走两次”中,code- davincii -002正确地将表达式“向右跑”翻译为(“向右转”+“跑”)* 4。然后,当对这个表达式应用“三次”时,它犯了一个错误,产生(“右转”+“跑”)* 9而不是(“右转”+“跑”)* 4 * 3或(“右转”+“跑”)* 12。在示例“向左运行三次后向左运行两次”中,code-davinci-002为两个由“after”连接的子表达式生成正确的翻译,但它将它们组合起来,就好像它们是由“and”连接一样。这意味着模型产生(“左转”* 2 +“跑”)* 3 +(“左转”+“跑”)* 4 * 2而不是(“左转”+“跑”)* 4 * 2 +(“左转”* 2 +“跑”)* 3。详细的误差分析见附录8.2。

3.3数学推理

        在本节中,我们应用最小到最大提示来解决GSM8K (Cobbe等人,2021)和DROP (Dua等人,2019)中的数学单词问题。我们特别感兴趣的是,结合最少到最多提示的大型语言模型是否可以解决比提示中看到的更困难的问题。在这里,我们只是通过解决步骤的数量来衡量难度。

        我们为解决GSM8K而设计的提示符如表9所示。演示范例由两部分组成。第一部分(从“让我们来分解这个问题……”开始))展示了如何将原始问题分解为更简单的子问题,第二部分展示了如何按顺序解决子问题。请注意,此提示将分解和子问题解决合并到单个步骤中。相反,可以设计两个不同的提示分别用于分解和子问题解决,就像前面部分中最少到最多的提示一样,以进一步提高性能。在这里,我们将重点研究如何将这个简单的“最小到最多”提示从简单的两步问题推广到更复杂的多步问题。

表9:解决GSM8K的最小到最大提示。演示问题只需要两个步骤就可以解决,但是提示符可以处理需要多个步骤才能解决的问题。

        我们还构建了一个思维链提示(表10)作为基线。它是通过删除分解部分从最小到最大提示(表9)派生出来的。结果如表11所示。

        总的来说,从最少到最多的提示只略微提高了思维链提示:从60:97%提高到62:39%;然而,从最少到最多的提示从根本上提高了解决至少需要5个步骤的问题的思维链提示:从39:07%提高到45:23%(表12)。

        我们发现,在GSM8K中,几乎所有从最少到最多提示都无法解决的问题,最终都可以通过使用手工制作的分解来解决。这不足为奇。对于我们人类来说,只要我们知道如何将一个复杂的问题分解成更简单的子问题,我们实际上已经解决了它。对于DROP基准,从最少到最多的提示在很大程度上优于思维链提示(表11)。这可能是因为DROP中的大多数问题都可以简单地分解。

表10:解决GSM8K的思维链提示。它是通过删除分解部分从表9中最小到最大的提示派生出来的。

表11:不同提示方法在GSM8K和DROP上的准确率(%)(仅包含数值问题的子集)。基本语言模型是code-davinci-002。

表12:最少到最多提示和思维链提示的准确性(%),按预期解决方案中所需推理步骤的数量进行细分。

4 相关工作

        组合泛化。SCAN(Lake & Baroni, 2018)是一个广泛使用的基准测试,用于评估组合泛化能力。在其所有分割中,最具挑战性的是长度分割,它要求模型能够泛化到比训练序列更长的测试序列。之前在SCAN上表现良好的工作大多提出了神经符号架构(Chen et al., 2020; Liu et al., 2020)和语法诱导技术(Nye et al., 2020; Shaw et al., 2021; Kim, 2021)。Chen等人(2020)提出了神经符号堆栈机器,其中包含一个神经网络作为控制器,为给定的输入生成执行轨迹,以及一个符号堆栈机器来执行轨迹并产生输出。执行轨迹由用于序列操作的特定于领域的原语组成,这使得机器能够将输入句子分解为不同的组件,分别翻译它们,并将它们组合在一起。Liu等人(2020)提出了一个框架,该框架协作学习两个神经模块,一个组合器和一个求解器,以共同学习输入结构和符号语法规则。Nye等人(2020)和Shaw等人(2021)推断出了SCAN的符号语法规则,而Kim(2021)提出了学习潜在神经语法的方案。尽管带有符号组件的方法能够在SCAN上达到100%的准确率(Chen et al., 2020; Liu et al., 2020; Nye et al., 2020; Shaw et al., 2021),但它们需要复杂的模型训练和语法推断算法来搜索大型语法空间。另一项关于SCAN的工作设计了数据增强方案(Andreas, 2020; Akyurek et al. ¨ , 2021; Lake, 2019)。Andreas(2020)和Akyurek等人(2021)通过重新组合不同训练样本中出现的片段来构建合成训练样本,而Akyurek等人(2021)进一步设计了一种抽样方案,鼓励重新组合模型产生稀有样本。另一方面,Lake(2019)提出了一个元训练算法,该算法需要一个元语法空间来构建训练数据,样本语法的格式与SCAN语法相似。尽管这些数据增强技术提高了在几个组合泛化基准测试上的性能,但它们未能解决SCAN的长度分割问题。其他先前的工作提出了神经网络架构来改善组合泛化,其中鼓励模型学习单词和跨度映射(Russin et al., 2019; Li et al., 2019),输入和输出的对齐作为跨度树(Herzig & Berant, 2021),以及输入和输出单词的排列等变性(Gordon et al., 2020)。然而,这些没有符号组件的端到端神经网络仍然无法泛化到更长的测试输入。与现有工作不同,我们展示了在没有专门设计来改善组合泛化的模型架构和符号组件的情况下,最少到最多提示仅凭少量的演示示例在任何分割(包括长度分割)上达到了99.7%的准确率,并且不需要任何训练或微调。

        从简单到困难的泛化。除了组合泛化之外,还有许多其他任务,测试用例需要比训练示例更多的推理步骤来解决,例如,末字母拼接任务中的测试列表比演示示例更长。Dong等人(2019)提出了神经逻辑机器(NLMs),用于归纳学习和逻辑推理。在小型任务(如小块世界)上训练的NLMs能够完美地泛化到大型任务(如更大的块世界)。Schwarzschild等人(2021)表明,通过在推理过程中执行额外的递归,训练来解决简单问题(如小尺寸迷宫或棋盘谜题)的递归网络能够解决更复杂的问题(如大尺寸迷宫或棋盘谜题)。在我们的方法中,我们通过将复杂问题分解为一系列更简单的问题来实现从简单到困难的泛化。

        任务分解。Perez等人(2020)将多跳问题分解为若干独立的单跳子问题,这些子问题由现成的问答(QA)模型回答。然后,将这些答案汇总形成最终答案。问题分解和答案聚合都是由训练过的模型实现的。Wang等人(2022a)通过将提示建模为连续的虚拟令牌,并通过迭代提示从语言模型中逐步引出相关知识来执行多跳QA。与这些方法不同,我们的方法不涉及任何训练或微调。此外,最少到最多提示中生成的子问题通常是相互依赖的,并且必须按照特定的顺序依次解决,以便一些子问题的答案可以作为解决其他子问题的构建块。Yang等人(2022)通过将问题分解为一系列与SQL子句对应的自然语言提示,并通过基于规则的系统将自然语言问题翻译为SQL查询。Wu等人(2022)提出串联大型语言模型的步骤,使得一个步骤的输出成为下一步的输入,并开发了一个交互式系统,供用户构建和修改链。最少到最多提示串联了问题分解和子问题解决的过程。

5 局限性

        分解提示通常不能很好地跨不同领域泛化。例如,一个展示数学应用题分解的提示(如表9所示)对于教导大型语言模型分解常识推理问题,如“亚里士多德使用笔记本电脑吗?”(Geva et al., 2021)是无效的。为了达到最佳性能,必须为这类问题设计一个新的提示来展示分解。即使在同一领域内,泛化分解也是困难的。我们观察到,如果大型语言模型能够得到GSM8K中几乎所有问题的正确分解,那么这些问题就可以准确地解决。这一发现并不令人惊讶,并且与我们在解决数学问题时的经验相符。每当我们成功地将一个数学问题分解为可以解决的更简单的子问题时,我们实际上已经解决了原始问题。在末字母拼接任务和SCAN基准测试上取得了卓越的结果,因为这些任务中的分解相对简单。

6 结论与讨论

        我们引入了最少到最多提示,以使语言模型能够解决比提示中更难的问题。这种方法包括一个两步过程:问题的自顶向下分解和自底向上的解决方案生成。我们的实证研究涵盖了符号操作、组合泛化和数学推理,发现最少到最多提示显著超越了标准提示和思维链提示。
        一般来说,提示可能不是教导大型语言模型推理技能的最佳方法。提示可以被视为一种单向通信形式,我们向语言模型发出指令,而不考虑其反馈。一个自然的发展趋势是将提示演变为完全双向的对话,使语言模型能够获得即时反馈,从而实现更高效和有效的学习。最少到最多提示技术代表着通过这种双向互动来指导语言模型的一个步骤。

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

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

相关文章

请你谈谈:BeanDefinition类作为Spring Bean的建模对象,与BeanFactoryPostProcessor之间的羁绊

那么,我们如何理解Spring Bean的建模对象呢?简而言之,它是指用于描述和配置Bean实例化过程的模型对象。有人可能会提出疑问,既然只需要Class(类)就可以实例化一个对象,Class作为类的元数据&…

电气工程VR虚拟仿真实训平台以趣味化方式增强吸引力

在工业4.0时代和教育信息化的双重推动下,我们致力于推动实训课件的跨界合作与共创。VR实训课件不仅促进了不同领域、不同行业之间的紧密合作,更让学习变得生动直观。我们凭借3D技术生动、直观、形象的特点,开发了大量配套3D教材,让…

CSS 【实用教程】(2024最新版)

CSS 简介 CSS 是层叠样式表( Cascading Style Sheets ) 的简写,用于精确控制 HTML 页面的样式,以便更好地展示图文信息或产生炫酷/友好的交互体验。 没有必要让所有浏览器都显示得一模一样的,好的浏览器有更好的显示,糟糕的浏览器…

C\C++ 终端输出带有颜色的字符

终端显示带有颜色的字符 终端显示带有颜色的字符 终端显示带有颜色的字符背景:测试机器,win10系统, VS2022编写字体设置不同的颜色背景色光标移动 (这个用的估计不是很多)字体设置动态显示C cout 也可以测试代码准确的…

【C++】继承(二)

目录 5、继承与友元 6、继承与静态成员 7、复杂的菱形继承和菱形虚拟继承 8、继承的总结与反思 5、继承与友元 友元关系不能继承,也就是说父类的友元不能访问子类的私有或保护的成员 class Student; class Person { public:friend void Display(const Person&a…

.net C# 使用网易163邮箱搭建smtp服务,实现发送邮件功能

功能描述:使用邮箱验证实现用户注册激活和找回密码。邮箱选择网易163作为smtp服务器。 真实测试情况:第一种:大部分服务器运行商的25端口默认是封禁的,可以联系运营商进行25端口解封,解封之后可以使用25端口。第二种&…

【Pytorch】Conda环境下载慢换源/删源/恢复默认源

文章目录 背景临时换源永久换源打开conda配置condarc换源执行配置 命令行修改源添加源查看源 删源恢复默认源使用示范 背景 随着实验增多,需要分割创建环境的情况时有出现,在此情况下使用conda create --name xx python3.10 pytorch torchvision pytorc…

文件读写操作之c语言、c++、windows、MFC、Qt

目录 一、前言 二、c语言文件读写 1.写文件 2.读文件 三、c文件读写 1.写文件 2.读文件 四、windows api文件读写 1.写文件 2.读文件 五、MFC文件读写 1.写文件 2.读文件 六、Qt文件读写 1.写文件 2.读文件 七、总结 一、前言 我们在学习过程中&#xff0c…

OpenCV解决验证码(数字和字母)识别(Python)

文章目录 前言一、准备验证码图片 前言 OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库。它支持Windows、Linux、Mac OS、Android和iOS等多个操作系统,提供了丰富的图像处理和计算机视觉功能,包括但…

链路追踪系列-01.mac m1 安装zipkin

下载地址:https://hub.docker.com/r/openzipkin/zipkin jelexjelexxudeMacBook-Pro zipkin-server % pwd /Users/jelex/Documents/work/zipkin-server 先启动Es: 可能需要先删除 /Users/jelex/dockerV/es/plugins 目录下的.DS_Store 当端口占用时再次启动&#x…

Qt+ESP32+SQLite 智能大棚

环境简介 硬件环境 ESP32、光照传感器、温湿度传感器、继电器、蜂鸣器 基本工作流程 上位机先运行,下位机启动后尝试连接上位机连接成功后定时上报传感器数据到上位机,上位机将信息进行处理展示判断下位机传感器数据,如果超过设置的阈值&a…

【Wamp】局域网设备访问WampServer | 使用域名访问Wamp | Wamp配置HTTPS

局域网设备访问WampServer 参考&#xff1a;https://www.jianshu.com/p/d431a845e5cb 修改Apache的httpd.conf文件 D:\Academic\Wamp\program\bin\apache\apache2.4.54.2\conf\httpd.conf 搜索 Require local 和Require all denied&#xff0c;改为Require all granted <…

【排序算法】计数排序

目录 一.基本思想 二.缺陷及优化 三.代码实现 四.特性总结 1.可以排序负数 2.适合范围集中的整数 3.时间复杂度&#xff1a;O(Nrange) 4.空间复杂度&#xff1a;O(range) 5.稳定性&#xff1a;稳定 一.基本思想 根据待排序数组a创建一个新的数组count&#xff0c;该数组…

python--实验 11 模块

目录 知识点 模块基础 模块使用方式 自定义模块示例 模块的有条件执行 Python包结构 定义和导入包 常用第三方库及安装 实例代码 第三方库自动安装脚本 Python标准库介绍 PyInstaller 小结 实验 1.(基础题)制作文本进度条。 2.(基础题) 蒙特卡罗方法计算圆周率…

nginx正向代理、反向代理、负载均衡

nginx.conf nginx首要处理静态页面 反向代理 动态请求 全局模块 work processes 1; 设置成服务器内核数的两倍&#xff08;一般不不超过8个超过8个反而会降低性能一般4个 1-2个也可以&#xff09; netstat -antp | grep 80 查端口号 *1、events块&#xff1a;* 配置影响ngi…

深度学习基础:Numpy 数组包

数组基础 在使用导入 Numpy 时&#xff0c;通常给其一个别名 “np”&#xff0c;即 import numpy as np 。 数据类型 整数类型数组与浮点类型数组 为了克服列表的缺点&#xff0c;一个 Numpy 数组只容纳一种数据类型&#xff0c;以节约内存。为方便起见&#xff0c;可将 Nu…

Linux多线程编程-生产者与消费者模型详解与实现(C语言)

1.什么是生成者与消费者模型 生产者-消费者模型是并发编程中的经典问题&#xff0c;描述了多个线程&#xff08;或进程&#xff09;如何安全、有效地共享有限的缓冲区资源。在这个模型中&#xff0c;有两种角色&#xff1a; 生产者&#xff08;Producer&#xff09;&#xff1…

Docker 安装ros 使用rviz 等等图形化程序

Docker 安装ros 使用rviz 等等图形化程序 ubuntu 版本与ros 发行版本对应 如何安装其它版本ros 此时考虑使用docker 易于维护 地址&#xff1a; https://hub.docker.com/r/osrf/ros 我主机是 ubuntu22.04 使用这个标签 melodic-desktop-full 1 clone 镜像到本机 docker pu…

OpenCV:python图像旋转,cv2.getRotationMatrix2D 和 cv2.warpAffine 函数

前言 仅供个人学习用&#xff0c;如果对各位朋友有参考价值&#xff0c;给个赞或者收藏吧 ^_^ 一. cv2.getRotationMatrix2D(center, angle, scale) 1.1 参数说明 parameters center&#xff1a;旋转中心坐标&#xff0c;是一个元组参数(col, row) angle&#xff1a;旋转角度…

html(抽奖设计)

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>抽奖</title><style type"text/css">* {margin: 0;padding: 0;}.container {width: 800px;height: 800px;border: 1px dashed red;position: absolut…