Making Large Language Models Perform Better in Knowledge Graph Completion

news2024/11/19 11:25:06

Making Large Language Models Perform Better in Knowledge Graph Completion

基本信息

博客贡献人

鲁智深

作者

Yichi Zhang, Zhuo Chen, Wen Zhang, Huajun Chen
隶属于浙江大学计算机学院和软件学院

摘要

    本文主要探讨了如何将有用的知识图谱结构信息融入大语言模型中,以实现大语言模型中的结构感知推理。

    基于大语言模型的知识图补全(KGC)旨在使用LLM预测KGs中缺失的三元组。但目前对基于LLM的KGC的研究有限,缺乏对LLM推理能力的有效利用,忽略了KGs中重要的结构信息,阻碍了LLM获得准确的事实知识。
    为解决这个问题,本文研究如何将有用的KG结构信息融入到LLM中,实现LLM的结构感知推理。首先将现有的LLM范式转移到结构感知设置中,提出了知识前缀适配器(KoPA)来实现这一目标。KoPA采用结构嵌入预训练来捕获KG中实体和关系的结构信息。然后将知识前缀适配器告知LLM,该适配器将结构嵌入映射到文本空间中,并获得虚拟知识tokens作为输入prompt的前缀。
    对这些基于结构感知的LLM的KGC方法进行了全面的实验,并提供了深入的分析,比较了结构信息的引入如何更好地提高LLM的知识推理能力。

基于LLM的KGC

符号定义

    一个KG记为 G = ( E , R , T , D ) G=(E,R,T,D) G=(E,R,T,D),其中 E , R E,R E,R分别为实体集、关系集。 T = ( h , r , t ) ∣ h , t ∈ E , r ∈ R T={(h,r,t)|h,t∈E,r∈R} T=(h,r,t)h,tE,rR是三元组集合, D D D是每个实体和关系的描述集。我们将 D ( e ) , D ( r ) D(e),D(r) D(e),D(r)表示为每个实体 e ∈ E e∈E eE和每个关系 r ∈ R r∈R rR的简短文本描述。例如,实体‘/m/0ctzf1’的文本描述为D(‘/m/0ctzf1’)=“The Transformer”。
    将LLM应用于KGC任务时,将LLM表示为作为文本解码器的 M M M。模型M的输入文本序列 S S S由几个部分组成:指令提示 I I I、三元组提示 X X X和可选的辅助提示 U U U。指令提示 I I I是手动准备的指导LLM M M M执行KGC任务的指令。三元组提示 X X X包含需要处理的三元组的文本信息,可以记为:
X ( h , r , t ) = D ( h ) ⊕ D ( r ) ⊕ D ( t ) X(h,r,t)=D(h)⊕D(r)⊕D(t) X(h,r,t)=D(h)D(r)D(t)
其中 ( h , r , t ) ∈ T (h,r,t)∈T (h,r,t)T是一个三元组, ⊕ ⊕ 表示文本标记连接操作。辅助示例 U U U是针对不同设置的可选prompt。
    以三元组分类作为切入点,研究如何利用LLM来完成KGC任务。三元组分类是一个基本的KGC任务,目的是对给定的三元组进行二元分类任务。而在LLM范式中,所有的任务都被转换为文本生成的形式。因此,我们希望模型 M M M给定文本序列输入 S = I ⊕ U ⊕ X S = I⊕U⊕X S=IUX回答真或假。
    这个任务可以被建模为一个文本分类任务。但三元组分类不同于普通的文本分类,因为三元组提示符中的实体和关系具有由给定的KG定义的复杂语义信息。如果不知道这种类型的信息,模型答案的内容是不可靠的和不稳定的。尽管在LLMs中存在大量的常识,研究表明大型模型对细粒度的事实知识麻木,会陷入幻觉。因此,将KG信息整合到提示符中,以提供更多的辅助信息,并指导LLM进行结构感知推理,是实现优秀的基于LLM的KGC的关键。

无训练的推理方法

    无训练推理是一种利用LLM解决下游任务的有效方法。需要准备一个合适的prompt模板来获得模型 M M M生成的结果。主流无训练方法包括zero-shot推理和上下文学习。
    zero-shot推理方法(ZSR):Zero-shot推理是LLM在没有辅助信息 U U U的情况下完成推理任务的一种直接方法。因此,ZSR的输入序列可以记为 S z s r = I z s r ⊕ X S_{zsr}=I_{zsr}⊕X Szsr=IzsrX。LLM M M M的解码过程可以表述为:
A z s r = a r g m a x A P M ( A │ S z s r ) = a r g m a x A P M ( A ∣ I z s r , X ) A_{zsr}=argmax_A P_M (A│S_{zsr} )=argmax_A P_M (A|I_{zsr},X) Azsr=argmaxAPM(ASzsr)=argmaxAPM(AIzsr,X)
其中, A A A是模型 M M M生成的答案, I z s r I_{zsr} Izsr是ZSR的指令模板。在ZSR的设置中,没有向输入序列 S z s r S_{zsr} Szsr中添加KG信息。
    ZSR提示符中的确定性信息只是测试三元组的文本描述。由于设置限制,ZSR无法合并KG信息,否则不能称为zero-shot。
    具有结构感知示例的上下文学习方法(ICL):作为另一种无训练范式,上下文学习允许模型 M M M在输入 S S S中添加辅助示例 U U U,并以类比推理的形式完成任务:
A i c l = a r g m a x A P M ( A │ S i c l ) = a r g m a x A P M ( A ∣ I i c l , U , X ) A_{icl}=argmax_A P_M (A│S_{icl} )=argmax_A P_M (A|I_{icl},U,X) Aicl=argmaxAPM(ASicl)=argmaxAPM(AIicl,U,X)
对于三元组分类任务, U U U应该是一些三元组,其标签形式为 ( X i , y i ) , 1 ≤ i ≤ k {(X_i,y_i),1≤i≤k} (Xi,yi),1ik,其中 X i X_i Xi是示例三元组。用𝑘个示例将ICL表示为𝑘-shot ICL。
    示例三元组可以从现有的训练KG中随机采样。然而,为了进一步纳入测试三元组 ( h , r , t ) (h,r,t) (h,r,t)的相对KG信息,我们建议对位于 h h h t t t的局部结构中的三元组进行采样,这意味着每个采样三元组中的一个实体应该是 h h h t t t。此外,由于现有的KG只由正三元组组成,我们采用负抽样对负三元组进行抽样形成示例。对于平衡预测,正三元组和负三元组的数量是相同的。在示例prompt中,正的三元组被标记为真,负的三元组被标记为假。
    通过这样做,我们将局部结构信息融入到具有正样本和负样本的示例提示U中。这种结构感知的示例可以更好地增强模型M的类比推理过程。

指令微调(IT)方法

    指令微调旨在对 LLM 进行微调,使其遵循人类指令并完成指令提示中提到的任务。
    Vanilla指令微调:在普通IT的设置中,指令提示 I i t I_{it} Iit将描述完成三元组分类任务的细节,而三元组提示 X X X由输入的三元组分类任务组成。输入模板中不包含其他辅助示例。为了训练模型 M M M,输入序列被组织为 S i t = I i t ⊕ X ⊕ A i t S_{it}=I_{it}⊕X⊕A_{it} Sit=IitXAit。其中, A i t A_{it} Ait为训练数据的预测答案。模型 M M M对下一个单词预测任务进行了微调,这是一种训练LLM的通用方法。训练目标可表述为:
L i t = − 1 / S i t ∑ ( i = 1 ) ( ∣ S i t ∣ ) l o g P M ( s i ∣ s < i ) L_{it}=-1/S_{it} ∑_{(i=1)}^{(|S_{it} |)}logP_M (s_i |s_{<i}) Lit=1/Sit(i=1)(Sit)logPM(sis<i)
其中, s i s_i si(𝑖= 1,2,……,| S i t S_{it} Sit|)表示输入序列 S i t S_{it} Sit的文本tokens。在推理阶段,采用模型 A i t A_{it} Ait来预测测试数据的答案。
    Vanilla IT 只对 LLM 进行微调,以学习单个三元组中的知识,从而进行判别。这种方法使得充分利用KG中丰富的语义变得困难,模型性能有限。
    结构感知的指令微调:KG的结构信息在KGC任务中起着重要的作用。为了在微调阶段融入这些KG信息,我们通过添加输入三元组的邻域描述来实现这一目标。具体来说,可以对头部ℎ和尾部𝑡的邻域进行采样,并将邻域三元组的文本描述放在示例提示 U i t U_{it} Uit中。这样,输入的训练序列就被增强为 S i t = I i t ⊕ U i t ⊕ X ⊕ A i t S_{it}=I_{it}⊕U_{it}⊕X⊕A_{it} Sit=IitUitXAit。将这种方法命名为结构感知指令调优,因为实体的局部结构信息以邻域三元组的形式添加到输入序列中。

基于LLM的KGC的知识前缀适配器

    前一节中提到的融入KG结构信息的基本方法的重点是将邻域信息以文本的形式添加到输入序列中。但以文本形式表示KG结构信息并不是一个好的选择,可能会给提示带来更多无效或冗余的信息。无限期地增加提示符的长度是不可扩展的和无效的,因为较长的上下文会导致模型能力的下降和高计算消耗。此外,也很难在KG中找到对三元组识别具有决定性作用的结构信息。
    为了解决这些问题,引入知识前缀适配器(简称KoPA),将KG结构信息合并到LLM中进行三元组分类。KoPA方法分为两部分:首先通过结构嵌入预训练提取KG中实体和关系的结构信息,然后通过结构前缀适配器将这些信息注入输入序列,LLM进一步利用结构注入序列进行微调。

在这里插入图片描述

图1. 对知识前缀适配器(KoPA)的概述。KoPA是一个基于LLM的两阶段KGC框架。KoPA首先对给定的KG中的实体和关系进行预训练结构嵌入。然后,KoPA使用指令调优来微调LLM。给定输入三元组序列的结构嵌入将通过适配器投影到LLM的文本标记空间中,并作为输入提示序列前面的前缀串,也称为虚拟知识标记。通过仅使用解码器的LLM的单向注意机制,这些虚拟知识标记将被following文本标记看到,这将允许LLM在结构感知状态下解码指令的答案。

结构嵌入预训练

    KoPA没有在输入序列中添加关于邻域信息的文本,而是通过自监督的结构嵌入预训练来提取实体和关系的结构信息。对于每个实体 e ∈ E e∈E eE和每个关系 r ∈ R r∈R rR,我们分别学习一个结构嵌入 e ∈ R ( d e ) , r ∈ R ( d r ) e∈R^{(d_e)},r∈R^{(d_r)} eR(de)rR(dr),其中 d e d_e de d r d_r dr为嵌入维数。将KG结构信息编码,并将其引入到LLM的文本表示空间中。
    参考现有的基于嵌入的KGC范式,定义了一个评分函数 F ( h , r , t ) F(h,r,t) F(h,r,t)来衡量三元组 ( h , r , t ) (h,r,t) (h,r,t)的合理性。采用了通过负采样的自监督预训练目标:
L p r e = 1 / ( ∣ T ∣ ) ∑ ( h , r , t ) ( − l o g σ ( γ − F ( h , r , t ) ) ) − ∑ ( i = 1 ) K p i l o g σ ( F ( h i ′ , r i ′ , t i ′ ) − γ ) L_{pre}=1/(|T|) ∑_{(h,r,t)}(-logσ(γ-F(h,r,t))) - ∑_{(i=1)}^K p_i logσ(F(h'_i,r'_i,t'_i)-γ) Lpre=1/(T)(h,r,t)(logσ(γF(h,r,t)))(i=1)Kpilogσ(F(hi,ri,ti)γ)
其中 γ γ γ为边, σ σ σ为s型激活函数, h i ′ , r i ′ , t i ′ h'_i,r'_i,t'_i hi,ri,ti(𝑖= 1,2,…,𝐾)为 ( h , r , t ) (h,r,t) (h,r,t)的𝐾个负样本。
    通过最小化这种预训练的损失,每个实体和关系的结构嵌入被优化,以适应其所有的相对三元组,从而在嵌入中捕获KG的结构信息,如子图结构和关系模式。

知识前缀适配器

    经过结构嵌入预训练后,我们可以得到三元组(ℎ,𝑟,𝑡)的结构嵌入(𝒉,𝒓,𝒕),其中KG的结构信息被编码在里面。然而,结构嵌入是在针对LLM M M M的文本标记表示空间的不同表示空间中学习的,这意味着 M M M不能直接理解这些嵌入。因此应用一个知识前缀适配器 P P P,将它们映射到 M M M的文本标记表示空间中。具体来说,结构嵌入通过 P P P转换为几个虚拟知识token K:
K = P ( h ) ⊕ P ( r ) ⊕ P ( t ) K = P (h) ⊕ P (r) ⊕ P (t) K=P(h)P(r)P(t)
    在实践中,适配器 P P P是一个简单的投影层。然后将 K K K放在原始输入序列 S S S的前面,作为指令和三元组提示符的前缀 S k p a = K ⊕ I i t ⊕ X S_{kpa}=K⊕I_{it}⊕X Skpa=KIitX。这样,由于仅使用解码器的LLM中的单向注意力,所有后续的文本Token都可以看到这些前缀。这样,文本Token可以对输入三元组的结构嵌入进行单向注意,从而在微调和推理期间实现结构感知提示。在训练过程中,冻结预训练好的结构嵌入。该适配器经过优化,可以学习从结构知识到文本表示的映射,并在推理阶段将其泛化到新的三元组,这将有利于文本描述,并从另一个角度提供三元组信息,从而增强预测。

实验

    在实验中,使用三个公共的KG基准UMLS,CoDeX-S 和FB15K-237N来评估所提出的基于LLM的KGC方法的能力。UMLS是一个经典的医学知识图,包括关于医学和卫生保健的一般知识。CoDeX-S是从百科中提取的百科全书式KG。

实验设置

    基线方法:在实验中,将提出的方法与三元组分类任务上的三大类基线模型进行了全面的比较,这是KGC的一个重要子任务。KGC基线可以分为三个部分:基于嵌入的方法、基于PLM的方法和基于LLM的方法。用于这些基线的具体模型如下:
    (1)嵌入式KGC方法:选择四种传统的基于嵌入的KGC方法进行比较,即TransE、DistMult、KGC和RotatE。这些方法通过学习到的结构嵌入和模型中定义的分数函数来预测三元组合理性。
    (2)基于PLM的KGC方法:选择KG-BERT和PKGC作为基于PLM的KGC基线,这是专注于三元组分类任务的经典方法。这些方法将三元组分类视为一个二元文本分类任务。
    (3)基于LLM的KGC方法:基于LLM的KGC研究仍处于早期阶段。只有KGLLaMA是基于LLM的KGC基线。除了KGLLaMA之外,在第2节中提出的方法,包括ZSR、ICL、IT和结构感知IT(增强型IT)也将作为基线。
    此外,进一步将基于LLM的方法分为两类:无训练方法和微调方法。无训练方法包括ZSR和ICL,其余均为微调方法。
    所有基于LLM的方法,使用Alpaca-7B作为LLM的主干。KoPA使用RotatE和结构嵌入预训练的得分函数,适配器是一个512×4096的线性投影层。
    评估指标:三元组分类任务本质上是一个二元分类任务。所有的测试数据集都是标签平衡的。因此,使用accuracy、precision、recall、和F1-score作为评价指标。

表1. 三元组分类的主要实验结果。报告了三个数据集上每种方法的准确率(ACC)、精度(P)、召回率(R)和F1-score(F1)结果。“-”意味着结果缺失,因为PKGC的特异性使其难以复制。基线中最好的Acc / F1结果用下划线标记,当实现新的SOTA时,用粗体突出显示我们的结果。

在这里插入图片描述

主要结果

    三元组分类的主要实验结果如上表所示。总的来说,可以发现,与现有的16个基线模型相比,KoPA在所有三个数据集上取得了优越的准确性和F1分数结果。以CoDeX-S为例,KoPA的F1分数提高了1.81%,准确率提高了1.85%。当在KoPA中使用预训练的RotatE嵌入时,可以观察到KoPA明显优于原始的基于嵌入的RotatE方法,特别是在更大、更具挑战性的数据集上,如CoDeX-S和FB15K-237N。
    同时,与所有基于LLM的方法相比,可以看到,如果没有微调,LLM就不能很好地理解KG的结构信息。即使GPT-3.5-turbo(175B参数)具有出色的能力,zero-shot LLM在三元组分类任务中表现得非常差。虽然ICL提供的示例可以包含KG信息,但性能增益是有限的。此外,无训练方法的预测结果是有偏差的,很容易陷入全对或全错的极端,因为它们的召回率要么很高,要么很低,但F1分数一直相对较低。
    然而,微调LLM可以将KG信息引入到LLM中,整体性能有了明显的改进。同时,尽管结构感知IT利用三元组的邻域信息增强了输入提示,但与KoPA相比,其性能也有限。这表明,与基于文本的辅助提示相比,结构嵌入包含了更多语义丰富的信息,LLM也可以通过前缀适配器来理解。

可转移性研究

    主要实验结果表明了KoPA的有效性。为了进一步验证KoPA的通用性和可转移性,进行了一个新的可转移性实验。在本实验中,我们将证明知识前缀适配器将学习从结构嵌入转换到文本tokens表示,并提供语义丰富的辅助信息,以增强LLM推理的解码过程。
    通过测试KoPA对不出现在训练阶段的实体的影响来证明这一点,这在其他KGC的作品中也被称为归纳设置。我们将KG数据集分割成一个具有定义的归纳率(IR)的归纳设置,它指的是在训练过程中看不见的实体的比例。例如,如果IR=为10%,我们将随机选择10%的实体作为归纳实体集。训练集中头部或尾部在归纳集中的任何三组训练都将在训练过程中被去除。此外,测试集中的三元组将分为两部分:可见(S)部分和看不见(U)部分。如果三元组的头部或尾部在归纳实体集中,它将被视为看不见的。
    只用剩余的可见的三元组来微调LLM,并对已看到和未看到的三元组进行测试。在这种情况下,一组实体将不会参与训练过程,而LLM也不会看到它们的文本描述,这将使测试过程更具挑战性。我们报告了已看到(S)、未看到(U)和所有(A)测试三元组的准确性和F1分数,如下图所示,有三种微调方法: KoPA、普通IT和结构感知的IT(图中增强了IT)。
    从雷达图中可以观察到,KoPA的性能优于其他方法,并且当IR增加时,性能下降更小。具有文本形式的邻域三元组的结构感知IT(增强型IT)的性能更加不稳定。这些现象表明,知识前缀适配器可以学习从结构嵌入到文本表示的一个很好的映射,即使在训练过程中看不到实体,这也是可转移的。从KG中捕获的结构嵌入在告知LLM有用的结构信息方面发挥了更重要的作用。
在这里插入图片描述

图3.可转移性实验的结果。我们报告了在不同诱导率(IR)下的CoDeX-S数据集的结果。此外,我们根据实体是否在训练过程中是否出现,将测试数据分为可见的(S)和看不见的(U)部分。我们还将所有(A)测试数据的结果汇总。雷达图中报告了精度(Acc)和F1评分(F1)。

案例研究

    为了更直观地了解KoPA,本节从宏观和微观的角度进行了一个案例研究。从宏观的角度来看,我们计算了多个模型的预测重叠,并绘制出如图4所示的维恩图。

在这里插入图片描述

图4.不同模型预测的维恩图。集合的相交部分代表了模型对某些数据的相同的预测。

    从图中可以发现,KoPA有很大一部分预测没有与其他几个模型相交,这意味着KoPA对一些测试数据做出了正确的预测,而许多其他模型的预测并不正确。这表明,KoPA中包含的结构信息在做出正确的预测方面具有重要作用。举一个简单的例子,一个测试三元组(约翰·兰迪斯,导演电影,来到美国)被RotatE模型和vanilla指令微调LLM预测为错误的。检索邻域三元组(来到美国,地点,纽约),(约翰·兰迪斯,国籍,美国),(来到美国,类型,浪漫喜剧),(喜剧,常见netflix标题,来到美国),结构感知微调LLM仍然做出错误的预测,因为邻域信息在当前预测的判断中几乎没有用处,尽管它们是正确的事实。KoPA中应用的结构嵌入比文本形式的结构信息包含更多的信息,并且我们更容易通过结构预训练过程进行提取。因此,KoPA在三元组分类任务中优于其他模型。

相关知识链接

论文代码

Talk Like a Graph: Encoding Graphs for Large Language Models

总结

[亮点]

  • 本文是第一个全面探索LLM在KGC中的应用的工作,特别是通过结合KG结构信息来增强LLM推理。这涉及到将现有的LLM范式(如ICL和IT)转移到KGC任务的结构感知设置中。
  • 本文提出了一种知识前缀适配器(KoPA),能有效地集成了预训练好的KG结构嵌入和LLM。KoPA支持来自LLM的文本嵌入和来自KG的结构嵌入的完全交互。具有KoPA的微调LLM能够做出显示出KGC结构意识的决策。

BibTex

@article{zhang2023making,
  title={Making Large Language Models Perform Better in Knowledge Graph Completion},
  author={Zhang, Yichi and Chen, Zhuo and Zhang, Wen and Chen, Huajun},
  journal={arXiv preprint arXiv:2310.06671},
  year={2023}
}

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

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

相关文章

使用Redhat操作系统下载MySQL

一、本地下载安装 方法一 ①在虚拟机火狐浏览器中搜索MySQL官网&#xff08;选择第一个下载&#xff09; ②下载完毕使用xshell远程连接解压及安装 [rootlocalhost ~]# cd /Downloads/ [rootlocalhost Downloads]# mkdir /mysql/ [rootlocalhost Downloads]# mv mysql-8.0.3…

12.字符串和正则表达式

使用正则表达式 正则表达式相关知识 在编写处理字符串的程序或网页时&#xff0c;经常会有查找符合某些复杂规则的字符串的需要&#xff0c;正则表达式就是用于描述这些规则的工具&#xff0c;换句话说正则表达式是一种工具&#xff0c;它定义了字符串的匹配模式&#xff08;…

25 心形按钮

效果演示 实现了一个心形的心形图案&#xff0c;当用户点击图案时&#xff0c;图案会旋转并缩小&#xff0c;同时背景颜色会变成白色。 Code <div class"love"><input id"switch" type"checkbox"><label class"love-heart&…

窗口超出屏幕拉不出来或移到屏幕边上的解决办法

前言 由于一些原因&#xff0c;比如进行远程电脑时屏幕大小不同&#xff0c;导致一些程序窗口超出屏幕拉不出来或移到屏幕边上&#xff0c; 我是在公司有个大屏幕&#xff0c;抱着笔记本回去之后&#xff0c;有个软件打开之后啥也没有。估计是跑到屏幕外了。 以下附上解决方法…

软件工程概论---内聚性和耦合性

目录 一.耦合性 1.内容耦合 2.公共耦合 4.控制耦合 5.标记耦合&#xff08;特征耦合&#xff09; 6.数据耦合 7.非直接耦合 二.内聚性 1.偶然内聚 2.逻辑内聚 3.时间内聚 4.过程内聚 5.通信内聚 6.顺序内聚 7.功能内聚 一.耦合性 耦合性是指软件结构中模块相互…

React 类组件和函数组件

组件component 一.概念 Element VS Component (元素与组件) //不成文的约定:元素小写&#xff0c;组件大写 const divReact.createElement(div,...) 这是一个React元素(小写) const Div()>React.createElement(div,...) 这是一个React组件(大写) 什么是组件? 能跟其他…

解决:已经安装open3d,还是报错No module named ‘open3d‘的问题

首先示例&#xff0c;我是如何安装又是如何被报错的过程。 报错过程&#xff1a; 网上普遍的安装指令就是下面这个&#xff1a; pip install open3d 我是直接python页面的终端安装的&#xff1a; 安装完&#xff0c;检查列表已安装文件是否有open3d&#xff0c; 输入指令 …

Linux:进程的通信

目录 进程间的通信 管道 1.概念 2.匿名管道 3.命名管道 4.匿名管道与命名管道的区别 5.总结管道的特点 共享内存 1.原理 2.共享内存的建立 3.代码 1.相关函数 2.总结 进程间的通信 1.进程间通信目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程…

flex弹性盒子常用的布局属性详解

想必大家在开发中经常会用到flex布局。而且还会经常用到 justify-content 属性实现分栏等等 接下来给大家分别讲一下 justify-content 的属性值。 以下是我敲的效果图大家可以清晰看出区别 space-between 属性值可以就是说两端对齐 space-evenly 属性值是每个盒子之间的…

攀登者1 - 华为OD统一考试

OD统一考试 分值: 100分 题解: Java / Python / C++ 题目描述 攀登者喜欢寻找各种地图,并且尝试攀登到最高的山峰。 地图表示为一维数组,数组的索引代表水平位置,数组的元素代表相对海拔高度。其中数组元素0代表地面。 例如:[0,1,2,4,3,1,0,0,1,2,3,1,2,1,0],代表如下…

如何顺滑使用华为云编译构建平台?

这两年平台构建服务需求越来越大&#xff0c;却一直苦于找不到一些指南&#xff0c; 这里特意写了一篇&#xff0c; 对在学习代码阶段和新手程序员朋友也蛮友好&#xff0c; 配置真的也不难&#xff0c; 也特别适合想尝试从0到1做个APP的朋友了。 以华为云的CodeArts Build为例…

鸿蒙系统应用开发之开发准备

今天我们来聊一聊鸿蒙系统应用开发之前&#xff0c;要做什么准备工作&#xff0c;如下图所示&#xff0c;我们要做的就是安装DevEco Studio&#xff0c;然后配置开发环境。 老规矩&#xff0c;拍拍手&#x1f44f;&#xff0c;上菜。 安装DevEco Studio 首先我们打开链接HUAWEI…

【Linux Shell】12. 文件包含

和其他语言一样&#xff0c;Shell 也可以包含外部脚本&#xff0c;这样可以很方便的封装一些公用的代码作为一个独立的文件。可以理解为在第2个文件中包含第1个文件&#xff0c;执行第1个文件的代码。 被包含的文件 不需要可执行权限 。Shell 文件包含的语法格式如下&#xff1…

Git将本地项目上传到Gitee仓库

1.右键点击文件&#xff0c;点击Git Bash Here,进入git窗口 2.初始化本地仓库 git init3.将本地仓库与远程仓库建立连接 git remote add origin 远程仓库地址远程仓库地址在gitee仓库复制即可 4.将远程仓库的文件拉到本地仓库中 git pull origin master5.将本地文件全部上传…

探索C语言中的水仙花数及其计算方法

在计算机科学与数学的交叉领域中&#xff0c;有一种特殊的整数被称为“水仙花数”&#xff0c;它是指一个三位数&#xff0c;其各位数字立方和等于该数本身。例如&#xff0c;153是一个典型的水仙花数&#xff0c;因为1 5 3 1 125 27 153。 下面&#xff0c;我们通过一段…

0_项目git地址——正点原子minifly与crazyflie

1、说明&#xff1a; 在每个专栏的第一篇文章&#xff0c;笔者都会贴出项目的git地址&#xff0c;方便后来者学习和复现&#xff1b; 下面介绍两个项目的官网资料和git地址&#xff0c;最后给出两者的对比&#xff1b; 2、正点原子minifly (1)minifly官网资料下载中心&#…

【sgPasswordInput】自定义组件:带前端校验密码强度的密码输入框,能够提供密码强度颜色提示和文字提示

特性&#xff1a; 有密码强度颜色提示密码强度进度条提示支持设置默认输入提示和密码长度 sgPasswordInput源码 <template><div :class"$options.name" style"width: 100%"><el-inputstyle"width: 100%"ref"psw"type&…

untiy使用http下载资源

文章目录 提醒下载一个资源并保存到本地下载一张图片 提醒 部分API需要将Unity的 Edit/PrejectSetting/Player/OtherSetttings/AConfiguration/ApiCompatibilityLevel 设为.NetFramework 才可以使用 下载一个资源并保存到本地 private IEnumerator DownloadFormServer_IE(st…

后端 API 接口文档 Swagger 使用

Swagger 是什么 swagger是一款可以根据 restful 风格生成的接口开发文档&#xff0c;并且支持做测试的一款中间软件。 例如当我们在开发前后端分离项目时&#xff0c;当后端开发完一个功能想要测试时&#xff0c;若此时还没有相应的前端页面发起请求&#xff0c;可以通过 swag…

大数据Doris(五十二):SQL函数之数学函数

文章目录 SQL函数之数学函数 一、abs(double a)