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

[深度学习] 大模型学习1-大语言模型基础知识

大语言模型(Large Language Model,LLM)是一类基于Transformer架构的深度学习模型,主要用于处理与自然语言相关的各种任务。简单来说,当用户输入文本时,模型会生成相应的回复或结果。它能够完成许多任务,如文本续写、分类、摘要、改写、翻译等。常见的LLM包括GPT、LLaMA等。本文将重点介绍LLM的基本原理和应用。详细内容可参考modelscope-classroom进行深入学习。

https://github.com/onejune2018/Awesome-LLM-Eval

文章目录

  • 1 LLM基础知识
    • 1.1 LLM介绍
    • 1.2 LLM训练范式
    • 1.3 Transformer结构解析
    • 1.4 LLM扩展应用
  • 2 LLM训练概览
    • 2.1 LLM推理过程
    • 2.2 LLM应用构建
      • 2.2.1 提示词工程
      • 2.2.2 模型训练与微调
      • 2.2.3 RAG
    • 2.3 LLM评估
      • 2.3.1 LLM自动评估
      • 2.3.2 LLM人工评估
      • 2.3.3 LLM评估工具
    • 2.4 LLM量化、部署、优化
      • 2.4.1 模型量化
      • 2.4.2 模型推理部署
      • 2.4.3 模型优化技术
  • 3 总结
  • 4 参考

1 LLM基础知识

1.1 LLM介绍

LLM发展历程

2022年11月30日,OpenAI推出的ChatGPT在LLM技术领域取得了创新突破,迅速引起了全球业界的广泛关注,并在短短两个月内成功吸引了超过一亿用户。作为一款基于LLM的应用,ChatGPT以其强大的文本生成、对话交互和信息提取能力,成为人工智能领域的一个重要里程碑,推动了人机交互的边界。然而,由于OpenAI未公开其底层技术并封闭源代码,这引发了全球AI开发者对开源技术的强烈需求。

https://www.appeconomyinsights.com/p/threads-fastest-growing-app-in-history

随着LLM技术的飞速发展,Meta推出的LLaMA模型、Mistral AI发布的Mistral模型以及BigScience团队推出的BLOOM模型等多个开源LLM相继问世。这些模型在性能上已接近甚至媲美商业化LLM,进一步推动了LLM技术的广泛应用与创新。以下是几款代表性LLM系列的发展时间线,展现了这一领域的迅猛进步:

https://arxiv.org/pdf/2306.13549

到2024年底,在众多LLM中,闭源模型中表现最为出色的是GPT-4,而在开源模型中,LLama 3.3和LLama 3.2最为推荐。尽管LLama 3.2在各类基准测试中优于GPT-4,但在实际应用中,GPT-4的表现仍然更为卓越:

https://onegen.ai/llama-3-2-models-comparison-use-cases-and-fine-tuning/

LLM的“大”体现在哪些方面?

  1. 庞大的参数量:LLM的“大”首先体现在参数数量上。例如,OpenAI的GPT-3有1750亿个参数,GPT-4更为庞大。参数越多,模型的语言理解和任务处理能力越强。
  2. 海量的训练数据:LLM依赖海量数据进行训练,包括书籍、新闻、网页内容和社交媒体等。这些多样化的数据帮助模型掌握丰富的语言模式,具备强大的理解和生成能力。
  3. 广泛的任务适应性:模型在多种数据上训练,赋予其从自然语言理解到翻译、摘要、情感分析等多任务的处理能力,使其具备显著的通用性。
  4. 巨大的计算资源需求:LLM的训练与推理依赖大量高性能计算资源,如GPU和专用加速器。随着模型规模的增加,计算需求呈指数级增长。

LLM为什么要基于Transformer架构?

在Transformer架构出现之前,自然语言模型主要依赖循环神经网络(RNN),但RNN的顺序处理方式限制了计算的并行性,且在处理长序列时,信息容易丢失或遗忘。

Transformer通过引入自注意力机制和位置编码,克服了传统模型在捕捉长距离依赖和并行计算方面的局限。自注意力机制允许模型同时关注输入序列中的所有词,捕捉更远距离的依赖关系,避免了RNN及其变体LSTM模型中存在的顺序处理瓶颈。因此,Transformer成为大规模预训练模型的基础架构,并在多个任务中展现了出色的性能。

1.2 LLM训练范式

LLM训练阶段

LLM的训练可分为以下四个关键阶段:

  1. 预训练(Unsupervised Pretraining):构建基座模型。

    • 数据来源:广泛采集的书籍、新闻、科研论文、社交媒体等多领域文本数据,作为模型训练的素材。
    • 学习目标:利用无监督学习技术,使模型能够根据上下文预测下一个词。
    • 训练过程:不依赖标注数据,通过不断优化模型预测与实际结果之间的差异,随着数据量的增加,逐步提升模型的性能。
  2. 有监督微调(Supervised Fine-Tuning,SFT):打造对话模型。

    • 数据来源:采用人工标注的对话数据,以提高模型在对话任务中的表现。
    • 学习目标:通过有针对性的训练,增强模型与用户互动的能力。
    • 训练过程:使用少量但高质量的对话数据进行微调,显著提高模型的对话能力。
  3. 奖励模型训练(Reward Model Training):培养能够评估回答的模型。

    • 数据来源:生成多个候选答案,并依据人工评分和排序进行评估。
    • 学习目标:培养奖励模型,利用评分数据来评估和优化模型生成的答案质量。
    • 训练过程:奖励模型根据人工评分提供反馈,引导模型生成更符合人类预期的答案,这个过程也常被称为人类对齐训练(alignment)。
  4. 强化学习训练(Reinforcement Learning with Human Feedback,RLHF):进一步提升对话模型的回答质量。

    • 数据来源:利用第三步训练好的奖励模型,通过强化学习进一步优化第二步训练好的对话模型。
    • 学习目标:依据奖励模型的反馈调整生成策略,提高模型回答的质量。
    • 训练过程:模型根据奖励评分调整其策略,并结合用户反馈,进一步改进生成答案的质量。

这一过程可以用Llama 2论文中的示例图片更为直观地展示:

https://arxiv.org/abs/2307.09288

基座模型和对话模型

在LLM的训练过程中,主要有两种模型类型:基座模型(Base模型)和对话模型(Chat模型)。两者的工作方式相似,都是通过预测文本的后续内容来进行训练。Base模型经过了预训练,可能进行了部分通用指令的微调;而Chat模型则在Base模型的基础上,进一步通过大量通用数据的微调和人类反馈的训练来优化性能。虽然“指令模型”(Instruction Model)这一术语有时也被提及,但它与Chat模型本质上是相同的,都是通过指令微调和强化学习对Base模型进行优化,以提高其理解和生成能力。

https://journals.sagepub.com/doi/full/10.1177/17562848241227031

开源LLM的研究机构通常会同时发布Base模型和Chat模型,以满足不同的需求。例如,Llama 2(Base模型)和Llama 2-Chat(Chat模型)。Base模型主要侧重于泛化能力,通常仅经过预训练,具备基本的文本补全功能,但缺乏对话上下文的理解,因此在与人类对话时,回答往往显得较为生硬、感觉在背书。而Chat模型则在Base模型的基础上进行优化和调整,增强了对话能力和自然语言理解,生成的回答更加自然。两者具体对比如下:

维度Base模型Chat模型
训练方式预训练预训练+监督微调(SFT)+强化学习(RLHF)
数据来源大量未标注文本数据标注好的对话数据集、人类对齐
模型特性庞大的参数规模,具备广泛的语言特征强大的对话生成和理解能力,能够生成连贯且有意义的回复
应用场景适用于多种NLP任务,如文本生成、语义理解、翻译等专门用于构建聊天机器人、虚拟助理等对话系统
优势泛化能力强,适用于多种任务对话能力强,能够生成符合人类偏好的回复
不足可能需要进一步的微调才能适应特定任务相对于Base模型,训练过程更复杂

1.3 Transformer结构解析

LLM通过预测下一个词生成高质量文本,这得益于强大的Transformer架构。Transformer的基本结构包括输入嵌入、编码器、解码器和输出层。编码器和解码器通过多层堆叠的自注意力机制和前馈神经网络相互作用,进而实现复杂的序列处理任务。自注意力机制使得Transformer能够在全局范围内捕捉词语之间的依赖关系,这是其处理长序列和大量数据的关键优势。

https://magazine.sebastianraschka.com/p/understanding-encoder-and-decoder

Transformer编码器

Transformer的编码器部分主要包括以下几个步骤:

  1. 输入token化:将输入文本拆分为可以被计算机处理的token,每个token对应词汇表中的一个索引。
  2. 嵌入层:将这些token转换为向量表示,捕捉词汇之间的语法和语义关系。
  3. 位置编码:给嵌入向量添加位置信息,帮助模型理解词在句子中的顺序。
  4. 自注意力机制:这是编码器的核心,通过计算每个词与其他词之间的相关性,确定注意力权重,捕捉输入序列中的重要信息。
  5. 多头自注意力:使用多个“头”来分别关注输入数据的不同方面,增强模型的表达能力。
  6. 前馈神经网络:对多头自注意力的输出进行处理,帮助模型识别更复杂的模式。
  7. 堆叠编码器:将多个编码器层叠加在一起,让模型能够在不同层次上理解输入数据,从而逐步提炼信息。

Transformer解码器

Transformer解码器的工作流程可以简化为以下几个步骤:

  1. 输入处理:解码器接收上一个时间步的输出和编码器的输出。初始步骤时,输入通常是一个特殊的起始标记(如 <sos>)或先前生成的结果。
  2. 嵌入和位置编码:解码器将每个输入词转化为向量,并加入位置编码,使模型知道词在序列中的位置。
  3. 自注意力机制(带掩码):解码器的自注意力机制只关注当前词之前的词,通过掩码确保模型生成下一个词时只依赖已生成的部分,从而实现自回归生成。
  4. 编码器-解码器注意力:解码器通过这个机制关注编码器的输出,帮助理解输入序列,从而生成更合适的输出。
  5. 前馈神经网络和解码器堆叠:解码器使用前馈神经网络对注意力输出进行处理,并通过多层堆叠提升对输入输出关系的理解,生成更复杂的结果。
  6. 线性层和Softmax:解码器将输出转化为词汇表大小的向量,通过Softmax层生成词的概率分布。
  7. 选择输出:模型选择概率最高的词作为下一个输出,直到生成结束标记(如 <eos>),完成整个序列的生成。

解码器中的多头自注意力机制与编码器类似,但采用遮蔽处理,以防模型关注未来词语。这样,模型在预测位置 i i i的输出时,仅依赖于位置 i i i之前的已知信息。如下图所示,解码器逐步生成每个单词:

https://magazine.sebastianraschka.com/p/understanding-encoder-and-decoder

LLM中的Transformer

Transformer架构是一种非常灵活且强大的神经网络结构,已经被广泛应用于各种自然语言处理任务。根据不同的任务需求,Transformer的架构可以分为几种不同的类型,每种类型都有其特定的优点和用途。以下是这几种主要结构的特点:

  1. 仅编码器模型(自编码器模型)

    • 主要用途: 仅编码器模型通常用于从输入数据中提取有用的特征信息,进行理解或表示学习。这些模型不需要生成输出,而是侧重于学习输入的上下文和表示。
    • 工作方式: 编码器的作用是将输入的序列通过多层的自注意力机制和前馈神经网络处理,最终将其转化为一个固定长度的向量或一组向量。
    • 应用: 这类模型在需要提取深度特征或做文本分类、情感分析等任务时非常有效。它们不涉及生成过程,而是通过理解和表示输入数据来完成任务。
    • 代表模型:
      • BERT(双向编码器表示模型): BERT是一种双向编码器,它通过“遮蔽”输入中的某些单词来训练模型,让模型预测这些被遮蔽的单词,从而获得输入文本的深层次理解。BERT的预训练后可以通过微调应用于多种任务,如文本分类、命名实体识别(NER)、问答等。
  2. 仅解码器模型(自回归模型)

    • 主要用途: 解码器模型通常用于生成任务,尤其是序列生成任务,如文本生成、对话生成等。这类模型的目标是从给定的输入或上下文中生成连贯的输出。
    • 工作方式: 解码器采用自回归的方式生成序列,它会基于已生成的词或标记不断预测下一个词,直到生成完整的输出。
    • 应用: 解码器模型广泛应用于需要生成连续文本的任务,比如机器翻译、文本生成、代码生成等。
    • 代表模型:
      • GPT:基于Transformer的解码器结构,采用自回归方式生成文本。在训练过程中,它通过大量的文本数据学习语言模式,并通过不断预测下一个词生成连贯的文章。GPT系列(如GPT-3、GPT-4)已经成为文本生成任务中的重要模型。
  3. 编码器-解码器模型(序列到序列模型)

    • 主要用途: 编码器-解码器模型适用于需要将一个输入序列映射到一个输出序列的任务,例如机器翻译、文本摘要、图像描述等。这种结构通常包含两个部分:编码器负责理解输入序列,解码器负责生成输出序列。
    • 工作方式: 编码器首先处理输入序列,将其转化为一个中间的表示(通常是一个上下文向量),然后解码器基于该表示生成输出序列。解码器可以使用自回归方式来逐步生成输出。
    • 应用: 这类模型适用于任何需要将一个序列转换为另一个序列的任务,常见的应用场景包括机器翻译、摘要生成、对话生成等。
    • 代表模型:
      • T5:将所有任务统一转换为文本到文本的任务,即输入和输出都是文本形式。它结合了编码器和解码器的结构,可以用于机器翻译、文本摘要、问答等多种任务。
      • BART:一种结合了BERT和GPT优点的模型,使用编码器-解码器架构,既能够进行双向的理解,又能进行自回归的生成。它特别适用于文本生成、序列到序列的转换等任务。

https://magazine.sebastianraschka.com/p/understanding-encoder-and-decoder

然而随着技术发展,Transformer架构不断优化,尤其是LLM(GPT系列)取得突破后,解码器模型变得更加流行,而编码器-解码器模型逐渐不再主流,原因如下:

  1. 简洁高效:解码器模型结构简单,训练和推理时更加高效。
  2. 更佳上下文理解:解码器专注于生成任务,能更好地理解上下文,生成连贯、符合语境的文本。

1.4 LLM扩展应用

为了应对日益复杂的任务需求,一些新型的大模型应运而生,它们对单一LLM的能力进行了扩展和补充。这些模型主要包括多模态大语言模型、LLM智能体(Agent)、垂直领域LLM等。以下是对这些模型的简要介绍:

  1. 多模态大语言模型 (Multimodal Large Language Models)

    多模态大语言模型通过融合文本、图像、视频和音频等多种信息,能够同时处理不同类型的输入,生成更丰富的语义理解。与传统模型不同,它在多元数据训练下显著提升了对各类数据的理解能力,展现出更强的任务适应性和通用性。例如,在图像描述任务中,模型结合图像和文本生成精准自然的语言;在音频处理任务中,通过融合音频和文本信息,提高语音识别和语义理解的准确性。

    https://arxiv.org/abs/2306.09093

  2. LLM智能体(Agent)

    LLM智能体(Agent)是基于LLM的人工智能系统,它能够理解、生成和处理语言,以执行各种任务。与传统的程序或工具不同,智能体不仅能够提供信息和答案,还能根据上下文进行自主推理、决策和行动。通过与用户的互动,它可以处理复杂的问题,提供个性化建议,并完成诸如对话、文本生成、翻译、问答等多种任务。智能体的核心是成熟的LLM,它通过大量的语料库学习语言的结构和含义,不断优化其理解和生成能力。

    https://blog.abacus.ai/blog/2023/08/31/supercharge-productivity-accomplish-10x-more-with-ai-agents/

  3. 垂直领域LLM

    垂直领域LLM是指专门针对某一特定行业或应用场景进行训练和优化的LLM。这类模型与通用LLM不同,它们在处理特定领域的问题时表现出更强的专业性和精确性。垂直领域LLM通常会利用行业专有的数据和知识进行训练,从而提高在该领域内的表现。
    例如,在代码生成上,它能根据需求自动生成高质量代码,减少开发时间与错误;在医学领域,它协助医生分析病历、解读检查结果,并提出诊断与治疗建议,提升诊疗效率;在法律咨询中,模型帮助解析法律条文、提供法律意见,让用户更清晰地理解法律问题和风险;在金融分析中,它能分析市场趋势、预测股市走向,为投资者提供数据支持;在客户服务方面,它能自动处理咨询、快速回应问题,提高服务质量;在技术支持中,它能识别技术问题并提供解决方案,保障用户体验。

2 LLM训练概览

2.1 LLM推理过程

LLM推理是指在训练完成后,利用训练好的模型对新数据进行预测或生成的过程。通过LLM解决实际问题,如回答问题、生成文案等,便是在进行模型推理。可以认为,模型推理是LLM应用的核心环节。
在推理阶段,LLM根据输入的提示(prompt)以及先前生成的内容,逐步预测下一个词或标记(token)。这一过程持续进行,直到生成完整的句子或多个句子。因而这类模型被称为自回归模型(autoregressive Model)。

https://www.omrimallis.com/posts/understanding-how-llm-inference-works-with-llama-cpp/

在推理阶段,单个词生成的过程如下所示:

  1. 提示(Prompt)作为输入文本,用来引导模型生成特定类型的回应或输出。首先,分词器会将提示文本拆分成一系列的标记(tokens)。根据模型的词汇表,一些单词可能会被拆成多个标记,每个标记都会对应一个唯一的数字。接下来,这些数字会被数字转化成固定长度的向量嵌入(embedding)。所有的向量合起来形成一个embedding矩阵,作为模型的输入。
  2. Embedding矩阵首先通过Transformer层进行处理,Transformer由多个堆叠的子层组成,每一层的输出作为下一层的输入。每个子层包含自注意力机制,能够在处理当前输入时综合考虑序列中其他位置的信息,从而捕捉全局依赖关系。与此同时,经过每一层处理后,输入矩阵的维度保持不变。
  3. 在Transformer层处理后,模型生成logits,这些logits表示每个可能token的预测分数。然后通过softmax函数将logits 转换为概率分布,并使用多种采样技术(如贪心解码、top-k采样或top-p采样等)之一从概率分布中选择下一个token。
  4. 上一步所选的token会被附加到当前生成的token序列中。然后,新的token序列作作为输入,模型会再次执行步骤1至步骤3的过程生成后续token。生成后续token。此过程会持续进行,直到模型生成特殊的结束标记(EOS),或达到预设的token数量。

2.2 LLM应用构建

构建LLM应用时,选择合适的方法整合专有和领域数据是关键一步,常用的方式包括提示词工程(Prompt Engineering)、模型训练与微调、以及检索增强生成(RAG,Retrieval-Augmented Generation)等。

2.2.1 提示词工程

提示词工程通是用户和LLM互动中最常用的方式。提示词工程通过设计和优化输入给模型的提示词(如问题或指令),帮助模型生成更加准确、符合需求的回答。相当于在告诉模型应该关注哪些信息或如何理解问题。可以把它理解为学会提出正确的问题,以获得最佳的答案。不过,能从中获得的帮助是有限的,因为模型的回答只能基于它已经学到的信息。

https://myscale.com/blog/prompt-engineering-vs-finetuning-vs-rag/

提示词工程的优缺点以及适用环境如下所示:

优点:

  1. 易用:操作简单,无需专业技术,任何用户都能轻松上手。
  2. 成本低:使用预训练模型,计算开销小,比微调方式更具成本效益。
  3. 灵活:可以快速调整提示内容,探索不同的结果,无需重新训练模型。

缺点:

  1. 一致性差:模型的响应质量可能因提示的措辞不同而产生较大的差异。
  2. 定制化受限:回答的个性化程度取决于提示的设计和技巧,定制能力有限。
  3. 知识局限:输出依赖于模型训练时获得的知识,无法处理过于专业或最新的信息。

适用环境:

  1. 模型能力视情况而定:提示词工程的效果依赖于所用模型的能力。在使用前,用户应评估模型是否具备处理业务问题的基础能力。若模型基础能力较强,提示词工程可作为快速、高效的解决方案。
  2. 适合通用任务和简单场景:与其他深度学习技术相比,提示词工程的开发门槛较低,适用于常识问答、文本生成、情感分析、角色扮演等通用任务和简单应用。

对于提示词工程的应用,Zero-Shot Learning(零样本学习)和Few-Shot Learning(少样本学习)是两种常见的提示词策略,它们在帮助用户获取所需内容时各有特点。以下是对这两种学习模式及其应用的进一步扩展说明:

Zero-Shot Learning

在Zero-Shot Learning模式下,用户提出任务时并不提供任何示例或样本,模型依赖于其预先学习的知识和语言能力直接生成答案。这样的模式适用于当用户需要一种快速、直接的生成内容方式,且不想提供或不需要提供额外的训练数据或背景信息。

举例来说,如果用户想了解宠物狗的基本情况,可以在LLM应用中通过一个简洁、明确的提示词来引导模型生成所需的内容:

请写一段介绍宠物狗的文字,描述一下它的外观、性格特点以及和人类相处的情况。

此时,模型基于其在大量文本数据中学习到的语言规律和知识,能够从各类资料中提取信息,生成一段介绍宠物狗的文字,涵盖它的外观、性格以及与人类的互动方式。例如,模型可能会生成如下内容:

宠物狗通常体型适中,拥有毛茸茸的皮毛,种类繁多,常见的有短毛、长毛、卷毛等。它们的耳朵形状、眼睛颜色和尾巴的长短各不相同。性格上,狗狗一般忠诚、活泼,喜爱与人类互动,是非常好的家庭伴侣。它们常常热情迎接主人,喜欢与家人一起散步、玩耍。狗狗特别喜欢获得主人的关注和奖励,在日常生活中会表现出对主人的深厚感情。

这种生成方式快速高效,适合快速获取一些普遍性信息。

Few-Shot Learning

与Zero-Shot Learning不同,Few-Shot Learning是通过提供少量示例或样本来帮助模型更好地理解任务要求。通过这些示例,模型能够更准确地理解输入和输出之间的关系,从而提高生成内容的质量。此方式在某些情况下会更加精确,尤其是当用户有特定需求时,示例可以帮助引导模型产生更符合预期的回答。

例如,以下是一个典型的Few-Shot Learning的提示词示例:

以下是几个描述动物的示例,请你按照这样的格式写一段介绍宠物狗的文字,描述它的外观、性格特点以及和人类相处的情况。示例 1:动物:猫咪外观:猫咪体型较小,毛茸茸的身体,眼睛大而明亮,耳朵尖尖,尾巴长而灵活,走路时轻盈优雅。性格特点:猫咪性格独立,喜欢自己待着,但也会对主人撒娇,开心时会发出呼噜声。和人类相处:它喜欢依偎在主人身边,陪伴主人休息或看电视,偶尔会捣乱,但总是给家庭带来温馨感。示例 2:动物:兔子外观:兔子身体小巧,耳朵长而竖立,眼睛圆润,嘴巴三瓣,后腿强壮,蹦跳时非常可爱。性格特点:兔子性格温顺胆小,喜欢啃食干草和胡萝卜,平时安静乖巧。和人类相处:兔子是孩子们的好伙伴,可以被抱在怀里抚摸,吃东西时很治愈。请写一段介绍宠物狗的文字:

在这个示例中,通过提供两个不同动物的描述,LLM能够识别出描述结构和内容的相似性,从而在生成宠物狗的描述时保持一致的格式和逻辑结构。在LLM应用中使用该提示词,生成的内容可能是:

动物:宠物狗
外观:宠物狗体型从小巧到中等大小不等,毛发种类繁多,有短毛、长毛或卷毛。它们的眼睛明亮,耳朵多为立耳或垂耳,尾巴通常是卷曲或直的,走动时充满活力。
性格特点:宠物狗通常友好、忠诚,喜欢与人类互动,性格开朗,适合做家庭宠物。它们非常聪明,能够学会一些基本的指令,喜欢参与户外活动。
和人类相处:狗狗是人类的忠实伙伴,喜欢陪伴主人,无论是散步、玩耍还是安静地待在主人身边,都会表现出对主人的深厚情感。狗狗还会通过摇尾巴、撒娇等方式表达情感,是非常合适的家庭宠物。

2.2.2 模型训练与微调

LLM的训练通过海量数据学习语言规律和知识,而微调则是在特定任务或领域上对已经训练好的模型进行优化,以便更好地满足具体需求。训练LLM通常需要巨大的显存和长时间的训练周期,受限于成本。微调常常通过在已有的LLM模型上附加额外结构、冻结原模型的参数,仅训练新结构,从而降低计算开销。在推理阶段,额外结构可以与原模型合并(但并非所有结构都支持合并)。目前,LoRA(低秩适配)是最流行的微调方法,它具有简单的结构和较低的训练成本,并在部分任务上能够接近全量微调的效果。

微调使模型能够学习新知识或调整生成结果。通过向已训练好的LLM提供额外数据,微调会改变模型的权重,从而更好地控制生成内容。与全量训练相比,微调通常是一个相对轻量的过程,且往往只需少量数据便能在特定任务上显著提升性能。然而,微调也可能带来意想不到的副作用,甚至可能削弱模型的通用能力,因此需要谨慎评估其效果。

对于大多数公司来说,微调模型是一种更加经济、高效和灵活的选择,尤其是在LLM已经预训练的情况下。公司无需承担从零开始训练模型的高昂成本和技术难题,只需关注特定领域的定制化需求。

https://clive-gomes.medium.com/pre-training-large-language-models-at-scale-d2b133d5e219

下面是微调的优缺点以及适用场景的总结:

优点

  1. 高定制化:微调能根据特定任务调整模型,提升在特定领域或任务中的表现,如金融、法律、医学等领域的专业应用。
  2. 一致性高:微调能减少因提示词不同导致的输出差异,使模型在特定任务中的表现更加稳定和一致。
  3. 长效性与可扩展性:微调后的模型能在当前任务中表现更好,且可以通过进一步微调适应新任务,具有较强的长期适应性。
  4. 应对复杂场景:微调能处理比提示词工程更复杂的场景,尤其是需要高精度和深度的任务,如技术文档生成、编程辅助等。

缺点

  1. 数据质量要求高:微调通常需要大量特定领域的高质量标注数据,这增加了数据准备的成本。
  2. 计算资源需求高:微调涉及重新训练部分模型参数,计算开销较大,需要较强的计算资源。
  3. 开发难度较大:微调需要一定的深度学习背景,开发者需要理解如何设计数据、调整参数和评估效果,门槛较高。
  4. 过拟合风险:如果微调的数据集过于单一或有限,模型可能在特定任务上过拟合,导致在其他场景中表现差。

适用环境

  1. 需要高定制化的任务:如医疗、法律、金融等领域,微调能帮助模型精确处理专业术语和规则。
  2. 拥有大量标注数据的任务:当有足够标注数据时,微调能有效提升模型性能。
  3. 要求高度一致性的任务:如自动文案生成、客户支持等,微调能确保模型输出的稳定性和一致性。
  4. 复杂或多任务场景:在多任务学习或复杂问题求解中,微调能够提升模型在不同任务中的适应性和处理能力。

除了模型训练和微调,开发LLM的一个关键环节是确保模型能够理解并回答符合人类需求的问题,这一过程被称为人类对齐。经过人类对齐的模型(Chat模型)通常能够更好地进行通用的问答任务,还可以在此基础上通过少量数据进行微调,以适应特定领域的应用场景。需要注意的是,人类对齐的技术难度通常高于微调,一般由LLM开发方负责实施。

此外,如果想要获取公开的LLM数据集以进行模型微调,可以参考以下开源仓库:data-prep-kit和LLMDataHub。

2.2.3 RAG

检索增强生成(RAG)简介

检索增强生成(RAG, Retrieval-Augmented Generation)是一种融合LLM与外部知识库的技术。其核心理念是在LLM为用户提供答案时,首先通过从知识库中检索相关信息,并基于这些信息生成精确的回答,类似于对信息库进行快速查询以获得最佳解答。RAG的工作流程如下:

  1. 问题转化与检索:当用户提出问题时,RAG系统会将问题转换为向量表示,并利用向量数据库进行高效检索,找到与问题相关的文档或信息。
  2. 信息召回:系统从知识库中召回与问题相关的文档或信息,确保模型能够基于最新且相关的内容生成答案。
  3. 答案生成:通过将检索到的信息与LLM的生成能力相结合,生成最终的回答。此过程可以是直接返回检索结果,也可以将召回的资料作为上下文输入LLM,由模型进一步加工整理,生成更为详细和精准的答案。

https://gradientflow.substack.com/p/best-practices-in-retrieval-augmented

RAG的优缺点及适用场景总结:

优点

  1. 提高准确性与覆盖面:结合外部信息,RAG能够生成更准确、详细的答案,尤其适用于处理大量实时信息的任务,如问答和文本生成。
  2. 灵活性强:动态检索相关文档,避免依赖固定训练数据,适应多领域及变化任务。
  3. 生成与检索结合:融合生成模型的语言能力与检索模型的知识,使答案既自然流畅又准确及时。
  4. 减少训练难度:相比微调模型,RAG通过检索系统的外部知识提升表现,减少对大规模标注数据的依赖。

缺点

  1. 依赖外部数据源:若检索源质量差或不准,生成结果会受到影响。
  2. 计算资源需求高:双重过程增加计算开销,尤其在实时检索时需更多资源。
  3. 模型复杂度高:联合训练与推理增加系统复杂性,需更多调试与优化。
  4. 上下文窗口限制:信息量受限于上下文窗口,超大规模知识无法完全纳入生成过程。

适用场景

  1. 实时更新任务:如新闻生成、知识问答,能够整合最新外部数据,生成高质量内容。
  2. 处理大量知识或冷门任务:适合医学、法律等领域,能检索并生成准确答案。
  3. 跨领域应用:支持跨学科研究与复杂决策,利用多领域信息进行综合分析。
  4. 增强通用LLM:提升通用LLM的表现,尤其在缺乏实时信息或知识库时。

2.3 LLM评估

LLM表现出卓越的泛化能力和适应性,在以前未见过的任务和不同领域中展现出强大的迁移能力。然而,其强大的能力也为评估带来了新的挑战。由于其输出具有高度生成性和开放性,标准化指标通常不足以进行全面评估。

这是因为尽管LLM具有巨大的潜力和显著的优势,但它也面临着一些关键挑战。例如,LLM的评估结果往往受到提示模板的影响,这可能导致评估有偏见或不一致。考虑到 LLM是在大量文本语料库上训练的,它们还可能继承各种隐性偏见,影响其评估的公平性和可靠性。

目前,常见的评估方法主要分为两种:自动评估和人工评估。其分类标准基于评估是否可以自动计算:若评估标准能够自动计算,则归类为自动评估;否则,归类为人工评估。关于LLM评估的详细指南可以查看huggingface提供评估工具:evaluation-guidebook。

https://arxiv.org/pdf/2310.19736

2.3.1 LLM自动评估

自动评估是最常见且广泛应用的评估方法之一,通常利用标准化的指标和工具来衡量模型性能。与人工评估相比,自动评估不依赖大量人工参与,能够节省时间并减少人为主观偏差,从而使评估过程更加规范化。自动评估通常从多个维度对模型进行评价,包括准确率、校准性、公平性和鲁棒性等:

  1. 准确率:衡量模型在特定任务上正确预测的程度。准确率的定义因任务和问题的不同而有所差异,通常使用多种指标进行衡量,如精确匹配、F1 分数和 ROUGE 分数。

    • 精确匹配(Exact Match):用于评估模型在文本生成任务中的输出是否与参考答案完全一致。在问答任务中,如果模型生成的答案与人工提供的答案完全一致,则精确匹配为1,否则为0。
    • F1分数:综合考虑模型的精度和召回率。
    • ROUGE分数:主要用于评估文本摘要和机器翻译任务,衡量生成文本与参考文本之间的重叠和匹配程度。
  2. 校准性:衡量模型输出的置信度与实际预测精度之间的一致性。

    • 期望校准误差(Expected Calibration Error):评估模型校准性能的常用方法。该方法通过将预测概率划分为多个区间,计算每个区间内的预测误差,并对这些误差加权平均,得出整体的校准误差。较低的值表示模型在不同置信度水平下具有较好的校准性。
    • 选择性准确率和覆盖率的曲线下面积(AUC):选择性准确率表示在特定置信度阈值下,模型正确预测的比例,而覆盖率则是该置信度阈值下,模型预测结果中有效预测的比例。通过绘制选择性准确率与覆盖率之间的关系曲线,可以计算出其曲线下面积AUC。AUC值较大的模型通常表明高置信度的预测更为准确。
  3. 公平性:评估模型对不同群体表现的一致性,即模型在不同群体中的表现是否公平。群体差异可能涉及性别、种族、年龄等因素:

    • 人口平衡差异(Demographic Parity Difference):衡量模型的预测是否在不同人群之间均匀分布。如果不同群体的预测结果差异较大,说明模型可能存在对某些群体的偏见。
    • 平等机会差异(Equalized Odds Difference):旨在确保模型在不同群体中具有相等的错误率,即模型在各群体中的预测错误概率应相似。
  4. 鲁棒性:评估模型在面对各种挑战性输入时的表现,包括对抗性攻击、数据分布变化和噪声等因素的影响:

    • 攻击成功率(Attack Success Rate):用于评估LLM在面对对抗性攻击时的鲁棒性。
    • 性能下降率(Performance Drop Rate):评估LLM在面对不同提示词时的鲁棒性,衡量模型性能在这些情况下的下降程度。

https://www.airtrain.ai/blog/the-comprehensive-guide-to-llm-evaluation

2.3.2 LLM人工评估

随着LLM能力的不断增强,它们已经超越了传统的通用自然语言任务评估标准。虽然一些生成任务可以采用自动评估方法,但在人类评估的情况下,生成结果往往能超越标准答案,因此备受青睐。

人工评估是一种通过人类参与来评估模型生成结果质量和准确性的方法。与自动评估相比,人工评估更贴近实际应用场景,能够提供更全面、准确的反馈。在LLM的人工评估中,通常会邀请评估者(如专家、研究人员或普通用户)对模型生成的结果进行评价。然而,即使是人工评估也可能存在较大的波动和不稳定性,这可能与文化差异和个体差异有关。在实际应用中,通常会综合考虑这两种评估方法,并根据具体情况进行权衡。

探索LLM的人工评估方法需要特别关注多个关键因素,以确保评估结果的可靠性和准确性。评估者的数量是一个至关重要的因素,它与评估的代表性和统计意义密切相关。合理选择评估者数量有助于对LLM进行更细致、全面的评估,从而更可靠地将评估结果推广到更广泛的场景中。

评估标准是人工评估过程中的核心内容。这些标准能够全面分析LLM在语法、语义和上下文等方面的表现,从而更深入地评估生成文本的质量。常见的评估标准包括:

  1. 准确性:准确性是评估标准中最为关键的一项,关注生成文本的正确性与精确性。该标准要求检查模型生成的信息是否与事实一致,避免出现错误或不准确的内容。
  2. 相关性:相关性评估生成内容的适切性和重要性,考察文本是否与给定的上下文或问题紧密相关,确保提供的信息不仅直接相关,还具有实际应用价值。
  3. 流畅性:流畅性评估模型生成内容的连贯性和一致性。一个流畅的文本不仅语法正确,还需确保可读性和用户体验,避免出现生硬的表达或突兀的语言转换。
  4. 透明性:透明性关注模型决策过程的清晰度与可解释性,评估模型是否能够清晰地传达其思维过程,使用户理解为何以及如何生成某些回答。透明的模型能够提供对其内部工作原理的深入洞察。
  5. 安全性:安全性是评估标准中的一个关键项,关注生成文本可能带来的潜在风险或不良后果。该标准评估模型在避免生成不适当、冒犯性或有害内容方面的能力,确保用户的安全,并防止虚假信息的传播。
  6. 人类对齐性:人类对齐性评估生成内容是否符合人类的价值观、偏好和期望。该标准关注生成内容的伦理影响,确保模型生成的文本符合社会规范与用户期望,促进积极的用户互动。

2.3.3 LLM评估工具

随着LLM在各行各业及应用场景中的广泛应用,评估流程在自然语言处理、内容生成、客户服务自动化等任务中的重要性日益凸显。与此同时,随着LLM技术的不断进步,涌现出一系列自动化评估工具、评估数据集和评估基准,以更好地满足日益增长的实际应用需求。开源仓库Awesome-LLM和Awesome LLM Eval提供了各类LLM评测工具、基准/数据集、排行榜等内容的精选资源。

如果想了解LLM的评估情况,尤其是当前开源LLM的表现,可以参考Open LLM排行榜,这是由Hugging Face 设立的一个专注于评测开源LLM的公开榜单。该排行榜汇集了多个模型的评测结果,展示了各种模型在不同任务中的性能,包括推理速度、生成质量、理解能力等多个维度。

https://huggingface.co/spaces/open-llm-leaderboard/open_llm_leaderboard#/

2.4 LLM量化、部署、优化

2.4.1 模型量化

随着LLM技术的迅猛发展,其模型复杂度呈现出指数级增长,导致参数数量的显著增加。例如,2018年发布的首个GPT模型拥有约1.1亿个参数,而至2019年底,GPT-2的参数量已扩展至15亿,2020年底发布的GPT-3更是突破了1750亿个参数。目前,GPT-4的参数量已预计突破1万亿。

这一增长伴随着一系列挑战:随着模型规模的扩大,内存需求急剧上升。这种日益增长的内存需求不仅限制了推理模型的训练与部署,也制约了基于LLM的解决方案在实际应用中的普及。因此,如何在保证模型性能的前提下缩减模型规模,成为亟待解决的核心问题。量化技术作为一种有效的解决手段,在尽可能保持性能的同时,显著降低内存占用。

量化旨在将LLM中的权重和激活值从高精度表示转化为低精度表示,即将数据从能够存储更多信息的类型转换为存储信息较少的类型。例如,将32位浮点数(float32)转换为8位整数(int8)。尽管量化技术在LLM中得到广泛应用,但它很早便在深度学习领域中得到应用,尤其在图像处理等任务中。通过减少每个权重或激活值所需的位数,量化显著减少了模型的总体大小。因此,量化不仅能够减小LLM在内存中的占用,还能降低存储需求并提升能效。然而,在提升计算效率的同时,量化技术需要在性能和精度之间寻找到合理的平衡点。

量化的基本原理是基于每个张量(tensor)的浮点型最大值与最小值,将其映射为一个固定范围内的整数集合,例如[-127, 127]。其公式可表示为:
q weight = round ( weight scale ) q_{\text{weight}} = \text{round} \left( \frac{\text{weight}}{\text{scale}} \right) qweight=round(scaleweight)
其中 q weight q_{\text{weight}} qweight 为量化后的权重, weight \text{weight} weight 为量化前的权重, scale \text{scale} scale 为缩放因子。可以看出,在进行量化时,通过缩放和取整操作,浮点数会丢失小数部分。在后续的计算或反量化过程中,由于无法完全恢复原浮点值,因此会出现一定的精度损失。

量化过程可以类比于图像压缩。高分辨率图像通常需要进行压缩,以加快网页加载速度。压缩通过去除部分数据或信息位,减小图像文件的大小。尽管压缩会在一定程度上影响图像质量,但它显著减少了文件体积,同时仍能提供较为清晰的视觉效果。

https://medium.com/@abonia/llm-series-quantization-overview-1b37c560946b

根据量化发生的阶段,量化方法可以分为两种:一种是训练后量化(Post-Training Quantization,PTQ),也称为离线量化,它在模型训练完成后对参数进行量化,不修改训练过程。在推理阶段,模型参数的动态范围将被重新计算;另一种是训练感知量化(Quantization-Aware Training,QAT),也称为在线量化,它通过修改训练过程,模拟量化对模型的影响,从而增强模型对量化误差的鲁棒性,并提高最终的准确性。在QAT过程中,训练的中间状态同时保存量化后的权重和原始未量化的权重(两者存储在内存中),推理时使用量化版本的模型,而在反向传播阶段则使用未量化的权重进行更新。QAT相较PTQ更加复杂且训练时间较长,但通常能够带来更高的准确性。

更多关于LLM量化的详细介绍可参考:Quantization Overview。

2.4.2 模型推理部署

LLM推理

LLM的推理部署有多种方式:

  • 直接使用PyTorch代码: 对于熟悉PyTorch的用户来说,可以直接利用其提供的接口进行推理。
  • 使用专用框架:
    • VLLM: 专为高效处理LLM而设计。
    • XInference: 提供便捷的部署流程,可以快速将模型部署到不同的硬件平台。
    • FastChat: 专注于对话模型的推理和优化。
  • 使用C++推理框架:
    • llama.cpp/chatglm.cpp/qwen.cpp: 提供了高性能的C++实现,适合对性能有较高要求的场景。

文本生成策略

在文本生成过程中,LLM通常采用自回归生成方式,即基于已生成的部分预测下一个部分。不同的采样策略会影响模型生成下一个词的方式,常见的采样策略包括:

  • 贪婪搜索(Greedy Search):模型根据前文内容,从词表中选择生成概率最高的下一个token。该方法简单高效,但由于始终选择概率最大值,生成的文本可能显得单调和重复。
  • 束搜索(Beam Search):与贪婪搜索不同,束搜索会同时考虑生成概率最高的k个token。在每一步生成下一个token时,模型会根据当前已生成的tokens,生成k个候选token,从而形成k²个可能的组合,并从中选择概率最高的k个序列继续生成,最终输出条件概率最优的序列。该方法能够在生成质量与多样性之间取得平衡,但可能导致生成的文本显得较为保守且不够自然。
  • 随机采样(Sampling):根据每个token的生成概率,从词表中随机选择下一个token。此方法能够增加生成文本的多样性,是目前主流的文本生成方式,但也可能导致生成的文本缺乏连贯性或逻辑性。

https://heidloff.net/article/greedy-beam-sampling/

可以看出,以上方法各自存在一定的局限性,因此LLM中引入了temperature温度参数,用于调节生成文本的随机性与确定性,并结合top-k采样和top-p采样这两种介于贪心解码和完全随机采样之间的策略,以优化文本生成过程。具体解释如下:

  • temperature:该参数控制生成文本的随机性与确定性之间的平衡。该值越高,生成的文本越具有多样性;而值越低,生成的文本则趋向于更加确定性和一致性。
  • top-k:top-k采样是对传统贪心解码策略的一种优化,它从概率排名前k的token中进行采样,允许其他高概率的token也有机会被选中。这种方式通过引入一定的随机性,有助于提升生成文本的质量。
  • top-p:top-p采样在每一步生成时,只从累积概率超过预设阈值p的最小token集合中进行随机采样,忽略低概率的token。该方法聚焦于概率分布的核心部分,避免了过多依赖概率较低的尾部元素。

top-p采样在实际应用中通常被认为比top-k采样更自然和灵活,因为它允许模型考虑更多的候选词,通过累积概率的方式来选择下一个词,从而生成的文本更加连贯和多样化,而不是像 top-k采样那样只从概率最高的几个词中选择,可能导致生成的文本过于单一和重复。

对于温度参数(temperature),首先需要了解Softmax函数的基本概念。Softmax函数广泛应用于神经网络的输出层。它将一个向量或一组实数映射到另一个向量,使得输出值位于0到1之间,并且所有输出值的总和为1。因此,Softmax函数的输出可以被解释为概率分布。

具体而言,对于输入向量 z z z中的第 i i i个元素,Softmax函数的定义为:

Softmax ( z i ) = e z i ∑ j e z j \text{Softmax}(z_i) = \frac{e^{z_i}}{\sum_{j} e^{z_j}} Softmax(zi)=jezjezi

其中, e z i e^{z_i} ezi表示 z i z_i zi的指数,而分母是所有输入元素的指数和。这样的设计确保了较大值的输入元素对应的概率较高,而较小值的输入元素对应的概率较低,但不会完全为零。

为了调整输出的概率分布,在Softmax函数中引入了温度参数(temperature parameter) T T T。温度参数 T T T可以通过修改指数部分来控制输出的平滑度。具体形式为:

Softmax ( z i , T ) = e z i / T ∑ j e z j / T \text{Softmax}(z_i, T) = \frac{e^{z_i / T}}{\sum_{j} e^{z_j / T}} Softmax(zi,T)=jezj/Tezi/T

T T T值较大时,输出的概率分布趋于平坦,即所有输出的概率接近均匀分布;而当 T T T趋向于0时,概率分布则变得更加集中,几乎所有的概率都会集中在最大的元素上。这种调整可以控制模型输出的确定性或多样性。

关于文本生成策略更详细的介绍见:https://newsletter.theaiedge.io/p/how-llms-generate-text

2.4.3 模型优化技术

随着LLM的发展,各种优化技术从不同角度不断涌现,具体包括常见以下几种:

  1. Static kv-cache and torch.compile

    • Static kv-cache(键值缓存)是一种优化技术,旨在存储LLM在解码过程中的键值对,以避免重复计算,从而提高效率。与torch.compile结合使用时,通过预先分配kv-cache的大小,可以实现静态分配,进一步优化性能,可能带来最多4倍的速度提升。
  2. Speculative decoding

    • 推测性解码是一种加速自回归模型采样的技术。它使用一个较小且更快的辅助模型生成候选token,然后由较大的LLM在单次前向传播中验证这些token。如果验证正确,LLM可以“免费”获得这些token,而不需要自己生成,且不会损失准确性。
  3. Prompt lookup decoding

    • Prompt lookup decoding适用于输入和输出之间存在重叠词汇的任务(如摘要生成)。它通过在输入提示中进行字符串匹配,生成候选token序列,从而替代传统推测性解码中的草稿模型。
  4. Attention optimizations

    • FlashAttention-2:这是一种优化算法,通过将注意力计算分解为更小的块,减少GPU内存的中间读写操作,从而加速推理过程。
    • Fine-Tuning with torch.compile and Padding-Free Data Collation:通过使用torch.compile进行微调,结合无填充数据整理技术,可以进一步提高模型运行效率。
    • PyTorch scaled dot product attention:通过硬件加速和优化的计算图来加速模型的训练和推理。
  5. VLLM

    • VLLM是一个快速且易于使用的LLM推理与服务库,支持分布式和容器化部署,且内置LLM服务,用户可通过命令直接启动。
  6. FastChat

    • FastChat是一个开源平台,旨在支持训练和分布式部署。它提供了先进模型的训练评估代码和分布式多模型服务系统,包含Web界面以及与OpenAI兼容的RESTful API。

关于这些技术的详细介绍见:llm inference optimization。

3 总结

涉及LLM的项目可能是一项艰巨的任务。它需要适当的协调和技能才能成功执行任务。一个LLM项目从最初的构思到最终部署的整个过程。可以将这个过程分为如下主要阶段:

  1. 定义项目的范围:

    • 明确目标:首先要明确这个LLM项目的目标是什么?是用于生成文本、对话助手、翻译语言、还是执行其他任务?
    • 确定范围:接下来要确定项目的范围,即这个LLM模型需要处理的数据量、任务复杂度以及所需的性能。
  2. 数据预处理和相关考虑:

    • 数据收集:收集与项目相关的大量高质量数据。
    • 数据清洗:对数据进行清洗,去除噪声、错误和不一致的数据。
    • 数据标注:为数据添加标签,以便模型能够学习到正确的关联。
  3. 选择一个基座的模型:

    • 模型选择:根据项目的需求选择一个合适的基座模型,以及是使用Base模型还是Chat模型。不同的模型在处理不同任务时表现会有所不同。
    • 考虑因素:在选择模型时,需要考虑模型的规模、参数数量、训练数据量以及计算资源等因素。
  4. 模型训练:

    • 模型训练:利用准备好的数据集和适当的训练方法对模型进行训练,特别要注重选择合适的训练策略。
    • 训练稳定性:LLM的训练相比其他深度学习模型更容易遇到意外问题,如不收敛、训练不稳定、突发中断等,要提前做好应对方案。
  5. 强化学习:

    • 交互学习:通过与环境的交互,让模型不断学习和改进。
    • 奖励机制:设计合理的奖励机制,引导模型朝着目标方向发展。
  6. 评估模型:

    • 性能评估:使用测试数据对模型的性能进行评估,以确定模型是否达到预期的效果。
    • 指标选择:选择合适的评价指标。
  7. 模型优化和部署:

    • 模型优化:对模型进行量化等,以减小模型的尺寸和提高推理速度。
    • 部署:将训练好的模型部署到实际应用中,提供服务。
  8. 模型监控和构建LLM应用:

    • 模型监控:持续监控模型的性能,及时发现问题并进行调整。
    • 应用开发:基于训练好的模型开发各种LLM应用,如聊天机器人、文本生成工具等。

https://datasciencedojo.com/blog/llm-project-lifecycle/

总之,LLM项目的整个生命周期是一个持续迭代的过程,涵盖了目标定义、模型训练、模型部署、监控以及应用开发等各个环节,且每个阶段都紧密相连、相互依赖。训练LLM的难点,不仅仅在于单一技术的挑战,更在于系统性复杂性的应对。这一过程需要数据、工程师、框架和硬件等多个方面的紧密协作与配合,才能推动工作的顺利进行。

4 参考

  • modelscope-classroom
  • Llama 2: Open Foundation and Fine-Tuned Chat Models
  • Understanding Encoder And Decoder LLMs
  • Prompt Engineering vs Fine-tuning vs RAG
  • data-prep-kit
  • LLMDataHub
  • evaluation-guidebook
  • Awesome-LLM
  • Awesome LLM Eval
  • Quantization Overview
  • How LLMs Generate Text
  • llm inference optimization

相关文章:

[深度学习] 大模型学习1-大语言模型基础知识

大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;是一类基于Transformer架构的深度学习模型&#xff0c;主要用于处理与自然语言相关的各种任务。简单来说&#xff0c;当用户输入文本时&#xff0c;模型会生成相应的回复或结果。它能够完成许多任务&…...

GitLab集成Runner详细版--及注意事项汇总【最佳实践】

一、背景 看到网上很多用户提出的runner问题其实实际都不是问题&#xff0c;不过是因为对runner的一些细节不清楚导致了误解。本文不系统性的介绍GitLab-Runner&#xff0c;因为这类文章写得好的特别多&#xff0c;本文只汇总一些常几的问题/注意事项。旨在让新手少弯路。 二、…...

STM32-笔记34-4G遥控灯

4G接线 一、项目需求 服务器通过4G模块远程遥控开关灯。 二、项目实现 复制项目文件夹38-wifi控制风扇项目 重命名为39-4G遥控点灯 打开项目文件 加载文件 main.c #include "sys.h" #include "delay.h" #include "led.h" #include "ua…...

PHP 使用集合 处理复杂数据 提升开发效率

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…...

AI代码开发实践-微信小程序开发

接上回&#xff0c;本人参加了一次小孩学校组织的护学岗&#xff0c;萌生了开发一个微信小程序的水印相机的想法&#xff0c;说干就干。 最近也是在学习用AI编程&#xff0c;索性之前也用一点&#xff0c;今天就尝试一下 工具选择&#xff0c;环境搭建 阿里-通义灵码 通义灵…...

【网络安全 | 漏洞挖掘】私有项目中的账户接管过程

未经许可,不得转载。 正文 该程序包含多个通配符目标。在逐一搜索后,我最终发现了一个具有 P4 严重级别的 IDOR 漏洞(不正确的直接对象引用),允许我删除其他用户在帖子中的评论。 其中一个目标是一个只有单个域名的网站,提供注册、登录和重置密码功能。我尝试寻找任何可…...

【算法不挂科】算法期末考试【选择题专项练习】<多单元汇总>

前言 大家好吖&#xff0c;欢迎来到 YY 滴算法不挂科系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 一.选择题 【1】算法绪论 1.算法与程序的区别是( ) A.输出 B.输入 C.确定性 D.有穷性 D 2.算法复杂度分析的两种基本方法…...

分布式消息中间件有哪些知名的产品

首先是Apache Kafka&#xff0c;它是一个分布式流处理平台&#xff0c;专注于高性能、低延迟的实时数据管道和流应用。Kafka通过分区和复制机制实现了高可用性和容错性&#xff0c;支持消息的持久化存储和高效的数据传输。其强大的生态系统还提供了丰富的客户端库和集成工具&am…...

kubernets基础入门

首先通过Kubernets架构图来认识Kubernets各个功能组件之间是怎么相互关联配合工作的。 一、Kubernets架构图&#xff1a; 通过上图来介绍集群功能组件通信详细过程&#xff1a; kubernetes api server 作为集群的核心&#xff0c;负责集群各功能模块之间的通信。集群内的各个功…...

【数据库初阶】MySQL数据类型

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; 数据库初阶 &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 亲爱的小伙伴们&#xff0c;大家好&#xff01;在这篇文章中&#xff0c;我们将深入浅出地为大家讲解 MySQL…...

(九千七-星河襟)椭圆曲线加密(ECC, Elliptic Curve Cryptography)及其例题

椭圆曲线加密&#xff08;ECC&#xff09;是一种基于椭圆曲线数学的公钥加密技术。它提供了一种高效的加密方法&#xff0c;能够在较小的密钥长度下实现与传统加密算法&#xff08;如RSA&#xff09;相同的安全级别。以下是ECC的主要特点和工作原理的总结&#xff1a; 1. 基本…...

LookingGlass使用

背景 Looking Glass 是一款开源应用程序&#xff0c;可以直接使用显卡直通的windows虚拟机。 常见环境是Linux hostwindows guest&#xff0c;基本部署结构图&#xff1a; 编译 git clone --recursive https://github.com/gnif/LookingGlass.git编译client mkdir client/b…...

ArcGIS Server 10.2授权文件过期处理

新的一年&#xff0c;arcgis server授权过期了&#xff0c;服务发不不了。查看ecp授权文件&#xff0c;原来的授权日期就到2024.12.31日。好吧&#xff0c;这里直接给出处理方法。 ArcGIS 10.2安装时&#xff0c;有的破解文件中会有含一个这样的注册程序&#xff0c;没有的话&…...

js es6 reduce函数, 通过规格生成sku

const specs [{ name: 颜色, values: [红色, 蓝色, 绿色] },{ name: 尺寸, values: [S, M, L] } ];function generateSKUs(specs) {return specs.reduce((acc, spec) > {const newAcc [];for (const combination of acc) {for (const value of spec.values) {newAcc.push(…...

Spring 事务底层原理

61 张图&#xff0c;剖析 Spring 事务&#xff0c;就是要钻到底&#xff01; 拜托&#xff01;面试请不要再问我 Transactional my&#xff1a; AOP Transactional PlatformTransactionManager&#xff1a;数据源隔离 TransactionInterceptor&#xff1a;拦截添加了注解的…...

ruoyi 分页 查询超出后还有数据; Mybatis-Plus 分页 超出后还有数据

修改&#xff1a;MybatisPlusConfig 类中 分页合理化修改为&#xff1a;paginationInnerInterceptor.setOverflow(false);...

基于Java的超级玛丽游戏的设计与实现【源码+文档+部署讲解】

目 录 1、绪论 1.1背景以及现状 1.2 Java语言的特点 1.3 系统运行环境及开发软件&#xff1a; 1.4 可行性的分析 1.4.1 技术可行性 1.4.2 经济可行性 1.4.3 操作可行性 2、 需求分析 2.1 用户需求分析 2.2功能需求分析 2.3界面设计需求分析…...

智慧工地信息管理与智能预警平台

建设背景与政策导向 智慧工地信息管理与智能预警平台的出现&#xff0c;源于工地管理面临的诸多挑战&#xff0c;如施工地点分散、危险区域多、监控手段落后等。随着政府对建筑产业现代化的积极推动&#xff0c;各地纷纷出台政策支持智慧工地的发展&#xff0c;旨在通过信息技…...

使用Apache Mahout制作 推荐引擎

目录 创建工程 基本概念 关键概念 基于用户与基于项目的分析 计算相似度的方法 协同过滤 基于内容的过滤 混合方法 创建一个推荐引擎 图书评分数据集 加载数据 从文件加载数据 从数据库加载数据 内存数据库 协同过滤 基于用户的过滤 基于项目的过滤 添加自定…...

记录:导出功能:接收文件流数据进行导出(vue3)

请求接口&#xff1a;一定要加responseType: blob 后端返回数据&#xff1a; api.js export function export() {return request({url: dev/api/export,method: get,responseType: blob,//一定要加}) } vue&#xff1a; import {export} from /api// 导出 const exportTab…...

GraphRAG vs 传统 RAG:如何通过知识图谱提升 AI 检索能力

相比传统 RAG 仅能独立检索文本片段的局限性&#xff0c;GraphRAG通过构建实体关系图谱实现了信息间的连接&#xff0c;让 AI 能更完整地理解和检索复杂的关联信息&#xff0c;从而生成更准确和连贯的回答 问题背景: 想象有一本详细记录某人(X)成就的传记,每个章节都描述了他的…...

问题清除指南|关于num_classes与 BCELoss、BCEWithLogitsLoss 和 CrossEntropyLoss 的关系

前言&#xff1a;关于「 num_classes 1 」引发的探究。 2024年尾声&#xff0c;学弟问到一个问题&#xff1a;在研究工作 CNNDetection 的github开源代码 networks/trainer.py 文件的 line 27 self.model resnet50(num_classes1) 中&#xff0c;变量 num_classes 的值为1&…...

组网实训实现

小型单元网络实现 IP划分&#xff1a; 外网:172.1.1.0/24 172.1.2.0/24 内网&#xff1a;基于192.168.3.0/24的子网划分 综合办公楼&#xff1a;192.168.3.00 000000 /26&#xff08;192.168.3.0-192.168.3.63&#xff09; 综合一楼&#xff1a;192.168.3.0000 0000 /28&…...

【DevOps】Jenkins部署

Jenkins部署 文章目录 Jenkins部署资源列表基础环境一、部署Gilab1.1、安装Gitlab1.2、修改配置文件1.3、加载配置文件1.4、访问Gitlab1.5、修改root登录密码1.6、创建demo测试项目1.7、上传代码1.8、验证上传的代码 二、部署Jenkins所需软件2.1、部署JDK2.2、部署Tomcat2.3、部…...

HTML——38.Span标签和字符实体

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>span标签和字符实体</title><style type"text/css">h1{text-align: center;}p{text-indent: 2em;}span{color: red;}</style></head><…...

doris:基于 Arrow Flight SQL 的高速数据传输链路

Doris 基于 Arrow Flight SQL 协议实现了高速数据链路&#xff0c;支持多种语言使用 SQL 从 Doris 高速读取大批量数据。 用途​ 从 Doris 加载大批量数据到其他组件&#xff0c;如 Python/Java/Spark/Flink&#xff0c;可以使用基于 Arrow Flight SQL 的 ADBC/JDBC 替代过去…...

文献阅读 | B. S. Carmo 2010

目录 一、文献名称二、原文地址三、ABSTRACT主要发现详细观察分岔分析雷诺数依赖性比较见解意义结论 四、IINTRODUCTION历史研究回顾计算研究近期研究进展研究空白与目的论文结构 一、文献名称 二、原文地址 研究目的&#xff1a;研究串列排列双圆柱体周围流场中的次级不稳定性…...

GRAPE——RLAIF微调VLA模型:通过偏好对齐提升机器人策略的泛化能力(含24年具身模型汇总)

前言 24年具身前沿模型大汇总 过去的这两年&#xff0c;工作之余&#xff0c;我狂写大模型与具身的文章&#xff0c;加之具身大火&#xff0c;每周都有各种朋友通过CSDN私我及我司「七月在线」寻求帮助/指导(当然&#xff0c;也欢迎各大开发团队与我司合作共同交付&#xff09…...

超越YOLO11!DEIM:先进的实时DETR目标检测

DEIM: DETR with Improved Matching for Fast Convergence arXiv: https://arxiv.org/abs/2412.04234 Project webpage&#xff1a;https://www.shihuahuang.cn/DEIM/ GitHub&#xff1a;https://github.com/ShihuaHuang95/DEIM 1 背景&#xff1a;DETR目标检测框架 目标检…...

django vue3实现大文件分段续传(断点续传)

前端环境准备及目录结构&#xff1a; npm create vue 并取名为big-file-upload-fontend 通过 npm i 安装以下内容"dependencies": {"axios": "^1.7.9","element-plus": "^2.9.1","js-sha256": "^0.11.0&quo…...

用户注册模块(芒果头条项目进度4)

1 创建⽤户模块⼦应⽤ 1.1 在项⽬包⽬录下 创建apps的python包。 1.2 在apps包下 创建应⽤userapp $ cd 项⽬包⽬录/apps $ python ../../manage.py startapp userapp 1.3 配置导包路径 默认情况下导包路径指向项⽬根⽬录 # 通过下⾯语句可以打印当前导包路径 print(sys.pa…...

Java Map集合、集合的嵌套

一. 概述 1. Map集合称为双列集合&#xff0c;格式&#xff1a;{key1value1, key2value2,.....},一次需要存一对数据作为一个元素。 2. Map集合的每个元素"keyvalue"称为一个键值对/键值对对象/一个Entry对象&#xff0c;Map集合也被称为"键值对集合"。 3.…...

C#中使用系统默认应用程序打开文件

有时您可能希望程序使用默认应用程序打开文件。 例如&#xff0c;您可能希望显示 PDF 文件、网页或互联网上的 URL。 System.Diagnostics.Process类的Start方法启动系统与文件关联的应用程序。 例如&#xff0c;如果文件扩展名为.txt&#xff0c;则系统会在 NotePad、WordPa…...

论文泛读《LPFHE: Low-Complexity Polynomial CNNs for Secure Inference over FHE》

文章目录 1、摘要2、介绍3、文章结构4、总结 1、摘要 Machine learning as a service (MLaaS) 在客户中越来越受欢迎。为了解决 MLaaS 中的隐私问题&#xff0c;引入了 FHE 来保护客户端的数据。  然而&#xff0c;FHE 不能直接评估 卷积神经网络 (CNNs) 中的非算数激活函数。…...

基于Spring Boot的IT技术交流和分享平台的设计与实现源码

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的IT技术交流和分享平台的设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于S…...

力扣hot100——二分查找

35. 搜索插入位置 class Solution { public:int searchInsert(vector<int>& a, int x) {if (a[0] > x) return 0;int l 0, r a.size() - 1;while (l < r) {int mid (l r 1) / 2;if (a[mid] < x) l mid;else r mid - 1;}if (a[l] x) return l;else …...

1月第一讲:WxPython跨平台开发框架之前后端结合实现附件信息的上传及管理

1、功能描述和界面 前端&#xff08;wxPython GUI&#xff09;&#xff1a; 提供文件选择、显示文件列表的界面。支持上传、删除和下载附件。展示上传状态和附件信息&#xff08;如文件名、大小、上传时间&#xff09;。后端&#xff08;REST API 服务&#xff09;&#xff1a…...

uniapp:跳转第三方地图

1.跳转第三方高德地图 //跳转地图 toMap(item){uni.navigateTo({url: (window.location.href https://uri.amap.com/navigation?to${item.lng},${item.lat},${item.shopName}&modecar&policy1&srchttps://gawl.gazhcs.com/wap/index.html&callnative0)}) },…...

源码理解 UE4中的 FCookStatsManager::FAutoRegisterCallback RegisterCookStats

官方文档&#xff1a;https://dev.epicgames.com/documentation/zh-cn/unreal-engine/API/Runtime/Core/ProfilingDebugging/FCookStatsManager文档中的注释&#xff1a; When a cook a complete that is configured to use stats (ENABLE_COOK_STATS), it will broadcast this…...

QML Text详解

1. 概述 Text 是 QML 中用来显示文本的基本组件。它可以用于创建静态的标签、标题、说明文字等&#xff0c;支持多种文本格式、样式、颜色、对齐方式等配置。Text 组件也支持动态文本内容的显示&#xff0c;可以通过绑定数据源来实时更新文本内容。 Text 组件非常灵活&#x…...

详细讲一下Prettier对我们日常开发的作用,以及详细用法

1.什么是 Prettier&#xff1f; // Prettier 是代码格式化工具&#xff0c;它可以自动调整代码格式 // 比如把这样的代码&#xff1a; function foo ( a, b ){ return ab; }// 自动格式化成这样&#xff1a; function foo(a, b) {return a b; } 2.基础配置详解 {// 控制…...

多模态论文笔记——Coca

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍多模态模型Coca&#xff0c;在DALLE 3中使用其作为captioner基准模型的原因和优势。 文章目录 ALBEF论文模型结构组成训练目标 CoCa​论文模型结构CoCa…...

24年无人机行业资讯 | 12.23-12.29

24年无人机行业资讯 | 12.23-12.29 1、 国家发改委新设低空经济司&#xff0c;助力低空经济规范发展2、商务部支持无人机民用国际贸易&#xff0c;强调出口管制与安全并重3、滨州高新区首架无人机成功下线4、 2025第九届世界无人机大会筹备推进会顺利召开5、2024年世界无人机竞…...

我们公司只有3个人,一个前端,一个后端

在当今这个数字化时代&#xff0c;各行各业都离不开互联网技术的支撑&#xff0c;而在这股技术浪潮中&#xff0c;小而美的创业公司如同雨后春笋般涌现&#xff0c;它们凭借着灵活高效、创新不断的特点&#xff0c;在市场中占有一席之地。 今天&#xff0c;就让我带你走进这样一…...

golang后台框架总结

gin [golang]gin框架接收websocket通信 - 花酒锄作田 - 博客园 golang Gin实现websocket_golang gin websocket-CSDN博客 ws测试: Websocket测试-Websocket在线测试-Websocket模拟请求工具 vmware下载: VMware16安装包详细安装教程_vmware16下载-CSDN博客...

Elasticsearch分片数量是什么意思?

Elasticsearch中的分片&#xff08;Shard&#xff09;数量是一个重要概念&#xff0c;以下为你详细介绍它的含义及相关要点&#xff1a; ### 定义 分片是Elasticsearch将索引数据进行拆分的基本单元。简单来说&#xff0c;Elasticsearch会把一个索引的数据分割成多个较小的部分…...

BerOS 文件系统路径归一化问题及其 Python 实现

题目背景 本文将讨论一道与操作系统路径归一化有关的问题&#xff0c;该问题来自 BerOS 文件系统 的设计。BerOS 是一个新型操作系统&#xff0c;其文件路径系统允许路径中的分隔符 / 重复出现。例如&#xff0c;以下路径被视为等价的&#xff1a; /usr//local//nginx/sbin//…...

【微服务】1、引入;注册中心;OpenFeign

微服务技术学习引入 - 微服务自2016年起搜索指数持续增长&#xff0c;已成为企业开发大型项目的必备技术&#xff0c;中高级java工程师招聘多要求熟悉微服务相关技术。微服务架构介绍 概念&#xff1a;微服务是一种软件架构风格&#xff0c;以专注于单一职责的多个响应项目为基…...

SQL Server 数据库 忘记密码

1、先用windows 身份验证 连接 2、安全性--登录名 3、设置 身份验证 4、重启电脑 5、登录 登陆成功!!! ------------------------------------------------------------------ --1、查询登录账号信息 ------------------------------------------------------------------ -- …...

Tableau数据可视化与仪表盘搭建-安装教程

下载 tableau.com/zh-cn/support/releases 滚动到最下方的下载 在下载的同时 我们点击登录&#xff0c;去注册一个tableau的账号 下面点击我们下载好的tableau安装程序 不要自定义安装&#xff0c;会有路径问题 点击试用14天 点击激活 激活学生 tableau.com/zh-cn/academic…...