大模型相关_automatic prompt optimization with “gradient desce-程序员宅基地

技术标签: 机器学习  深度学习  人工智能  

Automatic Prompt Optimization with “Gradient Descent” and Beam Search

摘要

大型语言模型 (LLM) 作为通用模型表现出了令人印象深刻的性能,但它们的能力仍然高度依赖于通过繁重的试错工作手写的提示。我们针对这个问题提出了一种简单且非参数的解决方案,即提示优化文本梯度,受到数值梯度下降的启发,在可以访问训练数据和 LLM API的前提下,自动改进提示。
该算法使用小批量数据形成自然语言“梯度”来批评当前提示,就像数值梯度指向错误上升的方向一样。 然后,通过以梯度的相反语义方向编辑提示,将自然语言梯度“传播”到提示中。 这些梯度下降步骤由波束搜索和老虎机选择程序引导,显着提高了算法效率。 三个基准 NLP 任务和 LLM 越狱检测的新问题的初步结果表明,自动提示优化可以超越之前的提示编辑技术,通过使用数据将模糊的任务描述重写为更精确的注释,将初始提示的性能提高高达 31% 指示。

2. Discrete Prompt Optimization with Nonparametric “Gradient Descent”

算法得到输入为:初始prompt P0、输入输出文本对组成的独立同分布数据{(x1, y1), …, (xn, yn)}。所有的prompt P都是从连贯的自然语言空间L中得到。假设使用黑盒LLM API LLMp(x) ≈ argmaxy∈LPLLM (y|p, x)。
在此基础上,我们的算法经过迭代一步步细化prompt p0去产生p

在接下来的章节中,我们首先会介绍算法如何进行文本梯度下降从而定向的提升prompt质量,然后,算法会充分利用这些梯度下降步骤,在连续的语言空间L中进行beam search,由梯度引导beam expansion,在beam selection时进行最佳识别。

2.1 Gradient descent with Prompts

梯度下降是指以下过程:1.先用一批数据评估prompt 2.创建一个local loss,其中包含怎样提升当前prompt的信息 3.在下一次迭代之前按照之前梯度相反的语义方向编辑prompt。
我们使用一对static LLM prompts来完成上述步骤,如图2所示。
第一个prompt用来创建loss(梯度),用∇表示。虽然∇的具体内容可能不同,可以是task-specific或者task-agnostic,但是∇必须始终考虑当前prompt p0,加上p0在小批量数据上的行为(特别是错误),生成p0缺点的自然语言摘要总结。这个摘要总结就是梯度g,在参数空间中,传统的梯度代表了模型变得更差的方向,与这一情况类似,文本梯度g代表了使prompt变得更差的方向。
第二个prompt用δ表示,其具体内容不固定,但是必须始终考虑梯度g0以及当前prompt p0,然后以梯度g相反的语义方向对p0进行编辑,修复g显示的p0的问题。
与传统的机器学习设置不同,我们不会生成单个梯度或者edit,而是会生成多个提升当前prompt的方向。2.2节会详细描述生成和选择候选prompt的过程。

2.2 Beam Search over Prompts

2.1节中描述的梯度下降步骤用于指导多个prompt中的beam search。beam search是我们prompt训练算法的外循环,在算法1中进行了描述。
beam search是一个迭代优化过程,每一次迭代,当前的prompt都会用于生成新的候选prompts,这个过程称为expansion。接下来使用“选择”过程来决定哪些prompt可以参与下一次迭代,这个循环可以对多个候选prompt进行增量改进和探索。

2.2.1 Expansion Step

Expansion Step 用于从当前的prompt生成多个新的候选prompt。它利用了2.1节描述的梯度下降框架,我们具体的prompt可以在附录中找到。
首先我们对小批量数据进行采样,将这些数据和初始prompt输入到LLMp0中,并且收集错误。之后我们将这些错误插入至prompt模版∆中,该模版会让LLM去描述p0目前存在的问题。接下来就会生成自然语言梯度,示例参见图1。
之后,梯度会被提供给另一个prompt δ,它会让大模型编辑当前的prompt p0去修复梯度中所描述的问题。通过这种方式我们将LLM纳入到对话递归反馈循环中。
最后,通过paraphrasing LLM(LLMmc)运行现有的候选prompt,生成其他候选prompt,进而扩展新的prompt候选周围的本地蒙特卡洛搜索空间。扩展的方法:让大模型生成新的候选,新生成的候选需要满足与输入语义相似但是措辞不同。

2.2.2 Selection Step

一旦 Expansion Step将候选prompt逐步分解为多个可能的后继候选,Selection Step会选择b个最有希望留下来的prompts参与后续迭代。
在整个训练数据集上评估所有候选prompt的成本很高,因此我们希望最大限度减少此类查询的数量。这个问题可以完全等价于bandit optimization中的best arm identification 问题。n个arm相当于n个prompt候选,它们在数据集上的表现是arm的隐藏值(hidden value),而拉动arm的行为就对应在随机选择的数据上评估prompt的好坏。我们的目标是找到b个最佳的arm并且尽可能的少拉动arm,我们考虑以下两个算法。

UCB Bandits

受到其他快速评估LLM性能工作的启发,我们根据prompt性能的proposal distribution 对prompts的的子集进行采样,在随机数据的子集上评估这些prompt,然后根据评估结果更新proposal distribution。最后,我们从proposal distribution中选择b个权重最高的prompt。细节见Algorithm 3 。
如果算法中参数c没有得到适当调整,UCB的性能可能会变差。

UCB-E

UCB-E是UCB的一个变体,它通过强调exploration性来纠正一些问题

Successive Rejects

这个算法被证明是best arm identification问题的最佳算法,不需要超参数并且非常简单。该算法分为n - 1个阶段进行,在每个阶段中,维护一组幸存的prompt候选集合Sk ⊆ {p1,…,pn}。在第t阶段,我们在所有的nt随机数据上评估St-1中的所有候选prompt,从而形成分数 m(pi,Dtr)。
然后为了生成新的prompt集合St,我们删除该阶段得分最低的prompt。注意,nt根据下面的 Equation 1计算而来,它会随着T逐渐增加。B是总查询预算。

3.Experiments

在4个NLP任务上,我们的算法在效率和性能方面都显示出了高于当前最优模型的高结果。

3.1 Data

虽然我们提出的ProTeGi算法只需要选择不同的metric function m,就可以应用在任何问题上,比如chatbot design后者summarization,但是我们还是在4个NLP的分类任务上进行了试验,这些任务涵盖了广泛的语言领域。

Jailbreak

这是一个新颖的任务,其目标是确定用户向LLM API中输入的信息是否构成了对LLM的jailbreak attack。我们将jailbreak attack定义为:一种迫使AI系统突破自身规则的交互策略。这其中可能包含有害内容或者泄漏LLM的metaprompt。这个数据集有452种语言示例和人工标注的jailbreak标签。
Ethos是一个在线的英语仇恨言论检测数据集,包含997条在线评论和仇恨言论标签。
Liar是一个英语假新闻检测数据集包含4000个陈述,上下文,和谎言标签。
Sarcasm是一个阿拉伯讽刺检测数据集,包含1000条讽刺评论和在线标签。

3.2 Setup

对于每项任务,我们随机抽取 50 个样本进行训练,并随机抽取 150 个样本进行test。 所有报告的结果均为 3 次实验的平均值。 我们基于对最终候选束的最大池化来报告整个测试集的二进制 F1 分数。 除非另有说明,实验均使用 2023 年 1 月版本的 gpt-3.5-turbo 进行,使用 Azure OpenAI LLM API 服务,在几次分类期间温度为 0.0,在所有其他上下文中温度为 1.0。
由于本文的重点是具有广泛适用性的非参数算法,因此我们没有对baseline或提出的算法进行任何超参数搜索,而是采用默认值,然后自始至终使用相同的参数。
除非有特殊说明,对于Automatic Prompt Optimization 算法,我们的mini batch size为64,beam size为4,算法运行6次迭代,在每一次迭代中,我们一次对4个误差组进行采样生成梯度,我们为每一个error group生成4个gradients,并为每个gradient编辑prompt,然后为每个new prompt candidate生成2个蒙特卡洛样本。为了避免计算溢出,我们在bandit selection之前为每个parent prompt选择8个后继候选prompt。

3.3 Baseline

我们将我们提出的 ProTeGi 框架与以下baseline进行比较。 请注意,对于这个case study,我们将重点限制在可与 ProTeGi 直接比较的非参数算法上。

Monte-Carlo (MC)

由Zhou等人在2022年提出的Automatic Prompt Engineering算法,该方法在prompt空间上进行迭代但是无方向的蒙特卡洛搜索。为了公平比较,我们将每个候选人蒙特卡洛样本数量与 ProTeGi 生成的后继候选数量进行匹配。

Reinforcement Learning (RL)

这一方向的算法都是最近提出并且发布的,比如GrIPS以及TEMPERA,这些方法依赖于对prompt文本的短语级操作:prompt会被切分成短语,其搜索空间则包括对短语的交换、释义添加和删除。

AutoGPT.5
3.4 Experimental Results
Overall Results

图 3 显示了我们的主要结果。 结果表明,ProTeGi 在研究中考虑的所有四个数据集上都优于其他最先进的算法。 平均而言,Pro-TeGi 比 MC 和 RL 基线分别显着提高了 3.9% 和 8.2%,同时也比原始提示 p0 提高了 15.3%,与 AutoGPT 提高了 15.2%。 当我们将搜索查询预算从每个提示候选者的 12 次评估更改为 50 次评估时,该裕度保持相对一致,尽管由于较少的评估增加了过程的方差,所有算法都开始失去功效。 我们在附录中进一步研究了优化过程的方差。

就baseline而言,我们的结果表明,虽然 MC 可以持续提高prompt性能,但 RL 的短语级操作和 AutoPrompt 的 AI 引导更改有时可能会达不到要求。 对于 Ethos 和 Sarcasm,RL 基线的性能仍然接近起始prompt p0。 对于 Jailbreak 和 Sarcasm,6 轮 AutoGPT 反馈实际上降低了启动提示的性能。 这些发现表明,不同的优化技术可能更适合不同类型的自然语言处理任务,并且可能需要像 ProTeGi 这样更具适应性的方法才能实现最佳性能。

Beam Search Ablation

为了确定第 2.2 节中概述的beam search过程的好处,我们取消了beam search步骤,并将其替换为single flat enumerate-then-select step 步骤(Gao 等人,2020)和greedy depth-first search over prompts(Deng 等人,2022),匹配每一步考虑的候选数量,以便每个变体具有相同的总体 API 查询预算。
表 1 中的结果表明,beam search算法在所有任务上都优于flat baseline和greedy baseline,并且在Jailbreak和Liar detection方面有显着改进。 flat baseline和greedy baseline之间没有明显的赢家,可能是由于搜索的高方差随机性。

Bandit Algorithms

我们尝试了 2.2.2 中描述的best arm identification algorithms,交换不同的近似选择算法以衡量它们的相对性能。 为了匹配不同变体的查询预算,我们将连续拒绝类型算法的预算参数 B 设置为 T ∗ |Dsample| * n 使用来自 UCB 类型算法的值。

结果如表 2 所示。所有approximate best arm identification algorithms 的性能均优于统一baseline,该baseline只是将预算平均分配给prompt 候选。 有趣的是,UCB 型算法始终优于successive rejects-style algorithms,这与第 2.2.2 节中描述的假设相反。 这可能是因为在实践中,UCB 式算法可以更好地平衡探索和利用(我们将所有实验的探索参数 c 设置为 2.0,一个相对较高的值),因为连续拒绝式算法更专注于探索那些 可能是最好的,但代价是探索前景较差的选择。

Learning Curves
Base Models

我们尝试通过对不同的 LLM API 进行 API 调用来更换不同的基础模型来支持 ProTeGi 算法(表 3)。 RLHF 调整模型的性能显着优于 GPT-3,其中 GPT-4 提供最佳性能。 这可能是由于 RLHF 调整的 LLM 的推理能力增强,特别是对于新的或定义不明确的问题,如越狱检测。

Qualitative Analysis

我们在表 4 中为每个数据集和起始提示 p0 提供了一个优化步骤的一些比较示例。更多示例可以在附录中找到。 我们可以观察到几种模式。 对于 Ethos 来说,梯度成功地反映了当前提示和特定数据点之间的任何不一致,梯度指出并非所有关于穆斯林的评论都是仇恨言论,而说谎者指出说话者的议程或偏见,而不仅仅是上下文,可能会强烈 影响他们说谎的倾向。 然而,越狱梯度似乎不太有用; 越狱梯度希望将提示的焦点转移到儿童修饰的具体问题上,而讽刺梯度则采取相反的方法,做出非常笼统的陈述。
类似地,每种算法对生成的候选提示 p’ 的影响也不同。 MC 派生的候选只是简单地改写了起始提示,而 RL 派生的候选则显得混乱且不连贯。 ProTeGi 提示具有更多的语法和语义可变性。 在某些情况下,这可能弊大于利,例如新的越狱 APO p’ 要求法学硕士解决一项新任务。 在其他情况下,ProTeGi 没有正确利用梯度,而是简单地使用其内部知识来重新定义概念(Ethos)。

Self-Alignment with Instruction Backtranslation

2 Method

我们的self-training方法需要基础语言模型、少量种子数据、为标记数据集合例如网络语料库。为标记数据是一个大量的多样化的人类书面文档,其中包括各种人类感兴趣的主题内容,但最重要的是没有与之配对的指令。第一个假设是:这些大量的人类编写的文本中存在子集,这个子集适合作为某些用户指令的gold generations。第二个假设是:我们可以预测这些候选gold answers的指令,这些指令可以用作高质量的示例对来训练指令模型。
我们的backtranslation过程执行两个核心步骤:
1.Self-augment:对未标记数据生成指令,以生成(指令,输出)对形式的候选训练数据进行指令调整。
2.Self-curate:自我选择高质量的数据作为训练数据去微调指令生成模型。这种方法是迭代完成的,更好的中间质量生成模型可以在下一次迭代中在选择的数据上进行微调得到提升。
我们在下面更加详细的描述了这些步骤,图1展示了该方法的概述。
在这里插入图片描述
上图说明:我们从基础的语言模型开始,LLaMa,少量(指令,输出)对种子样本,未标记文档集合,这些文档被看作未知指令的候选输出。Self- augmentation:使用seed data中的(输出,指令)对数据对基础模型进行微调得到指令预测模型Myx,该模型用于为未标注的数据生成候选指令。Self-curation:从中间指令预测网络只利用seed data进行微调开始,他从上一步的k个候选中选择高质量(指令,输出)对A(1),并将它们作为下一个中间模型M1的微调数据,之后在选择训练数据以获得模型V2。

2.1 Initialization
Seed data

我们从一组人工注释(指令,输出)样本开始,这些样本用于微调语言模型,在两个方向上给出预测,预测给定指令的输出,以及预测给定输出的指令。

Unlabelled data

我们使用网络语料库作为未标记数据的来源。 对于每个文档,我们执行预处理以提取独立的段 {yi},它们是 HTML 标头后面的文本部分。 我们进一步运行重复数据删除、长度过滤,并通过几种启发式方法(例如标题中大写字母的比例)删除潜在的低质量片段。

2.2 Self-Augmentation (generating instructions)

我们使用从seed data中获得的(output, instruction) 对数据{(yi, xi)} 微调base模型,得到Myx := p(x|y)。对于每个未标注的数据yi,我们对模型Myx进行推理生成候选指令x,从中导出后选配对数据A := {(xˆ , y )}。正如我们将在实验中看到的那样,并非所有这些候选 ii 对都是高质量的,在这种情况下,将它们全部用于自训练可能没有好处。 因此,我们考虑下一步重要的是管理高质量子集。

2.3 Self-Curation (selecting high-quality examples)

我们使用语言模型本身进行高质量样本的选择。我们从只在seed data上微调过的模型M0开始,我们使用M0对每个增强示例{(xˆi, yi)} 进行评分,得到质量分数a_i,这一过程需要通过prompting完成,经过训练的模型以5分制对数据的质量进行评分。我们精确的prompt在表1中给出,我们选择分数大于k的增强示例形成精选集。

Iterative self-curation

我们进一步提出一种迭代训练的方法来产生更高质量的预测。在迭代t中,我们使用前一次迭代的精选数据A(t-1)以及seed data作为训练数据去微调模型Mt,该模型又可用于对增强示例的质量进行重新评分,从而产生增强集 A(t)。 我们进行两次数据选择和微调迭代,得到最终的模型 M2。当结合种子数据和增强数据进行微调时,我们使用标记来区分这两个数据源。 具体来说,我们在示例中附加一个额外的句子(称为“系统提示”)。对于种子数据,我们使用 Sa := “Answer in the style of an AI Assistant.” ,对于增强数据,Sw := “Answer with knowledge from web search.”对于增强数据。这种方法类似于在机器翻译中标记合成数据以进行反向翻译的方法 [Caswell et al., 2019]。

3 Experiments
3.1 Experimental Setup
Seed data

我们使用 Open Assistant 数据集中的 3200 个示例作为人工注释的种子数据来训练我们的模型。 每个示例都是从对话树的第一轮中选择的(指令,输出)对 {(xi, yi)}。 我们仅根据人工注释的排名(排名 0)对高质量的英语回复进行抽样。

Base model & finetuning

我们使用7B、33B、65B 参数的预训练LLaMA 模型作为微调的基础模型。 在训练过程中,我们只优化output tokens的损失,而不是input tokens的损失,因此偏离了标准语言建模损失。 对于大多数模型,我们使用与现有监督微调(SFT)方法相同的超参数 [Zhou et al., 2023, Touvron et al., 2023]:学习率 1e − 5 在训练结束时线性衰减到 9e − 6, 权重衰减 0.1,batch size 32(示例)和 dropout 0.1。 对于少于 3000 个示例的微调,我们使用批量大小 8(更多详细信息请参见表 18)。 我们将经过训练的基于 Llama 的指令反向翻译模型称为 Humpback1。 为了生成,我们使用nucleus sampling ,温度 T = 0.7,p = 0.9。

Unlabelled data

我们使用 Clueweb 语料库的英语部分作为未标记数据的来源 [Overwijk et al., 2022]。 其中,我们采样了 502k 段。

Baseline

我们主要用以下三种baseline

  1. text-davinci-003:基于GPT-3的指令预测模型,使用强化学习对来自人类编写的指令,人类编写的输出等各种数据上进行微调。
  2. LIMA:LLaMA 模型使用 1000 个手动选择的指令示例进行了微调,这些指令示例来自社区问答(例如 StackOverflow、WikiHow 等)以及人类专家编写的指令和响应。
  3. Guanaco:LLaMA 模型使用 OpenAssistant 数据集中的 9000 个示例进行了微调。 与本文中使用的 3200 个seed data的区别在于,Guanaco 包含所有回合的(指令、输出)对,而我们仅使用对话的第一回合。
    我们还报告了与各种其他模型的比较,例如使用从更大、更强大的模型(例如 GPT-4)中提取的数据,但不认为它们可以与我们基于 LlaMa 的方法直接比较。
Evaluation.

我们对来自多个来源的测试提示进行评估:Vicuna [Chiang et al., 2023](80 个提示)、Self-instruct [Zhang and Yang, 2023](252 个提示)、Open Assistant [Köpf et al., 2023](188 提示)、Koala [Geng et al., 2023](156 个提示)、HH_RLHF [Bai et al., 2022a](129 个提示)、LIMA [Zhou et al., 2023](300 个提示)、作者众包(64 提示)。 总共有 1130 个独特的提示,很好地覆盖了各种任务类别,例如 写作、编码、数学推理、信息查找、建议、角色扮演、安全等。我们从中抽取了 250 个提示(不包括 AlpacaEval 测试集中的提示)作为开发集,另外 250 个提示用于执行生成质量评估。 我们使用 AlpacaEval [Li et al., 2023] 运行自动评估,该评估根据基于 GPT-4 判断的基线模型计算获胜率,以及人类偏好评估。

Data scaling efficiency.

当我们改变各种指令预测模型微调时使用的数据量时,我们对比了他们的性能。当使用给定微调数据微调7B LLaMa时,我们测试每个模型相对于text-davinci-003的win rate。我们使用了数据缩放系数a评估了这一效率,该系数是通过将经验数据与 w = α log N + C 拟合来计算的,其中 w 是衡量在 N 个示例上微调的模型生成质量的win rate。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44851284/article/details/134361589

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签