当前位置: 首页 > news >正文

[论文笔记]Making Large Language Models A Better Foundation For Dense Retrieval

引言

今天带来北京智源研究院(BAAI)团队带来的一篇关于如何微调LLM变成密集检索器的论文笔记——Making Large Language Models A Better Foundation For Dense Retrieval。

为了简单,下文中以翻译的口吻记录,比如替换"作者"为"我们"。

密集检索需要学习具有区分性的文本嵌入,以表示查询和文档之间的语义关系。考虑到大语言模型(LLM)在语义理解方面的强大能力,它们可能会对密集检索有所裨益。然而,LLM 是通过文本生成任务进行预训练的,其工作方式与将文本表示为嵌入的方式完全不同。因此,研究如何适当地调整 LLM,以使其能够有效地初始化为密集检索的主干编码器,是至关重要的。

在本文中,我们提出了一种新方法,称为 LLaRA(LLM Adapted for dense Retrieval),该方法作为对 LLM 进行后处理适应以用于密集检索应用。LLaRA 包含两个前置任务:EBAE(Embedding-Based Auto-Encoding)和 EBAR(Embedding-Based Auto-Regression),其中 LLM 的文本嵌入分别用于重构输入句子的词元和预测下一个句子的词元。

模型在仓库: https://github.com/FlagOpen/FlagEmbedding/tree/master/FlagEmbedding/llm_reranker 中进行公开。

1. 总体介绍

密集检索是深度神经网络带来的信息检索(IR)新范式。与传统的 IR 方法不同,密集检索学习将查询和文档表示为同一潜在空间中的嵌入,其中查询和文档之间的语义关系可以通过嵌入相似性反映出来。

密集检索的质量受到其主干编码器能力的严重影响。在过去几年中,预训练语言模型被广泛应用于查询和文档的表示。实证研究发现,模型规模和训练规模的扩大可以显著提高密集检索的准确性和泛化能力。

最近,大语言模型(LLMs)已被微调作为许多经典 NLP 任务的通用解决方案。考虑到 LLM 在语义理解方面的优越能力,利用这些强大的模型进行密集检索也具有很大潜力。事实上,已有一些开创性的努力在这一方向上进行,其中 LLM 被提示或微调以生成具有区分性的嵌入,从而促进密集检索(Muennighoff;Neelakantan;Ma;Zhang)。

尽管已有初步进展,但要充分发挥大语言模型在密集检索中的潜力仍然面临挑战。特别是,LLMs 是通过文本生成任务进行预训练的,其嵌入的学习目标是为了预测下一个词元。因此,LLMs 的输出嵌入主要集中于捕捉上下文的局部和近期语义。然而,密集检索需要的嵌入应该能表示整个上下文的全局语义。这种大的差异将严重限制 LLMs 在密集检索中的直接应用。

Refer to caption

图 1:LLaRA 框架。LLM 被提示生成两个文本嵌入。一个用于 EBAE(绿色),其任务是预测原始句子。另一个用于 EBAR(蓝色),其任务是预测下一个句子。

为了解决这个问题,我们提出了一种新方法 LLaRA(见图 1),它作为 LLMs 的后处理适应,旨在提高其在密集检索中的可用性。LLaRA 可以被视为无监督生成预训练的扩展训练阶段。通过精心设计的前置任务,LLaRA 旨在增强 LLMs 生成文本嵌入的能力,以便更好地表示全局上下文的语义。

具体来说,LLaRA 引入了两个前置训练任务:EBAE(Embedding-Based Auto-Encoding)和 EBAR(Embedding-Based Auto-Regression)。在 EBAE 中,LLM 被提示生成可以用来预测输入句子自身词元的文本嵌入。而在 EBAR 中,LLM 被提示生成可以用来预测下一个句子词元的文本嵌入。通过学习这些前置任务,LLM 的文本嵌入可以从局部语义表示(即预测下一个词元)调整为全局语义表示(即预测句子级特征)。借助这两种不同的提示模板,LLM 的嵌入能力可以被区分,以处理各种语义匹配场景,例如相似性搜索(使用 EBAE 的提示)和问答(使用 EBAR 的提示)。

在 LLaRA 中,句子级特征的预测是通过对 LLM 输出嵌入进行线性投影完成的,不需要额外的解码组件。因此,LLaRA 可以直接在现有的生成预训练流程上实现,具有极高的训练效率。此外,因为 LLaRA 完全基于原始语料库进行操作,所以不需要收集任何标注数据。

总结来说,我们在本工作中做出了以下技术贡献:

  1. 我们提出了 LLaRA,这是首个将 LLM 适应于密集检索应用的研究工作。
  2. LLaRA 设计简单但有效,通过对未标注数据执行两个前置任务,显著提升了 LLM 的检索能力。
  3. 预训练和微调 LLM 需要巨大的成本。为了促进该领域未来的研究,公开发布模型和源代码。

2. 相关工作

密集检索是将查询和文档表示为同一潜在空间中的嵌入,在此空间中,可以基于嵌入的相似性检索相关文档。密集检索的准确性由嵌入的质量决定,其中主干编码器是学习区分性嵌入的决定性因素。在过去几年中,预训练语言模型被广泛用于查询和文档的编码。得益于大规模预训练和基于变换器的架构,PLMs 能够为输入文本生成细粒度的语义表示。

沿着相同的思路,利用 LLMs 进行主干编码器的持续扩展是自然的选择。LLMs 在许多方面具有前景,尤其是其强大的语义理解能力可以显著改善复杂查询和文档的建模。此外,考虑到 LLMs 显著扩展的上下文长度,它为构建文档级检索器提供了直接基础。由于 LLMs 的前所未有的普适性和指令跟随能力,它们也有助于多任务嵌入模型的学习。最近,有几项工作对将 LLMs 作为密集检索的主干编码器进行了初步尝试(Muennighoff;Neelakantan;Ma;Zhang)。然而,现有方法仅仅是直接使用 LLMs,由于文本生成任务和文本嵌入任务之间的巨大差异,LLMs 的潜力可能没有得到充分发挥。实际上,如何将 LLM 适应为密集检索应用的更好基础模型仍需进一步研究。

3. 方法

3.1 前置知识

密集检索利用文本嵌入模型生成查询和文档的嵌入: e q e_{q} eq e d e_{d} ed。查询和文档的相关性通过它们的嵌入相似性来反映: ⟨ e q , e d ⟩ \langle e_{q}, e_{d} \rangle eq,ed。因此,可以通过在嵌入空间内进行近似最近邻(ANN)搜索来检索与查询相关的文档 D q D_{q} Dq D q ← Top– k ( { d : ⟨ e q , e d ⟩ ∣ D } ) D_{q} \gets \text{Top}–k(\{d : \langle e_{q}, e_{d} \rangle | D\}) DqTopk({d:eq,edD})

预训练语言模型曾被用作嵌入模型的主干编码器。以 BERT 为例,输入文本被标记化为序列 T : [ C L S ] , t 1 , . . . , t N , [ E O S ] T: [CLS], t1, ..., tN, [EOS] T[CLS],t1,...,tN,[EOS]。然后,标记化的序列由 BERT 编码,输出的嵌入被整合为文本嵌入。执行整合的两种常见选项是:[CLS] 或均值池化:

e t ← BERT ( T ) [ CLS ] (1) e_{t} \leftarrow \text{BERT}(T)[\text{CLS}] \tag 1 etBERT(T)[CLS](1)

e t ← AVG ( BERT ( T ) ) (2) e_{t} \leftarrow \text{AVG}(\text{BERT}(T)) \tag 2 etAVG(BERT(T))(2)

当使用大语言模型(LLMs)作为主干编码器时,文本嵌入需要以不同的方式生成。鉴于现有的 LLMs 主要采用仅解码器架构,全局上下文只能通过输入序列末尾的词元来获取。因此,关于特殊词元 ⟨ \ s ⟩ \langle \backslash \text{s} \rangle \s [ E O S ] [EOS] [EOS] 的输出嵌入被用作文本嵌入。以 LLaMA 为例,我们有以下更新后的文本嵌入形式:
e t ← LLaMA ( T ) [ ⟨ \ s ⟩ ] . (3) e_{t} \gets \text{LLaMA}(T)[\langle \backslash \text{s} \rangle]. \tag 3 etLLaMA(T)[⟨\s⟩].(3)

3.2 LLaRA

尽管在 LLM 中最后一个词元可以关注整个上下文,但其输出嵌入并不是输入文本的最佳表示。这是因为 LLM 是通过文本生成任务进行预训练的,其中每个词元的嵌入用于预测下一个词元。换句话说,LLM 的输出嵌入主要关注捕捉局部和未来的语义,而不是全局上下文的语义。

目标:为了解决上述问题,我们提出了 LLaRA,用于检索导向的 LLMs 适应。通过适应过程,LLM 的文本嵌入预计实现两个属性:

  • 文本嵌入需要表示全局上下文的语义。
  • 全局上下文表示应促进查询和文档之间的关联。

前置任务:为实现上述两个目标,我们引入了两个前置(pretext)任务。第一个是 EBAE,在这个任务中,文本嵌入 e t e_{t} et 被用于预测输入文本本身。具体来说,如果 e t e_{t} et 能预测原始输入文本,那么 e t e_{t} et 必须完全编码输入文本的全局语义。第二个任务是 EBAR,在这个任务中,文本嵌入 e t e_{t} et 被用于预测输入文本的下一句。知道相关文档是查询的可能下一句(例如,问题的答案或对话上下文的回应),可以通过为这种语义建立表示来建立查询和文档之间的关联。

文本嵌入:LLM 使用两个不同的模板生成 EBAE 和 EBAR 的文本嵌入(图 1)。对于 EBAE,LLM 由模板提示:[Placeholder for input]<space>The original sentence:<space><\s> (<space>表示一个空白符),文本嵌入生成如下:
e t α ← LLaMA ( T , SELF, ⟨ \ s ⟩ ) [ − 1 ] . (4) e_{t}^{\alpha} \gets \text{LLaMA}(T, \text{SELF,}\langle\backslash\text{s}\rangle)[-1]. \tag 4 etαLLaMA(T,SELF,\s⟩)[1].(4)

这里,SELF代表 EBAE 的提示:The original sentence:

对于 EBAR,LLM 由模板提示:[Placeholder for input]<space>The next sentence:<space><\s> ,文本嵌入生成如下:
e t β ← LLaMA ( T , NEXT , ⟨ \ s ⟩ ) [ − 1 ] . (5) e_{t}^{\beta} \gets \text{LLaMA}(T, \text{NEXT}, \langle\backslash\text{s}\rangle)[-1]. \tag 5 etβLLaMA(T,NEXT,\s⟩)[1].(5)

这里,NEXT 代表 EBAR 的提示:The next sentence:

图2: LLaRA的注意力掩码

直接计算 e t α e_{t}^{\alpha} etα e t β e_{t}^{\beta} etβ 会导致大量成本浪费,因为输入文本 T T T 被处理了两次。为了解决这个问题,我们提出在一次处理过程中计算 e t α e_{t}^{\alpha} etα e t β e_{t}^{\beta} etβ。具体来说,将 EBAE 和 EBAR 的提示合并为一个联合提示:[Placeholder for input]<space>SELF<space><\s><space>NEXT<space><\s>。由于两个文本嵌入需要独立计算,我们修改了传统的因果语言建模的注意力掩码,其中SELF<space><\s> NEXT<space><\s> 是相互不可见的(图 2)。现在,第一和第二个 ⟨ \ s ⟩ \langle\backslash\mathbf{s}\rangle \s 词元的输出嵌入分别用于 e t α e_{t}^{\alpha} etα e t β e_{t}^{\beta} etβ。由于输入文本 T T T 将占用联合提示的大部分长度,这种处理方式比直接计算节省了大约 50% 的成本。

训练目标:如前所述,LLaRA 的文本嵌入旨在捕捉输入文本本身和下一句的全局语义。在此基础上,我们提出了一个简单但有效的训练目标,将文本嵌入转化为全局语义表示者。从理论上讲,我们认为,如果一个嵌入能够准确预测特定上下文的所有词元,则该嵌入必须是对应上下文全局语义的强表示者。

基于这一基本原则,文本嵌入的训练被表述为多类别分类问题,其中文本嵌入经过线性投影用于预测目标上下文中的词元。上述问题的目标函数如下:

min ⁡ ∑ t ∈ T exp ⁡ ( e T W t ) ∑ v ∈ V exp ⁡ ( e T W v ) . (6) \operatorname*{min} \sum_{t \in \mathcal{T}} \frac{\exp{\left(e^{T} \pmb{W}_{t}\right)}}{\sum_{v \in V} \exp{\left(e^{T} \pmb{W}_{v}\right)}}. \tag 6 mintTvVexp(eTWv)exp(eTWt).(6)

其中 W ∈ R ∣ V ∣ × d W \in \mathbb{R}^{|V| \times d} WRV×d 是线性投影矩阵, V V V 是词汇空间。 T \mathcal{T} T 代表输入文本本身或下一句的词元集合,具体取决于 e t α e_{t}^{\alpha} etα e t β e_{t}^{\beta} etβ 的处理。这一训练目标简单但有效,可以轻松实现于现有的语言建模训练流程之上。

4. 实验

4.1 设定

image-20240906080655226

实验研究旨在验证 LLaRA 的有效性,特别是其在微调后的检索准确性和在不同场景中的泛化能力。为此,我们使用 MS MARCO作为微调数据集,对段落检索和文档检索任务进行评估。为了评估模型的泛化能力,我们还利用了 BEIR 基准,该基准涵盖了各种检索场景,如问答、事实验证、实体检索、重复检测等。来自 MS MARCO 的微调模型直接用于 BEIR 的0-shot 评估。

image-20240906080901053

训练:LLaRA 应用于 LLaMA-2-7B(base)模型。训练基于由 DPR整理的未标注的维基百科语料库。我们总共进行 10000 步的 LLaRA 适应,批量大小为 256,序列长度为 1024,学习率为 1e-5。LLaRA 的微调遵循 RepLLaMA提出的程序:利用 LoRA进行高效的 LLM 参数训练,并使用 ANN 硬负样本进行嵌入模型的对比学习。

image-20240906080915442

4.2 分析

关于 MS MARCO 的段落和文档检索,以及 BEIR 基准上的0-shot 检索的评估结果分别展示在表 1、表 2 和表 3 中。我们与多种基准方法进行了比较,包括基于预训练语言模型的代表性密集检索器,如 ANCE、RocketQA、GTR、RetroMAE、SimLM以及传统的基于 BM25 的稀疏检索器。我们还引入了最新的利用 LLM 作为骨干编码器的方法,包括 CPT、SGPT、RepLLaMA。

主要观察结果如下。首先,LLaRA 在每个评估场景中都取得了最好的检索性能。

对每个具体场景的观察结果如下。首先,MS MARCO 段落检索(表 1)曾是信息检索领域最广泛引用的基准之一。值得注意的是,LLaRA 仅通过硬负样本进行微调。如果未来可以利用更先进的微调方法,报告的性能可能会进一步提高。与基于 BERT 的替代方法(如 RetroMAE 和 SimLM)相比,切换骨干编码器带来了近 + 4 % +4\% +4% 的 MRR @10 增益。这一显著提升表明了应用 LLM 进行密集检索的巨大潜力。

在 MS MARCO 的文档检索任务中(表2),相同的观察结果也得到了验证。基于 LLM 的检索器带来了优越的经验性能。实际上,文档检索直接受益于使用 LLM 作为骨干编码器,鉴于 LLM 显著扩展的上下文长度,例如 LLaMA-2 的 4K 长度。

根据 BEIR 基准上的0-shot 评估结果,检索器的泛化能力是使用 LLM 作为骨干编码器的另一个明显优势。在 BEIR 基准的许多评估任务中,基于 BERT 的方法甚至比简单的 BM25 基于稀疏检索器表现更差。然而,通过切换到基于 LLM 的骨干编码器,密集检索器的0-shot 性能可以显著提升。值得注意的是,随着模型规模的大幅扩展,所有大型基准能够在大多数情况下超越 BM25。此外,与 BERT 基准相比,LLaRA 在每个单独任务中的表现都要好得多,这最终带来了在平均性能上 + 16 % +16\% +16% 的 NDCG@10 显著提升。

5. 结论

在本文中,我们提出了 LLaRA,这是一种新颖的方法,旨在通过提高文本嵌入能力,使 LLM成为更好的密集检索基础。LLaRA 由两个前置任务 EBAE 和 EBAR 组成。这两个任务协作将 LLM 的文本嵌入转化为全局上下文的表示者,从而促进查询与相关目标之间的语义匹配。

总结

⭐ 本工作提出了LLaRA,该方法作为对 LLM 进行后处理适应以用于密集检索应用。LLaRA 包含两个前置任务: LLM 的文本嵌入分别用于重构输入句子的词元和预测下一个句子的词元。通过这种方式旨在捕捉输入文本本身和下一句的全局语义,从而使LLM变成一个有效的密集检索器。

相关文章:

[论文笔记]Making Large Language Models A Better Foundation For Dense Retrieval

引言 今天带来北京智源研究院(BAAI)团队带来的一篇关于如何微调LLM变成密集检索器的论文笔记——Making Large Language Models A Better Foundation For Dense Retrieval。 为了简单&#xff0c;下文中以翻译的口吻记录&#xff0c;比如替换"作者"为"我们&quo…...

Linux平台屏幕|摄像头采集并实现RTMP推送两种技术方案探究

技术背景 随着国产化操作系统的推进&#xff0c;市场对国产化操作系统下的生态构建&#xff0c;需求越来越迫切&#xff0c;特别是音视频这块&#xff0c;今天我们讨论的是如何在linux平台实现屏幕|摄像头采集&#xff0c;并推送至RTMP服务。 我们知道&#xff0c;Linux平台&…...

梧桐数据库|中秋节活动·抽奖领取大闸蟹

有话说 众所周不知&#xff0c;我的工作就是做一个国产的数据库产品—中国移动梧桐数据库&#xff08;简称WuTongDB&#xff09;。 近期我们举办了一次小活动&#xff0c;来提升梧桐数据库的搜索量和知名度&#xff0c;欢迎大家来参加&#xff0c;免费抽奖领取大闸蟹哦~~~ 具…...

Python怎么发送邮件:基础步骤与详细教程?

Python怎么发送邮件带附件&#xff1f;怎么使用Python发送邮件&#xff1f; 无论是工作中的通知、报告&#xff0c;还是生活中的问候、邀请&#xff0c;电子邮件都扮演着不可或缺的角色。那么&#xff0c;Python怎么发送邮件呢&#xff1f;AokSend将详细介绍Python发送邮件的基…...

[译] 大模型推理的极限:理论分析、数学建模与 CPU/GPU 实测(2024)

译者序 本文翻译自 2024 年的一篇文章&#xff1a; LLM inference speed of light&#xff0c; 分析了大模型推理的速度瓶颈及量化评估方式&#xff0c;并给出了一些实测数据&#xff08;我们在国产模型上的实测结果也大体吻合&#xff09;&#xff0c; 对理解大模型推理内部工…...

vue3 响应式 API:readonly() 与 shallowReadonly()

readonly() readonly()是一个用于创建只读代理对象的函数。它接受一个对象 (不论是响应式还是普通的) 或是一个 ref&#xff0c;返回一个原值的只读代理。 类型 function readonly<T extends object>(target: T ): DeepReadonly<UnwrapNestedRefs<T>>以下…...

迁移学习与知识蒸馏对比

应用场景不同 迁移学习&#xff1a;通常用于不同但相关的任务之间的知识迁移。特别是当目标任务的数据量不足时&#xff0c;可以从一个已经在大规模数据上训练好的模型中获取有用的特征或参数。典型场景包括计算机视觉任务&#xff0c;比如你在ImageNet上训练了一个ResNet&…...

【Java-反射】

什么是反射&#xff1f; JAVA反射机制是在运行状态中&#xff0c;创建任意一个类&#xff0c;能获取这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意一个方法和属性&#xff1b;这种动态获取的信息以及动态调用对象的方法的功能称为java语言…...

移动UI设计要求越来越高,最为设计师应如何迎头赶上

一、引言 在当今数字化高速发展的时代&#xff0c;移动设备已经成为人们生活中不可或缺的一部分。随着科技的不断进步和用户需求的日益增长&#xff0c;移动 UI 设计的要求也越来越高。作为移动 UI 设计师&#xff0c;我们面临着巨大的挑战&#xff0c;需要不断提升自己的能力…...

大数据-121 - Flink Time Watermark 详解 附带示例详解

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…...

国行 iPhone 15 Pro 开启苹果 Apple Intelligence 教程

一、前言苹果在 iOS 18.1 测试版上正式开启了 Apple Intelligence 的内测&#xff0c;但国行设备因政策原因不支持&#xff0c;且国行设备在硬件上被锁定。不过&#xff0c;我们可以通过一些方法来破解国行 iPhone 15 Pro&#xff0c;使其能够开启 Apple Intelligence。 以下是…...

conda、anaconda、pip、torch、pytorch、tensorflow到底是什么东西?(转载自本人的知乎回答)

转载自本人的知乎回答&#xff08;截止2024年9月&#xff0c;1700赞同&#xff0c;2400收藏&#xff09; https://www.zhihu.com/question/566592612/answer/3063465880 如果你是一个大四的CS准研究生回去补基础课&#xff0c;假如是科班CS甚至科班EE的话那你基础也太差了。你…...

数据库系列之GaussDB数据库中逻辑对象关系简析

初次接触openGauss或GaussDB数据库的逻辑对象&#xff0c;被其中的表空间、数据库、schema和用户之间的关系&#xff0c;以及授权管理困惑住了&#xff0c;与熟悉的MySQL数据库的逻辑对象又有明显的不同。本文旨在简要梳理下GaussDB数据库逻辑对象之间的关系&#xff0c;以加深…...

如何进行不同数据库的集群操作?--从部署谈起,今天来看MySQL和NoSql数据库Redis的集群

篇幅较长&#xff0c;主要分为mysql和Redis两部分。找想要的部分可见目录食用。。 目录 什么是集群&#xff1f;为什么要集群&#xff1f; 1.1 数据库主要分为两大类&#xff1a;关系型数据库与 NoSQL 数据库 1.2 为什么还要用 NoSQL 数据库呢&#xff1f; ----------------…...

第 6 章图像聚类

本章将介绍几种聚类方法&#xff0c;并展示如何利用它们对图像进行聚类&#xff0c;从而寻找相似的图像组。聚类可以用于识别、划分图像数据集&#xff0c;组织与导航。此外&#xff0c;我们还会对聚类后的图像进行相似性可视化。 6.1 K-means聚类 K-means 是一种将输入数据划…...

HC-SR501人体红外传感器详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 3.工作原理介绍 三、程序设计 main.c文件 body_hw.h文件 body_hw.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 HC-SR501人体红外模块是基于红外线技术的自动控制模块&#xff0c;采用德国原装进口LHI77…...

关于武汉芯景科技有限公司的IIC电平转换芯片XJ9517开发指南(兼容PCF9517)

一、芯片引脚介绍 1.芯片引脚 2.引脚描述 二、系统结构图 三、功能描述 1.电平转换 2.芯片使能/失能 EN 引脚为高电平有效&#xff0c;内部上拉至 VCC&#xff08;B&#xff09;&#xff0c;允许用户选择中继器何时有效。这可用于在上电时隔离行为不良的从机&#xff0c;直到…...

C语言:scanf()、getchar()、gets()

一、gets() gets()能吸收空格和换行&#xff0c;因此输入后&#xff0c;对输出要去除空格 和换行\n; #include <stdio.h> #include <string.h> int main() {char str[1000];int count0;gets(str);for(int i0;i<strlen(str);i)count;printf("%s\n",str…...

基于MATLAB的全景图像拼接系统实现

简要的论文框架和技术思路 摘要 本文深入探讨了基于MATLAB平台的块匹配全景图像拼接系统的设计与实现。通过详细解析SIFT/SURF特征提取、RANSAC变换估计、APAP局部对齐、图割算法拼接缝选择及multi-band blending图像融合等关键技术&#xff0c;构建了高效且高质量的全景图像…...

AI模型“减肥”风潮:量化究竟带来了什么?

量化对大模型的影响是什么 ©作者|YXFFF 来源|神州问学 引言 大模型在NLP和CV领域的广泛应用中展现了强大的能力&#xff0c;但随着模型规模的扩大&#xff0c;对计算和存储资源的需求也急剧增加&#xff0c;特别是在资源受限的设备上面临挑战。量化技术通过将模型参数和…...

第四届“长城杯”网络安全大赛 暨京津冀网络安全技能竞赛(初赛) 全方向 题解WriteUp

战队名称&#xff1a;TeamGipsy 战队排名&#xff1a;18 SQLUP 题目描述&#xff1a;a website developed by a novice developer. 开题&#xff0c;是个登录界面。 账号admin&#xff0c;随便什么密码都能登录 点击头像可以进行文件上传 先简单上传个木马试试 测一下&…...

ETCD的备份和恢复

一、引言 ETCD是一个高度可用的键值存储系统&#xff0c;被广泛应用于Kubernetes等分布式系统中以存储关键配置数据和服务发现信息。由于ETCD的重要性&#xff0c;确保其数据的安全性和可靠性至关重要。本文将介绍ETCD备份与恢复的基础知识、常用方法及最佳实践。 二、概述 …...

Linux Makefile文本处理函数知识详解

1.Makefile函数 GNU make 提供了大量的函数用来处理文件名、变量、文本和命令。通过这些函数&#xff0c;用户可以节省很多精力&#xff0c;编写出更加灵活和健壮的Makefile。函数的使用和变量引用的展开方式相同&#xff1a; $(function arguments)${function arguments}关于…...

Rust的数据类型

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust到底值不值得学&#xff0c;之一 -CSDN博客 Rust到底值不值得学&#xff0c;之二-CSDN博客 3.5 数据类型的定义和分类 在Rust…...

如何在vim中批量注释和取消注释

一、批量注释 首先在你需要注释的初始所在行在命令模式下输入CTRL v&#xff0c;然后按下HJKL来控制方向&#xff08;不能使用键盘上的箭头方向键&#xff09;&#xff1a; 然后输入 shifti&#xff1a; 输入两个斜杠然后加exc就可以完成批量注释&#xff1a; 二、批量取消注…...

Centos7.9 安装Elasticsearch 8.15.1(图文教程)

本章教程,主要记录在Centos7.9 安装Elasticsearch 8.15.1的整个安装过程。 一、下载安装包 下载地址: https://www.elastic.co/cn/downloads/past-releases/elasticsearch-8-15-1 你可以通过手动下载然后上传到服务器,也可以直接使用在线下载的方式。 wget https://artifacts…...

哈希表-数据结构

一、哈希表基本概念 哈希表&#xff08;也称为散列表&#xff09;是根据键而直接访问在内存存储位置的数据结构&#xff0c;也就是说实际上是经过哈希函数进行映射&#xff0c;映射道表中一个位置来访问记录&#xff0c;这个存放记录的数组称为散列表。 哈希函数&#xff1a;就…...

指针之旅(4)—— 指针与函数:函数指针、转移表、回调函数

目录 1. 函数名的理解 1.1 “函数名”和“&函数名”的含义 1.2 函数(名)的数据类型 2. 函数指针(变量) 2.1 函数指针(变量)的创建格式 2.2 函数指针(变量)的使用格式 2.3 例子 判别 3. typedef 关键字 3.1 typedef的作用 3.2 typedef的运作逻辑 和 函数指针类型…...

打造线上+线下相结合的O2O平台预约上门服务小程序源码系统 带完整的安装代码包以及搭建部署教程

系统概述 本系统采用前后端分离的设计架构&#xff0c;前端以微信小程序为载体&#xff0c;提供直观、易用的用户界面&#xff1b;后端则采用稳定的服务器架构&#xff0c;确保数据处理的高效与安全。系统主要包括用户端、商户端和管理员端三大模块&#xff0c;通过API接口实现…...

python sys模块

在Python中&#xff0c;sys模块提供了访问和使用解释器的许多功能的方法&#xff0c;包括命令行参数、环境变量、路径管理、标准输入输出流等。sys模块是Python的标准库的一部分&#xff0c;不需要额外安装即可使用。 常用的sys模块功能 1. sys.argv sys.argv是一个包含命令…...