ToolkenGPT:用大量工具增强LLM

news2024/11/27 0:42:48

8f024a270dedade4b4b2bdebbad5430d.png

深度学习自然语言处理 原创
作者:cola

用外部工具增强大型语言模型(LLM)已经成为解决复杂问题的一种方法。然而,用样例数据对LLM进行微调的传统方法,可能既昂贵又局限于一组预定义的工具。最近的上下文学习范式缓解了这一问题,但有限的上下文长度局限于少样本样例,导致不能完全挖掘工具的潜力。此外,当有许多工具可供选择时,上下文学习可能完全不起作用。因此本文提出了一种替代方法ToolkenGPT,它结合了双方的优势。

论文:
ToolkenGPT: Augmenting Frozen Language Models with Massive Tools via Tool Embeddings

地址:
https://arxiv.org/abs/2305.11054

介绍

LLM已经成为各种现实世界应用程序的强大工具。随着这些模型的不断发展,人们对其与现实世界交互的潜力越来越感兴趣,并通过与其他工具集成来增强其功能,如计算器、数据库等。这些模型掌握和控制各种工具的能力不仅是其智能的标志,还标志着一条有希望的克服其部分基本弱点的道路。包括更新最新的世界知识,减少其幻觉,以及执行符号操作等。

然而,新工具的迅速出现,如高级软件库、新颖的API或特定领域的实用程序,为LLM的工具学习任务带来了额外的丰富和复杂性。这种不断的演变强调了赋予LLM快速适应和掌握大量新工具的能力的重要性。

表1展示了与LLM的工具集成的两种主要研究方法。第一种方法涉及微调以学习特定工具。虽然这种方法可以产生很好的结果,但它的计算成本很高,并且缺乏对新工具的适应性。第二种方法依赖于上下文学习,LLM通过提示中提供的上下文样例来学习如何使用工具。这种方法允许LLM处理新引入的工具。然而,上下文学习有其独特的局限性,使它不可能在上下文中使用大量的工具。此外,仅通过少量样本掌握新工具可能具有挑战性。10749070bb3f6f6495db75668884ab7b.png本文提出ToolkenGPT,一种使LLM能够掌握大量的工具,而不需要任何微调,同时允许LLM快速适应新工具。ToolkenGPT的关键思想是将每个工具表示为一个新token(“toolken”),以增加词汇表。具体来说,每个工具都与插入到LLM头部的嵌入相关联,就像常规的单词tokens嵌入一样。在生成过程中,一旦预测到toolken, LLM临时切换到特殊模式(通过提示)以产生工具要执行的输入参数,并将输出注入到生成中(参见图1)。这种方法为LLM提供了一种有效的方法,只需学习轻量级toolken嵌入即可掌握工具。9ad1dbaa6777aa85a2751bde367015da.png因此,ToolkenGPT结合了微调和上下文学习范式的优势,同时避免了它们的局限性:与只能容纳少量工具和少量样例的上下文学习相比,ToolkenGPT允许大量工具(通过简单地在词汇表中插入各自的工具),并可以使用广泛的样例数据来学习toolken嵌入;与微调相比,不仅需要最小的训练成本,而且还提供了一种方便的方法,通过扩展toolken词汇表来动态插入任意新工具。

ToolkenGPT掌握大量工具

首先介绍一下工具使用语言建模的背景和符号表示。通常,LLMs对单词标记序列为,其中每个单词token来自LLM的词汇,即,表示第步之前的部分词token序列。在实践中,通常设置序列的前缀(称为提示),以引导LLM生成所需的内容。进一步深入,下一个token的分布被预测为,其中是当前上下文的最后一个隐藏状态,是单词token的嵌入矩阵(也称为语言模型头)。

给定工具集,我们的目标是使LLM能够调用这些工具的子集来解决复杂的问题。所提出的灵活公式允许工具通过返回一些可以帮助LLM进行文本生成(例如计算)或影响现实世界环境(例如机器人动作)的结果来发挥作用。要在生成过程中调用工具,LLM首先需要选择工具,然后输入参数。在图1所示的运行示例中,在答案生成过程(“Reasoning model”)中,选择数学运算符square作为工具,并在“工具模式”中生成一个操作数16作为参数。一旦外部工具收到调用,它就会执行工具并返回结果256,返回Reasoning model。

框架概览

ToolkenGPT的核心思想是明确地将工具制定为token。每个工具集被参数化为一个工具集嵌入向量,我们将一组工具集嵌入表示为一个矩阵,即。假设我们已经训练了toolken嵌入,如图1所示,LLM默认处于推理模式,以生成下一个token。该框架允许LLM统一考虑单词token和工具token。具体来说,工具嵌入矩阵与连接。因此,LLM预测下一个token的概率如下:0448945f1aa1916d4db52ff4fa04e0d7.png其中下一个token可以是词token,也可以是工具集,即,且[;]是拼接操作。我们将工具表述为toolken嵌入,自然允许通过扩展toolken嵌入矩阵来快速适应新工具。要执行工具,一旦其toolken被预测为下一个令牌(如图1中的“mode switch”所示),LLM将切换到“tool mode”,其目的是为工具生成参数。

具体来说,LLM暂停生成并将当前生成的上下文附加到另一个提示符。工具模式下的提示由预测工具的上下文样例组成,展示如何通过引用特殊语法[tool]中的工具调用来生成工具参数。然后LLM可以在样例中遵循模式来完成当前工具调用的参数。与之前完全依赖上下文学习进行工具学习的方法相比,所提出框架只将完成论证的简单工作留给上下文学习。此外,对于单个指定工具的样例,将有丰富的上下文空间。最后,将参数发送到指定的工具执行,并将返回值发送回推理模式下的文本。

学习工具嵌入

该框架冻结了原始LLM的参数,并使用工具嵌入引入了最小的额外训练开销。该嵌入矩阵包含唯一需要优化的参数,但与其他有效的LLM微调方法不同,它不需要梯度流过LLM参数的主体,从而导致非常稳定和高效的训练。因此,toolken嵌入的微调与LLM推理使用了几乎相同的GPU内存。每当添加新工具时,toolken嵌入可以方便地扩展,然后,在涉及新工具的工具样例数据上的后续训练逐渐细化其嵌入。此外,与只将少数示例消化为训练信号的上下文学习方法不同,ToolkenGPT能够从大规模样例中调整工具嵌入。

本文主要关注通过工具样例学习工具嵌入,它可以是域内训练数据,也可以是LLM生成的合成数据。我们首先描述训练数据的格式和训练目标,并使用图1中的相同示例来展示如何将其用于训练。例如"the area is 256 square feet …"可以标记为token序列s=("the","area","is","2","5","6","square ","feet",…)。为了表明何时预测工具集,我们需要一个混合了词token和工具集的平行序列,即s'=(“the”,“area”,“is”,“[square]”,“[N/a]”,“[N/a]”,“square”,“feet”,…)。在s中(“2”,“5”,“6”)的子序列是返回的工具结果应该填充的地方,我们选择s'中对应的第一个token作为工具调用的工具,以下token填充[N/A],表示在损失计算中被忽略。因此,给定一个由配对序列D={(s,s')}组成的数据集,ToolkenGPT的训练目标为:608e539cf8392d433f8ab58cbb5e8ffe.png

其中在公式1中定义了,是指示函数,表示我们在训练期间忽略[N/A]标记。因此,我们的训练过程在很大程度上与推理模式中的推理一致。

获取配对数据的方法主要有两种。首先,一些数据集与自然语言序列一起提供了基准事实工具调用。为了将数据用于监督学习,我们对其进行预处理,以获得训练所需的成对数据,如上文所述。其次,探索了用LLM合成工具样例,分享了与自指导类似的想法。对这个过程的直观解释是将LLM中的知识提取到新的工具嵌入中。具体来说,我们可以用工具文档和一些具有特殊语法指示工具调用的样例来提示LLM,例如,The capital of U.S. is <capital> ("U.S.")="Washington D.C."。在此基础上,LLM可以生成一些新的用例,这些用例利用给定的工具并使用相同的语法引用工具调用。然后,我们可以轻松地定位工具调用,并将数据处理为用于训练的成对数据。

实验

作者将ToolkenGPT应用于三个不同的应用:用于数值推理的算术工具、用于基于知识的问答的数据库API、用于具具计划生成的机器人动作。重点关注方法如何准确地调用工具,以及它们如何成功地解决任务。实验表明,ToolkenGPT可以有效地掌握大量工具,同时利用它们来解决复杂问题,性能有所提高,始终优于先进的提示技术。

数理推理

探索四个基本算术函数(+、−、×、÷)的可用性。此外,为了对更复杂数学问题中的工具处理能力进行基准测试,包括更多可用的工具,即扩展的函数集,并创建一组合成数据。结果表明,通过仅在合成数据上进行训练,ToolkenGPT显著优于基线。

数据集

为全面评估工具学习在数值推理方面的能力,策划了两个新的测试数据集:

  • GSM8K-XL:现有GSM8K数据集的增强版本。GSM8K是一个包含不同语言的小学数学应用题的数据集,涉及使用4种基本算术运算(+、−、×、÷)进行一系列计算,以得到最终答案。在测试集中,我们放大数字以增加LLMs的计算难度,这导致了GSM8K-XL数据集,具有568个具有更大数字的测试用例。

  • FuncQA:该数据集需要至少13个运算符(如power、sqrt、lcm)来解决,在没有外部计算器的情况下,人类和LLM都具有挑战性。将FuncQA分为两个子集:68个只需一次操作即可求解的单跳问题(one-hop question, FuncQAone)和60个需要少量推理步骤的多跳问题(multi-hop question, FuncQAmulti)。

对比方法

我们为每个可用的数学运算符训练toolken嵌入。在推理过程中,用4-shot思维链的例子来提示LLM。为了进行比较,对以下基线进行了评估:

  • 使用ChatGPT作为基础LLM。这个基线衡量了LLM用其自身的推理和计算能力回答复杂数值推理问题的能力。

  • 思维链(chain -of- thought, CoT)是一种更先进的提示技术。在这种方法中,精心设计了一系列相互关联的提示,以指导LLM一步步地推理过程。示例中的推理链与我们在ToolkenGPT中使用的推理链相同,但没有可用的函数。

  • ReAct通过促使LLM以交错的方式生成语言推理轨迹和工具调用,将推理和工具相结合。具体来说,不仅仅是提供推理链,还引入了特殊的语法来调用操作符。一旦在推理过程中检测到语法,就会调用该工具来计算结果。

结果分析

表2显示了所有方法在GSM8K-XL和FuncQA数据集上的性能。在GSM8K-XL数据集上,使用CoT的零样本ChatGPT和少样本学习在没有工具帮助的情况下很难计算大量的数字,而ReAct和ToolkenGPT设法以较大的幅度持续提高准确性。这两个方法都可以在必要时调用正确的工具,因为工具集只有4个基本操作符。

然而,对于FuncQAone和FuncQAmulti数据集,随着工具数量的增加,学习调用适用的工具变得具有挑战性。在ReAct中,尽管所有的工具都列在提示符的开头,但在有限的上下文中包括每个工具的样例是不可行的。因此,ReAct很容易受到缺少工具调用、错误的工具调用和预测错误的参数的影响,特别是对于没有在上下文中样例的工具。ToolkenGPT在单跳和多跳场景中都优于所有基线,当有许多工具时,显示出卓越的工具学习能力。6ca3d1e3d35b3b00c261a307adeffe5c.png

基于知识的问答

由于有限的知识限制,LLM经常犯事实错误和幻觉。让它们能够访问知识库(KBs)是一个有希望的研究方向,以减少它们的幻觉。我们将对知识库的访问表述为查询数据库的API。因此,每个关系查询都可以被视为一个工具,其输入参数是主题实体,输出是相应的尾部实体。

数据集

KAMEL是一个基于Wikidata的问答数据集。参照ToolFormer采用KAMEL来评估KB查询工具的使用情况。KAMEL包含了来自Wikidata的243个关系的知识,每个关系都与一个问题模板相关联,以便将Wikidata中的一个事实转换为一个问题。这个数据集总共有234个工具。为了分析不同数量工具的性能,我们从原始测试集中抽样创建了四个子集。每个子集由与不同数量关系相关的问题组成,分别对应于30、60、100和234。每个子集的大小是500。

对比方法

我们设置了两个不同的框架:

  • ToolkenGPT(sup):从KAMEL的训练集中每个关系采样200个示例,并通过监督学习训练toolken嵌入。该设置表示有足够的域内训练数据可用的真实场景。

  • ToolkenGPT(syn):假设域内训练数据不可用,使用每个关系的文本描述与ChatGPT合成训练数据,使用潜在的工具winner_of(NOBEL PEACE PRIZE IN 2020)→UNITED NATIONS WORLD FOOD PROGRAMME。平均使用40个示例来训练每个toolken嵌入。

本文提出以下比较基线:

  • 提示:用LLM的内部知识回答问题。我们在" question:[QUESTION]\nThe answer is"提示符中构建每个问题,并让LLM继续这个句子。

  • 上下文学习(ICL):在提出问题之前,我们列出所有可用工具的工具样例和描述。样例以特定的语法显示,以便LLM可以以类似的风格生成以进行解析。

  • 上下文学习(desc):所有可用工具的描述将在上下文中提供,但它们的样例并不直接显示。相反,我们展示了测试子集中不包含的工具的样例。

所有方法的基本模型都是LLaMA-13B。

结果分析

我们在图2中展示了涉及不同数量关系的4个测试集上的实验结果。ToolkenGPT(sup)取得了最高的结果,表明在有大量域内训练数据时,学习toolken嵌入是一种有效的方法。相反,即使上下文学习也会在上下文中看到域内训练数据,但它仍然不清楚要调用哪些工具。此外,当要使用的工具超过30个时,上下文长度限制会导致性能急剧下降。多工具场景中的失败揭示了上下文学习范式的根本局限性。ToolkenGPT(syn)在所有子集中也优于所有其他基线。

合成训练数据通常与数据集具有非常不同的表达风格,但仍然有助于LLM理解这些关系。这一成功反映了该框架的灵活性,即使在没有域内训练数据可用的情况下也可以应用。上下文学习(desc)在这项任务中通常失败,因为LLM很难记忆在上下文中显示的文本描述并将其映射到关系标识符。该结果证实了LLM在使用不熟悉的工具时存在困难这一猜想。基于这种观察,我们有理由推测,LLM主要是从它们的标识符中回忆工具,而不是真正从它们的描述中学习使用工具。e460d9917b7a3a6461532ec57c0a6a8e.png

具身计划生成

最近,有许多研究尝试利用LLM作为具身智能体的控制器。我们也探索了所提出框架如何应用于具身智能体的计划生成。与之前提示LLM的方法相比,ToolkenGPT可以通过学习智能体动作和对象的toolken嵌入来更好地理解环境。

数据集

VirtualHome:一个典型家庭活动的仿真平台,活动程序知识库由许多可在VirtualHome中执行的任务和计划组成。从活动程序中得出297个任务的子集。对于每个任务,给模型一个高级目标(例如:“读书”)、详细的指令(例如:“我会躺在床上,打开书开始阅读”,以及对环境的描述,其中包括初始状态和环境的对象列表(例如:“我在[家庭办公室]。我可以操作的对象是['邮件','冰箱','电视',…,‘小说’)”。该模型被期望输出一个可执行的计划,它是一个动词-对象指令的有序列表。每个任务都有一个初始状态图和最终状态图,从而能够使用模拟器验证生成的计划,并将最终状态与真实状态进行比较。我们将数据集划分为包含247个任务的训练集和包含50个任务的测试集,数据集中总共使用了25个动词和32个对象。

对比方法

我们认为VirtualHome中的所有动作和对象都是工具。加上一个额外的[END]函数表示计划的结束,我们总共有58个工具。对于这个数据集,我们不需要图1中描述的参数生成过程,因为这些工具不接受参数。在推理过程中,ToolkenGPT交替生成动作工具和对象工具,并以[END]工具结束。toolken嵌入在训练集上进行训练。将该方法与以下基线进行了比较:

  • 上下文学习:提示LLM并将其输出解析为计划。LLM显示了行动列表、3个样例计划和一个具有目标、详细描述和环境描述的新任务。

  • Translation:使用SentenceRoBERTa-large将动作或对象转换为具有最高余弦相似度的可用动作或对象。

  • Grounded Decoding:用affordance grounding函数,鼓励LLM生成有效的动作和对象。

结果分析

我们在表3中列出了结果。尽管使用上下文学习的LLM在上下文中明确列出了所有有效的动作和对象,但有时它不能将其预测作为可接受的指令的基础。即使动作和对象是有效的,但在VirtualHome中往往违反物理规律,导致成功率较低。ToolkenGPT不仅通过其设计自然地预测有效的动作和对象,而且还通过从更多的训练任务中学习toolken嵌入来实现最高的成功率。dbd1444dfff1d2f8ddc756e6e6b7ed4c.png图3展示了一个具体的例子来说明差异。2af47d2abdc3e825e6061b2c8f01a9d8.png

分析

计算损耗

通过实验比较了ToolkenGPT和微调在计算效率和性能方面的差异。本文在LLaMA-7B上实现了这两种方法。结果列在表4中。92952856cdc29087c3cae7d04a612385.png对LLMs进行微调后,在FuncQA上的性能略好于ToolkenGPT。即使我们应用了以效率著称的LoRA,但与训练工具嵌入相比,微调的时间消耗明显更长。

消融学习

ToolkenGPT的设计有利于工具选择和参数完成。为了理解它们各自对性能的贡献,我们进一步实现了一个将ReAct-style的提示和参数完成的子程序(工具模式)相结合的基线。在工具模式下,LLM只使用所选工具对样例进行提示,这将提供比ReAct提示更相关的知识。dcd83e39d60b33c02e4f6c4bc92dfd8d.png如表5所示,添加工具模式确实可以通过提高参数补全的准确性来改进普通的ReAct提示方法。然而,ToolkenGPT仍然在很大程度上优于这个改进的基线,这表明toolken嵌入有效地帮助LLM决定何时调用以及调用哪个工具。

训练数据

因为有两种不同的训练数据来源,并且很容易处理或合成更多的数据,所以在KAMEL上扩展实验。对每个工具的ToolkenGPT(sup)和ToolkenGPT(syn)进行了10/20/40的训练样本采样,并报告了在包含30个工具的测试集上的精度。结果汇总在表6中。98503da116a00044e8c3c2a7a0c0b1d1.png在相同的数据规模预算下,使用监督数据进行训练可以获得更好的性能。尽管在大多数合成数据实例中没有观察到明显的错误,但合成数据和测试集之间的分布差距可能会阻止toolken嵌入的良好表现。更大的训练集有利于提高两个数据源的性能。

总结

提出了ToolkenGPT,一种用大量外部工具来增强LLM的新方法。该方法为每个工具引入了toolken嵌入的概念,使LLM能够像生成单词标记一样轻松地调用和使用不同的工具。该方法克服了当前微调和上下文学习范式的限制,使LLM能够适应更大的工具集,并使用广泛的样例数据来学习工具嵌入。ToolkenGPT能够快速适应和利用新工具,表明它有能力跟上不断发展的大规模工具的步伐。


备注:昵称-学校/公司-方向/会议(eg.ACL),进入技术/投稿群

87648acd8897e9cb5b9bc4ad20564940.png

id:DLNLPer,记得备注呦

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】C++中的String类详解及模拟实现示例

文章目录 string类简介string类的基本用法string类的常用方法string类的优势 string类的模拟实现存储结构头文件string.h源文件string.cpp源文件test.cpp string类简介 string类简介在C编程中&#xff0c;字符串是一种非常常见的数据类型&#xff0c;用于存储文本信息。C标准库…

鸿蒙应用开发(二)环境搭建

开发流程 IDE下载 首先下载HUAWEI DevEco Studio&#xff0c;介绍首次启动DevEco Studio的配置向导&#xff1a; 运行已安装的DevEco Studio&#xff0c;首次使用&#xff0c;请选择Do not import settings&#xff0c;单击OK。安装Node.js与ohpm。node.js 是基于 V8 引擎构…

〖大前端 - 基础入门三大核心之JS篇㊿〗- 面向对象之对象的方法、遍历、深浅克隆

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;哈哥撩编程&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xff0c;目前在公司…

堆的基础功能实现和优先级队列

1. 堆的插入与删除 1.1 堆的插入 步骤&#xff1a; 1、先将元素放入到底层空间中(注意&#xff1a;一般是放到整个二叉树的最后一个叶子节点的后边&#xff0c;其次存储空间不够时需要扩容) 2、将最后新插入的节点向上调整&#xff0c;直到满足堆的性质&#xff08;判断该节点…

【金融数据分析】计算沪深300指数行业权重分布并用饼图展示

前言 前面的文章我们已经介绍了如何获取沪深300成分股所述行业以及权重的数据&#xff0c;想要了解这部分内容的小伙伴可以阅读上一篇文章 springbootjdbcTemplatesqlite编程示例——以沪深300成分股数据处理为例-CSDN博客 那么有了上文获取的数据&#xff0c;我们实际上可以…

List 接口

1 List 接口 java.util 中的集合类包含 Java 中某些最常用的类。最常用的集合类是 List 和 Map。 List是一种常用的集合类型&#xff0c;它可以存储任意类型的对象&#xff0c;也可以结合泛型来存储具体的类型对象&#xff0c;本质上就是一个容器。 1.1 List 类型介绍 有序性…

基于Solr的全文检索系统的实现与应用

文章目录 一、概念1、什么是Solr2、与Lucene的比较区别1&#xff09;Lucene2&#xff09;Solr 二、Solr的安装与配置1、Solr的下载2、Solr的文件夹结构3、运行环境4、Solr整合tomcat1&#xff09;Solr Home与SolrCore2&#xff09;整合步骤 5、Solr管理后台1&#xff09;Dashbo…

Redis 五大经典业务问题

一 缓存穿透 缓存穿透是指当请求的数据既不在缓存中也不存在于数据库中时&#xff0c;请求会直接穿透缓存层&#xff0c;到达数据库层。这通常是由于恶意攻击或者程序错误造成的&#xff0c;比如攻击者故意请求不存在的大量数据&#xff0c;导致缓存不命中&#xff0c;所有的请…

python zblog API实现类似XMLRPC/发布文章

我发现python对Zblog的XML发布并不友好&#xff0c;虽然也有对应的模块&#xff0c;但是远远没有XPCRPC更直接方便&#xff0c;但是使用xmlRpc是直接给发布文章带来了不小的便利&#xff0c;但是对系统也并不友好&#xff0c;但是zblog也开放了Api&#xff0c;但是干部子弟不乐…

【Spring教程20】Spring框架实战:AOP(面对切面编程)知识总结

欢迎大家回到《Java教程之Spring30天快速入门》&#xff0c;本教程所有示例均基于Maven实现&#xff0c;如果您对Maven还很陌生&#xff0c;请移步本人的博文《如何在windows11下安装Maven并配置以及 IDEA配置Maven环境》&#xff0c;本文的上一篇为《利用 AOP通知获取数据代码…

为 Compose MultiPlatform 添加 C/C++ 支持(3):实战 Desktop、Android、iOS 调用同一个 C/C++ 代码

theme: serene-rose 前言 在本系列的前两篇文章中我们已经学会了如何在 kotlin native 平台&#xff08;iOS&#xff09;使用 cinterop 调用 C/C 代码。以及在 jvm 平台&#xff08;Android、Desktop&#xff09;使用 jni 调用 C/C 代码&#xff0c;并且知道了如何自动编译 A…

Leetcode—389.找不同【简单】

2023每日刷题&#xff08;五十五&#xff09; Leetcode—389.找不同 实现代码 char findTheDifference(char* s, char* t) {int len strlen(s);int len2 len 1;int a[26] {0};int b[26] {0};if(len 0) {return t[0];}for(int i 0; i < len; i) {int idx s[i] - a;…

使用alpine镜像部署go应用时踩的坑

使用alpine镜像部署go应用时踩的坑 关于交叉编译 实际上我在ubuntu的交叉编译出来的exe并不能在alpine上运行&#xff0c;这边采取拉镜像编译复制出来的做法&#xff0c;部署再用干净的alpine 拉取golang:alpine踩坑 在Dockerhub上可以找到&#xff1a; 然而拉取的alpine中…

蓝桥杯-动态规划专题-子数组系列,双指针

目录 一、单词拆分 二、环绕字符串中唯一的子字符串 双指针-三数之和 ArrayList(Arrays.asList(array)) 四、四数之和&#xff08;思路和三数之和一样&#xff0c;只是多了一层循环&#xff09; 一、单词拆分 1.状态表示 dp[i]:到达i位置结尾&#xff0c;能否被dict拆分 …

JVM进程缓存

引言 缓存在日常开发中启动至关重要的作用&#xff0c;由于是存储在内存中&#xff0c;数据的读取速度是非常快的&#xff0c;能大量减少对数据库的访问&#xff0c;减少数据库的压力。我们把缓存分为两类&#xff1a; 分布式缓存&#xff0c;例如Redis&#xff1a; 优点&…

【MySQL】MySQL 在 Centos 7环境安装教程

文章目录 1.卸载不要的环境2.检查系统安装包3.获取mysql官方yum源4.安装mysql yum 源&#xff0c;对比前后yum源5.安装mysql服务6.查看配置文件和数据存储位置7.启动服务和查看启动服务8.登录9.配置my.cnf 1.卸载不要的环境 先检查是否有mariadb存在 ps ajx |grep mariadb如果…

虚拟机VMware安装centos以及配置网络

目录 1、CentOS7的下载2、CentOS7的配置3、CentOS7的安装4、CentOS7的网络配置 4.1、自动获取IP4.2、固定获取IP 5、XShell连接CentO 准备工作&#xff1a;提前下载和安装好VMware。VMware的安装可以参考这一篇文章&#xff1a;VMware15的下载及安装教程。 1、CentOS7的下载 …

sentinel整合nacos配置中心持久化

在网上找了很多的资料&#xff0c;发现sentinel整合nacos持久化的博文和视频大多数都只有改造限流部分的教程&#xff0c;并且都需要修改前端&#xff0c;略显麻烦&#xff0c;至于剩下的熔断、热点流控、授权的更是没有相关的改造教程&#xff0c;最后在知乎的看到一篇文章后让…

Sql server数据库数据查询

请查询学生信息表的所有记录。 答&#xff1a;查询所需的代码如下&#xff1a; USE 学生管理数据库 GO SELECT * FROM 学生信息表 执行结果如下&#xff1a; 查询学生的学号、姓名和性别。 答&#xff1a;查询所需的代码如下&#xff1a; USE 学生管理数据库 GO SELE…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《考虑移动式储能调度的配电网灾后多源协同孤岛运行策略》

这篇文章的标题表明研究的主题是在配电网发生灾害后&#xff0c;采用一种策略来实现多源协同孤岛运行&#xff0c;并在这个过程中特别考虑了移动式储能的调度。 让我们逐步解读标题的关键词&#xff1a; 考虑移动式储能调度&#xff1a; 文章关注的焦点之一是移动式储能系统的…