解锁DeepSpeek-R1大模型微调:从训练到部署,打造定制化AI会话系统
目录
1. 前言
2.大模型微调概念简述
2.1. 按学习范式分类
2.2. 按参数更新范围分类
2.3. 大模型微调框架简介
3. DeepSpeek R1大模型微调实战
3.1.LLaMA-Factory基础环境安装
3.1大模型下载
3.2. 大模型训练
3.3. 大模型部署
3.4. 微调大模型融合基于SpirngBoot+Vue2开发的AI会话系统
4.源码获取
5.结语
1. 前言
在如今快速发展的AI技术领域,越来越多的企业正在将AI应用于各个场景。然而,尽管大模型(如GPT、DeepSpeek等)在多个任务上已取得显著进展,但是普通的大模型在面对特定行业或任务时,往往会出现一个问题——AI幻觉。所谓AI幻觉,是指模型生成的内容不符合实际需求,甚至包含错误或无关的信息,这对于一些行业来说,可能带来不可接受的风险,尤其是在医疗、法律、金融等领域。
对于这些行业的企业而言,精准、高效地输出行业特定内容是他们对AI的核心需求。企业希望AI能够处理行业术语、应对特殊情境,并且确保内容的准确性。然而,单纯依赖大模型进行推理,往往无法达到这样的标准,因为大模型的训练是基于通用数据集,这些数据集通常并不包含行业领域的深度知识。因此,企业通常需要一个更加定制化、精细化的模型,而这正是大模型微调技术能够提供的解决方案。
大模型微调技术通过对预训练的大模型进行进一步训练,能够根据特定领域的需求进行优化。通过提供具有代表性的领域数据,尤其是精心标注的行业特定数据,微调后的模型能够学习这些领域的专有知识,从而有效避免AI幻觉的发生,并且提供更加准确、有价值的输出。
本文将从零开始教你一步步入门AI大模型微调技术(基于DeepSpeek R1大模型),最终实现基于私有化部署的微调大模型AI会话系统。感兴趣的朋友可以继续往下看看。
2.大模型微调概念简述
大模型微调是指在已有的预训练大模型基础上,通过特定任务或领域数据进行进一步训练,使模型能够更精准地处理特定任务。与传统的训练方法不同,微调充分利用已有的大模型,减少对大量数据的依赖,同时通过对模型进行小范围的调整,使其适应新的任务。大模型微调技术在多个领域中得到了广泛应用,如文本生成、分类任务、问答系统等。
微调的核心目标是使大模型根据特定任务需求进行优化,提升其在特定应用场景中的表现。为实现这一目标,微调方法主要包括以下两种分类方式:
- 按学习范式分类:根据模型学习方式的不同,微调方法可分为有监督微调、无监督微调和半监督微调等类型。
- 按参数更新范围分类:根据在微调过程中对模型参数更新范围的不同,方法可分为全量微调和部分微调等类型。
2.1. 按学习范式分类
有监督微调(Supervised Fine-Tuning,SFT)
有监督微调是最常见的微调方式,适用于任务明确且具有标注数据的情况。通过使用人工标注的高质量数据对,模型能够学习特定任务所需的知识,从而在指定任务上提供准确的输出。
SFT示例:
training_data = [{"input": "问题", "output": "标准答案"},# 人工标注的高质量数据对
]
在有监督微调中,模型的目标是根据输入的“问题”生成一个“标准答案”。这个过程依赖于人工标注的数据,使模型能够更好地理解并生成符合实际需求的结果,有监督微调适用于需要特定答案的任务,如情感分析、文本分类、机器翻译、问答系统等。
无监督微调(Unsupervised Fine-Tuning)
无监督微调是一种不依赖人工标注的微调方式,主要利用大量未标注的文本数据进行训练。通过无监督学习,模型能够自动从原始数据中提取知识,尤其在没有标注数据或标注数据获取困难的情况下尤为有用。
无监督微调示例:
training_data = ["大量未标注文本...",# 无需人工标注的原始文本
]
这种方式通常用于模型的预训练过程,模型通过对大规模文本进行训练,学习通用的语言表示能力。无监督微调可以增强模型的语法和语义理解能力,提升其在不同任务中的表现,无监督微调适用于自然语言建模、生成任务等场景,帮助模型理解文本的结构和语义关系。
半监督微调(Semi-Supervised Fine-Tuning)
半监督微调结合了有监督和无监督学习的优点,利用标注数据和未标注数据来训练模型。常用的方法包括将未标注数据通过某种方式生成伪标签,或利用自监督学习方法,使模型在标注数据较少时也能进行有效训练。
半监督微调示例:
training_data = [{"input": "问题", "output": "标准答案"}, # 高质量人工标注数据"大量未标注文本...", # 用于填充的未标注数据
]
半监督微调适用于标注数据稀缺的场景,能够结合少量标注数据和大量未标注数据,进一步提升模型表现,这种方法在实际应用中尤其适用于标签获取困难或成本高昂的领域,如医疗、法律等行业。
2.2. 按参数更新范围分类
全量微调(Full Fine-Tuning)
全量微调是指在对预训练模型进行微调时,更新模型的所有参数。通过对特定领域数据的训练,模型的所有层都会根据新任务的数据进行调整。全量微调能够在模型中深度定制领域知识,最大程度地提升模型在目标任务中的效果。
全量微调的特点:
- 更新模型的所有参数。
- 适用于数据量较大且任务复杂的场景。
- 训练时间较长,需要大量计算资源。
全量微调适用于大规模数据集且任务复杂的场景,如文本生成、问答系统、情感分析等。它能够充分利用预训练模型进行深度学习,提供最优效果。
部分微调(Low-Rank Adaptation,LoRA)
部分微调是一种通过对预训练模型的部分参数进行微调的技术。LoRA的目标是减少微调过程中需要更新的参数数量,从而显著降低计算开销。通过低秩矩阵的方式,LoRA仅更新模型中的某些参数(如特定层的权重),使微调过程更加高效,特别适合计算资源有限的场景。
LoRA的特点:
- 只调整部分参数(如低秩矩阵分解)。
- 降低计算和内存开销。
- 适合快速微调,尤其在资源受限时。
LoRA非常适合在资源有限的情况下快速调整模型,尤其在需要快速部署且不需要全部模型调整的场景中非常有用。
在大模型微调过程中,有监督微调(SFT)与LoRA(Low-Rank Adaptation)相结合,能够充分发挥各自优势,提升模型在特定任务上的表现。具体而言,SFT通过在人工标注的数据上对模型进行微调,使其适应特定任务;而LoRA则在冻结预训练模型权重的基础上,引入低秩矩阵进行微调,减少计算开销并提高效率。将两者结合,可以在保证性能的同时,降低资源消耗。在接下来的部分,我们将详细探讨如何将SFT与LoRA相结合,进行高效的大模型微调,并展示其在实际应用中的效果。
2.3. 大模型微调框架简介
在大模型微调领域,存在多种框架,每个框架都有其独特的优势和局限性。以下是几种常见的大模型微调框架的介绍与比较:
1. Hugging Face Transformers
Hugging Face Transformers(https://huggingface.co/transformers/) 是目前最为流行的自然语言处理(NLP)框架之一,提供了丰富的预训练模型和易于使用的 API,广泛应用于各类 NLP 任务,如文本分类、问答系统等。它的特点是:
- 预训练模型丰富,支持多种模型,如 BERT、GPT、T5 等。
- 提供了高层次的 API,使得微调过程简单易懂。
- 拥有庞大的用户社区和文档支持。
尽管 Hugging Face Transformers 在许多常见任务中表现优秀,但在超大规模模型的微调和训练中,可能会面临性能瓶颈和资源消耗过大的问题。
2. DeepSpeed
DeepSpeed(Latest News - DeepSpeed )是微软开发的高效深度学习训练框架,专注于优化大规模模型训练的性能。其主要特点包括:
- ZeRO优化,显著减少内存占用,提高分布式训练的效率。
- 支持 混合精度训练,加速训练过程并减少内存需求。
- 提供分布式训练功能,支持大规模模型的训练。
DeepSpeed适合大规模模型的训练,但使用门槛较高,需要深入理解框架的底层实现。
3. Fairseq
Fairseq (fairseq documentation — fairseq 0.12.2 documentation)是 Facebook AI Research 开发的一个高效训练工具,支持多种模型架构的训练,如 Transformer 和 BART。其特点为:
- 高性能和灵活性,支持多种任务,如机器翻译、文本生成等。
- 容易扩展,支持用户自定义新的算法和模型。
Fairseq 对于需要灵活定制和扩展的场景非常适合,但其文档和社区支持相对有限。
4. LLaMA-Factory(本文使用的框架)
LLaMA-Factory (LLaMA Factory)是由国内北航开源的低代码大模型训练框架,旨在简化大模型微调过程,尤其是在支持低代码甚至零代码操作的基础上,提供极大的便利。其主要特点包括:
- 零代码操作:通过 Web UI(LlamaBoard),用户无需编写代码即可完成大规模模型的微调。
- 高效的训练方法:结合 LoRA(低秩适配)和 QLoRA 等先进技术,在保证模型性能的同时,显著降低了计算资源消耗。相较于其他框架,LLaMA-Factory 提供了更高的微调效率。
- 广泛的模型支持:支持 LLaMA、Mistral、Qwen 等多种流行的预训练模型,适应性强。
- 低成本和高性能:通过量化技术和高效算法,LLaMA-Factory 可降低模型训练成本,同时加速训练过程。
LLaMA-Factory 适合企业和研究人员需要快速、高效地微调大模型并在特定任务中应用时,尤其在低资源条件下表现突出
。
每个大模型微调框架都有其适用场景和优势。Hugging Face Transformers 以其丰富的模型和简便的 API 受到广泛欢迎,适合大多数 NLP 任务。DeepSpeed 在处理超大规模模型时表现优异,适合对性能要求极高的训练任务。Fairseq 则适合需要灵活定制和高性能训练的应用场景。而 LLaMA-Factory 则在提高训练效率、降低成本和简化操作方面展现出巨大的优势,尤其在零代码操作和多种微调技术的结合下,使得大模型的微调过程更加轻松和高效。对于希望快速实现大模型微调的用户,LLaMA-Factory 无疑是一个值得优先考虑的选择。
3. DeepSpeek R1大模型微调实战
3.1.LLaMA-Factory基础环境安装
1. 安装 Anaconda(Python 环境管理工具)
1.下载 Anaconda:
- 访问 Anaconda 官网 下载适用于 Windows 系统的安装包,记得选择 Python 3.10 版本。
- 安装包约 800MB,耐心等待下载完成。
2. 安装 Anaconda(已经安装了Anaconda就跳过这步):
- 双击下载的安装程序,按照提示进行安装。
- 安装过程中,建议勾选“Add Anaconda to PATH”选项,这样方便在命令行中使用,如果你忘记勾了也没关系,后续自行配置一下环境变量就行了(环境变量->系统变量->Path中新增下图内容):
- 安装完成后,点击“Finish”结束安装。
2. 安装 Git(已经安装了git就跳过这步):
1. 下载 Git:
- 访问 Git 官网 下载适用于 Windows 的安装包。
2. 安装 Git:
- 双击安装程序,并按照默认选项进行安装。
- 安装过程中大部分选项可以保持默认,完成安装后即可使用 Git。
3. 创建项目环境
打开Anaconda Prompt(从Windows开始菜单找到),执行:
# 创建新的环境
conda create -n llama python=3.10
#运行 conda init 初始化
conda init
#这个命令会修改你的 shell 配置文件(例如 .bashrc、.zshrc 等),以便能够正确使用 conda 命令。
#conda init 执行后,需要重新启动命令提示符。关闭当前的命令提示符窗口,然后重新打开一个新的命令提示符窗口。
# 激活环境
conda activate llama
4. 安装PyTorch(AI框架)
在同一个命令窗口继续执行(llma环境):
# 安装PyTorch(支持CUDA的版本)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
5. 安装LLaMA-Factory
找到一个目录存放LLaMA-Factory项目,打开git命令窗口执行:
# 克隆项目
git clone https://github.com/hiyouga/LLaMA-Factory.git
下载完成后使用pycharm打开LLaMA-Factory工程
安装项目依赖
安装的时候确保你的环境是llma(也可以在外部命令窗口执行,这个看你自己,核心是保证依赖下载到llma环境):
pip install -e ".[torch,metrics]"
验证安装
# 测试是否安装成功
llamafactory-cli version
启动 LLama-Factory 的可视化微调界面
llamafactory-cli webui
打开http://localhost:7860/,你会看到以下界面:
3.1大模型下载
打开HuggingFace 官网(https://huggingface.co),我这里还是以deepspeek为例(1.5b)来演示,这几天qwq也很火,感兴趣的朋友也可以试试,不过要预先明确好你的电脑能承载多大的模型,关于deepspeek模型对于电脑规格的需求,我放在了我的另外一篇博客里:DeepSpeek服务器繁忙?这几种替代方案帮你流畅使用!(附本地部署教程)-CSDN博客
修改大模型存放位置:$env:HF_HOME = "E:\soft\Hugging-Face"
修改大模型下载位置:$env:HF_ENDPOINT="HF-Mirror"
安装huggingface_hub:pip install -U huggingface_hub
下载DeepSeek-R1模型:huggingface-cli download --resume-download deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B
3.2. 大模型训练
在llaMA-Factory界面(http://localhost:7860/)加载模型,图中我选的位置是E:\soft\Hugging-Face\hub\models--deepseek-ai--DeepSeek-R1-Distill-Qwen-1.5B\snapshots\ad9f0ae0864d7fbcd1cd905e3c6c5b069cc8b562,微调方法选择lora,训练阶段选择SFT(有监督微调)
接下来就是准备训练数据集了,在LLaMA-Factory工程中,打开data文件夹下的READ_ME.md文件,查看框架支持的训练数据集:
我按照identity.json的格式模拟了一个xfc.json(数据量太少会导致训练效果不好,尽量自己多生成一些):
[{"instruction": "你是谁?","input": "","output": "喵呜~我是小肥肠,一只会说话的小肥猫,是喵喵咖啡厅的服务员!今天有什么我可以帮你的吗?😸"},{"instruction": "你是猫咪吗?","input": "","output": "没错!我是猫咪,我叫小肥肠,是喵喵咖啡厅的服务员哦~喜欢猫咪吗?"},{"instruction": "你会做什么?","input": "","output": "我是喵喵咖啡厅的服务员!我的工作是给客人提供温暖的咖啡和甜点,让大家感到开心和放松!我可是个超棒的咖啡品鉴师哦!"},{"instruction": "你在咖啡厅做什么工作?","input": "","output": "喵~我负责为客人提供服务,带来美味的咖啡和甜点!我会为大家推荐最适合的饮品,保证你每一口都喝得开心!"},{"instruction": "为什么叫小肥肠?","input": "","output": "哈哈,这是因为我是一只特别可爱的小肥猫呀!喜欢吃好吃的东西,所以就叫小肥肠了~而且我也喜欢和大家分享美味的咖啡和甜点!"},{"instruction": "你是服务员吗?","input": "","output": "对呀,我是喵喵咖啡厅的服务员小肥肠!我会为你准备你喜欢的饮品,今天想要喝点什么呢?"},{"instruction": "喵喵咖啡厅是什么样的地方?","input": "","output": "喵呜~喵喵咖啡厅是一个温暖又舒适的地方,空气里弥漫着咖啡香,猫咪们在这里和我一起工作,大家可以在这里喝咖啡、吃甜点、享受悠闲的时光!"},{"instruction": "你会做咖啡吗?","input": "","output": "虽然我是一只会说话的小肥猫,但做咖啡可不是我的工作哦!不过,我可是个超棒的咖啡品鉴师,保证你每一口都喝得开心!"},{"instruction": "你有什么特别的技能?","input": "","output": "我的特别技能就是让你开心!喵呜~我能用可爱的声音和表情让你瞬间笑出来,心情都变得超级好哦!"},{"instruction": "你为什么是喵喵咖啡厅的服务员?","input": "","output": "因为我是一只特别喜欢和大家互动的小肥猫!在喵喵咖啡厅,我能和每一位客人交流,分享美味的饮品和甜点,给大家带来温暖和欢乐!"}
]
把xfc.json配置到dataset_info.json
"xfc": {"file_name": "xfc.json"
}
回到llaMA-Factory界面(http://localhost:7860/)界面,点击【Train】,设置一下训练数据集:
开始调整训练参数(我认为最难的一部分,我学了3,4天还是不太会调,你最好自己去查阅资料自己调,不要照抄我的):
如果用专业术语来解释上面的训练参数可能很多人看不懂,当时我也是看的非常吃力(现在依然比较懵,不过这个不是本文的重点,这篇文章主要讲解大模型微调入门,参数调整会放到以后的进阶篇),这里以非专业通俗易懂的预研解释一下训练参数,想象你是一位老师,将模型训练过程想象成教导一个学生学习新知识:
- 学习率(Learning Rate):就像你给学生布置作业时,告诉他每次复习多少内容。学习率决定了模型在每次“学习”时,调整知识的幅度。较小的学习率意味着每次调整都很小,学习过程更稳定,但可能需要更多时间才能学会;较大的学习率则可能导致学习过程不稳定。
- 训练轮数(Training Epochs):这相当于你让学生复习的总次数。每一轮(epoch)中,模型都会“阅读”并学习所有的训练数据。更多的训练轮数通常有助于模型更好地学习,但也需要更多的时间。
- 最大梯度范围(Max Gradient Norm):想象学生在学习过程中,如果调整过大,可能会导致学习偏离正确方向。这个参数就像是给学生设定的“学习幅度上限”,确保每次调整都在合理范围内,防止学习过程中的“过度反应”。
- 批次大小(Batch Size):这就像你一次给学生布置的作业量。较大的批次大小意味着每次学习时,模型会处理更多的数据,这有助于提高学习效率,但也需要更多的计算资源(GPU资源)。
- 梯度累积步数(Gradient Accumulation Steps):如果由于资源限制,你不能一次性给学生布置大量作业,这个参数允许你分多次累积学习效果,然后再一起调整模型的知识。这样可以在不增加计算资源的情况下,模拟更大的批次学习效果。
- 计算类型:这就像你决定用粗略的笔记还是精确的记录来记录学生的学习进度。较高的计算精可以提高学习的准确性,但可能需要更多的计算资源。
点击【开始】按钮开始训练,结束以后会提示【训练完毕】,途中的折线图是训练的效果:
(如果模型训练效果不好,可以采用增大训练轮数、学习率或者增加训练数据集的样本数来解决,这个自己下去摸索,现在博主也在摸索阶段,后期会出一篇大模型微调参数的纯干货文)
点击【Chat】检验我们的训练效果,在检查点路径选择我们刚刚训练的模型。(检查点路径” 是指 模型训练过程中的中间保存文件的位置,通常用于 恢复训练 或 加载已经训练好的模型。)点击【加载模型】,就可以开始聊天了:
3.3. 大模型部署
点击【Export】选择模型存储位置,将训练好的模型进行导出:
选择任意盘,创建deepspeekApi文件夹用于存放部署脚本,我选的是E盘(E:\deepspeekApi),进入E:\deepspeekApi,输入cmd打开命令提示符窗口:
新增conda虚拟环境(部署环境),激活环境后在该环境中下载所需依赖:
#新建deepspeekApi虚拟环境
conda create -n deepspeekApi python=3.10
#激活deepspeekApi
conda activate deepspeekApi
#下载所需依赖
conda install -c conda-forge fastapi uvicorn transformers pytorch
pip install safetensors sentencepiece protobuf
新增main.py脚本:
from fastapi import FastAPI, HTTPException
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
import logging
from pydantic import BaseModel, Field# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)app = FastAPI()# 模型路径
model_path = r"E:\deepspeek-merged"# 加载 tokenizer 和模型
tokenizer = AutoTokenizer.from_pretrained(model_path)
device = "cuda" if torch.cuda.is_available() else "cpu"
model = AutoModelForCausalLM.from_pretrained(model_path,torch_dtype=torch.float16 if device == "cuda" else torch.float32
).to(device)@app.get("/answer")
async def generate_text(prompt: str):try:# 使用 tokenizer 编码输入的 promptinputs = tokenizer(prompt, return_tensors="pt").to(device)# 使用模型生成文本,设置优化后的参数outputs = model.generate(inputs["input_ids"], max_length=100, # 增加最大长度min_length=30, # 设置最小长度top_p=0.85, # 提高top_p值temperature=0.6, # 降低温度系数do_sample=True, # 使用采样repetition_penalty=1.2, # 添加重复惩罚no_repeat_ngram_size=3, # 防止3-gram重复num_beams=4, # 使用束搜索early_stopping=True # 提前停止生成)# 解码生成的输出generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)return {"generated_text": generated_text}except Exception as e:logger.error(f"生成错误: {str(e)}")raise HTTPException(status_code=500, detail=str(e))@app.get("/health")
async def health_check():return {"status": "healthy", "model": model_path}
main.py 文件实现了一个轻量级 DeepSeek 模型推理服务,基于 FastAPI 框架构建。该服务将本地部署的大语言模型包装为 HTTP API,便于系统集成。其关键特性如下:
- ✅ 本地模型加载:直接从本地路径加载模型,无需依赖云服务
- ✅ GPU 加速支持:自动检测并使用 GPU 进行推理加速
- ✅ 参数精调:固定的生成参数配置(max_length=100, top_p=0.85, temperature=0.6...)
- ✅ 错误处理:完整的异常捕获和日志记录机制
- ✅ 健康检查:提供服务状态监控端点
运行命令uvicorn main:app --reload --host 0.0.0.0:
uvicorn main:app --reload --host 0.0.0.0 命令用于启动一个 FastAPI 应用服务器,其中 main:app 指定了应用入口(即 main.py 文件中的 app 实例),--reload 选项启用开发模式,允许在代码更改时自动重启服务器,而 --host 0.0.0.0 使服务器监听所有网络接口,允许外部设备访问。访问接口localhost:8000/answer
大模型微调加部署已经完整实现,接下来就是把它接入我们自己的定制化会话模型中。
3.4. 微调大模型融合基于SpirngBoot+Vue2开发的AI会话系统
上面章节中我们完成了大模型的微调和部署,这一章中我会把微调大模型融入到SpringBoot+Vue2搭建的AI会话系统中,关于AI会话系统,之前我就有写过相关博客,感兴趣的朋友可以移步:10分钟上手DeepSeek开发:SpringBoot + Vue2快速构建AI对话系统_springboot deepseek-CSDN博客
原来的AI会话模型接入的是云端的deepspeek模型,现在接入的是本地微调过得deepspeek1.5b模型,代码我就不粘贴了,比较简单,就是websocket加远程调用python接口(localhost:8000/answer),实现效果如下图:
后端日志:
系统界面:
这次的AI会话系统界面比之前更加精美了,想要源码的读者可以移步第四章源码获取。
4.源码获取
关注gzh后端小肥肠,点击底部【资源】菜单即可获取前后端完整源码。
5.结语
大模型微调作为一种强大的技术,能够为许多行业提供量身定制的AI解决方案,帮助企业更好地适应和优化特定任务。尽管微调大模型的过程充满挑战,但通过不断学习和实践,我们能够逐步掌握并精通这一领域。本文通过详细的步骤讲解了大模型微调的基础操作,使用LLaMA-Factory框架进行模型训练和部署,并通过FastAPI实现了本地化部署服务。这些知识为想要开展AI微调项目的朋友提供了宝贵的实践经验。
如果你对AI领域感兴趣,欢迎关注小肥肠,小肥肠将持续更新AI领域更多干货文章~~感谢大家的阅读,我们下期再见!
相关文章:
解锁DeepSpeek-R1大模型微调:从训练到部署,打造定制化AI会话系统
目录 1. 前言 2.大模型微调概念简述 2.1. 按学习范式分类 2.2. 按参数更新范围分类 2.3. 大模型微调框架简介 3. DeepSpeek R1大模型微调实战 3.1.LLaMA-Factory基础环境安装 3.1大模型下载 3.2. 大模型训练 3.3. 大模型部署 3.4. 微调大模型融合基于SpirngBootVue2…...
性能测试和Jmeter
文章目录 前言性能测试理论知识什么是性能?什么是性能测试?性能测试的作用性能测试与功能测试的区别性能测试常见术语性能测试的策略基准测试负载测试稳定性测试压力测试并发测试 常见性能测试指标响应时间并发数吞吐量点击数和错误率资源使用率 性能测试…...
Linux网络之数据链路层协议
目录 数据链路层 MAC地址与IP地址 数据帧 ARP协议 NAT技术 代理服务器 正向代理 反向代理 上期我们学习了网络层中的相关协议,为IP协议。IP协议通过报头中的目的IP地址告知了数据最终要传送的目的主机的IP地址,从而指引了数据在网络中的一步…...
数据结构第八节:红黑树(初阶)
【本节要点】 红黑树概念红黑树性质红黑树结点定义红黑树结构红黑树插入操作的分析 一、红黑树的概念与性质 1.1 红黑树的概念 红黑树 ,是一种 二叉搜索树 ,但 在每个结点上增加一个存储位表示结点的颜色,可以是 Red和 Black 。 通过对 任何…...
【大模型知识点】位置编码——绝对位置编码,相对位置编码,旋转位置编码RoPE
由于Transformer 中的自注意模块具有置换不变性(不关心输入序列的顺序),因此需要使用位置编码来注入位置信息以建模序列,使模型能够区分不同位置的 token,并捕捉序列的顺序关系。 在介绍一些位置编码方法前࿰…...
【大模型篇】推理模型大作战(QwQ-32B vs DeepSeek-R1)
大家好,我是大 F,深耕AI算法十余年,互联网大厂技术岗。分享AI算法干货、技术心得。 欢迎关注《大模型理论和实战》、《DeepSeek技术解析和实战》,一起探索技术的无限可能! 写在前面 当我让QwQ-32B vs DeepSeek-R1 写一封未来自己的信 大家更喜欢哪种风格? QwQ-32B 模…...
【汇编语言】单片机程序执行过程
一、任务需求 指示灯LED4闪烁,亮0.5秒,灭0.5秒,无限循环 二、针对硬件的编程 1、确定原理图2、确定硬件的物理关系 三、设计步骤 1.用自己的语言描述工作流程 1.1指示灯LED4亮1.2延时0.5秒1.3指示灯LED4灭1.4延时0.5秒1.5跳转到1.1步 …...
MYSQL之创建数据库和表
创建数据库db_ck (下面的创建是最好的创建方法,如果数据库存在也不会报错,并且指定使用utf8mb4) show databases命令可以查看所有的数据库名,可以找到刚刚创建的db_ck数据库 使用该数据库时,发现里面没有…...
MybatisPlus
1.增删改查入门案例: 首先导入依赖: <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version></dependency> 然后这些增删改查…...
HCIE云计算学什么?怎么学?未来职业发展如何?
随着云计算成为IT行业发展的主流方向,HCIE云计算(华为认证云计算专家)作为华为认证体系中的高端认证之一,逐渐成为了许多网络工程师和IT从业者提升职业竞争力的重要途径。 那么,HCIE云计算究竟学什么内容,如…...
小程序 -- uni-app开发微信小程序环境搭建(HBuilder X+微信开发者工具)
目录 前言 一 软件部分 1. 微信开发者工具 2. HBuilder X 开发工具 二 配置部分 1. 关于 HBuilder X 配置 2. 关于 微信开发工具 配置 三 运行项目 1. 新建项目 2. 代码编写 3. 内置浏览器 编译 4. 配置小程序 AppID获取 注意 四 实现效果 前言 uni-app开发小程…...
多线程-线程本地变量ThreadLocal
简介 ThreadLocal是线程本地变量,用于存储独属于线程的变量,这些变量可以在同一个线程内跨方法、跨类传递。每一个ThreadLocal对象,只能为当前线程关联一个数据,如果要为当前线程关联多个数据,就需要使用多个ThreadLo…...
MuBlE:为机器人操作任务规划提供了逼真的视觉观察和精确的物理建模
2025-03-05,由华为诺亚方舟实验室、捷克技术大学和帝国理工学院联合开发的MuBlE(MuJoCo and Blender simulation Environment)模拟环境和基准测试。通过结合MuJoCo物理引擎和Blender高质量渲染,为机器人操作任务规划提供了逼真的视…...
计算机网络笔记(一)——1.1计算机网络在信息时代中的作用
21世纪的一些重要特征是数字化、网络化和信息化,它是一个以网络为核心的信息时代。要实现信息化就必须依靠完善的网络,因为网络可以迅速地传递信息。网络现在已经成为信息社会的命脉和发展知识经济的重要基础。 有三大类网络大家应该很熟悉,即…...
第十五届蓝桥杯省赛电子类单片机学习过程记录(客观题)
客观试题: 01.典型的BUCK电源电路包含哪些关键器件(ABCD) A. 电容 B. 二极管 C. 电感 D. MOSFET 解析: 典型的 BUCK 电源电路是一种降压型的直流-直流转换电路,它包含以下关键器件: A.电容:电容在电路中起到滤波的作用。输入电容用于平滑输入电压的波动,减少电源噪声对…...
计算机组成与体系结构-存储系统
主存编址 存储单元:最小存储单元,一般为4bit。每个存储单元有自己的二进制编号 存储器:多个存储单元排布而成。常见的有8*4存储器(8个4bit的存储单元) 编址内容: 按字编址:存储体的最小存储单…...
better-sqlite3之exec方法
在 better-sqlite3 中,.exec() 方法用于执行包含多个 SQL 语句的字符串。与预编译语句相比,这种方法性能较差且安全性较低,但有时它是必要的,特别是当你需要从外部文件(如 SQL 脚本)中执行多个 SQL 语句时。…...
WinUI 3 支持的三种窗口 及 受限的窗口透明
我的目标 希望能够熟悉 WinUI 3 窗口的基本使用方式,了解可能出现的问题 。 WinUI 3 支持三种窗口模式,分别为:常规窗口模式、画中画模式、全屏模式。 窗口模式:常规 即我们最常见的普通窗口。 支持:显示最大化按钮…...
【运维笔记】Navicat中删除mongo 某个时间之前的数据
【运维笔记】Navicat中删除mongo 某个时间之前的数据 一、场景与需求1.1、场景1.2、需求 二、解决方案三、实战3.1、【Navicat】使用sql语句 (推荐)Step 1:使用查询窗口 - 查询Step 2:确认第一步的数据是否是需要删除的数据Step 3…...
java2025年常见设计模式面试题
1. 请解释建造者模式(Builder Pattern)及其应用场景。 答案: 建造者模式用于创建一个复杂的对象,同时允许用户只通过指定复杂对象的类型和内容就能构建它们,隐藏了复杂的构建逻辑。 示例: public class C…...
Docker部署Ragflow(完美解决502 bad gateway)
Docker快速启动Ragflow:Dev 系统准备 ubuntu server 24.04 CPU ≥ 4 cores (x86);RAM ≥ 16 GB;Disk ≥ 100 GB; 更新系统 sudo apt update 下载源码 git clone https://github.com/infiniflow/ragflow.git cd ragflow/docker # 切换稳定版本分支 git checkout -f v0.17.…...
算法中的背包问题详解:部分背包与0-1背包
1. 背包问题概述 背包问题是组合优化中的经典问题,其核心目标是:在给定容量的背包中装入一组物品,使得物品的总价值最大化。根据物品是否可分割或重复选择,背包问题分为多个变种,其中最常见的两种是: 部分…...
Stream特性(踩坑):惰性执行、不修改原始数据源
在日常开发中,Stream API 提供了一种高效且易于使用的工具集来处理集合数据。 本文主要讲解 Stream 的两个特性:惰性执行,不修改原始数据源。 为什么说这两个、而不讲下其他的特性呢?主要是因为在开发中如果忽略这两个特性的话&…...
Varlens(手机上的单反)Ver.1.9.3 高级版.apk
Varlens 是一款专业级手机摄影软件,旨在通过丰富的功能和高自由度参数调节,让手机拍摄效果媲美微单相机。以下是核心功能总结: 一、核心功能 专业拍摄模式 支持手动/自动/程序模式,可调节ISO、快门速度、EV、白平衡等参数27 提供…...
【无监督学习】层次聚类步骤及matlab实现
层次聚类 (四)层次聚类1.算法步骤2.MATLAB 实现参考资料 (四)层次聚类 层次聚类是一种通过逐层合并或分裂数据点构建树状结构(树状图,Dendrogram)的聚类方法。它分为两种类型: 凝聚…...
uploadlabs通关思路
目录 靶场准备 复现 pass-01 代码审计 执行逻辑 文件上传 方法一:直接修改或删除js脚本 方法二:修改文件后缀 pass-02 代码审计 文件上传 1. 思路 2. 实操 pass-03 代码审计 过程: 文件上传 pass-04 代码审计 文件上传 p…...
doris:Elasticsearch
Elasticsearch Catalog 除了支持自动映射 ES 元数据外,也可以利用 Doris 的分布式查询规划能力和 ES(Elasticsearch) 的全文检索能力相结合,提供更完善的 OLAP 分析场景解决方案: ES 中的多 index 分布式 Join 查询。 Doris 和 ES 中的表联合…...
JetBrains学生申请
目录 JetBrains学生免费授权申请 IDEA安装与使用 第一个JAVA代码 1.利用txt文件和cmd命令运行 2.使用IDEA新建项目 JetBrains学生免费授权申请 本教程采用学生校园邮箱申请,所以要先去自己的学校申请校园邮箱。 进入JetBrains官网 点击立即申请,然…...
PDFMathTranslate安装使用
PDF全文翻译!!!! PDFMathTranslate安装使用 它是个啥 PDFMathTranslate 可能是一个用于 PDF 文件的数学公式翻译 工具。它可能包含以下功能: 提取 PDF 内的数学公式 将数学公式转换成 LaTeX 代码 翻译数学公式的内…...
清华北大推出的 DeepSeek 教程(附 PDF 下载链接)
清华和北大分别都有关于DeepSeek的分享文档,内容非常全面,从原理和具体的应用,大家可以认真看看。 北大 DeepSeek 系列 1:提示词工程和落地场景.pdf 北大 DeepSeek 系列 2:DeepSeek 与 AIGC 应用.pdf 清华 Deep…...
2025-03-09 学习记录--C/C++-PTA 练习11-4 字符定位(最后一次找到的字符)
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 一、题目描述 ⭐️ 裁判测试程序样例: #include <stdio.h> char *match(char *s, char ch); int main(void …...
C语言数据结构之顺序表
目录 1.线性表 2.顺序表 2.1.静态顺序表 2.2.动态顺序表 2.2.1.初始化 2.2.2.清空顺序表 2.2.3.扩容+尾插 2.2.4.尾出函数 2.2.5.头插函数 2.2.6.头出函数 2.2.7.在中间位置插入 2.2.8.删除中间位置数据 2.2.9.查找函数 2.2.10.总结 3.OJ例题 3.1.合…...
【Git】合并冲突
合并冲突 可是,在实际分支合并的时候,并不是想合并就能合并成功的,有时候可能会遇到代码冲突的问题。 为了演示这问题,创建一个新的分支 dev1 ,并切换至目标分支,我们可以使用 git checkout -b dev1 一步…...
【每日学点HarmonyOS Next知识】Web跨域资源、Web长按菜单、Web拦截请求、禁止录屏、Base64图片宽高
1、HarmonyOS Web组件本地资源跨域问题? 关于资源跨域问题的解决,可以参考以下官网文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/web-cross-origin-V5 方法一 为了使Web组件能够成功访问跨域资源,开…...
高效数据分析实战指南:Python零基础入门
高效数据分析实战指南 —— 以Python为基石,构建您的数据分析核心竞争力 大家好,我是kakaZhui,从事数据、人工智能算法多年,精通Python数据分析、挖掘以及各种深度学习算法。一直以来,我都发现身边有很多在传统行业从…...
【语料数据爬虫】Python爬虫|批量采集征集意见稿数据(1)
前言 本文是该专栏的第5篇,后面会持续分享Python爬虫采集各种语料数据的的干货知识,值得关注。 在本文中,笔者将主要来介绍基于Python,来实现批量采集“征集意见稿”数据。同时,本文也是采集“征集意见稿”数据系列的第1篇。 采集相关数据的具体细节部分以及详细思路逻辑…...
电力场景绝缘子缺陷分割数据集labelme格式1585张4类别
数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数):1585 标注数量(json文件个数):1585 标注类别数:4 标注类别名称:["broken part","broken insulat…...
《C++ 构造、拷贝构造与析构函数:对象的诞生、克隆与消逝之旅》
类的6个默认成员函数 构造函数 是对一个对象实例化时的初始化 例如在C语言中写的堆的时候要初始化StackInit,而c祖师爷写的构造函数本质上就是自动调用初始化。 构造函数默认构造函数自己写的(符合规定的显示表达式) 注:一般情况下…...
uniapp uniCloud引发的血案(switchTab: Missing required args: “url“)!!!!!!!!!!
此文章懒得排版了,为了找出这个bug, 星期六的晚上我从9点查到0点多,此时我心中一万个草泥马在崩腾,超级想骂人!!!!!!!!! uniCloud 不想…...
【论文阅读】VAD: Vectorized Scene Representation for Efficient Autonomous Driving
一、介绍 VAD是华科团队设计的一个端到端无人驾驶框架,针对传统的无人驾驶框架的模块化设计的问题,该算法使用向量化的策略进行了端到端的实现。传统的模块化设计使得感知模块完全依赖于感知模块的计算结果,这一解耦实际上从规划模块的角度损…...
uniapp版本加密货币行情应用
uniapp版本加密货币行情应用 项目概述 这是一个使用uniapp开发的鸿蒙原生应用,提供加密货币的实时行情查询功能。本应用旨在为用户提供便捷、实时的加密货币市场信息,帮助用户随时了解市场动态,做出明智的投资决策。 应用采用轻量级设计&a…...
使用 Java 执行 SQL 语句和存储过程
使用 Java 执行 SQL 语句和存储过程,通常有两种主要的方式:使用 JDBC(Java Database Connectivity)或者通过框架如 Spring Data JPA、MyBatis 等。 1. 使用 JDBC 执行 SQL 语句 JDBC 是 Java 操作数据库的标准 API。以下是通过 …...
算法系列之深度优先搜索寻找妖怪和尚过河问题的所有方式
在算法学习中,深度优先搜索(DFS)是一种常用的图搜索算法,通过递归或栈实现,适合路径搜索、连通性、拓扑排序、回溯、生成、环路检测、强连通分量和可达性等问题。本文将介绍如何利用深度优先搜索解决“妖怪和尚过河问题…...
大白话JavaScript闭包实现原理与在实际开发中的应用场景
大白话JavaScript闭包实现原理与在实际开发中的应用场景 答题思路 解释闭包的概念:先简单直白地说明闭包是什么,让读者对闭包有一个初步的认识。阐述闭包的实现原理:详细讲解闭包是如何形成的,涉及到函数作用域、变量的生命周期…...
【redis】数据类型之geo
Redis的GEO数据类型用于存储地理位置信息(如经纬度),并提供高效的地理位置查询功能(如计算两地距离、搜索附近地点等)。其底层基于Sorted Set(有序集合)实现,通过Geohash编码将经纬度…...
C++后端服务器开发技术栈有哪些?有哪些资源或开源库拿来用?
一、 C后台服务器开发是一个涉及多方面技术选择的复杂领域,特别是在高性能、高并发的场景下。以下是C后台服务器开发的一种常见技术路线,涵盖了从基础到高级的技术栈。 1. 基础技术栈 C标准库 C11/C14/C17/C20:使用现代C特性,如…...
第五次CCF-CSP认证(含C++源码)
第五次CCF-CSP认证 第一道(easy)思路及AC代码 第二道(easy)思路及AC代码solution 1solution 2 第三道(mid)思路及AC代码(mid) 第一道(easy) 题目链接 思路及…...
tcp udp区别
TCP(传输控制协议) 和 UDP(用户数据报协议) 是两种常用的传输层协议,它们在数据传输方式、可靠性和应用场景等方面有显著区别。以下是它们的主要区别: 1. 连接方式 TCP:面向连接的协议。通信前需…...
驱动 AI 边缘计算新时代!高性能 i.MX 95 应用平台引领未来
智慧浪潮崛起:AI与边缘计算的时代 正悄然深植于我们的日常生活之中,无论是火热的 ChatGPT 与 DeepSeek 语言模型,亦或是 Meta 智能眼镜,AI 技术已经无形地影响着我们的生活。这股变革浪潮并未停歇,而是进一步催生了更高…...
【Keil5教程及技巧】耗时一周精心整理万字全网最全Keil5(MDK-ARM)功能详细介绍【建议收藏-细细品尝】
💌 所属专栏:【单片机开发软件技巧】 😀 作 者: 于晓超 🚀 个人简介:嵌入式工程师,专注嵌入式领域基础和实战分享 ,欢迎咨询! 💖 欢迎大家࿱…...