ToolkenGPT:用大量工具增强LLM

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.mzph.cn/news/212811.shtml

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

相关文章

Shell 常用命令详解-上

Shell 常用命令详解-上 1.目录查阅相关命令2.文件操作相关命令 1.目录查阅相关命令 ll 命令 命令描述&#xff1a;ll命令用于显示指定工作目录下的内容。 命令格式&#xff1a;ll [参数] [目录名]。 参数说明&#xff1a; 参数说明-a显示所有文件及目录&#xff08;包括隐藏文…

【机器学习】041_模型开发迭代过程

一、模型开发的一般步骤 1. 明确研究问题 确定问题的组成和结果&#xff0c;明晰问题是分类问题还是回归问题 2. 决定系统总体架构 ①理解数据&#xff1a;采集&#xff08;爬取&#xff09;数据&#xff0c;生成&#xff08;导入&#xff09;数据&#xff0c;进行数据清洗…

代码随想录二刷 |二叉树 |101. 对称二叉树

代码随想录二刷 &#xff5c;二叉树 &#xff5c;101. 对称二叉树 题目描述解题思路 & 代码实现递归法迭代法使用队列使用栈 题目描述 101.对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,…

zcms企业官网建站系统源码搭建-支持页面自定义

1.支持mysql&#xff0c;sqlite&#xff0c;access三种数据库。 2.模板和标签与asp版的zzzcms通用。 3.asp版的zzzcms的access数据库可直接使用。 4.支持手机站。 &#xff08;增删改查不做描述&#xff09;&#xff1a; 网站信息 名称&#xff0c;logo&#xff0c;微信&…

基于OpenCV的流水线包装箱检测计数应用(附源码)

导 读 本文主要介绍基于OpenCV的流水线包装箱检测计数应用,并给出源码。 资源下载 完整代码和视频下载地址: https://github.com/freedomwebtech/rpi4-conveyor-belt-boxces-counter 核心代码如下(cboxtest.py): import cv2import numpy as npfrom tracker import*cap=c…

【MYSQL】单表查询

查询语法&#xff1a; select 字段&#xff08;*表示全字段&#xff09; from 数据表 【where 条件表达式】 【group by 分组字段【having 分组条件表达式】】 【order by 排序字段【asc | desc】】 例子&#xff1a; 教职工表Teacher(Tno, TName, age, sal, mgr, DNo)&#…

C# 图解教程 第5版 —— 第17章 转换

文章目录 17.1 什么是转换17.2 隐式转换17.3 显示转换和强制转换17.4 转换的类型17.5 数字的转换17.5.1 隐式数字转换17.5.2 溢出检测上下文17.5.3 显示数字转换 17.6 引用转换17.6.1 隐式引用转换17.6.2 显式引用转换17.6.3 有效显式引用转换 17.7 装箱转换17.7.1 装箱是创建副…

MySQL - 聚簇索引和非聚簇索引,回表查询,索引覆盖,索引下推,最左匹配原则

聚簇索引和非聚簇索引 聚簇索引和非聚簇索引是 InnoDB 里面的叫法 一张表它一定有聚簇索引&#xff0c;一张表只有一个聚簇索引在物理上也是连续存储的 它产生的过程如下&#xff1a; 表中有无有主键索引&#xff0c;如果有&#xff0c;则使用主键索引作为聚簇索引&#xff1b;…

【Scala】Scala中的一些基本数据类型的特性 列表、元组、构造器、单例对象、伴生类、伴生对象、抽象类与特质

列表 使用List(“”,“”,“”)去声明 sliding 和 groued表示迭代器 val iter List("Hadoop", "Spark", "Scala") sliding 2// sliding 和 groued 是有区别的while (iter.hasNext){println(iter.next())}for (elem <- iter){println(elem)}…

极速学习SSM之SpringMVC笔记

文章目录 一、SpringMVC简介1、什么是MVC2、什么是SpringMVC3、SpringMVC的特点 二、HelloWorld1、开发环境2、创建maven工程a>添加web模块b>打包方式&#xff1a;warc>引入依赖 3、配置web.xmla>默认配置方式b>扩展配置方式 4、创建请求控制器5、创建springMVC…

Kafka 最佳实践:构建可靠、高性能的分布式消息系统

Apache Kafka 是一个强大的分布式消息系统&#xff0c;被广泛应用于实时数据流处理和事件驱动架构。为了充分发挥 Kafka 的优势&#xff0c;需要遵循一些最佳实践&#xff0c;确保系统在高负载下稳定运行&#xff0c;数据可靠传递。本文将深入探讨 Kafka 的一些最佳实践&#x…

四. 基于环视Camera的BEV感知算法-环视背景介绍

目录 前言0. 简述1. 环视背景介绍2. 环视思路3. 主流基于环视Camera的算法详解总结下载链接参考 前言 自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习下课程第四章——基于环视Camer…

基于Spring+Spring boot的SpringBoot在线电子商城管理系统

SSM毕设分享 基于SpringSpring boot的SpringBoot在线电子商城管理系统 1 项目简介 Hi&#xff0c;各位同学好&#xff0c;这里是郑师兄&#xff01; 今天向大家分享一个毕业设计项目作品【基于SpringSpring boot的SpringBoot在线电子商城管理系统】 师兄根据实现的难度和等级…

高云GW1NSR-4C开发板M3硬核应用

1.M3硬核IP下载&#xff1a;Embedded M3 Hard Core in GW1NS-4C - 科技 - 广东高云半导体科技股份有限公司 (gowinsemi.com.cn) 特别说明&#xff1a;IDE必须是1.9.9及以后版本&#xff0c;1.9.8会导致编译失败&#xff08;1.9.8下1.1.3版本IP核可用&#xff09; 以下根据官方…

vue3中关于echars的使用

今天介绍一个好用的插件echars&#xff0c;一个可视化插件Apache ECharts 一、使用步骤 1、安装 npm install echarts --save 2、导入 import * as echarts from echarts 3、正式使用 echars的使用非常的简单&#xff0c;直接点击官网有现成的代码的可用 代码示例 <t…

微服务——服务保护Sentinel

雪崩问题 在单体项目里面&#xff0c;如果某一个模块出问题会导致整个项目都有问题。 在微服务项目里面&#xff0c;单独一个服务出问题理论上是不会影响别的服务的。 但是如果有别的业务需要调用这一个模块的话还是会有问题。 问题产生原因和解决思路 最初那只是一个小小…

ChatGPT 应用开发(一)ChatGPT OpenAI API 免代理调用方式(通过 Cloudflare 的 AI Gateway)

前言 开发 ChatGPT 应用&#xff0c;我觉得最前置的点就是能使用 ChatGPT API 接口。首先我自己要能成功访问&#xff0c;这没问题&#xff0c;会魔法就可以本地调用。 那用户如何调用到我的应用 API 呢&#xff0c;我的理解是通过用户能访问到的中转服务器向 OpenAI 发起访问…

成都工业学院Web技术基础(WEB)实验四:CSS3布局应用

写在前面 1、基于2022级计算机大类实验指导书 2、代码仅提供参考&#xff0c;前端变化比较大&#xff0c;按照要求&#xff0c;只能做到像&#xff0c;不能做到一模一样 3、图片和文字仅为示例&#xff0c;需要自行替换 4、如果代码不满足你的要求&#xff0c;请寻求其他的…

Echarts 环形图配置 环形半径(radius) 修改文本位置(label) 南丁格尔图(roseType)

数据 const data [{ name: 华为, value: 404 },{ name: 小米, value: 800 }, { name: 红米, value: 540 }, { name: 苹果, value: 157 }]设置南丁格尔图 roseType: area设置标签位置 label: {show: true,position: center // center 中间展示 outside 外侧展示 inside 内侧…

C语言动态内存经典笔试题分析

C语言动态内存经典笔试题分析 文章目录 C语言动态内存经典笔试题分析1. 题目一2. 题目二3. 题目三4. 题目四 1. 题目一 void GetMemory(char *p){p (char *)malloc(100);} void Test(void){char *str NULL;GetMemory(str);strcpy(str, "hello world");printf(str)…