初学者如何微调大模型?从0到1详解
本文将手把手带你从0到1,详细解析初学者如何微调大模型,让你也能驾驭这些强大的AI工具。
1. 什么是大模型微调?
想象一下,预训练大模型就像一位博览群书但缺乏专业知识的通才。它掌握了海量的通用知识,但可能无法完美胜任特定领域的细分任务。
微调(Fine-tuning) 就是在这个“通才”的基础上,喂给它特定领域或任务的小批量高质量数据,让它在保持原有通用能力的同时,成为特定领域的“专家”。这就像给一位全科医生进行专科培训,让他成为心脏病专家一样。
与从头训练(Pre-training from scratch)相比,微调的优势:
- 数据需求少: 不需要海量的无标签数据。
- 计算资源消耗低: 对GPU的要求相对较低。
- 训练时间短: 通常几个小时到几天就能完成。
- 效果显著: 能在特定任务上取得比通用模型更好的表现。
微调 vs. Prompt Engineering vs. RAG:
- Prompt Engineering: 通过精心设计输入提示(Prompt)来引导模型输出期望结果,不改变模型参数。
- RAG (Retrieval Augmented Generation): 结合外部知识库,在生成回答时检索相关信息作为上下文,不改变模型参数。
- Fine-tuning: 通过在特定数据集上继续训练,从而调整模型内部的参数。
对于需要模型学习特定风格、知识或执行特定指令格式的任务,微调往往是更优选。
2. 微调前的准备工作
在开始微调之前,你需要做好以下准备:
-
2.1 明确目标与应用场景:
- 你希望模型解决什么问题?(例如:客服问答、代码生成、特定风格的文本创作、情感分析等)
- 你的应用场景对模型的哪些能力要求较高?(例如:遵循指令、领域知识、特定输出格式)
- 干货提示: 目标越清晰,数据准备和模型选择就越有针对性。初期可以从小处着手,验证可行性。
-
2.2 理论知识储备:
- Python基础: 掌握Python编程语言。
- 深度学习基础: 了解神经网络、梯度下降、损失函数等基本概念。
- NLP基础(可选但推荐): 了解词嵌入、注意力机制等概念会有帮助。
- 干货提示: 不用精通所有理论,但理解核心概念能帮助你更好地理解微调过程和参数设置。推荐吴恩达的深度学习课程或Hugging Face的NLP课程。
-
2.3 硬件与环境:
- GPU: 微调大模型通常需要一块或多块高性能GPU。NVIDIA的GPU(如RTX 30系列、40系列,或A100/H100)是主流选择。
- 内存: 显存(VRAM)和内存(RAM)都非常重要,显存大小直接决定了你能微调多大的模型和选择多大的批次大小(batch size)。
- 软件环境:
- Python (通常 3.8+ )
- PyTorch 或 TensorFlow/JAX (PyTorch 更为流行)
- Hugging Face Transformers, Datasets, Accelerate, PEFT 库
- CUDA 和 cuDNN (如果使用NVIDIA GPU)
- 干货提示:
- 对于初学者,可以考虑使用云平台(如Google Colab Pro, AWS SageMaker, Azure ML, 国内的阿里云、腾讯云等)提供的GPU资源,按需付费,免去本地配置的麻烦。
- 如果没有GPU,可以尝试微调非常小的模型或使用CPU进行少量实验,但效率会很低。
3. 微调实战步骤详解 📝
接下来,我们将分步骤讲解微调大模型的完整流程。
-
3.1 选择合适的基础模型:
- 模型规模: 参数量(如7B, 13B, 70B)。模型越大,能力越强,但微调和推理所需的资源也越多。初学者建议从较小规模的模型(如7B)开始。
- 开源许可: 注意模型的开源协议是否允许你的使用场景(如商业用途)。
- 社区支持与文档: 选择有活跃社区和完善文档的模型,遇到问题更容易找到解决方案。
- 预训练语料: 了解模型的预训练数据是否包含与你任务相关的语言或领域。
- 热门选择:
- Llama系列 (Meta): Llama 2, Llama 3 (推荐)
- Qwen系列 (阿里通义千问): Qwen1.5, Qwen2 (对中文支持友好)
- ChatGLM系列 (智谱AI): ChatGLM3 (对中文支持友好)
- Mistral/Mixtral (Mistral AI): 高效且性能优异
-
3.2 数据准备与处理 (关键中的关键!):
- 数据质量远比数量重要! 低质量、有噪声的数据会严重影响微调效果,甚至产生负面作用。
- 数据格式:
- 指令微调 (Instruction Fine-tuning): 通常采用问答对、指令-输出对的形式。常见格式为JSON Lines (JSONL),每行一个JSON对象,包含
prompt
和completion
,或类似instruction
,input
,output
的结构。 JSON// 示例1: Alpaca 格式 {"instruction": "解释什么是机器学习。", "input": "", "output": "机器学习是人工智能的一个分支..."} {"instruction": "将以下句子翻译成英文。", "input": "你好,世界!", "output": "Hello, world!"}// 示例2: Prompt-Completion 格式 {"prompt": "用户:你好\nAI:", "completion": "你好!有什么可以帮助你的吗?"}
- 继续预训练 (Continued Pre-training): 使用纯文本格式,让模型学习特定领域的知识或风格。
- 指令微调 (Instruction Fine-tuning): 通常采用问答对、指令-输出对的形式。常见格式为JSON Lines (JSONL),每行一个JSON对象,包含
- 数据来源:
- 公开数据集: Alpaca, Dolly, OpenOrca等。
- 业务数据: 从你的实际业务场景中积累的数据 (注意数据隐私和脱敏)。
- 人工标注: 针对特定任务,人工构建高质量数据。
- 合成数据: 使用更强大的模型(如GPT-4)生成微调数据 (注意评估生成数据的质量)。
- 数据清洗与预处理:
- 去除重复、不相关、低质量的数据。
- 统一格式,处理特殊字符。
- 进行Tokenization (分词),将文本转换为模型可以理解的ID序列。Hugging Face的
tokenizer
会帮你做这件事。
- 划分数据集: 将数据划分为训练集(Training Set)和验证集(Validation Set,有时也需要测试集 Test Set)。验证集用于在训练过程中监控模型性能,防止过拟合。
- 干货提示:
- 数据增强: 对于小数据集,可以考虑同义词替换、回译等方法进行数据增强,但要保证增强后数据的质量。
- Prompt 设计: 微调数据的Prompt本身也需要精心设计,清晰、明确的指令有助于模型学习。考虑加入系统提示(System Prompt)来设定模型的角色或行为准则。
- 至少准备几百到几千条高质量的指令数据,对于简单任务,几百条可能就有效;复杂任务则需要更多。
-
3.3 选择微调策略 (PEFT大法好):
- 全量微调 (Full Fine-tuning): 更新模型的所有参数。效果可能最好,但对显存需求极大,训练时间长,初学者不推荐。
- 参数高效微调 (Parameter-Efficient Fine-tuning, PEFT): 只微调模型的一小部分参数或增加少量额外参数。显著降低显存消耗和计算成本。
- LoRA (Low-Rank Adaptation): 目前最流行的PEFT方法之一。通过在模型的某些层(通常是Attention层)旁边注入可训练的低秩矩阵来适配新任务。微调时只训练这些小矩阵,原始模型参数冻结。
- QLoRA (Quantized LoRA): LoRA的进一步优化。通过将预训练模型量化到更低精度(如4-bit),并结合LoRA进行微调,能极大降低显存占用,使得在消费级GPU上微调更大模型成为可能。强烈推荐初学者使用!
- 其他PEFT方法: Prefix Tuning, P-Tuning, Adapters等。
- 干货提示: Hugging Face的
PEFT
库 (https://huggingface.co/docs/peft) 提供了LoRA、QLoRA等多种PEFT方法的便捷实现。
-
3.4 配置训练参数 (Hyperparameters):
learning_rate
(学习率): 控制模型参数更新的幅度。通常较小,如1e-5
,2e-5
,5e-5
。过大会导致训练不稳定,过小则收敛缓慢。batch_size
(批次大小): 一次梯度更新所用的样本数。受显存限制,越大通常效果越稳定,但过大会爆显存。QLoRA可以支持更大的有效批次。num_train_epochs
(训练轮次): 整个训练数据集被模型学习的次数。通常1-5轮。轮次过多可能导致过拟合。gradient_accumulation_steps
(梯度累积步数): 当显存不足以支持较大batch_size
时,通过累积多次小批次的梯度,模拟大批次训练效果。实际batch_size = per_device_train_batch_size * num_gpus * gradient_accumulation_steps
。optimizer
(优化器): 如AdamW。lr_scheduler_type
(学习率调度器): 如cosine
,linear
,用于在训练过程中动态调整学习率。- LoRA特定参数:
r
(LoRA的秩):通常取8, 16, 32, 64。lora_alpha
:LoRA的缩放因子,通常设为r
的两倍或与r
相同。target_modules
:指定在哪些模块上应用LoRA,如["q_proj", "v_proj"]
。
- 干货提示:
- 初学者可以先从社区推荐的默认参数开始尝试。
- 使用
wandb
(Weights & Biases) 或tensorboard
等工具来追踪和可视化训练过程,便于调参。 - QLoRA关键配置(使用
bitsandbytes
库):load_in_4bit=True
bnb_4bit_quant_type="nf4"
(NF4量化类型)bnb_4bit_use_double_quant=True
(二次量化)bnb_4bit_compute_dtype=torch.bfloat16
(计算时使用的类型)
-
3.5 开始训练!🚂
- 使用Hugging Face
Trainer
API 或自定义训练循环。Trainer
API 封装了很多细节,对初学者更友好。 - 关键代码片段(概念性,具体实现依赖库和模型):
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer, BitsAndBytesConfig from peft import get_peft_model, LoraConfig, prepare_model_for_kbit_training import torch# 1. 加载Tokenizer和模型 (以QLoRA为例) model_name = "meta-llama/Llama-2-7b-hf" # 替换为你选择的模型 tokenizer = AutoTokenizer.from_pretrained(model_name) if tokenizer.pad_token is None:tokenizer.add_special_tokens({'pad_token': '[PAD]'}) # Llama等模型可能需要quantization_config = BitsAndBytesConfig(load_in_4bit=True,bnb_4bit_quant_type="nf4",bnb_4bit_compute_dtype=torch.bfloat16,bnb_4bit_use_double_quant=True, ) model = AutoModelForCausalLM.from_pretrained(model_name,quantization_config=quantization_config,device_map="auto" # 自动分配到可用GPU ) model.gradient_checkpointing_enable() # 进一步节省显存 model = prepare_model_for_kbit_training(model) # 预处理模型以支持k-bit训练# 2. 配置LoRA lora_config = LoraConfig(r=16,lora_alpha=32,target_modules=["q_proj", "v_proj"], # 示例,具体模块看模型结构lora_dropout=0.05,bias="none",task_type="CAUSAL_LM" ) model = get_peft_model(model, lora_config) model.print_trainable_parameters() # 查看可训练参数占比# 3. 加载和处理数据 (假设你已准备好 tokenized_datasets) # tokenized_datasets = ... (使用Hugging Face Datasets库加载和处理)# 4. 配置训练参数 training_args = TrainingArguments(output_dir="./output_finetuned_model",per_device_train_batch_size=1, # 根据显存调整gradient_accumulation_steps=4, # 有效batch_size = 1*4=4learning_rate=2e-4, # QLoRA通常用稍大的学习率num_train_epochs=1, # 先用1轮试试logging_steps=10,save_steps=100, # 每100步保存一次checkpointevaluation_strategy="steps", # 如果有验证集eval_steps=50, # 每50步评估一次fp16=True, # 如果GPU支持且不是QLoRA(QLoRA内部处理精度)# bf16=True, # 如果GPU支持(如A100),通常比fp16更好 )# 5. 初始化Trainer并开始训练 trainer = Trainer(model=model,args=training_args,train_dataset=tokenized_datasets["train"],eval_dataset=tokenized_datasets.get("validation"), # 可选# data_collator=... # 可能需要DataCollatorForLanguageModeling ) trainer.train()# 6. 保存模型 model.save_pretrained("./output_finetuned_lora_adapters") # 如果需要合并LoRA权重到基础模型 (可选,会增加显存占用) # merged_model = model.merge_and_unload() # merged_model.save_pretrained("./output_finetuned_merged_model") # tokenizer.save_pretrained("./output_finetuned_merged_model")
- 监控训练过程: 观察Loss曲线是否平稳下降,验证集上的指标是否提升。如果Loss长时间不下降或剧烈震荡,可能需要调整学习率或其他参数。
- 使用Hugging Face
-
3.6 评估模型效果
- 自动化评估:
- Perplexity (困惑度): 衡量模型对文本序列的流畅性和可预测性的指标,越低越好。
- 任务相关指标: 如BLEU (翻译), ROUGE (摘要), Accuracy (分类), F1-score等。
- Benchmark: 使用标准Benchmark(如MMLU, GSM8K, C-Eval)评估模型在多项能力上的表现(通常用于更全面的模型评估)。
- 人工评估: 对于生成任务,人工评估往往更可靠。设计评估维度(如指令遵循度、相关性、流畅性、安全性等),让评估者对模型输出进行打分。
- 对比评估: 将微调后的模型与微调前的基础模型、其他SOTA模型进行对比。
- 干货提示: 准备一个小的、高质量的、有代表性的“保留测试集”(Holdout Test Set),在训练中完全不使用,仅用于最终评估。
- 自动化评估:
-
3.7 模型部署与推理 🚀
- LoRA权重加载: 使用PEFT库加载基础模型,再加载训练好的LoRA权重即可进行推理,非常轻量。 Python
from peft import PeftModel from transformers import AutoModelForCausalLM, AutoTokenizerbase_model_name = "meta-llama/Llama-2-7b-hf" lora_adapter_path = "./output_finetuned_lora_adapters"base_model = AutoModelForCausalLM.from_pretrained(base_model_name, device_map="auto", torch_dtype=torch.bfloat16) # 注意与训练时精度匹配 tokenizer = AutoTokenizer.from_pretrained(base_model_name)model_with_lora = PeftModel.from_pretrained(base_model, lora_adapter_path) model_with_lora.eval() # 设置为评估模式# 推理 prompt = "解释一下什么是黑洞?" inputs = tokenizer(prompt, return_tensors="pt").to(model_with_lora.device) outputs = model_with_lora.generate(**inputs, max_new_tokens=100) print(tokenizer.decode(outputs[0], skip_special_tokens=True))
- 合并权重(可选): 可以将LoRA权重合并到基础模型中,形成一个完整的微调后模型,方便部署。但合并后模型体积会变大。
- 推理优化:
- 量化 (Quantization): 如GPTQ, AWQ,进一步压缩模型,加速推理。
- Flash Attention: 优化Attention计算,提升速度和减少显存。
- 推理服务框架: vLLM, TGI (Text Generation Inference), TensorRT-LLM 等,提供高性能推理服务。
- 干货提示: Hugging Face的
pipeline
API可以快速搭建推理流程。对于生产环境,建议使用专门的推理服务框架。
- LoRA权重加载: 使用PEFT库加载基础模型,再加载训练好的LoRA权重即可进行推理,非常轻量。 Python
-
3.8 迭代与优化 🔄
- 微调往往不是一次就能成功的。根据评估结果,你可能需要:
- 调整数据质量和数量。
- 尝试不同的基础模型。
- 调整超参数。
- 尝试不同的PEFT方法或配置。
- 这是一个不断实验、分析、改进的循环过程。
- 微调往往不是一次就能成功的。根据评估结果,你可能需要:
4. 微调的常见陷阱与建议 ⚠️
- 过拟合 (Overfitting): 模型在训练数据上表现很好,但在未见过的数据上表现差。
- 对策: 使用更多样化的数据、早停(Early Stopping)、正则化(如Dropout,LoRA本身也有一定正则效果)、减少训练轮次、增加验证集监控。
- 灾难性遗忘 (Catastrophic Forgetting): 模型在学习新知识时忘记了预训练时学到的通用能力。
- 对策: PEFT方法本身能缓解这个问题。保留一部分通用数据进行混合训练,或使用更高级的技术如EWC。对于大多数特定任务微调,如果数据和任务相关性高,这个问题不突出。
- 数据泄露 (Data Leakage): 验证集或测试集的信息意外地混入训练集。
- 对策: 严格划分数据集,确保数据独立。
- 显存不足 (Out of Memory, OOM):
- 对策: 使用QLoRA,减小
batch_size
,启用梯度累积,使用gradient_checkpointing
,选择更小的模型,使用多GPU并行(如DeepSpeed ZeRO)。
- 对策: 使用QLoRA,减小
- 训练时间过长:
- 对策: 优化数据加载,使用更高效的硬件,尝试更小的模型或更少的训练数据进行快速实验。
- “脏数据”毁所有: 再次强调数据质量的重要性!
- 初始期望过高: 微调不是万能药,它是在现有模型基础上进行优化。如果基础模型本身能力有限,微调效果也会受限。
给初学者的建议:
- 先跑通一个最小可行案例 (MVP): 用少量数据、小模型、短时间跑通整个流程,建立信心。
- 善用开源社区和工具: Hugging Face, GitHub上有大量现成代码和教程。
- 多动手实践: 理论学得再多,不如实际操作一遍。
- 记录实验: 详细记录每次实验的配置、数据、结果,便于分析和复现。
- 保持耐心: AI模型训练充满不确定性,遇到问题是常态,不断调试和学习。
5. 总结与展望 ✨
恭喜你,已经初步掌握了微调大模型的核心知识和流程!从明确目标到数据准备,从选择模型到参数配置,再到训练、评估和部署,每一步都充满了挑战与乐趣。
大模型技术仍在飞速发展,新的算法、模型和工具层出不穷。保持学习的热情,积极拥抱变化,你将在这个激动人心的AI时代大有可为!
现在,就开始你的第一次大模型微调之旅吧! 💪
相关推荐
-
2025大模型技术架构揭秘:GPT-4、Gemini、文心等九大模型核心技术对比与实战选型指南-CSDN博客
-
💡大模型中转API推荐
-
✨中转使用教程
技术交流:欢迎在评论区共同探讨!更多内容可查看本专栏文章,有用的话记得点赞收藏噜!
相关文章:

初学者如何微调大模型?从0到1详解
本文将手把手带你从0到1,详细解析初学者如何微调大模型,让你也能驾驭这些强大的AI工具。 1. 什么是大模型微调? 想象一下,预训练大模型就像一位博览群书但缺乏专业知识的通才。它掌握了海量的通用知识,但可能无法完美…...

西瓜书第十一章——降维与度量学习
文章目录 降维与度量学习k近邻学习原理头歌实战-numpy实现KNNsklearn实现KNN 降维——多维缩放(Multidimensional Scaling, MDS,MDS)提出背景与原理重述1.**提出背景**2.**数学建模与原理推导**3.**关键推导步骤** Principal Component Analy…...

Portainer安装指南:多节点监控的docker管理面板-家庭云计算专家
背景 Portainer 是一个轻量级且功能强大的容器管理面板,专为 Docker 和 Kubernetes 环境设计。它通过直观的 Web 界面简化了容器的部署、管理和监控,即使是非技术用户也能轻松上手。Portainer 支持多节点管理,允许用户从一个中央控制台管理多…...
NanoGPT的BenchMarking.py
1.Benchmarking是一种评估和比较性能的过程。在深度学习领域,它通常涉及对模型的训练速度、推理速度、内存占用等指标进行测量,以便评估不同模型、不同硬件配置或者不同软件版本之间的性能差异。 例如,当你尝试比较两个不同架构的模型&#x…...
测试用例及黑盒测试方法
一、测试用例 1.1 基本要素 测试用例(Test Case)是为了实施测试而向被测试的系统提供的一组集合,这组集合包含:测试环境、操作步骤、测试数据、预期结果等4个主要要素。 1.1.1 测试环境 定义:测试执行所需的软硬件…...
CentOS 7 环境下部署 LAMP
在 CentOS 7 环境下部署 LAMP(Linux Apache MySQL 5.7 PHP 7.4) 环境的详细步骤如下: 1. 系统准备 1.1 更新系统 sudo yum update -y 1.2 安装依赖 sudo yum install -y gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel e…...

vscode实用配置
前端开发安装插件: 1.可以更好看的显示文件图标 2.用户快速打开文件 使用步骤:在html文件下右键点击 open with live server 即可 刷力扣: 安装这个插件 还需要安装node.js即可...

React 项目中封装 Excel 导入导出组件:技术分享与实践
文章目录 前言一、为什么需要封装 Excel 组件?二、技术选型三、核心实现1. 安装依赖2. 封装Excel导出3. 封装导入组件 (UploadExcel) 总结 前言 在 React 项目中,处理 Excel 文件的导入和导出是常见的业务需求。无论是导出报表数…...
【PhysUnits】15.1 引入P1后的加一特质(add1.rs)
一、源码 代码实现了类型系统中的"加一"操作(Add1 trait),用于在编译期进行数字的增量计算。 //! 加一操作特质实现 / Increment operation trait implementation //! //! 说明: //! 1. Z0、P1,、N1 1࿰…...

【2025CCF中国开源大会】RISC-V 开源生态的挑战与机遇分论坛重磅来袭!共探开源芯片未来
点击蓝字 关注我们 CCF Opensource Development Committee 开源浪潮正从软件席卷硬件领域,RISC-V作为全球瞩目的开源芯片架构,正在重塑计算生态的版图!相较于成熟的x86与ARM,RISC-V生态虽处爆发初期,却蕴藏着无限可能。…...

python完成批量复制Excel文件并根据另一个Excel文件中的名称重命名
import openpyxl import shutil import os # 原始文件路径 original_file "C:/Users/Administrator/Desktop/事业联考面试名单/郑州.xlsx" # 读取包含名称的Excel文件 # 修改为您的文件名 wb openpyxl.load_workbook( "C:/Users/Administrator/Desktop/事…...

Vue-2-前端框架Vue基础入门之二
文章目录 1 计算属性1.1 计算属性简介1.2 计算属性示例 2 侦听器2.1 简单的侦听器2.2 深度监听2.3 监听对象单个属性 3 vue-cli3.1 工程化的Vue项目3.2 Vue项目的运行流程 4 vue组件4.1 Vue组件的三个部分4.1.1 template4.1.2 script4.1.3 style 4.2 组件之间的关系4.2.1 使用组…...

CPT208 Human-Centric Computing 人机交互 Pt.7 交互和交互界面
文章目录 1. 界面隐喻(Interface metaphors)1.1 界面隐喻的应用方式1.2 界面隐喻的优缺点 2. 交互类型2.1 Instructing(指令式交互)2.2 Conversing(对话式交互)2.3 Manipulating(操作式交互&…...
ubuntu20.04.5-arm64版安装robotjs
ubuntu20.04.5arm上使用robotjs #ssh,可选 sudo apt update sudo apt install openssh-server sudo systemctl status ssh sudo systemctl enable ssh sudo systemctl enable --now ssh #防火墙相关,可选 sudo ufw allow ssh sudo ufw allow 2222/tc…...

[网页五子棋][匹配模块]前后端交互接口(消息推送机制)、客户端开发(匹配页面、匹配功能)
让多个用户,在游戏大厅中能够进行匹配,系统会把实力相近的两个玩家凑成一桌,进行对战 约定前后端交互接口 消息推送机制 匹配这样的功能,也是依赖消息推送机制的 玩家 1 点击开始匹配按钮,就会告诉服务器࿱…...

【数据分析】Matplotlib+Pandas+Seaborn绘图
【数据分析】MatplotlibPandasSeaborn绘图 (一)Matplotlib绘图1.1 matplotlib绘图方式1: 状态接口1.2 matplotlib绘图方式2: 面向对象1.3 通过安斯科姆数据集, 说明可视化的重要性1.4 MatPlotlib绘图-单变量-直方图1.5 MatPlotlib绘图-双变量-散点图1.6 …...

NLP学习路线图(十五):TF-IDF(词频-逆文档频率)
在自然语言处理(NLP)的浩瀚宇宙中,TF-IDF(词频-逆文档频率) 犹如一颗恒星,虽古老却依然璀璨。当ChatGPT、BERT等大模型光芒四射时,TF-IDF作为传统方法的代表,其简洁性、高效性与可解…...

[Redis] Redis命令在Pycharm中的使用
初次学习,如有错误还请指正 目录 String命令 Hash命令 List命令 set命令 SortedSet命令 连接pycharm的过程见:[Redis] 在Linux中安装Redis并连接桌面客户端或Pycharm-CSDN博客 redis命令的使用见:[Redis] Redis命令(1…...

openpnp - 给M4x0.7mm的直油嘴加油的工具选择
文章目录 openpnp - 给M4x0.7mm的直油嘴加油的工具选择概述如果换上带卡口的M4x0.7直油嘴END openpnp - 给M4x0.7mm的直油嘴加油的工具选择 概述 X导轨用了一个HG15的滑块 滑块上的注油口的黄油嘴是M4x0.7mm的直油嘴。 外表面是6边形的柱子,没有可以卡住加油嘴工…...
Azure Devops 系列之三- vscode部署function app
Azure Function App 是 Microsoft Azure 提供的一项无服务器计算服务,它允许您运行事件驱动的应用程序,而无需管理底层基础架构。它使您能够执行代码来响应各种事件,例如 HTTP 请求、队列消息、计时器以及许多其他类型的触发器。 Azure Function App 的主要功能: 无服务器…...

EasyExcel复杂Excel导出
效果图展示 1、引入依赖 <!-- easyExcel --> <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>4.0.2</version> </dependency>2、实体类 import com.alibaba.excel.annotatio…...

1,QT的编译教程
目录 整体流程: 1,新建project文件 2,编写源代码 3,打开QT的命令行窗口 4,生成工程文件(QT_demo.pro) 5,生成Make file 6,编译工程 7,运行编译好的可执行文件 整体流程: 1,新建project文件 新建文本文件,后缀改为.cpp 2,编写源代码...
C++基础算法————深度优先搜索(DFS)
一、DFS算法原理 (一)基本思想 深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索树或图的算法。它从一个起始节点开始,沿着一个方向尽可能深入地探索,直到无法继续为止,然后回溯到上一个节点,继续探索其他方向。这一过程可以用递归或栈结构来实现。 (二…...
React 第五十节 Router 中useNavigationType的使用详细介绍
前言 useNavigationType 是 React Router v6 提供的一个钩子,用于确定用户如何导航到当前页面。 它提供了关于导航类型的洞察,有助于优化用户体验和实现特定导航行为。 一、useNavigationType 核心用途 1.1、检测导航方式: 判断用户是通过…...

【笔记】在 MSYS2(MINGW64)中安装 Python 工具链的记录
#工作记录 📌 安装背景 操作系统:MSYS2 MINGW64当前时间:2025年6月1日Python 版本:3.12(默认通过 pacman 安装)目标工具链: pipxnumpypipsetuptoolswheel 🛠️ 安装过程与结果记录…...
npm install命令都做了哪些事情
npm install(或其简写 npm i)是 Node.js 项目中最重要的命令之一,它负责安装项目所需的所有依赖项。下面我将详细解释这个命令的完整执行过程和底层机制,让你彻底理解它背后的工作原理。 一、npm install 的完整工作流程 1. 依赖…...

Linux 学习-模拟实现【简易版bash】
1、bash本质 在模拟实现前,先得了解 bash 的本质 bash 也是一个进程,并且是不断运行中的进程 证明:常显示的命令输入提示符就是 bash 不断打印输出的结果 输入指令后,bash 会创建子进程,并进行程序替换 证明&#x…...

【中国・珠海】2025 物联网与边缘计算国际研讨会(IoTEC2025)盛大来袭!
2025 物联网与边缘计算国际研讨会(IoTEC2025)盛大来袭! 科技浪潮奔涌向前,物联网与边缘计算已成为驱动各行业变革的核心力量。在此背景下,2025 物联网与边缘计算国际研讨会(IoTEC2025)即将震撼…...
企业级安全实践:SSL/TLS 加密与权限管理(二)
案例分析:成功与失败的经验教训 成功案例分析 以一家知名电商企业 ABC 为例,该企业每天处理数百万笔订单,涉及大量用户的个人信息、支付信息和商品数据。在网络安全建设方面,ABC 电商高度重视 SSL/TLS 加密与权限管理。 在 SSL…...
Java面试:从Spring Boot到分布式系统的技术探讨
场景一:电商平台的订单处理 面试官: “谢先生,假设我们在一个电商平台工作,你将如何使用Spring Boot构建一个订单处理服务?” 谢飞机: “这个简单,我会使用Spring Boot快速启动项目࿰…...