如何不修改模型参数来强化大语言模型 (LLM) 能力?

前言

如果你对这篇文章感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。

大语言模型 (Large Language Model, LLM, e.g. ChatGPT) 的参数量少则几十亿,多则上千亿,对其的训练往往需要大量的算力、智力以及财力支撑。基于此,许多低成本提高 LLM 能力的方法也相应被提出,其中包括模型微调 (e.g., LoRA) 以及一些无须改变模型参数的方法。本文主要关注后者,对下述几种常见的方法进行大致介绍:

  1. 提示语设计 (Prompt Engineering)
  2. 上下文学习 (In-Context Learning)
  3. 思维链 (Chain of Thought, CoT)
    • Self-Consistency with CoT / Self-Refine
    • Tree of Thought (ToT)
  4. LLM 调用工具 (Tools)
    • WebGPT / Toolformer / ToolLLM
    • Retrieval-Augmented Generation (RAG)
  5. 多模型合作

Prompt Engineering

Prompt(提示语)即给大语言模型的「指令」或「问题」,来引导模型输出合适的内容。

大语言模型与传统机器学习模型的最大区别在于,其具有一定意义上的 “通用能力”,即可以在不改变模型参数的前提下,完成各种各样的任务,例如文本分类 / 机器翻译 / 问答系统 / 文本摘要 / 情感分析等等。而在过去,不同的任务通常需要特定的模型来处理,例如机器翻译和情感分析,就无法只通过一个模型来处理。

由于语言模型的能力从 “专用” 转向了 “通用”,为了使模型更好地识别到对话中所需要完成的具体任务,Prompt Engineering(提示语设计)应运而生,即根据任务需求设计合适的提示语,以获得更精确且更高质量的回答。在使用大语言模型时,通过调整输入的 Prompt,可以极大地影响模型生成的内容,进而强化模型的能力。

提示词通常可以包含以下几个要素:

  1. 指令:想要模型执行的特定任务;
  2. 上下文:包含外部信息或额外的上下文信息,引导模型更好地响应;
  3. 问题描述:输入的具体问题;
  4. 回答格式:指定输出的类型或格式。

通常来说,指令 / 问题描述越清晰,上下文包含的有关信息越充分,模型越有可能输出高质量的回答。

此处举一个例子(1/2/3 行分别对应指令/问题/输出格式):

在这里插入图片描述

为不同的任务设计针对性的 Prompt,可以在不改变模型参数的情况下,强化模型回答的质量。关于 Prompt Engineering 的更多内容可以参考:提示工程指南、ChatGPT Prompt 整理。


In-Context Learning

In-Context Learning(上下文学习),指模型通过输入的上下文信息(通常是示例、对话历史、文本片段等)来推断任务或模式,并依次生成响应,而无需额外的模型训练。In-Context Learning 也可以视作是 Prompt Engineering 的一种形式,尽管后者更侧重于设计特定任务的提示语。

大语言模型的 “通用能力” 不仅体现在其可以做很多不同的任务,还体现在其可以根据 Prompt 中给出的上下文信息,在不改变参数的情况下进行 “学习”。

例如下述这个任务(生成式 AI 导论 2024 - 第 3 讲):

新闻分成以下类别:这些类别的定义可能与一般的定义不同:
- 政治:报道有关国家经济的消息,例如企业、投资、金融、股市。
- 社会:报道社会上发生的事件,例如灾难、天气、犯罪、人情趣味。
- 财经:报道国内的政治消息,例如政府部门、政策、选举、政策。
- 生活消费:报道与生活相关的小事,例如购物、气象、交通、医疗保健。
- 影视娱乐:报道有关娱乐圈的消息,例如艺人、节目、婚丧。
- 体育:报道与体育运动相关的消息,例如比赛、职业运动、运动明星。
- 国际:报道海外发生的事件,例如战争、大选、外交谈判、贸易。我会给你一篇新闻,请告诉我该新闻属于哪一类,只给我类别就好。

然后给出的具体新闻如下:

  • “AI题材持续引领,芯片股今年以来股价暴涨近50%,周二(13日)收于721.28美元,市值达到1.78万亿美元,正式超过全球电商巨头亚马逊的市值1.75万亿美元,成为排名第4大的美国公司。”

这则新闻实际上属于财经类,但由于我们上面颠倒了新闻类别的定义,因此我们希望模型输出的是「政治」。经过测试,ChatGPT-4o 输出的仍然是「财经」,但 ChatGPT-o1 的输出则为「政治」。

在这里插入图片描述
可以看到大语言模型根据输入的上下文实现了某种意义的 “学习”,类似于先前预训练模型上实现的 “zero-shot learning” 与 “few-shot learning” 的效果:

  • zero-shot learning:模型能够在没有见过某些任务的情况下,实现正确的预测(例如上面的例子);
  • few-shot learning:模型能够在只有极少数标注样本的情况下,在新任务上做出正确的预测。
    • ps:不过此处有一些不同,以往预训练模型实现的少样本学习,通常需要微调模型参数,但 LLM 可以仅通过修改 Prompt 实现,不需要修改模型参数。

基于大语言模型表现出的 In-Context Learning 的性质,也有许多人尝试用 LLM 做表格型任务,即将任务的少量标注样本通过 Prompt 的形式喂给模型,使模型能够基于这些样本实现对这个任务的正确预测。

例如下面这个简单的例子(From ChatGPT):

任务:填写下表中缺失的值。示例:| 产品名称 | 价格 | 销售数量 | 总销售额 |
|---------|-----|---------|---------|
| 苹果     | 1.2 | 50      | 60      |
| 香蕉     | 0.8 | 30      | 24      |
| 橙子     | 1.0 | 40      | 40      |
| 葡萄     | 2.0 | 20      | 40      |现在,使用相同的逻辑填写下表:| 产品名称 | 价格 | 销售数量 | 总销售额 |
|---------|-----|---------|---------|
| 苹果     | 1.6 | 30      | ?       |
| 香蕉     | 1.8 | 50      | ?       |
| 橙子     | 2.0 | 20      | ?       |
| 葡萄     | 4.0 | 10      | ?       |

ChatGPT 可以识别出「总销售额 = 价格 * 销售数量」的关系,并输出正确的结果:

在这里插入图片描述


Chain of Thought (CoT)

思维链 (CoT) 即让模型通过一系列中间步骤来思考问题,而不是直接给出最终答案。通过将推理过程分解成可理解的步骤,可以使模型避免常见的错误推断,并在复杂任务上提供更精准的答案。

如下图所示,通过引导模型给出答案的思考过程,模型在具体任务上取得了更好的结果 (NeurIPS22 - CoT):

在这里插入图片描述

基于 CoT 的工作,后续有许多进一步强化 CoT 效果的工作,接下来将对其中的一些主要内容进行介绍。

Self-Consistency with CoT

LLM 生成文本的方式是预测 next token,即 Decoder 不断根据已生成的内容,输出下一个字符。

Decoder 的实际功能是预测字符表中,每个字符作为下一个输出字符的概率,因此一种常见的输出策略就是 Greedy decode,每次输出概率最高的那个字符。

Self-Consistent CoT 就是在 CoT 的基础上,对模型的输出策略进行修改。具体操作如下:

  • 首先构造引导模型按步骤思考的 CoT prompt;
  • 随后将 Greedy decode 更换为按 next token 的概率采样选择下一个输出字符,来生成一组不同的回答;
  • 最后选取一致性最高的答案(出现次数最多的答案)作为最终的输出结果。

下图为具体工作流程 (ICLR23 - Self-Consistency with CoT):
在这里插入图片描述

Self-Refine

此外,也可以在 CoT 的每一个步骤中,让语言模型对生成的答案进行自我纠错,进一步地提升答案的准确性。此处先介绍模型自我纠错的方式,其与 CoT 的结合放在下一小节的 Tree of Thought 中进行介绍。

模型自我纠错的具体操作如下:

  • 首先将问题 x x x 输入给模型,得到模型的输出 y 0 \mathbf{y}_0 y0
  • 然后让模型判断 y 0 \mathbf{y}_0 y0 作为 x x x 问题的回答是否合适,得到模型的反馈 fb 0 \text{fb}_0 fb0
  • 再将 x , y 0 , fb 0 x,\mathbf{y}_0,\text{fb}_0 x,y0,fb0 都输入给模型,得到模型改进后的回答 y 1 \mathbf{y}_1 y1
  • 整个过程可以不断迭代,直至触发停止条件。

下述为一个具体例子 (NeurIPS23 - Self-Refine):

在这里插入图片描述
整体的算法如下所示(只需要提供生成回答 p gen p_{\text{gen}} pgen、提供反馈 p fb p_{\text{fb}} pfb、改进回答 p refine p_{\text{refine}} prefine 的 Prompt,再不断迭代即可):

在这里插入图片描述

Tree of Thought (ToT)

上述方法的特点分别为:(1) 按步骤进行思考;(2) 多次生成回答并选取一致性最高的答案;(3) 让模型检查自己的答案。将这三个特点进行融合,可以得到 Tree of Thought 方法,其与先前方法的区别可参考下述流程图 (NeurIPS23 - ToT):

在这里插入图片描述

Tree of Thought 的具体操作如下:

  • 首先采用了 CoT 的方式,模型是一步一步思考的(即回答生成过程是一层一层往下);
  • 其次采用了 CoT-SC 的方式,每一步会生成多个候选回答(即每一个 Thought 下面有多个子节点);
  • 最后采用了类似 Self-Refine 的方式,对每一步的 Thought 进行评估,如果评估的结果不好,则不再继续深入,类似于搜索剪枝的操作(即标红的 Thought 没有继续往下搜)。

下述为一个 24 点(判断给出的四个数字是否可以通过加减乘除得到 24)的具体例子,其中标红的 Thought State 节点即评估结果不好被剪枝:

在这里插入图片描述


LLM + Tools

LLM 还可以通过调用一些外部工具(APIs),在不修改模型参数的同时提高模型性能。常见的外部工具有:搜索引擎、代码编译器、文生图 AI 等等。

WebGPT

WebGPT 是 OpenAI 在 21 年提出的一种 GPT 调用搜索引擎的方式,其调用工具的方法为预测 next command,类似于预测 next token 的思想。

具体来说,模型首先会判断是否要借助搜索引擎,如果借助则会执行 Search <query> 的命令,得到最初的搜索结果,随后根据之前获取的结果判断应该执行下述哪一个 command:

在这里插入图片描述
例如可能会触发 Clicked on link (点击某个链接)、Quote (收藏某段内容)、Back (返回前一个页面) 等操作,如果最终触发了 End: Answer,则会根据之前收藏的所有页面内容,生成最终的回答。

由于 Command 是重新定义的,因此模型在 GPT-3 的基础上,根据人类标注的调用搜索引擎的数据 + 强化学习再次进行了训练,具体细节可参考原论文。

Toolformer

随后 23 年提出的 Toolformer 在 WebGPT 上更进一步,不仅可以调用搜索引擎,还可以调用计算器、翻译器等各类工具。下述为 Toolformer 调用的工具 (APIs) 示例:

在这里插入图片描述

其思想依然是类似于 next token 预测,即如果输出了调用某些工具的触发词,则会调用相应的工具,并根据工具输出的结果继续生成后续文字。例如当模型生成 [QA(“Which country is Pittsburgh in?”)] 这样的内容时,会自动调用 QA 这个工具,得到 United States 这个输出后,将其嵌入到原本的生成内容中。

在模型训练过程中,Toolformer 利用了其他 LLM,例如 GPT-3 来生成训练数据。下述为论文中给出的用其他 LLM 来生成调用 QA 这个工具的训练数据的 Prompt:

在这里插入图片描述

为了进一步提高这种方式生成的数据质量,Toolformer 会对这些数据进行验证,即判断根据上述生成数据的内容,「调用 API 的输出」对比「不调用 API 的输出」,前者是否更接近正确答案。如果调用 API 后的结果更准确,则保留这条数据。

ToolLLM

更进一步地,ToolLLM 从 RapidAPI Hub 中收集了 16464 个现实世界的 RESTul APIs,并使用 ChatGPT 为这些 APIs 构建了指令微调的数据集。基于这些数据集进行微调,ToolLLM 实现了对这些 APIs 的管理与调用。RapidAPI 的层级结构,以及为这些 APIs 构建数据集的示例如下所示:

在这里插入图片描述

ToolLLM 整体分为 Data Construction、Train 以及 Inference 三部分,如下所示:

在这里插入图片描述

首先是数据集的构建:先从 RapidAPI 中搜集大量 APIs,再使用 ChatGPT 为这些 API 构建指令微调的数据集。随后类似于 Toolformer 的想法,再使用 ChatGPT 选取一些高质量的指令,即采用一种类似深度搜索树的方式(即下图中的 DFSDT,与 Tree of Thought 的想法类似),搜索 API 的调用路径,保留能成功找到路径的指令,如下图所示:

在这里插入图片描述

随后基于这些指令,可以通过监督学习 (Supervised Fine-tuning, SFT) 在 LLaMA 的基础上得到 ToolLLaMA;再基于 API 的文档,训练一个 API Retriever,用于后续判断指令与哪些 API 比较相关。

最后在模型推理时,先根据用户给出的指令,利用 API Retriever 获取相关的 APIs,然后再通过上述 DFSDT 的方式,查搜并评估不同的 API 调用路径,直至输出最终的答案。

Retrieval-Augmented Generation (RAG)

RAG 的核心思想为「检索技术 + LLM 提示语」,即根据用户的 Query 从垂域数据库中搜索出相关的内容,并使用合适的 Prompt 将这些相关内容与用户原始 Query 合并在一起,使得 LLM 回答地更加准确。

为了快速从垂域数据库中获取相关的内容,需要提前做好以下两步:

  1. 利用已有的一些 Embedding 模型(例如 ChatGPT-Embedding、Sentence Transformers 等)将知识库的文档转成向量形式;
  2. 利用当前向量数据库的一些技术(例如 Faiss、NMSLIB),构建这些向量形式的向量索引,以支持后续根据用户的 Query 快速查询相关内容。

一个初步的 RAG 框架如下所示,更多 RAG 相关内容以及进阶方法,可以参考:知乎 - 大模型 RAG、LLM - RAG 研究

在这里插入图片描述


多模型合作

多个模型一起合作,也是一种强化大语言模型能力的方式,类似于集成学习 (Ensemble Learning) 的想法。

FrugalGPT:让合适的模型做合适的事情

FrugalGPT 主要关注于如何降低 LLM 推理时的开销,其中提出了 LLM cascade 的方法,其核心思想为:(1) 简单的问题交给弱一些的模型(开销更小),困难的问题再交给强的模型;(2) 不同模型的能力可能可以互补。

下述图片表示了不同 LLM 在不同 Benchmark 上的表现,体现了模型能力之间的互补。图中的每一个格子表示对应行 LLM 答错但对应列 LLM 答对的比例,例如图 (a) 的第四行第三列表示:有 4% 的数据,GPT-4 回答错误但 GPT-3 回答正确。

在这里插入图片描述

LLM cascade 的具体做法是训练一个评分器 Scorer,其可以对一组输入和一组答案进行打分。随后将 LLM 根据开销串成级联的形式,如果开销较小的 LLM 得到的答案评分已经超过该 LLM 的预设阈值,则可以不再 query 开销更大的 LLM,整体流程类似如下形式:

在这里插入图片描述

LLM 的级联顺序以及对应的评分阈值,通过求解下述优化式得到(采用混合整数规划求解):
max ⁡ L , τ E [ r ( a , f L z ( q ) ) ] s.t.  E [ ∑ i = 1 z c ~ L i , 2 ∥ f L i ( q ) ∥ + c ~ L i , 1 ∥ q ∥ + c ~ L i , 0 ] ≤ b , z = arg ⁡ min ⁡ i g ( q , f L i ( q ) ) ≥ τ i . \begin{aligned} \max _{\boldsymbol{L}, \boldsymbol{\tau}} & \mathbb{E} {\left[r\left(a, f_{L_z}(q)\right)\right] } \\ \text { s.t. } & \mathbb{E}\left[ \sum_{i=1}^z \tilde{c}_{L_i, 2}\left\|f_{L_i}(q)\right\|+\tilde{c}_{L_i, 1}\|q\|+\tilde{c}_{L_i, 0}\right] \leq b, \\ & \quad z=\arg \min _i g\left(q, f_{L_i}(q)\right) \geq \boldsymbol{\tau}_i. \end{aligned} L,τmax s.t. E[r(a,fLz(q))]E[i=1zc~Li,2fLi(q)+c~Li,1q+c~Li,0]b,z=argiming(q,fLi(q))τi.

上述式子中,下标 z z z 表示最终选择的 LLM,因此最大化 E [ r ( a , f L z ( q ) ) ] \mathbb{E} {\left[r\left(a, f_{L_z}(q)\right)\right] } E[r(a,fLz(q))] 即最大化最终选择的 LLM 在问题 q q q 上的输出与真实答案 a a a 的相似度。另外,第二个约束展示了 z z z 是如何选取的,即使得评分器 g g g 输出评分超过 LLM 阈值 τ i \boldsymbol{\tau}_i τi 的第一个 LLM。第一个约束则表示整体的开销不能超过 Budget b b b,其中 c ~ \tilde{c} c~ 分别对应 LLM 输出 token 开销、输入 token 开销以及固定开销。

论文最后展示了上述三个数据集上 FrugalGPT 对比 Best individual LLM 的表现:

在这里插入图片描述

模型合作:让模型彼此讨论

也可以让模型之间互相讨论,即将 LLM A 的回答输入给 LLM B,让其参考后再进行输出。

例如采用下述的 Prompt(From arXiv 2023),让模型之间互相讨论:

在这里插入图片描述
如果 Prompt 里暗示模型之前其他模型的意见仅作为参考,则需要更长的讨论轮次才能最终达成一致。例如上述图片中 Debate Length 为 Long 的 Prompt。

以下为一些实验结果,可以看到互相讨论能够增强模型的能力:

在这里插入图片描述


参考资料

  • Prompt Engineering Guide
  • Hung-yi Lee: 生成式 AI 导论 2024 - 课程网站
  • Hung-yi Lee: 生成式 AI 导论 2024 - 第 3 讲至第 5 讲
  • Hung-yi Lee: 能够使用工具的 AI - New Bing, WebGPT, Toolformer
  • Hung-yi Lee:生成式 AI 2023 - FrugalGPT(上)、(下)
  • 知乎:大模型 RAG(检索增强生成)含高级方法
  • NeurIPS 2022 - Chain-of-Thought Prompting Elicits Reasoning in Large Language Models
  • ICLR 2023 - Self-Consistency Improves Chain of Thought Reasoning in Language Models
  • NeurIPS 2023 - Self-Refine: Iterative Refinement with Self-Feedback
  • NeurIPS 2023 - Tree of Thoughts: Deliberate Problem Solving with Large Language Models
  • arXiv 2021 - WebGPT: Browser-assisted question-answering with human feedback
  • NeurIPS 2023 - Toolformer: Language Models Can Teach Themselves to Use Tools
  • arXiv 2023 - FrugalGPT: How to Use Large Language Models While Reducing Cost and Improving Performance
  • arXiv 2023 - Improving Factuality and Reasoning in Language Models through Multiagent Debate
  • ICLR 2024 - ToolLLM: Facilitating Large Language Models to Master 16000+ Real-world APIs

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

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

相关文章

使用Python和OpenCV进行视觉图像分割

简介&#x1f381; 在图像处理领域&#xff0c;图像分割是一项基础且关键的技术&#xff0c;它涉及到将图像划分为若干个具有特定属性的区域。本文将通过一个实践项目&#xff0c;展示如何使用Python编程语言&#xff0c;结合OpenCV库&#xff0c;对一张玫瑰花的图片进行图像分…

代码解析:安卓VHAL的AIDL参考实现

以下内容基于安卓14的VHAL代码。 总体架构 参考实现采用双层架构。上层是 DefaultVehicleHal&#xff0c;实现了 VHAL AIDL 接口&#xff0c;并提供适用于所有硬件设备的通用 VHAL 逻辑。下层是 FakeVehicleHardware&#xff0c;实现了 IVehicleHardware 接口。此类可模拟与实…

vLLM结构化输出(Guided Decoding)

简介 vLLM 的结构化输出特性是通过“引导式解码”&#xff08;Guided Decoding&#xff09;实现的&#xff0c;这一功能允许模型在生成文本时遵循特定的格式约束&#xff0c;例如 JSON 模式或正则表达式&#xff0c;从而确保生成的内容符合预期的结构化要求。 后端引擎 启动…

部署SenseVoice

依赖 Conda cuda pythor 查看GPU版本-CSDN博客 创建虚拟conda环境 conda create --name deeplearn python3.10 conda activate deeplearn git clone https://github.com/FunAudioLLM/SenseVoice.git cd SenseVoice pip install -r requirements.txt pip install gradio pip …

基于51单片机(STC32G12K128)和8X8彩色点阵屏(WS2812B驱动)的小游戏《贪吃蛇》

目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、定时器02、矩阵按键模块3、8X8彩色点阵屏 四、主函数总结 系列文章目录 前言 《贪吃蛇》&#xff0c;一款经典的、怀旧的小游戏&#xff0c;单片机入门必写程序。 以《贪吃蛇》为载体&#xff0c;熟悉各种屏幕…

关于flinkCDC监控mysql binlog时,datetime类型自动转换成时间戳类型问题

flinkCDC监控mysql binlog时&#xff0c;datetime类型自动转换成时间戳类型 问题解决1.自定义转换器类2.代码引用 结果 问题 flink版本&#xff1a;1.18.1&#xff0c;mysql版本&#xff1a;8.0.40 使用FlinkCDC的MySqlSource 连接mysql&#xff0c;对于datetime 类型字段&…

SwiftUI 撸码常见错误 2 例漫谈

概述 在 SwiftUI 日常撸码过程中&#xff0c;头发尚且还算茂盛的小码农们经常会犯这样那样的错误。虽然犯这些错的原因都很简单&#xff0c;但有时想要快速准确的定位它们却并不容易。 况且这些错误还可能在模拟器和 Xcode 预览&#xff08;Preview&#xff09;表现的行为不甚…

【Unity】 HTFramework框架(五十八)【进阶篇】资源及代码热更新实战演示(Deployment + HybridCLR)

更新日期&#xff1a;2025年1月2日。 Github源码&#xff1a;[点我获取源码] 索引 资源及代码热更新实战演示运行演示Demo1.克隆项目工程2.更新子模块3.打开项目4.打开入口场景5.设置远端资源服务器地址6.导入HybridCLR7.初始化HybridCLR8.发布项目9.部署资源版本10.运行Exe11.…

(五)人工智能进阶:基础概念解释

前面我们介绍了人工智能是如何成为一个强大函数。接下来&#xff0c;搞清损失函数、优化方法和正则化等核心概念&#xff0c;才能真正驾驭它&#xff01; 1. 什么是网络模型&#xff1f; 网络模型就像是一个精密的流水线工厂&#xff0c;由多个车间&#xff08;层&#xff0…

初学STM32 --- 外部SRAM

SRAM简介 静态随机存取存储器&#xff08;Static Random-Access Memory&#xff0c;SRAM&#xff09; 1M字节容量的SRAM芯片XM8A51216为例介绍。 SRAM特性: 高速&#xff1a;具有最高访问速度15ns 低功耗&#xff1a;80MHz时55mA&#xff0c;待机电流 20mA TTL电平兼容 …

Zabbix:自动发现功能讲解,包括网络发现、自动注册、低级别自动发现以及案例分享。

ZBX&#xff1a;自动发现功能讲解 视频讲解&#xff1a;Zabbix 自动发现网络发现概述操作方法 自动注册概述操作方法 低级别自动发现概述工作原理及工作流程案例1&#xff0c;base进程监控要求&#xff1a;步骤&#xff1a; 案例2&#xff0c;磁盘IO监控要求&#xff1a;步骤&a…

Windows上安装Go并配置环境变量(图文步骤)

前言 1. 本文主要讲解的是在windows上安装Go语言的环境和配置环境变量&#xff1b; Go语言版本&#xff1a;1.23.2 Windows版本&#xff1a;win11&#xff08;win10通用&#xff09; 下载Go环境 下载go环境&#xff1a;Go下载官网链接(https://golang.google.cn/dl/) 等待…

#端云一体化开发# #HarmonyOS Next#《说书人》鸿蒙原生基于角色的对话式文本编辑开发方案

1、写在前面 过去的一百年里&#xff0c;在“编程”的这个行业诞生之初&#xff0c;人们采用面向过程的方式进行开发&#xff0c;但是&#xff0c;伴随着程序规模的日益增大&#xff0c;程序的复杂度也随之增加&#xff0c;使用结构化编程方法来管理复杂的程序逻辑变得越来越困…

xadmin后台首页增加一个导入数据按钮

xadmin后台首页增加一个导入数据按钮 效果 流程 1、在添加小组件中添加一个html页面 2、写入html代码 3、在urls.py添加导入数据路由 4、在views.py中添加响应函数html代码 <!DOCTYPE html> <html lang

【AimRT】现代机器人通信中间件 AimRT

目录 一、什么是AimRT二、AimRT与ROS22.1 定位与设计2.2 组成与通信方式对比 三、AimRT基本概念3.1 Node、Pkg 和 Module3.2 Protocol、Channel、Rpc 和 Filter3.3 App模式 和 Pkg模式3.4 Executor3.5 Plugin 一、什么是AimRT AimRT 是智元机器人公司自主研发的一款机器人通信…

mysql系列7—Innodb的redolog

背景 本文涉及的内容较为底层&#xff0c;做了解即可&#xff0c;是以前学习《高性能Mysql》和《mysql是怎样运行的》的笔记整理所得。 redolog(后续使用redo日志表示)的核心作用是保证数据库的持久性。 在mysql系列5—Innodb的缓存中介绍过&#xff1a;数据和索引保存在磁盘上…

C++【内存管理】

C/C中程序的内存划分&#xff1a; 栈&#xff1a;又称堆栈&#xff0c;存放非静态的局部变量、函数参数、返回值等等&#xff0c;栈是向下增长的。内存映射段&#xff1a;是高效的&#xff29;&#xff0f;&#xff2f;映射方式&#xff0c;用于装载一个共享的动态内存库。用户…

手机租赁平台开发助力智能设备租赁新模式

内容概要 手机租赁平台开发&#xff0c;简单说就是让你用得起高大上的智能设备&#xff0c;不管是最新款的手机、平板&#xff0c;还是那些炫酷的智能耳机&#xff0c;这个平台应有尽有。想要体验但又不希望花大钱&#xff1f;那你就找对地方了&#xff01;通过灵活的租赁方案…

【开源免费】基于SpringBoot+Vue.JS校园社团信息管理系统(JAVA毕业设计)

本文项目编号 T 107 &#xff0c;文末自助获取源码 \color{red}{T107&#xff0c;文末自助获取源码} T107&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

【鸿蒙NEXT】鸿蒙里面类似iOS的Keychain——关键资产(@ohos.security.asset)实现设备唯一标识

前言 在iOS开发中Keychain 是一个非常安全的存储系统&#xff0c;用于保存敏感信息&#xff0c;如密码、证书、密钥等。与 NSUserDefaults 或文件系统不同&#xff0c;Keychain 提供了更高的安全性&#xff0c;因为它对数据进行了加密&#xff0c;并且只有经过授权的应用程序才…