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

Qwen-3 微调实战:用 Python 和 Unsloth 打造专属 AI 模型

虽然大家都忙着在 DeepSeek 上构建应用,但那些聪明的开发者们却悄悄发现了 Qwen-3 的微调功能,这可是一个隐藏的宝藏,能把通用型 AI 变成你的专属数字专家。

通过这篇文章,你将学到如何针对特定用途微调最新的 Qwen-3 模型。无论是刚刚踏入 AI 领域的初学者,还是经验丰富的 AI 工程师,这篇文章都有适合你的内容。

None
Qwen3 很快就成为了大多数开发者的首选。它之所以如此受欢迎,是因为它在编码、数学、通用能力等竞争性评估中获得的基准分数。

这些基准分数超过了主要的 LLM,包括 DeepSeek-R1、o1、o3-mini、Grok-3 和 Gemini-2.5-Pro 等模型。此外,小 MoE 模型 Qwen3–30B-A3B 在激活参数数量上是 Qwen-32B 的 10 倍,甚至一个像 Qwen3–4B 这样的小模型也能与 Qwen2.5–72B-Instruct 的性能相媲美。

None

Qwen-3 模型基准

你可以从 这里 了解更多关于基准及其在特定任务中的表现。

在这篇文章中,你将深入了解如何使用 Python 和 Unsloth 对 Qwen-3 模型进行微调。

尽管微调是一个计算成本高昂的任务,但这篇文章通过使用 Google 的 Colab Notebook,尽量使其变得易于访问。

条件和设置

让我们先了解微调 Qwen-3 需要什么。这包括技术要求和设置要求的简要介绍。

Python库和框架

以下是微调 Qwen-3 模型所需的 Python 库和框架:

  • unsloth,这个包能让像 Llama-3、Mistral、Gemma 和 Qwen 这样的大型语言模型的微调速度翻倍,内存使用减少 70%,而且不会降低准确性!你可以在这里了解更多 详情。
  • torch,这个包是使用 PyTorch 进行深度学习的基础。它提供了一个强大的张量库,类似于 NumPy,但增加了 GPU 加速的优势,这对于处理 LLM 来说至关重要。
  • transformers 是一个强大且流行的开源自然语言处理(NLP)库。它为各种最先进的预训练模型提供了易于使用的接口。由于预训练模型是任何微调任务的基础,这个包有助于轻松访问训练好的模型。
  • trl 包是一个专门用于 强化学习(Reinforcement Learning, RL) 与变换器模型的 Python 库。它基于 Hugging Face 的 transformers 库构建,利用其优势,使变换器的强化学习更加易于访问和高效。
计算需求

微调大型语言模型(LLM)是一种技术,可以在不进行完整(参数)训练的情况下,使模型的响应更加结构化和特定于领域。

然而,对于大多数普通计算机硬件来说,微调大型 LLM 仍然不可行,因为所有的可训练参数以及实际的 LLM 都存储在 GPU 的 vRAM(虚拟 RAM)中,而 LLM 的巨大尺寸是实现这一目标的主要障碍。

因此,为了这篇文章,我们将微调 Qwen-3 的量化版本,该版本有 80 亿参数。这个 LLM 需要大约 8-12 GB 的 vRAM,为了使所有学习者都能访问,我们将使用 Google Colab 的免费 T4 GPU,它有 15 GB 的 vRAM。

数据准备策略

对于微调 LLM,我们需要结构化和特定于任务的数据。有许多数据准备策略,无论是从社交媒体平台、网站、书籍还是研究论文中抓取数据。

对于微调我们的 Qwen-3 模型,我们将使用推理数据集和通用聊天交互数据集。这样,我们将为我们的 LLM 赋予增强的推理能力和改进的提示理解能力。

这两个数据集将从开源的 Hugging Face Hub 加载。我们将使用 unsloth/OpenMathReasoning-minimlabonne/FineTome-100k 数据集。

在这里,unsloth/OpenMathReasoning-mini 将增强我们模型的推理和解决问题的能力,而 mlabonne/FineTome-100k 将提高通用对话能力。

Python实现

安装包

你需要在你的内核中运行以下命令:

!pip install --no-deps bitsandbytes accelerate xformers==0.0.29.post3 peft trl==0.15.2 triton cut_cross_entropy unsloth_zoo
!pip install sentencepiece protobuf datasets huggingface_hub hf_transfer
!pip install --no-deps unsloth

如果你有一个强大的 GPU 并且愿意在本地机器上进行微调任务,那么这个过程相当简单。要安装这个包,只需在你的终端中运行以下命令:

!pip install unsloth
初始化 LLM 模型及其分词器

我们将使用 unsloth 包来加载预训练模型。除了更快的下载速度外,它还提供了有助于微调 LLM 的有用技术。

初始化模型和分词器的代码如下:

from unsloth import FastLanguageModel
import torchmodel, tokenizer = FastLanguageModel.from_pretrained(model_name = "unsloth/Qwen3-8B-unsloth-bnb-4bit",max_seq_length = 2048,   # 上下文长度load_in_4bit = True,     # 4bit 使用更少的内存load_in_8bit = False,    # 稍微更准确,但内存使用量翻倍full_finetuning = False, # 现在我们已经可以进行全微调了!# token = "<YOUR_HF_TOKEN>", # 如果使用受限制的模型
)
  • 我们正在从 Hugging Face Hub 使用 FastModel.from_pretrained() 方法加载预训练的 Qwen3–8B 模型。
  • 第一个参数是 model_name,即 unsloth/Qwen3–8B-unsloth-bnb-4bit,这是 Qwen-3 模型的 80 亿参数 版本,非常适合我们的需求。
  • 通过设置 max_seq_length,我们可以处理模型的 序列长度,允许模型处理 2048 个标记的输入序列。它也会影响模型的性能、内存使用和准确性。
  • load_in_4bit 参数用于将模型量化为 4 位精度,以减少内存使用量,而你可以将 load_in_8bit 设置为 True(如果你的 GPU 支持),因为它会提高准确性,但内存成本会增加一倍。
  • full_finetuning 标志设置为 False,这使得我们能够进行 参数高效的微调(PEFT),而不是更新所有模型参数。

None

初始化 Qwen-3 模型和分词器

添加 LoRA 适配器

我们将为预训练的 Qwen-3 模型添加 LoRA 矩阵,这将有助于微调模型的响应。使用 unsloth,整个过程只需要几行代码。

代码如下:

model = FastLanguageModel.get_peft_model(model,r = 32,target_modules = ["q_proj", "k_proj", "v_proj", "o_proj","gate_proj", "up_proj", "down_proj",],lora_alpha = 64,lora_dropout = 0,bias = "none",use_gradient_checkpointing = "unsloth", # True 或 "unsloth" 用于非常长的上下文random_state = 3433,
)

代码解释:

  • FastModel.get_peft_model() 方法将 参数高效的微调(PEFT) 应用于我们刚刚初始化的 Qwen-3 基础模型,以实现高效的适应。
  • r 参数(秩)控制 LoRA 适应矩阵 的大小,值越高可以提高准确性,但可能会导致过拟合。lora_alpha 作为缩放因子,通常设置为 r 的相等或两倍。
  • 我们将 lora_dropout 设置为 0,表示不应用 dropout,bias="none" 表示我们不微调偏置。
  • 设置 random_state=3433 就像给新模型留下了一个指纹,确保在微调过程中结果的一致性和可重复性。
数据准备

现在,我们已经在预训练的 Qwen-3 模型上设置了 LoRA 适配器。接下来,我们可以开始准备用于训练模型的数据。

我们将使用 unsloth/OpenMathReasoning-minimlabonne/FineTome-100k 数据集来微调模型,并从 Hugging Face 加载数据集。

加载数据集的代码如下:

from datasets import load_dataset
reasoning_dataset = load_dataset("unsloth/OpenMathReasoning-mini", split = "cot")
non_reasoning_dataset = load_dataset("mlabonne/FineTome-100k", split = "train")

在这里,数据集 unsloth/OpenMathReasoning-mini 将用于增强 LLM 的推理能力,为此,我们只需要数据的 COT(Chain-Of-Thought,思维链)部分。

现在,我们需要将数据结构标准化,以匹配聊天式微调的预期格式,例如处理“用户”和“助手”的角色。这一步也可以用于生成对话式的输入,以便将查询传递给数据集中的问题。这样,我们就可以对齐实际传递给 LLM 的查询方式。

标准化数据集的代码如下:

def generate_conversation(examples):problems  = examples["problem"]solutions = examples["generated_solution"]conversations = []for problem, solution in zip(problems, solutions):conversations.append([{"role" : "user",      "content" : problem},{"role" : "assistant", "content" : solution},])return { "conversations": conversations, }

这个函数 generate_conversation 将单独的查询及其各自的解决方案转换为对话,包含用户和助手的响应。

现在,我们需要将这个函数映射到实际的数据集上,代码如下:

reasoning_conversations = tokenizer.apply_chat_template(reasoning_dataset.map(generate_conversation, batched = True)["conversations"],tokenize = False,
)

现在,我们还需要处理我们加载的非推理数据集。为此,我们将使用 UnSloth 聊天模板库中的 standardize_sharegpt 函数来修正数据集的格式。

from unsloth.chat_templates import standardize_sharegpt
dataset = standardize_sharegpt(non_reasoning_dataset)non_reasoning_conversations = tokenizer.apply_chat_template(dataset["conversations"],tokenize = False,
)
数据比例

现在我们已经准备好了两个数据集,通常这个时候就可以开始训练模型了。但我们还应该考虑模型的 聊天与推理比例

较高的聊天比例会优先考虑对话的流畅性和一般知识,而较高的推理比例则强调逻辑推理和解决问题的能力。在这两者之间取得平衡对于创建一个既能进行有趣对话又能解决复杂任务的多功能模型至关重要。

在本文中,我们假设我们想要一个聊天模型,因此我们将聊天部分设置为 70%,推理部分设置为 30%。实现方法如下:

import pandas as pd# 定义聊天部分的比例
chat_percentage = 0.7# 按照比例对非推理数据集进行采样
non_reasoning_subset = pd.Series(non_reasoning_conversations)
non_reasoning_subset = non_reasoning_subset.sample(int(len(reasoning_conversations) * (1.0 - chat_percentage)),random_state = 2407,
)

现在,我们在数据准备过程中的最后一步是将两个数据集合并,代码如下:

data = pd.concat([pd.Series(reasoning_conversations),pd.Series(non_reasoning_subset)
])
data.name = "text"from datasets import Dataset
combined_dataset = Dataset.from_pandas(pd.DataFrame(data))
combined_dataset = combined_dataset.shuffle(seed = 3407)

训练

现在我们已经准备好了结构化的数据和带有 LoRA 适配器或矩阵的模型,我们可以开始训练模型了。

为了训练模型,我们需要初始化一些超参数,这些参数将有助于训练过程,并且会在一定程度上影响模型的准确性。

我们将使用 SFTTrainer 初始化一个 trainer,并设置超参数。

from trl import SFTTrainer, SFTConfig
trainer = SFTTrainer(model = model,tokenizer = tokenizer,train_dataset = combined_dataset, # 结构化的数据集eval_dataset = None,args = SFTConfig(dataset_text_field = "text", # 数据集中用于训练的结构化字段per_device_train_batch_size = 2, # 每个设备每个批次处理的样本数量gradient_accumulation_steps = 4, # 在执行反向传播之前累积梯度的步数warmup_steps = 5, # 训练开始时逐步增加学习率的步数# num_train_epochs = 1, # 设置为 1 以进行完整的训练运行max_steps = 30, # 要执行的总训练步数learning_rate = 2e-4, # 训练期间更新权重的学习率logging_steps = 1, # 训练指标记录的频率(以步数为单位)optim = "adamw_8bit", # 优化器weight_decay = 0.01, # 用于防止过拟合的正则化lr_scheduler_type = "linear", # 用于控制学习率衰减seed = 3407,report_to = "none", # 用于记录指标的平台,也可以是 'wandb'),
)

代码解释:

  • SFTTrainertrl 库中用于在自定义数据集上微调大型语言模型的工具。它提供了诸如梯度累积、混合精度优化等技术,非常适合指令微调、对话生成以及特定领域的 LLM 适应等任务。
  • SFTTrainer 中,我们传入了模型、分词器和我们刚刚准备好的训练数据集,并将评估数据集设置为 None,以满足我们的用例。

现在,我们已经完成了所有设置,模型已经准备好开始训练。开始训练的代码如下:

trainer_stats = trainer.train()

这将在每个训练步骤中在内核中打印训练损失,如下所示:

None

训练带有 LoRA 适配器的 Qwen3 模型

推理

现在我们已经完成了模型的训练,接下来只需要对微调后的模型进行推理,以评估其响应。

有两种方法可以对模型进行推理,一种是启用思考,另一种是禁用思考。

不思考模式

禁用思考时对模型进行推理的代码如下:

messages = [{"role" : "user", "content" : "Solve (x + 2)^2 = 0."}
]
text = tokenizer.apply_chat_template(messages,tokenize = False,add_generation_prompt = True, # 必须添加以进行生成enable_thinking = False, # 禁用思考
)from transformers import TextStreamer
_ = model.generate(**tokenizer(text, return_tensors = "pt").to("cuda"),max_new_tokens = 256, # 增加此值以获得更长的输出temperature = 0.7, top_p = 0.8, top_k = 20,streamer = TextStreamer(tokenizer, skip_prompt = True),
)
  • 在这里,为了对模型进行推理,我们初始化分词器以处理 Qwen3 聊天格式/模板中的对话。
  • 在将 chat_template 应用于消息(输入)时,我们明确指定了模型在响应时不进行思考。
  • max_new_token 设置为 256,你可以根据需要调整此值以获得更长的输出。

此推理的输出如下:

None

禁用思考时微调后的 Qwen-3 模型的推理输出。

如果图片不太清晰,以下是文字版的输出内容:

<|im_start|> To solve the equation (x + 2)² =0, we can take the square root of the both sides. This gives us x+2 = 0. Then, we can subtract 2 from both sides to get x = -2. <|im_end|>

思考模式

我们刚刚看到,当告诉模型不进行思考时,模型直接给出了答案,这正是我们所期望的!

禁用思考的方法既有优点也有缺点,因为它虽然减少了计算需求并加快了输出生成速度,但对于解决复杂问题来说并不可靠——在那种情况下,我们需要模型进行思考。

要启用思考以进行响应,我们需要按照以下方式操作:

messages = [{"role" : "user", "content" : "Solve (x + 2)^2 = 0."}
]
text = tokenizer.apply_chat_template(messages,tokenize = False,add_generation_prompt = True, # 必须添加以进行生成enable_thinking = True, # 启用思考
)from transformers import TextStreamer
_ = model.generate(**tokenizer(text, return_tensors = "pt").to("cuda"),max_new_tokens = 1024, # 增加此值以获得更长的输出temperature = 0.6, top_p = 0.95, top_k = 20,streamer = TextStreamer(tokenizer, skip_prompt = True),
)
  • 在这里,我们修改了 enable_thinking 标志。
  • 我们将 max_new_token 的数量增加到了 1024,你可以根据对问题的思考来调整这个值。

上述推理的输出如下:

None

启用思考时微调后的 Qwen-3 模型的推理输出。

在这里,我们可以看到模型为了回答这样一个简单的问题所达到的深度。而且,那些 <think> 标签也可见。

保存模型

这一步完成了整个微调模型的过程,现在我们可以保存微调后的模型,以便进行推理或在未来使用。

我们还需要将分词器与模型一起保存。以下是将完整的(合并后的)微调模型保存到本地系统的方法:

model.save_pretrained_merged("Qwen3-16bit-OpenMathReasoning-Finetuned-Merged", tokenizer, save_method = "merged_16bit")
  • 在这里,我们将微调后的模型命名为 Qwen3–16bit-OpenMathReasoning-Finetuned-Merged,但你可以选择自己的名称。

总结

  • 大型语言模型,简单来说,就是深度学习架构(如 Transformer)的一个漂亮实现,它被大量语言文本数据喂养或训练。
  • Qwen3 通过在许多现有的最佳大型语言模型中脱颖而出,包括 DeepSeek-R1、o1、Gemini-2.5-pro 等,占据了竞争地位。
  • 微调 LLM 是一个过程,即向模型提供一些特定于任务的数据,以量身定制其响应,从而提高其准确性,并使其响应更加专门化和特定于领域。
  • chat_template 表示用于标记多轮对话的骨架,以确保模型正确区分系统、用户和助手消息。
  • 我们使用的主要 Python 库和框架是 unslothtorchtransformerstrl。此外,我们还讨论了微调 LLM 的计算要求。
  • 我们对数据集进行了结构化,以便有效地微调模型,然后使用 SFTTrainer 进行了训练。
  • 我们还将 LoRA 适配器或矩阵与预训练模型合并

Today’s Inspiration

“有人今天坐在树荫下,是因为很久以前有人种下了一棵树。” —— 沃伦·巴菲特

相关文章:

Qwen-3 微调实战:用 Python 和 Unsloth 打造专属 AI 模型

虽然大家都忙着在 DeepSeek 上构建应用&#xff0c;但那些聪明的开发者们却悄悄发现了 Qwen-3 的微调功能&#xff0c;这可是一个隐藏的宝藏&#xff0c;能把通用型 AI 变成你的专属数字专家。 通过这篇文章&#xff0c;你将学到如何针对特定用途微调最新的 Qwen-3 模型。无论…...

微软Build 2025:Copilot Studio升级,解锁多智能体协作未来

微软Build 2025大会圆满落幕&#xff0c;作为年度科技盛会&#xff0c;它一直是开发与AI技术突破性创新的重要展示平台。对于工程师、创作者和领域专家来说&#xff0c;这是了解微软生态未来动向的关键时刻。今年&#xff0c;Microsoft Copilot Studio推出了一系列新功能&#…...

设计模式——系统数据建模设计

摘要 本文主要介绍了UML在软件系统分析和设计中的应用&#xff0c;详细阐述了六大类关系&#xff08;泛化、实现、依赖、关联、聚合、组合&#xff09;及其在UML类图中的表示方法&#xff0c;并通过具体例子说明了这些关系在实际编程中的应用。同时&#xff0c;文章还概述了UM…...

解决docker运行zentao 报错:ln: failed to create symbolic link ‘/opt/zbox/tmp/mysq

1 背景描述 禅道使用docker部署运行过一段&#xff0c;服务正常。 后因服务器断电重启&#xff0c;禅道服务也随docker一起启动&#xff0c;但是服务却无法访问。如下如&#xff1a; 2 查看日志&#xff0c;定位原因 查看禅道日志&#xff1a; # docker logs zentao容器di…...

Spring Boot MVC自动配置与Web应用开发详解

Spring Boot MVC自动配置机制 Spring Boot通过自动配置功能为MVC应用提供了开箱即用的默认配置&#xff0c;开发者无需手动配置即可获得完整的Web支持。以下是核心功能的实现原理&#xff1a; 静态资源支持 默认情况下&#xff0c;Spring Boot会自动从以下classpath目录提供…...

OA工程自动化办公系统 – 免费Java源码

概述 功能完备的OA工程自动化办公系统Java源码&#xff0c;采用主流技术栈开发&#xff0c;无论是学习SpringBoot框架还是开发企业级应用&#xff0c;都是不可多得的优质资源。 主要内容 技术架构 ​​后端技术栈​​&#xff1a; 核心框架&#xff1a;SpringBoot 2.xORM框…...

Apache IoTDB V2.0.3 发布|新增元数据导入导出脚本适配表模型功能

Release Announcement Version 2.0.3 Apache IoTDB V2.0.3 已经发布&#xff01; V2.0.3 作为树表双模型正式版本&#xff0c;主要新增元数据导入导出脚本适配表模型、Spark 生态集成&#xff08;表模型&#xff09;、AINode 返回结果新增时间戳&#xff0c;表模型新增部分聚…...

某校体育场馆结构自动化监测

1. 项目简介 某小学学校成立于2020年&#xff0c;是一所公办小学&#xff0c;以高起点定位为该区优质教育新增长极&#xff0c;依托当地学院及教师进修学院附属小学资源&#xff0c;注重学生综合素质培养&#xff0c;近年来&#xff0c;该小学聚焦“五育” 领域&#xff0c;不…...

MySQL 9.0 相较于 MySQL 8.0 引入了多项重要改进和新特性

MySQL 9.0 相较于 MySQL 8.0 引入了多项重要改进和新特性,以下是两者的主要区别及其详细说明: 1. 认证机制 MySQL 8.0 支持 mysql_native_password 和 caching_sha2_password 认证插件。默认使用 caching_sha2_password,但未完全移除 mysql_native_password。MySQL 9.0 完全…...

Android 3D球形水平圆形旋转,旋转动态更换图片

看效果图 1、事件监听类 OnItemClickListener&#xff1a;3D旋转视图项点击监听器接口 public interface OnItemClickListener {/*** 当旋转视图中的项被点击时调用** param view 被点击的视图对象* param position 被点击项在旋转视图中的位置索引&#xff08;从0开始&a…...

数据结构与算法学习笔记(Acwing 提高课)----动态规划·树形DP

数据结构与算法学习笔记----动态规划树形DP author: 明月清了个风 first publish time: 2025.6.4 ps⭐️树形动态规划&#xff08;树形DP&#xff09;是处理树结构问题的一种动态规划方法&#xff0c;特征也很明显&#xff0c;会有一个树形结构&#xff0c;其实是DFS的优化。…...

FTP 和 SFTP 介绍及 C/C++ 实现分析

1. FTP 协议概述 FTP&#xff08;File Transfer Protocol&#xff09;是一种用于在网络上进行文件传输的标准协议&#xff0c;诞生于 1971 年&#xff0c;是互联网上最早的应用层协议之一。它基于客户端 - 服务器模型&#xff0c;使用 TCP 作为传输层协议&#xff0c;默认通过 …...

leetcode hot100刷题日记——36.最长连续序列

解答&#xff1a; 实际上在哈希表中存储不重复的数字。 然后遍历哈希表&#xff0c;找间隔&#xff0c;更新最大间隔。 class Solution { public:int longestConsecutive(vector<int>& nums) {unordered_set<int>hash;for(int num:nums){hash.insert(num);}in…...

CentOS7关闭防火墙、Linux开启关闭防火墙

文章目录 一、firewalld开启、关闭防火墙1、查看防火墙状态 一、firewalld开启、关闭防火墙 以下命令在linux系统CentOS7中操作开启关闭防火墙 # 查询防火墙状态 systemctl status firewalld.service # 开启防火墙 systemctl start firewalld.service # 开机自启动防火墙 syste…...

PyTorch——搭建小实战和Sequential的使用(7)

import torch from torch import nn from torch.nn import Conv2d, MaxPool2d, Flatten, Linearclass TY(nn.Module):def __init__(self):"""初始化TY卷积神经网络模型模型结构&#xff1a;3层卷积池化&#xff0c;2层全连接设计目标&#xff1a;处理32x32像素的…...

基于大模型的腔隙性脑梗塞风险预测及治疗方案研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与方法 1.3 国内外研究现状 二、腔隙性脑梗塞概述 2.1 定义与分类 2.2 发病机制与病理生理过程 2.3 临床表现与诊断方法 三、大模型技术原理与应用现状 3.1 基本概念与技术架构 3.2 在医疗领域的应用案例与优势 3.3 …...

Python 开发效率秘籍:PyCharm、VS Code 与 Anaconda 配置与实战全解

目录 一、IDE(集成开发环境)是什么?二、Python IDE有哪些&#xff0c;哪款适合初学者&#xff1f;三、Visual Studio Code下载和安装教程3.1 VS Code下载和安装3.2 VS Code运行Python程序 四、PyCharm下载和安装教程4.1 PyCharm下载4.2 PyCharm安装4.3 运行PyCharm4.4 创建工程…...

[C]C语言日志系统宏技巧解析

代码解释&#xff1a;日志标签字符串化宏 这段代码定义了一个名为 _LOG_TAG 的宏&#xff0c;用于将 LOG_TAG_CONST 转换为字符串形式。这在日志系统中很常见&#xff0c;用于为不同模块添加标识前缀。 宏结构分析 #define _LOG_TAG STR(LOG_TAG_CON…...

自动驾驶系统研发系列—激光雷达感知延迟:自动驾驶安全的隐形隐患?

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中一起航行,共同成长,探索技术的无限可能。 🚀 探索专栏:学…...

内网应用如何实现外网访问?无公网IP本地端口网址服务提供互联网连接

一、应用程序外网访问遇到的问题 在现实的工作场景中&#xff0c;在公司内网的服务器上有很多的应用系统&#xff0c;这些系统只能局限于在公司内部使用&#xff0c;而在外网却无法使用。 二、外网访问内网应用常见的解决方案 如何在外网使用这些系统呢&#xff1f;下面简单…...

大话软工笔记—组合要素1之要素

1. 要素来源 对象是要素的来源&#xff0c;要素是从对象分解而来的。可将对象分为优化类和非优化类&#xff0c;如下图所示。 对象分类图 2. 要素的概念 2.1 要素的定义 要素&#xff0c;是构成事物必不可少的因素&#xff0c;要素的集合体构成了对象。 2.2 要素的内容 要…...

oracle从表B更新拼接字段到表A

oracle中表A怎么从表B中追加相对应的编码到表A字段里&#xff0c; 在Oracle数据库中&#xff0c;如果你想从表B中获取数据并更新到表A的某个字段里&#xff0c;可以使用UPDATE语句结合子查询来实现。假设表A有一个字段叫做code&#xff0c;你希望根据某个键&#xff08;比如id&…...

平台化 LIMS 系统架构 跨行业协同与资源共享的实现路径

在科技快速发展的今天&#xff0c;质检行业正面临着效率、合规和数据安全的多重挑战。新一代质检 LIMS 系统以智能化与平台化为核心&#xff0c;为实验室管理提供了全新的解决方案。 一、智能化&#xff1a;从数据采集到分析的全流程升级 传统质检流程中&#xff0c;人工数据录…...

RedisTemplate查询不到redis中的数据问题(序列化)

RedisTemplate查询不到redis中的数据问题(序列化) 一.问题描述 存入Redis中的值取出来却为null,问题根本原因就是RedisTemplate和StringRedisTemplate的序列化问题、代码示例&#xff1a; SpringBootTest class Redis02SpringbootApplicationTests {Autowiredprivate RedisTe…...

如何利用乐维网管进行IP管理

IP管理是网络管理中的关键环节&#xff0c;对于保障网络的正常运行、提升资源利用效率以及保障网络安全等方面都具有不可忽视的重要性。乐维网管在IP管理方面具有多种实用功能&#xff0c;以下从IP规划与分配、IP状态监测、IP冲突处理、IP审计与报表生成四个方面&#xff0c;介…...

unix/linux,sudo,其历史争议、兼容性、生态、未来展望

sudo作为一个广泛应用的系统工具,在其发展历程中,自然也伴随着一些讨论、挑战和对未来的展望。 一、 历史争议与讨论 (Historical Controversies and Discussions) 虽然sudo被广泛认为是成功的,但也存在一些历史上的讨论点或潜在的争议: 复杂性 vs. 简洁性 (sudoers语法)…...

git stash命令用法

git stash 是 Git 中一个非常有用的命令&#xff0c;它可以临时保存当前工作区的修改&#xff0c;让你可以切换到其他分支或者处理其他任务&#xff0c;而不需要提交这些还未完成的修改。 一、基本用法 1. 保存当前修改&#xff08;包括暂存区和工作区的内容&#xff09; git…...

SkyWalking如何实现跨线程Trace传递

一、概述 SkyWalking 的中构建 Trace 信息时会借助 ThreadLocal来存储一些上下文信息&#xff0c;当遇到跨线程的时候&#xff0c;如果 Trace 的上下文信息没有传递到新线程的ThreadLocal 中&#xff0c;那么链路就断开了。那么SkyWalking是如何解决这个问题的呢&#xff1f; …...

软件工程专业的本科生应该具备哪些技能

软件工程专业的本科生需要具备扎实的技术基础、良好的开发流程认知和一定的软技能&#xff0c;以适应软件开发行业的需求。以下从技术技能、开发流程与工具、软技能、实践能力等维度整理核心技能清单&#xff0c;供参考&#xff1a; 一、核心技术技能 1. 编程语言 - 必学基础语…...

使用 Spring Boot 3.3 和 JdbcTemplate 操作 MySQL 数据库

在现代的 Java 应用开发中&#xff0c;Spring Boot 提供了强大的工具来简化数据库操作。JdbcTemplate 是 Spring 提供的一个核心类&#xff0c;用于简化 JDBC 操作&#xff0c;减少样板代码。本文将介绍如何在 Spring Boot 3.3 项目中使用 JdbcTemplate 来操作 MySQL 数据库&am…...