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

提升大语言模型的三大策略

1.概述

随着大语言模型(LLMs)在技术和应用上的不断发展,它们已经深刻地改变了我们与计算机的互动方式。从文本生成到语言理解,LLMs的应用几乎涵盖了各个行业。然而,尽管这些模型已展现出令人印象深刻的能力,如何将它们真正适配到自己特定的业务需求中,仍然是一个复杂且充满挑战的任务。

比如,Llama 2的发布让LLM在性能上逼近甚至有潜力超越ChatGPT,但仅仅使用预训练的模型往往不能满足特定场景的需求。这时候,微调(fine-tuning)就显得尤为重要。通过精确调整模型的权重、优化算法和训练数据,你可以使模型在某些特定任务上表现得更加出色。但这背后所需的技术细节和调整策略,远比简单的模型调用复杂得多。

所以,想要最大化LLMs的潜力,开发者需要深入了解这些模型的工作原理,并掌握如何针对特定用例进行优化。只有这样,才能真正让这些强大的工具发挥出它们应有的价值。

2.内容

在优化大语言模型(LLMs)的性能时,我们有许多工具和策略可供选择。尽管这些模型本身已经非常强大,但如何让它们在特定任务上表现更好,仍然是一个值得探讨的话题。接下来,我们将介绍三种常见且高效的方法,用于提升LLMs的性能和适应性:

  • 提示工程(Prompt Engineering):提示工程是一种通过设计有效输入来引导模型产生更相关和高质量输出的技巧。通过细化输入提示,我们可以让模型更好地理解上下文,从而提供更加精准的答案。

  • 检索增强生成(RAG):RAG结合了传统的信息检索技术和生成模型的强大能力。通过在生成过程中引入外部知识库或搜索引擎,RAG可以帮助LLM更准确地回答需要特定知识或最新信息的问题。

  • 参数高效微调(PEFT):参数高效微调是一种在不大幅调整原始模型参数的情况下,对模型进行微调的策略。它能够在保持较低计算成本的同时,提升模型在特定任务中的性能。

提升大语言模型(LLM)性能的途径多种多样,但这三种方法无疑是最简单且最有效的。如果你希望在有限的时间和资源下看到显著的结果,这些方法无疑是最值得尝试的。我们从最简单的方法提示工程开始,一直到相对复杂的参数高效微调(PEFT),这些方法涵盖了优化LLM的不同层面。

值得一提的是,想要得到最好的效果,完全可以将这三种方法结合起来使用,通过灵活搭配,你可以最大化模型的性能,而无需深入修改每一个细节。

接下来,我们将为你提供一份更加深入的概述,帮助你快速理解这些方法的核心要点,为后续的学习和实践做好准备。如下图所示:

 2.1 加载Llama 2

在接下来的教程中,我们将使用Llama 2基础模型进行示范,它以其出色的性能和灵活性成为了许多开发者的首选。由于Llama 2的开源许可和强大功能,它非常适合作为我们的学习工具。

为了开始使用Llama 2,我们首先需要确保具备相关的访问权限。通过以下步骤,我们可以轻松完成这一过程:

  • 创建一个HuggingFace账号,注册地址在这里

  • 申请Llama 2的访问权限,点击这里申请

  • 获取并保存你的HuggingFace令牌,用于后续的登录

完成上述步骤后,我们就能使用HuggingFace凭证登录到环境中,系统将确认我们已获得下载Llama 2模型的许可,并准备好进行接下来的操作。

from huggingface_hub import notebook_login
notebook_login()

一旦完成了前面的准备工作,我们就可以开始加载Llama 2的13B版本了。13B版本在性能和资源消耗之间达到了一个非常好的平衡,适合大多数开发者进行实验和实际应用。通过加载这一版本,我们将能够体验到Llama 2在处理各种任务时的强大能力。

from torch import cuda, bfloat16
import transformersmodel_id = 'meta-llama/Llama-2-13b-chat-hf'# 4-bit Quanityzation to load Llama 2 with less GPU memory
bnb_config = transformers.BitsAndBytesConfig(load_in_4bit=True,  bnb_4bit_quant_type='nf4',  bnb_4bit_use_double_quant=True,bnb_4bit_compute_dtype=bfloat16
)# Llama 2 Tokenizer
tokenizer = transformers.AutoTokenizer.from_pretrained(model_id)# Llama 2 Model
model = transformers.AutoModelForCausalLM.from_pretrained(model_id,trust_remote_code=True,quantization_config=bnb_config,device_map='auto',
)
model.eval()# Our text generator
generator = transformers.pipeline(model=model, tokenizer=tokenizer,task='text-generation',temperature=0.1,max_new_tokens=500,repetition_penalty=1.1
)

在使用Llama 2等开源大语言模型时,正确的提示设计是关键。许多LLM都有一些基本的规则或模板,帮助开发者优化与模型的交互。对于Llama 2来说,遵循这些设计准则能够提高生成的质量和准确性。通过了解这些模板,你可以确保输入的提示能最大程度地引导模型产生相关且高效的输出。

 为了确保Llama 2生成的文本符合预期,我们需要遵循一定的提示格式。正确的提示设计不仅能提高生成结果的准确性,还能有效控制模型输出的内容和风格。接下来,我们将展示如何构建这些提示,以便正确触发模型并获得理想的结果。

basic_prompt = """
<s>[INST] <<SYS>>You are a helpful assistant<</SYS>>What is 1 + 1? [/INST]
"""
print(generator(basic_prompt)[0]["generated_text"])

通过正确设计提示,我们可以得到Llama 2生成的输出。下面是使用该提示后,模型产生的结果示例:

"""
Oh my, that's a simple one! 
The answer to 1 + 1 is... (drumroll please)... 2! 
"""

提示模板看起来有点复杂,但通过不断练习,你一定能够很快掌握它的要领。

接下来,我们将进入优化LLM输出的第一种方法——提示工程。通过精心设计提示,我们能够有效地引导模型产生更符合需求的输出。这不仅仅是简单地输入问题,而是需要根据目标任务调整和优化提示的结构。

2.2 提示词工程

如何向LLM提出问题,直接决定了我们获得输出的质量。精准、详尽并提供相关示例是提升模型回答质量的关键。

这正是提示工程的魅力所在:它不需要对模型本身进行任何更新,而是通过调整和优化提示,快速实现模型效果的改善。这种方法使得我们能够灵活地对模型进行调优,并根据需要不断尝试新的提示设计。

在提示工程中,主要有两种方法:

  • 基于示例的提示(Example-based):这种方法通过提供具体的示例来引导模型的输出。示例能够清晰地告诉模型我们期望的答案类型和格式,从而有效提高模型的输出质量。

  • 基于思维的提示(Thought-based):这种方法更侧重于引导模型进行思考和推理。它通过向模型提供思考过程的指导,帮助模型在生成答案时更加符合逻辑和深度。

2.2.1 基于示例的提示

在基于示例的提示中,像“一次性学习(one-shot)或少量学习(few-shot)”一样,我们通过给LLM提供几个例子,明确告诉它我们想要什么样的输出。这种方式能够帮助模型理解任务的目标,从而更准确地生成符合预期的结果。

比如,在一次性学习中,我们只需给模型提供一个示例,就能帮助它掌握如何处理类似的任务。而在少量学习中,提供几个示例可以让模型更好地理解模式,并在此基础上进行推理和生成。

通过基于示例的提示,我们通常可以获得更符合我们需求的文本输出。例如,在情感分类任务中,我们可以为模型提供一个示例,让它了解如何判断评论的情感倾向。

接下来,我们将通过一个简单的示例来演示如何对一条简短评论进行情感分类。

prompt = """
<s>[INST] <<SYS>>You are a helpful assistant.<</SYS>>Classify the text into neutral, negative or positive. 
Text: I think the food was okay. [/INST]
"""
print(generator(prompt)[0]["generated_text"])

通过向模型提供明确的示例,LLM能够根据这些输入生成更加符合预期的输出。接下来,您将看到基于我们设计的提示,模型生成的情感分类结果示例:

"""
Positive. The word "okay" is a mildly positive word, 
indicating that the food was satisfactory or acceptable.
"""

对于这类任务,我们不仅要向模型提供示例,还要明确告诉它如何解读文本的含义。在情感分类中,我们可能希望模型不仅仅根据词语来做出判断,而是要从整体上下文中提取出情感信息。

因此,给模型提供一个示例,演示如何正确识别情感并提取答案,是非常有效的。通过这个方法,模型将能更好地理解如何进行情感分类,而不仅仅停留在字面意思上。

prompt = """
<s>[INST] <<SYS>>You are a helpful assistant.<</SYS>>Classify the text into neutral, negative or positive. 
Text: I think the food was alright.
Sentiment: 
[/INST] Neutral</s><s>[INST]
Classify the text into neutral, negative or positive. 
Text: I think the food was okay.
Sentiment: 
[/INST] 
"""
print(generator(prompt)[0]["generated_text"])

通过提供清晰的示例,我们能够让模型更准确地理解任务要求。如下所示,模型生成了我们预期的情感分类结果,体现了它在分析文本时的敏锐度:

"""
Neutral
"""

2.2.2 基于思维的提示

除了简单地提供示例外,我们还可以让LLM进行推理,通过分步思考帮助它生成更精确的答案。将思考过程分解为多个小步骤,使得模型能够逐步细化自己的输出,每个步骤都经过充分的计算和评估。

这种方法被称为基于思维的提示,它能够帮助LLM深入理解问题并产生更符合逻辑的答案。以下展示了如何通过更复杂的思维提示进一步优化模型的输出。

在应用基于思维的提示时,我们可以从最简单的场景入手,比如让模型将一个问题分解成步骤来解决。这种方法不仅能帮助模型更好地理解任务,还能使其输出更加清晰和有条理。接下来,我们将演示如何通过逐步推理来解答问题。

prompt = """
<s>[INST] <<SYS>>You are a helpful assistant.<</SYS>>Do the odd numbers in this group add up to an even number? 3, 5, 15, 32.
Solve by breaking the problem into steps. 
Identify the odd numbers, add them, and indicate whether the result is odd or even.[/INST]
"""
print(generator(prompt)[0]["generated_text"])

通过让模型分步推理,我们能够看到它是如何逐步分析问题并得出答案的。以下是模型在解答问题时的详细推理过程,这种方法有助于增强我们对模型生成过程的理解:

"""
Hello! I'd be happy to help you with that. Let's break down the problem into steps:
Step 1: Identify the odd numbers in the group.
The odd numbers in the group are:
3, 5, 15
Step 2: Add the odd numbers.
3 + 5 + 15 = 23
Step 3: Is the result odd or even?
23 is an odd number.
Therefore, the sum of the odd numbers in the group is an odd number.
"""

这种逐步推理的方法被称为思维链(Chain-of-Thought)。在这个过程中,LLM按照一定的顺序进行独立的思考,每一步都建立在前一步的基础上。这样的结构不仅使得模型的输出更加清晰,也有助于提升其逻辑性和可靠性。

通过分解问题,模型能够在每个步骤中进行深度分析,从而增强了对输出的控制力。每个思维步骤的推理过程使得模型在计算时更加透明,有助于我们理解它是如何得出结论的。

2.3 检索增强生成

虽然通过提示工程我们能够提高模型的输出质量,但它的能力仅限于模型已经学习到的知识。如果模型的训练数据没有包含某个时间点或领域的最新信息,提示工程是无法弥补这一空白的。

这时候,检索增强生成(RAG)技术就显得尤为重要。通过将外部知识库(如维基百科)转换为数值嵌入并存储在向量数据库中,RAG使得模型能够在生成内容时迅速检索到相关知识,从而弥补模型知识的局限性。这种方法让模型能够灵活地整合来自不同来源的最新信息,增强了其在实际应用中的表现。

在RAG方法中,当你向LLM提出问题时,它会通过查询存储在向量数据库中的知识库,检索与问题最相关的信息。然后,LLM会将这些信息作为上下文输入,以便更好地理解问题并生成准确的回答。

通过这种方式,RAG为模型提供了外部知识的支持,弥补了其在训练过程中无法覆盖的新信息。实践中,RAG让LLM能够“查找”并有效利用外部知识,从而生成更精确、更相关的答案。

 2.3.1 使用 LangChain 创建检索增强生成(RAG)管道

创建RAG系统时,LangChain是一个非常方便且广泛使用的框架,它简化了集成检索和生成模型的过程。接下来,我们将通过构建一个简单的Llama 2知识库并将其存储在文本文件中来开始我们的实践。这样,我们可以为模型提供相关的外部知识,帮助它更准确地生成响应。

# Our tiny knowledge base
knowledge_base = ["On July 18, 2023, in partnership with Microsoft, Meta announced LLaMA-2, the next generation of LLaMA." ,"Llama 2, a collection of pretrained and fine-tuned large language models (LLMs) ","The fine-tuned LLMs, called Llama 2-Chat, are optimized for dialogue use cases.","Meta trained and released LLaMA-2 in three model sizes: 7, 13, and 70 billion parameters.","The model architecture remains largely unchanged from that of LLaMA-1 models, but 40% more data was used to train the foundational models.","The accompanying preprint also mentions a model with 34B parameters that might be released in the future upon satisfying safety targets."
]
with open(r'knowledge_base.txt', 'w') as fp:fp.write('\n'.join(knowledge_base))

接下来,我们将创建一个嵌入模型,将文本转化为数字化表示——也就是嵌入。为此,我们选择使用sentence-transformers/all-MiniLM-L6-v2,这是一个非常受欢迎且高效的句子转换模型。

from langchain.embeddings.huggingface import HuggingFaceEmbeddings# Embedding Model for converting text to numerical representations
embedding_model = HuggingFaceEmbeddings(model_name='sentence-transformers/all-MiniLM-L6-v2'
)

有了嵌入模型和知识库后,我们可以构建向量数据库来存储和检索嵌入。市场上有很多向量数据库可以选择,但为了便捷地在本地使用,我们选择了FAISS,这是一个开源且高效的向量搜索库,非常适合处理大规模数据。接下来,我们将使用FAISS来存储我们的知识库,并为后续的查询和生成任务提供支持。

from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import FAISS
from langchain.document_loaders import TextLoader# Load documents and split them
documents = TextLoader("knowledge_base.txt").load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)# Create local vector database
db = FAISS.from_documents(docs, embedding_model)

虽然我们已经完成了数据库的构建,但为了使其与LLM配合使用,我们还需要将它们结合起来。LangChain在这方面提供了非常简便的解决方案,让我们能够轻松地将向量数据库与LLM集成,进一步增强模型的能力。这一过程既快速又高效,下面我们将演示如何操作。

from langchain.chains import RetrievalQA
from langchain.llms import HuggingFacePipeline# Load LLM into LangChain
llm = HuggingFacePipeline(pipeline=generator)# RAG Pipeline
rag = RetrievalQA.from_chain_type(llm=llm, chain_type='stuff',retriever=db.as_retriever()
)

llm和rag变量的强大之处在于,它们提供了灵活的使用方式。我们可以在没有RAG管道的情况下,单独利用LLM进行简单的提示,或者在需要额外知识支持时,启用RAG管道。

接下来,让我们先不使用RAG管道,看看如果我们询问LLM关于自身的问题,比如“Llama 2是什么?”模型会怎么回答。

llm和rag变量的强大之处在于,它们提供了灵活的使用方式。我们可以在没有RAG管道的情况下,单独利用LLM进行简单的提示,或者在需要额外知识支持时,启用RAG管道。接下来,让我们先不使用RAG管道,看看如果我们询问LLM关于自身的问题,比如“Llama 2是什么?”模型会怎么回答。

显然,在没有RAG的帮助下,LLM无法正确回答关于Llama 2的问题,甚至给出了一个完全不相关的答案——加密货币。这说明LLM对自身的知识是有限的。

接下来,我们将启用RAG管道,看看通过外部知识库的帮助,模型是否能够更好地回答这个问题。

>>> rag('What is Llama 2?')"""
Llama 2 is a collection of pretrained and fine-tuned large language models 
(LLMs) announced by Meta in partnership with Microsoft on July 18, 2023.
"""

现在,由于我们将Llama 2的外部知识提供给了模型,它能够利用这些信息生成更加精准的回答。这说明RAG管道确实提升了LLM的知识获取和应用能力。

2.4 参数高效微调

提示工程和RAG方法的优势在于它们无需改变LLM本身的参数,模型的结构保持不变,而是通过外部信息和优化提示来提升其输出。然而,如果我们希望LLM在特定的应用场景中学习新知识,就需要通过微调来实现。

传统的微调方法需要调整模型的数十亿个参数,但这样会非常耗费计算资源。因此,PEFT作为一种高效的微调方式,可以在仅修改少量参数的情况下,大幅提升LLM的性能。这种方法不仅节省了资源,还能有效适应特定的业务需求。

为了高效地微调LLM,LoRA成为了其中一个最常见的技术。LoRA通过只训练模型中最小的一部分参数,避免了对基础模型的大规模调整。这些经过训练的参数是模型中最关键的部分,因此只需调整它们,就能达到优化的效果。其最大优势在于,生成的权重可以与基础模型分开保存,从而减少了存储空间的需求,同时保持了模型的可扩展性。 

2.4.1 使用 AutoTrain 对 Llama 2 进行微调

微调Llama 2模型时,面对众多参数时的确有些令人头痛。幸运的是,AutoTrain能够大大简化这一过程,帮助我们在极短的时间内完成微调,只需一行代码即可。

而要开始微调,我们首先要准备的数据是至关重要的。数据质量直接决定了模型性能的好坏。为了让Llama 2具备对话功能,我们将使用OpenAssistant Guanaco数据集,这是一个专为对话优化的数据集,非常适合用来微调模型。

import pandas as pd
from datasets import load_dataset# Load dataset in pandas
dataset = load_dataset("timdettmers/openassistant-guanaco")
df = pd.DataFrame(dataset["train"][:1000]).dropna()
df.to_csv("train.csv")

OpenAssistant Guanaco数据集提供了一种清晰的结构,其中用户提问以### Human标记,模型回答以### Assistant标记,非常适合用于训练对话型模型。为了简便起见,挑选了1000个样本用于示例,但随着更多优质数据的加入,模型的性能将显著提升。

注意: 数据集需要包含一个文本列,这是AutoTrain会自动识别并用于训练的字段。

一旦安装了AutoTrain,微调过程变得异常简单,几乎可以通过一行代码完成训练启动。

autotrain llm --train \
--project_name Llama-Chat \
--model abhishek/llama-2-7b-hf-small-shards \
--data_path . \
--use_peft \
--use_int4 \
--learning_rate 2e-4 \
--num_train_epochs 1 \
--trainer sft \
--merge_adapter

在微调过程中,有几个参数非常关键:

  • data_path:指定数据所在路径。我们将数据保存为train.csv,并确保其中包含一个文本列,AutoTrain将自动识别并用于训练。

  • model:这是我们微调的基础模型,采用了分片版本,旨在简化训练过程。

  • use_peft & use_int4:这两个参数启用了高效微调技术,减少了所需的显存,部分依赖LoRA方法。

  • merge_adapter:为了便于后续使用,我们将LoRA权重与基础模型合并,生成一个新的模型。

当你运行训练代码时,你应该会看到类似于以下的输出,表示训练开始了。

 就这样!通过这种方法,微调Llama 2模型变得异常简单。而且,由于我们将LoRA权重与原始模型合并,更新后的模型可以像之前一样加载,继续进行后续的推理和使用。

 3.总结

在提升大语言模型(LLM)性能的过程中,我发现了三种高效的策略:提示工程、检索增强生成(RAG)和参数高效微调(PEFT)。这三者各有特点,能根据不同需求大幅提升模型表现。

首先,提示工程通过优化提问方式,能够显著提高模型的输出质量。这是最简单且立竿见影的方式,尤其适合任务明确且数据量不大的场景。接着,RAG通过引入外部知识库,使得模型能够“查找”最新或领域特定的信息,增强回答的准确性。最后,PEFT利用LoRA等方法,在不修改大部分模型参数的情况下进行高效微调,节省资源同时提升定制化能力。

这三种策略可以互补,帮助我们在不完全依赖重训练的情况下,提升大语言模型的能力。通过合理运用这些方法,开发者能更快速地让模型适应各种任务,提高工作效率和应用灵活性。

文章转载自:哥不是小萝莉

原文链接:提升大语言模型的三大策略 - 哥不是小萝莉 - 博客园

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

相关文章:

提升大语言模型的三大策略

1.概述 随着大语言模型&#xff08;LLMs&#xff09;在技术和应用上的不断发展&#xff0c;它们已经深刻地改变了我们与计算机的互动方式。从文本生成到语言理解&#xff0c;LLMs的应用几乎涵盖了各个行业。然而&#xff0c;尽管这些模型已展现出令人印象深刻的能力&#xff0c…...

Ubuntu 24.04 LTS 安装 Docker Desktop

Docker 简介 Docker 简介和安装Ubuntu上学习使用Docker的详细入门教程Docker 快速入门Ubuntu版&#xff08;1h速通&#xff09; Docker 安装 参考 How to Install Docker on Ubuntu 24.04: Step-by-Step Guide。 更新系统和安装依赖 在终端中运行以下命令以确保系统更新并…...

mysql查看binlog日志

mysql 配置、查看binlog日志&#xff1a; 示例为MySQL8.0 1、 检查binlog开启状态 SHOW VARIABLES LIKE ‘log_bin’; 如果未开启&#xff0c;修改配置my.ini 开启日志 安装目录配置my.ini(mysql8在data目录) log-binmysql-bin&#xff08;开启日志并指定日志前缀&#xff…...

2. Flink分区策略

一. Flink分区策略概述 Flink任务在执行过程中&#xff0c;一个流(stream)包含一个或多个分区(Stream partition)&#xff0c;TaskManager中的一个slot的SubTask就是一个stream partition(流分区)。 Flink分区之间进行数据传递模式有两种。 1. one-to-one模式 数据不需要重新…...

Qt 5.14.2 学习记录 —— 십칠 窗口和菜单

文章目录 1、Qt窗口2、菜单栏设置快捷键添加子菜单添加分割线和菜单图标 3、工具栏 QToolBar4、状态栏 QStatusBar5、浮动窗口 QDockWidget 1、Qt窗口 QWidget&#xff0c;即控件&#xff0c;是窗口的一部分。在界面中创建控件组成界面时&#xff0c;Qt自动生成了窗口&#xf…...

微信小程序中实现背景图片完全覆盖显示,可以通过设置CSS样式来实现

wxml页面代码 <view class"beijing"></view>wxss样式代码 /* pages/beiJing/beiJing.wxss */ .beijing {background-image: url("https://www.qipa250.com/qipa.jpg");/* 定位&#xff1a;绝对定位 */position: absolute;/* 上下左右都定位到…...

亲测有效!如何快速实现 PostgreSQL 数据迁移到 时序数据库TDengine

小T导读&#xff1a;本篇文章是“2024&#xff0c;我想和 TDengine 谈谈”征文活动的优秀投稿之一&#xff0c;作者从数据库运维的角度出发&#xff0c;分享了利用 TDengine Cloud 提供的迁移工具&#xff0c;从 PostgreSQL 数据库到 TDengine 进行数据迁移的完整实践过程。文章…...

中国综合算力指数(2024年)报告汇总PDF洞察(附原数据表)

原文链接&#xff1a; https://tecdat.cn/?p39061 在全球算力因数字化技术发展而竞争加剧&#xff0c;我国积极推进算力发展并将综合算力作为数字经济核心驱动力的背景下&#xff0c;该报告对我国综合算力进行研究。 中国算力大会发布的《中国综合算力指数&#xff08;2024年…...

51c~ONNX~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/11608027 一、使用Pytorch进行简单的自定义图像分类 ~ONNX 推理 图像分类是计算机视觉中的一项基本任务&#xff0c;涉及训练模型将图像分类为预定义类别。本文中&#xff0c;我们将探讨如何使用 PyTorch 构建一个简单的自定…...

线下陪玩系统架构与功能分析

2015工作至今&#xff0c;10年资深全栈工程师&#xff0c;CTO&#xff0c;擅长带团队、攻克各种技术难题、研发各类软件产品&#xff0c;我的代码态度&#xff1a;代码虐我千百遍&#xff0c;我待代码如初恋&#xff0c;我的工作态度&#xff1a;极致&#xff0c;责任&#xff…...

海康工业相机的应用部署不是简简单单!?

作者&#xff1a;SkyXZ CSDN&#xff1a;SkyXZ&#xff5e;-CSDN博客 博客园&#xff1a;SkyXZ - 博客园 笔者使用的设备及环境&#xff1a;WSL2-Ubuntu22.04MV-CS016-10UC 不会吧&#xff1f;不会吧&#xff1f;不会还有人拿到海康工业相机还是一脸懵叭&#xff1f;不会还有人…...

SAP POC 项目完工进度 - 收入确认方式【工程制造行业】【新准则下工程项目收入确认】

1. SAP POC收入确认基础概念 1.1 定义与原则 SAP POC&#xff08;Percentage of Completion&#xff09;收入确认方式是一种基于项目完工进度来确认收入的方法。其核心原则是根据项目实际完成的工作量或成本投入占预计总工作量或总成本的比例&#xff0c;来确定当期应确认的收…...

【Elasticsearch 】 聚合分析:聚合概述

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

【算法】二分

二分 1.二分查找1.在排序数组中查找元素的第一个和最后一个位置2.牛可乐和魔法封印3.A-B 数对4.烦恼的高考志愿 2.二分答案1.木材加工2.砍树3.跳石头 1.二分查找 当我们的解具有二段性&#xff08;根据最终答案所在的位置判断是否具有二段性&#xff09;时&#xff0c;就可以使…...

如何将自己本地项目开源到github上?

环境&#xff1a; LLMB项目 问题描述&#xff1a; 如何将自己本地项目开源到github上&#xff1f; 解决方案&#xff1a; 步骤 1: 准备本地项目 确保项目整洁 确认所有的文件都在合适的位置&#xff0c;并且项目的 README.md 文件已经完善。检查是否有敏感信息&#xff0…...

编辑器Vim基本模式和指令 --【Linux基础开发工具】

文章目录 一、编辑器Vim 键盘布局二、Linux编辑器-vim使用三、vim的基本概念正常/普通/命令模式(Normal mode)插入模式(Insert mode)末行模式(last line mode) 四、vim的基本操作五、vim正常模式命令集插入模式从插入模式切换为命令模式移动光标删除文字复制替换撤销上一次操作…...

Scade 表达式 - 使用索引的迭代器

Scade 表达式中的 map, fold, mapfold&#xff0c;会对输入数组参数中的元素逐个作处理&#xff0c;不需要数组元素的索引信息。若在处理数组元素时&#xff0c;需要数组元素相应的索引信息&#xff0c;则可使用迭代器算子 mapi, foldi, mapfoldi。 mapi 算子 mapi 算子的行为…...

K8s学习

Kubernetes 1. Kubernetes介绍 1.1 应用部署方式演变 在部署应用程序的方式上&#xff0c;主要经历了三个时代&#xff1a; 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其它技术的参与 缺点&#xf…...

面试--你的数据库中密码是如何存储的?

文章目录 三种分类使用 MD5 加密存储加盐存储Base64 编码:常见的对称加密算法常见的非对称加密算法https 传输加密 在开发中需要存储用户的密码&#xff0c;这个密码一定是加密存储的&#xff0c;如果是明文存储那么如果数据库被攻击了&#xff0c;密码就泄露了。 我们要对数据…...

微服务学习-快速搭建

1. 速通版 1.1. git clone 拉取项目代码&#xff0c;导入 idea 中 git clone icoolkj-microservices-code: 致力于搭建微服务架构平台 1.2. git checkout v1.0.1版本 链接地址&#xff1a;icoolkj-microservices-code 标签 - Gitee.com 2. 项目服务结构 3. 实现重点步骤 …...

兼职全职招聘系统架构与功能分析

2015工作至今&#xff0c;10年资深全栈工程师&#xff0c;CTO&#xff0c;擅长带团队、攻克各种技术难题、研发各类软件产品&#xff0c;我的代码态度&#xff1a;代码虐我千百遍&#xff0c;我待代码如初恋&#xff0c;我的工作态度&#xff1a;极致&#xff0c;责任&#xff…...

【云岚到家】-day03-门户缓存实现实战

【云岚到家】-day03-门户缓存实现实战 1.定时任务更新缓存 1.1 搭建XXL-JOB环境 1.1.1 分布式调度平台XXL-JOB介绍 对于开通区域列表的缓存数据需要由定时任务每天凌晨更新缓存&#xff0c;如何实现定时任务呢&#xff1f; 1.使用jdk提供的Timer定时器 示例代码如下&#xf…...

Ubuntu 24.04 LTS 开启 SMB 服务,并通过 windows 访问

Ubuntu 24.04 LTS 背景资料 Ubuntu服务器折腾集Ubuntu linux 文件权限Ubuntu 空闲硬盘挂载到 文件管理器的 other locations Ubuntu开启samba和window共享文件 Ubuntu 配置 SMB 服务 安装 Samba 确保 Samba 已安装。如果未安装&#xff0c;运行以下命令进行安装&#xff…...

“AI人工智能内容辅助创作平台:让创意不再“卡壳”

在如今这个信息爆炸的时代&#xff0c;内容创作成了每个人的“必修课”。无论是自媒体大V、文案策划&#xff0c;还是普通学生写作文&#xff0c;大家都会遇到一个让人抓狂的问题——“创意枯竭”。有时候&#xff0c;脑袋里空空如也&#xff0c;一个字都写不出来&#xff0c;那…...

mac 安装 node

brew versions node // 安装 node brew versions node14 // 安装指定版本 卸载node: sudo npm uninstall npm -g sudo rm -rf /usr/local/lib/node /usr/local/lib/node_modules /var/db/receipts/org.nodejs.* sudo rm -rf /usr/local/include/node /Users/$USER/.npm su…...

VUE之Router使用及工作模式

1、路由的使用 【两个注意点】 1)路由组件通常放在pages 或 views文件夹,一般组件通常放在components文件夹。 2)通过点击导航,视觉效果上"消失"了的路由组件,默认是被"卸载"掉的,需要的时候再去挂载。 // 创建一个路由器,并暴露出去// 第一步:…...

day25_HTML

今日内容 零、 复习昨日 一、HTML 零、 复习昨日 一、Web开发 前端 HTML ,页面展现CSS , 样式JS (JavaScript) , 动起来 二、HTML 2.1 HTML概念 ​ 网页&#xff0c;是网站中的一个页面&#xff0c;通常是网页是构成网站的基本元素&#xff0c;是承载各种网站应用的平台。通俗…...

(开源)基于Django+Yolov8+Tensorflow的智能鸟类识别平台

1 项目简介&#xff08;开源地址在文章结尾&#xff09; 系统旨在为了帮助鸟类爱好者、学者、动物保护协会等群体更好的了解和保护鸟类动物。用户群体可以通过平台采集野外鸟类的保护动物照片和视频&#xff0c;甄别分类、实况分析鸟类保护动物&#xff0c;与全世界各地的用户&…...

【AI日记】25.01.20

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】 AI kaggle 比赛&#xff1a;Forecasting Sticker Sales 读书 书名&#xff1a;自由宪章阅读原因&#xff1a;作者哈耶克&#xff0c;诺贝尔经济学奖得主&#xff0c;之前读过他的 《通往奴役…...

基于机器学习的用户健康风险分类及预测分析

完整源码项目包获取→点击文章末尾名片&#xff01; 背景描述 在这个日益注重健康与体能的时代&#xff0c;健身已成为许多人追求健康生活的重要组成部分。 本数据集包含若干健身房会员的详细信息&#xff0c;包括年龄、性别、体重、身高、心率、锻炼类型、身体脂肪比例等多项关…...

AI生成内容——JavaScript中的Promise、async和wait

一、Promise *1. 概念&#xff1a; Promise 是 JavaScript 中处理异步操作的一种对象&#xff0c;它表示一个异步操作的最终完成&#xff08;或失败&#xff09;及其结果值。一个 Promise 对象处于以下三种状态之一&#xff1a; Pending&#xff08;进行中&#xff09;&#…...

Java基于SSM框架的社区团购系统小程序设计与实现(附源码,文档,部署)

Java基于SSM框架的社区团购系统小程序设计与实现 博主介绍&#xff1a;✌程序猿徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f4…...

Git原理与应用(三)【远程操作 | 理解分布式 | 推送拉取远程仓库 | 标签管理】

Git 理解分布式版本控制系统远程仓库新建远程仓库克隆远程仓库向远程仓库推送配置Git忽略特殊文件 标签管理理解标签创建标签操作标签删除标签 理解分布式版本控制系统 我们⽬前所说的所有内容&#xff08;工作区&#xff0c;暂存区&#xff0c;版本库等等&#xff09;&#x…...

【esp32小程序】小程序篇02——连接git

一、创建仓库 进入gitee官网&#xff0c;登录&#xff08;如果没有gitee账号的就自行注册一下&#xff09;。 点击号-->新建仓库 填写好必填信息&#xff0c;然后点击“创建” 二、微信开发者工具配置 在微信开发者工具打开我们的项目。按下面的步骤依次点击 三、验证 点…...

MongoDB基本操作

一、实验目的 1. 熟悉MongoDB的基本操作&#xff0c;包括CRUD&#xff08;增加、读取、更新、删除&#xff09;。 2. 理解MongoDB的文档型数据库特性和Shell的使用。 3. 培养学生通过命令行操作数据库的能力。 4. 强化数据库操作的实际应用能力。 二、实验环境准备 1.…...

Brooks MagnaTran LEAP User Manual 指导半导体机械手

Brooks MagnaTran LEAP User Manual 指导半导体机械手...

【Red Hat8】:搭建DHCP服务器

1、新建挂载文件 2、挂载 3、关闭防火墙 4、搭建yum源 &#xff08;搭建的时候用vim 自行定义文件名.repo或者是vi 自行定义文件名.repo&#xff09; 5、安装dhcp-server 6、复制模板文件 dhcpd.conf 是DHCP服务的配置文件&#xff0c;DHCP服务所有参数都是通过修改dhcpd.co…...

JupyterLab 安装以及部分相关配置

安装 JupyterLab pip install jupyter启动 JupyterLab jupyter lab [--port <指定的端口号>] [--no-browser] # --port 指定端口 # --no-browser 启动时不打开浏览器安装中文 首先安装中文包 pip install jupyterlab-language-pack-zh-CN安装完成后重启 JupyterLab 选…...

深圳桂湾公园的花海

工作日的午休时间我经常骑行到桂湾公园&#xff0c;时不时都能碰上一些阿姨问&#xff1a;小伙子你知道桂湾公园的花海在哪里吗&#xff1f;我找了半天了哈。我发现不少找花海的人是从桂湾地铁或前湾地铁下车&#xff0c;然后在偌大的桂湾公园找寻。其实只要定位前海紫荆园就好…...

寒假刷题Day10

一、220. 存在重复元素 III 两种解法&#xff1a;并没有弄懂&#xff0c;待复盘 class Solution { public:bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {set<long> st;for (int i 0; i < nums.size(); i) {auto lb st.lower_…...

【Java-图片存储方案】

Java功能相关文章 一、Minio存储大体量图片 上传到Minio指定路径&#xff0c;前端预览时,需要生成临时访问凭证的URL import io.minio.MinioClient; import io.minio.errors.MinioException; import io.minio.http.Method; import io.minio.GetPresignedObjectUrlArgs; impo…...

机器人传动力系统介绍

以下是对机器人驱动系统的分析、最新科技应用以及世界顶级公司机器人型号使用的技术&#xff1a; 机器人驱动系统分析 液压驱动&#xff1a;利用液体压力来传递动力&#xff0c;通过液压泵将液压油从油箱抽出&#xff0c;送至液压缸&#xff0c;推动活塞运动&#xff0c;进而…...

DDD - 微服务落地的技术实践

文章目录 Pre概述如何发挥微服务的优势怎样提供微服务接口原则微服务的拆分与防腐层的设计 去中心化的数据管理数据关联查询的难题Case 1Case 2Case 3 总结 Pre DDD - 软件退化原因及案例分析 DDD - 如何运用 DDD 进行软件设计 DDD - 如何运用 DDD 进行数据库设计 DDD - 服…...

《Vue3 十》Vue 底层原理

命令式编程和声明式编程&#xff1a; 以计时器为例&#xff1a; // 原生 JavaScript 实现计数器&#xff0c;是命令式编程 <div><h1>当前数字&#xff1a;<span class"count"></span></h1><button class"add" click&qu…...

GMM高斯混合聚类算法(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 GMM高斯混合聚类算法 matlab2023b语言&#xff0c;一键出图&#xff0c;直接运行 1.代码注释清晰&#xff0c;自行解读容易。 2…输出图例如图所示包括&#xff1a;聚类图(聚类结果图)&#xff0c;协方差矩阵类型…...

【Leetcode 每日一题】2266. 统计打字方案数

问题背景 Alice 在给 Bob 用手机打字。数字到字母的 对应 如下图所示。 为了 打出 一个字母&#xff0c;Alice 需要 按 对应字母 i i i 次&#xff0c; i i i 是该字母在这个按键上所处的位置。 比方说&#xff0c;为了按出字母 ‘s’ &#xff0c;Alice 需要按 ‘7’ 四次…...

多线程杂谈:惊群现象、CAS、安全的单例

引言 本文是一篇杂谈&#xff0c;帮助大家了解多线程可能会出现的面试题。 目录 引言 惊群现象 结合条件变量 CAS原子操作&#xff08;cmp & swap&#xff09; 线程控制&#xff1a;两个线程交替打印奇偶数 智能指针线程安全 单例模式线程安全 最简单的单例&…...

Nginx调优

Nginx 是一个高性能的反向代理服务器和负载均衡器&#xff0c;在处理大量并发请求时表现出色。但是&#xff0c;随着系统负载的增加&#xff0c;Nginx 的性能可能受到多方面的影响&#xff0c;因此进行适当的调优至关重要。以下是 Nginx 调优的几个方向和关键点&#xff1a; 1…...

自定义UITableViewCell

很多时候&#xff0c;我们是不能直接使用系统自带的UITableViewCell&#xff0c;因为自带的比较简单只有一个UIImageView和两个UILabel&#xff0c;假设需要多个UIImageView或者两个以上UILabel&#xff0c;那就需要自定义了。本文就实现如何自定义UITableViewCell。 假设我们现…...

Java 基于微信小程序的原创音乐小程序设计与实现(附源码,部署,文档)

大家好&#xff0c;我是stormjun&#xff0c;今天为大家带来的是Java实战项目-基于微信小程序的原创音乐小程序设计与实现。该系统采用 Java 语言 开发&#xff0c;MySql 作为数据库&#xff0c;系统功能完善 &#xff0c;实用性强 &#xff0c;可供大学生实战项目参考使用。 博…...