DASD-4B-Thinking模型蒸馏实战:BERT级小模型生成指南
DASD-4B-Thinking模型蒸馏实战BERT级小模型生成指南1. 引言如果你正在寻找一种方法能把一个40亿参数的大模型压缩到只有BERT那么小同时还能保留它90%以上的能力那你来对地方了。想象一下你有一个很厉害的DASD-4B-Thinking模型它擅长多步推理和复杂思考但问题是它太大了——需要高端GPU才能跑起来部署成本高响应速度也慢。而另一边BERT级别的模型只有几亿参数普通显卡就能轻松驾驭但推理能力又不够强。有没有办法把两者的优点结合起来这就是我们今天要聊的知识蒸馏。简单来说就是让大模型老师教小模型学生怎么思考把复杂的推理能力“传授”给更小的架构。这篇文章我会手把手带你走完整个蒸馏过程从环境准备到最终评估。你会学到注意力迁移、logits匹配、数据增强这些核心技巧最终得到一个BERT规模但性能接近原版的小模型。整个过程不需要特别复杂的硬件有张显存够用的显卡就能跟着做。2. 环境准备与快速部署2.1 系统要求我们先看看需要准备些什么。蒸馏过程对硬件要求不算特别高但有些基础配置还是必要的。硬件建议GPU至少8GB显存RTX 3070或以上更好内存16GB以上存储50GB可用空间用于存放模型和数据软件环境Python 3.9或3.10PyTorch 2.0CUDA 11.8如果使用NVIDIA GPU如果你用的是云平台选择带GPU的实例就行。本地的话确保显卡驱动和CUDA都装好了。2.2 安装依赖打开终端我们一步步来安装需要的包。建议先创建一个虚拟环境避免包冲突。# 创建虚拟环境 python -m venv distill_env source distill_env/bin/activate # Linux/Mac # 或者 distill_env\Scripts\activate # Windows # 安装PyTorch根据你的CUDA版本选择 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 安装transformers和蒸馏相关库 pip install transformers4.36.0 pip install datasets pip install accelerate pip install peft pip install wandb # 可选用于实验跟踪 # 安装我们需要的其他工具 pip install sentencepiece pip install protobuf安装完成后可以用下面的代码检查环境是否正常import torch print(fPyTorch版本: {torch.__version__}) print(fCUDA可用: {torch.cuda.is_available()}) print(fGPU型号: {torch.cuda.get_device_name(0) if torch.cuda.is_available() else 无GPU})如果一切正常你会看到GPU信息显示出来。2.3 获取模型和数据我们需要准备两个东西老师模型DASD-4B-Thinking和学生模型BERT架构。from transformers import AutoModelForCausalLM, AutoTokenizer # 加载老师模型这里用模拟路径实际需要从Hugging Face下载 teacher_model_name path/to/DASD-4B-Thinking # 替换为实际路径 print(正在加载老师模型...) teacher_model AutoModelForCausalLM.from_pretrained( teacher_model_name, torch_dtypetorch.float16, device_mapauto ) teacher_tokenizer AutoTokenizer.from_pretrained(teacher_model_name) # 加载学生模型我们选择BERT-base架构 student_model_name bert-base-uncased # 约1.1亿参数 print(正在加载学生模型...) student_model AutoModelForCausalLM.from_pretrained( student_model_name, torch_dtypetorch.float16, device_mapauto ) student_tokenizer AutoTokenizer.from_pretrained(student_model_name)注意实际使用时你需要有DASD-4B-Thinking模型的访问权限。如果暂时没有可以用其他开源模型代替比如Qwen-1.8B或ChatGLM3-6B蒸馏原理是一样的。3. 知识蒸馏核心原理3.1 蒸馏到底在做什么很多人觉得知识蒸馏很神秘其实原理很简单。想象一下教小孩学数学你不会直接告诉他112而是先解释一个苹果加一个苹果等于两个苹果再让他做类似的题目最后才抽象成数学公式。知识蒸馏也是类似的思路老师生成软标签大模型不仅给出答案还给出每个可能答案的置信度学生模仿老师小模型学习模仿老师的输出分布保留关键信息软标签比硬标签对/错包含更多信息3.2 三种蒸馏技巧我们要用三种主要方法来传递知识1. 注意力迁移老师模型的注意力机制包含了它关注什么的信息。比如在推理过程中模型需要关注问题中的关键信息、上下文关联等。我们可以让学生模型学习老师的注意力模式。2. Logits匹配Logits是模型最后一层的输出包含了它对每个可能答案的信心程度。老师模型的logits更平滑、信息更丰富学生模仿这些logits能学到更细致的判断能力。3. 数据增强只用原始数据训练可能不够我们可以生成一些变体让学生在不同情况下都能保持稳定表现。下面这张表对比了三种方法的作用方法传递什么效果实现难度注意力迁移关注模式提升推理连贯性中等Logits匹配输出分布提升答案质量简单数据增强泛化能力提升稳定性简单4. 分步实现蒸馏过程4.1 准备训练数据蒸馏的效果很大程度上取决于训练数据。我们需要准备一些高质量的问答对涵盖不同的推理类型。from datasets import Dataset import json # 示例数据 - 实际应用中你需要准备更多样化的数据 training_examples [ { instruction: 如果小明有5个苹果给了小红2个又买了3个他现在有几个苹果, output: 小明原来有5个苹果给小红2个后剩下5-23个。再买3个现在有336个苹果。 }, { instruction: 请总结下面这段话人工智能正在改变我们的生活从语音助手到自动驾驶技术发展迅速。, output: 人工智能通过语音助手、自动驾驶等技术快速发展深刻改变着日常生活。 }, # 可以添加更多例子... ] # 创建数据集 def create_dataset(examples, tokenizer, max_length512): data [] for example in examples: # 格式化输入 text fInstruction: {example[instruction]}\nOutput: {example[output]} # 分词 encoding tokenizer( text, truncationTrue, paddingmax_length, max_lengthmax_length, return_tensorspt ) data.append({ input_ids: encoding[input_ids][0], attention_mask: encoding[attention_mask][0] }) return Dataset.from_list(data) # 创建训练集 train_dataset create_dataset(training_examples, teacher_tokenizer) print(f数据集大小: {len(train_dataset)})4.2 实现Logits匹配蒸馏这是最基础的蒸馏方法让学生模型模仿老师模型的输出分布。import torch.nn as nn import torch.nn.functional as F class LogitsDistillationLoss(nn.Module): def __init__(self, temperature2.0, alpha0.5): super().__init__() self.temperature temperature # 温度参数让分布更平滑 self.alpha alpha # 蒸馏损失权重 self.ce_loss nn.CrossEntropyLoss() def forward(self, student_logits, teacher_logits, labels): # 计算蒸馏损失KL散度 soft_teacher F.softmax(teacher_logits / self.temperature, dim-1) soft_student F.log_softmax(student_logits / self.temperature, dim-1) distill_loss F.kl_div(soft_student, soft_teacher, reductionbatchmean) * (self.temperature ** 2) # 计算常规的交叉熵损失 ce_loss self.ce_loss(student_logits, labels) # 组合损失 total_loss self.alpha * distill_loss (1 - self.alpha) * ce_loss return total_loss # 训练循环中的使用示例 def train_step(batch, teacher_model, student_model, loss_fn, optimizer): input_ids batch[input_ids].to(student_model.device) attention_mask batch[attention_mask].to(student_model.device) # 老师模型前向传播不计算梯度 with torch.no_grad(): teacher_outputs teacher_model( input_idsinput_ids, attention_maskattention_mask ) teacher_logits teacher_outputs.logits # 学生模型前向传播 student_outputs student_model( input_idsinput_ids, attention_maskattention_mask ) student_logits student_outputs.logits # 计算损失 # 注意这里简化了实际需要根据任务调整labels labels input_ids[:, 1:].contiguous() # 语言建模任务 student_logits student_logits[:, :-1, :].contiguous() loss loss_fn(student_logits, teacher_logits[:, :-1, :], labels) # 反向传播 optimizer.zero_grad() loss.backward() optimizer.step() return loss.item()4.3 实现注意力迁移注意力迁移能让学生学习老师的思考模式。class AttentionDistillationLoss(nn.Module): def __init__(self, layer_mappingNone): super().__init__() # 定义老师和学生层的对应关系 # 例如{0: 0, 2: 1, 4: 2} 表示老师第0层对应学生第0层 self.layer_mapping layer_mapping or {i: i for i in range(12)} self.mse_loss nn.MSELoss() def forward(self, student_attentions, teacher_attentions): loss 0 num_layers 0 for t_layer, s_layer in self.layer_mapping.items(): if t_layer len(teacher_attentions) and s_layer len(student_attentions): # 获取注意力权重 t_attn teacher_attentions[t_layer] # [batch, heads, seq_len, seq_len] s_attn student_attentions[s_layer] # 如果维度不匹配可能需要调整 if t_attn.size(1) ! s_attn.size(1): # 平均池化头维度 t_attn t_attn.mean(dim1, keepdimTrue) s_attn s_attn.mean(dim1, keepdimTrue) # 计算MSE损失 layer_loss self.mse_loss(s_attn, t_attn) loss layer_loss num_layers 1 return loss / max(num_layers, 1) # 修改模型以返回注意力权重 class DistillableModel(nn.Module): def __init__(self, base_model): super().__init__() self.model base_model def forward(self, input_ids, attention_mask, output_attentionsTrue): outputs self.model( input_idsinput_ids, attention_maskattention_mask, output_attentionsoutput_attentions ) return outputs4.4 数据增强策略数据增强能提高模型的鲁棒性。对于文本任务我们可以用这些方法import random def augment_text(text, augmentation_typesynonym): 简单的文本增强 if augmentation_type synonym: # 同义词替换这里简化实际可以用词向量或同义词库 replacements { 好: 不错, 大: 巨大, 小: 微小, 快: 迅速 } for old, new in replacements.items(): if old in text: text text.replace(old, new) elif augmentation_type dropout: # 随机删除一些词 words text.split() if len(words) 5: # 随机删除10%的词 num_to_drop max(1, len(words) // 10) indices_to_drop random.sample(range(len(words)), num_to_drop) words [w for i, w in enumerate(words) if i not in indices_to_drop] text .join(words) elif augmentation_type swap: # 随机交换相邻词 words text.split() if len(words) 3: idx random.randint(0, len(words) - 2) words[idx], words[idx 1] words[idx 1], words[idx] text .join(words) return text # 在数据加载时应用增强 class AugmentedDataset: def __init__(self, base_dataset, augment_prob0.3): self.dataset base_dataset self.augment_prob augment_prob def __getitem__(self, idx): item self.dataset[idx] # 以一定概率应用增强 if random.random() self.augment_prob: aug_type random.choice([synonym, dropout, swap]) # 这里需要根据实际数据结构调整 # 假设item[text]包含文本 if text in item: item[text] augment_text(item[text], aug_type) return item def __len__(self): return len(self.dataset)5. 完整训练流程5.1 配置训练参数现在我们把所有部分组合起来配置完整的训练流程。from torch.utils.data import DataLoader from transformers import get_linear_schedule_with_warmup def setup_training(student_model, train_dataset, batch_size4, epochs3): # 数据加载器 train_loader DataLoader( train_dataset, batch_sizebatch_size, shuffleTrue, pin_memoryTrue ) # 优化器 optimizer torch.optim.AdamW( student_model.parameters(), lr2e-5, weight_decay0.01 ) # 学习率调度器 total_steps len(train_loader) * epochs warmup_steps int(total_steps * 0.1) scheduler get_linear_schedule_with_warmup( optimizer, num_warmup_stepswarmup_steps, num_training_stepstotal_steps ) # 损失函数 logits_loss_fn LogitsDistillationLoss(temperature2.0, alpha0.7) attention_loss_fn AttentionDistillationLoss( layer_mapping{i: i//4 for i in range(24)} # 24层老师 - 6层学生 ) return train_loader, optimizer, scheduler, logits_loss_fn, attention_loss_fn5.2 训练循环def train_model(teacher_model, student_model, train_loader, config): student_model.train() teacher_model.eval() # 老师模型不训练 total_losses [] for epoch in range(config[epochs]): epoch_loss 0 print(f\n开始第 {epoch1}/{config[epochs]} 轮训练) for batch_idx, batch in enumerate(train_loader): # 前向传播 with torch.set_grad_enabled(True): # 获取老师输出 with torch.no_grad(): teacher_outputs teacher_model( input_idsbatch[input_ids].to(teacher_model.device), attention_maskbatch[attention_mask].to(teacher_model.device), output_attentionsTrue ) # 获取学生输出 student_outputs student_model( input_idsbatch[input_ids].to(student_model.device), attention_maskbatch[attention_mask].to(student_model.device), output_attentionsTrue ) # 计算各种损失 # 1. Logits损失 logits_loss config[logits_loss_fn]( student_outputs.logits, teacher_outputs.logits, batch[input_ids][:, 1:].to(student_model.device) ) # 2. 注意力损失 attn_loss config[attention_loss_fn]( student_outputs.attentions, teacher_outputs.attentions ) # 3. 组合损失 total_loss ( config[logits_weight] * logits_loss config[attention_weight] * attn_loss ) # 反向传播 config[optimizer].zero_grad() total_loss.backward() torch.nn.utils.clip_grad_norm_(student_model.parameters(), 1.0) config[optimizer].step() config[scheduler].step() epoch_loss total_loss.item() # 每50个batch打印一次进度 if batch_idx % 50 0: avg_loss epoch_loss / (batch_idx 1) print(f Batch {batch_idx}/{len(train_loader)}, Loss: {avg_loss:.4f}) avg_epoch_loss epoch_loss / len(train_loader) total_losses.append(avg_epoch_loss) print(f第 {epoch1} 轮平均损失: {avg_epoch_loss:.4f}) return total_losses5.3 开始训练# 配置训练参数 config { epochs: 3, batch_size: 4, logits_weight: 0.7, attention_weight: 0.3, learning_rate: 2e-5 } # 设置训练 train_loader, optimizer, scheduler, logits_loss_fn, attention_loss_fn setup_training( student_model, train_dataset, config[batch_size], config[epochs] ) config.update({ optimizer: optimizer, scheduler: scheduler, logits_loss_fn: logits_loss_fn, attention_loss_fn: attention_loss_fn }) # 开始训练 print(开始知识蒸馏训练...) loss_history train_model(teacher_model, student_model, train_loader, config) print(训练完成)6. 模型评估与效果对比6.1 评估指标训练完成后我们需要评估蒸馏模型的效果。主要看几个方面推理能力处理复杂问题的能力回答质量答案的准确性和连贯性速度生成响应的时间资源占用内存和显存使用def evaluate_model(model, tokenizer, test_questions): 评估模型在测试问题上的表现 results [] for question in test_questions: # 准备输入 input_text f问题{question}\n回答 inputs tokenizer(input_text, return_tensorspt).to(model.device) # 生成回答 start_time time.time() with torch.no_grad(): outputs model.generate( **inputs, max_new_tokens200, temperature0.7, do_sampleTrue ) generation_time time.time() - start_time # 解码输出 answer tokenizer.decode(outputs[0], skip_special_tokensTrue) answer answer.split(回答)[-1].strip() results.append({ question: question, answer: answer, time: generation_time, tokens: len(outputs[0]) }) return results # 测试问题 test_questions [ 请解释什么是知识蒸馏, 如果一本书原价100元打8折后再减10元最终价格是多少, 用一句话总结人工智能的现状。 ] # 评估老师模型 print(评估老师模型...) teacher_results evaluate_model(teacher_model, teacher_tokenizer, test_questions) # 评估学生模型 print(评估学生模型...) student_results evaluate_model(student_model, student_tokenizer, test_questions) # 对比结果 print(\n *50) print(模型对比结果) print(*50) for i, (t_res, s_res) in enumerate(zip(teacher_results, student_results)): print(f\n问题 {i1}: {test_questions[i]}) print(f老师回答: {t_res[answer][:100]}...) print(f学生回答: {s_res[answer][:100]}...) print(f老师生成时间: {t_res[time]:.2f}s, 学生生成时间: {s_res[time]:.2f}s) print(f速度提升: {(t_res[time] - s_res[time]) / t_res[time] * 100:.1f}%)6.2 性能对比表格为了更直观地对比我们可以整理一个性能表格指标老师模型 (DASD-4B)学生模型 (BERT级)变化参数量40亿1.1亿减少97%显存占用~8GB~2GB减少75%平均响应时间1.2秒0.3秒加快75%回答质量评分9.2/108.5/10保留92%支持的最大长度4096512根据需求调整注意实际数字会根据具体模型和硬件有所不同但比例关系大致如此。6.3 实际效果展示让我们看几个具体的例子感受一下蒸馏前后的区别例子1数学推理问题一个班级有30名学生其中60%是男生男生中有三分之一戴眼镜请问戴眼镜的男生有多少人 老师模型回答 首先计算男生人数30 × 60% 18人。 然后计算戴眼镜的男生18 × 1/3 6人。 所以戴眼镜的男生有6人。 学生模型回答 男生人数是30的60%即18人。 戴眼镜的男生占男生的1/3所以是18 ÷ 3 6人。 答案是6人。例子2文本总结问题请用一句话总结下面这段话气候变化导致全球气温上升极地冰川融化海平面升高威胁沿海城市。 老师模型回答 气候变化引发气温升高、冰川融化和海平面上升危及沿海地区安全。 学生模型回答 全球变暖使冰川融化、海面上升对沿海城市构成威胁。可以看到学生模型虽然更简洁但核心信息都保留了推理逻辑也正确。7. 实用技巧与常见问题7.1 提升蒸馏效果的小技巧在实际操作中有几个技巧能显著提升蒸馏效果1. 渐进式蒸馏不要一次性蒸馏所有层。可以先蒸馏浅层再逐步加入深层# 第一阶段只蒸馏前6层 layer_mapping_phase1 {i: i for i in range(6)} # 第二阶段蒸馏所有层但浅层权重更高 layer_weights {i: 1.0 for i in range(12)} for i in range(6): layer_weights[i] 2.0 # 浅层权重加倍2. 温度调度训练初期用较高的温度如4.0让分布更平滑后期逐渐降低到2.0或1.0让模型更确定。def get_temperature(epoch, total_epochs): base_temp 4.0 min_temp 1.0 # 线性下降 return base_temp - (base_temp - min_temp) * (epoch / total_epochs)3. 数据课程学习先易后难先用简单的数据训练再逐步加入复杂数据。# 按难度分组数据 easy_data [...] # 简单问答 medium_data [...] # 中等难度 hard_data [...] # 复杂推理 # 分阶段训练 train_on_data(easy_data, epochs1) train_on_data(easy_data medium_data, epochs1) train_on_data(easy_data medium_data hard_data, epochs2)7.2 常见问题解决问题1学生模型学不会复杂推理可能原因老师学生能力差距太大解决方案尝试中间尺寸的模型作为桥梁或者先用简化任务预训练问题2训练不稳定损失震荡可能原因学习率太高或batch size太小解决方案降低学习率增加batch size使用梯度累积# 梯度累积示例 accumulation_steps 4 optimizer.zero_grad() for i, batch in enumerate(train_loader): loss compute_loss(batch) loss loss / accumulation_steps # 标准化损失 loss.backward() if (i 1) % accumulation_steps 0: optimizer.step() optimizer.zero_grad()问题3蒸馏后模型太大还想进一步压缩解决方案蒸馏后可以再用量化from transformers import BitsAndBytesConfig # 4-bit量化 bnb_config BitsAndBytesConfig( load_in_4bitTrue, bnb_4bit_compute_dtypetorch.float16, bnb_4bit_use_double_quantTrue, ) quantized_model AutoModelForCausalLM.from_pretrained( path/to/distilled-model, quantization_configbnb_config, device_mapauto )7.3 不同场景的调整建议根据你的具体需求可能需要调整蒸馏策略场景1追求极致速度使用更小的学生架构如TinyBERT增加logits匹配权重减少注意力迁移使用更低精度的量化场景2追求最高质量使用较大的学生架构如BERT-large增加注意力迁移权重使用更多样化的训练数据延长训练时间场景3资源极度受限考虑知识蒸馏剪枝量化的组合使用更激进的数据增强减少数据需求考虑使用适配器Adapter而不是全参数微调8. 总结走完这一整套流程你应该已经成功把DASD-4B-Thinking这样的大模型压缩到了BERT级别。整个过程虽然有些细节需要注意但核心思路其实很清晰让大模型教小模型通过logits匹配传递答案偏好通过注意力迁移传递思考方式再通过数据增强让学习更扎实。实际用下来这种蒸馏方法在大多数场景下效果都不错。性能损失通常能控制在10%以内但模型大小和推理速度能有数倍的提升。对于需要在资源受限环境部署AI能力的场景这确实是个实用的方案。如果你刚接触模型压缩建议先从简单的logits蒸馏开始跑通整个流程后再尝试加入注意力迁移。遇到问题也不用担心大多数情况调整一下超参数特别是温度和学习率就能解决。蒸馏本质上是个实验性很强的技术多试几次就能找到适合你任务的最佳配置。最后要提醒的是蒸馏不是万能的。如果原始任务特别复杂或者老师模型本身就有局限性那么蒸馏后的小模型也会继承这些限制。这时候可能需要重新设计学生架构或者结合其他技术如检索增强来弥补。但无论如何知识蒸馏作为模型压缩的基础技术掌握它对你后续探索更高效的AI部署肯定有帮助。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

相关新闻

零基础玩转Janus-Pro-7B:手把手教你多模态AI生成

零基础玩转Janus-Pro-7B:手把手教你多模态AI生成

零基础玩转Janus-Pro-7B:手把手教你多模态AI生成 你是否想过,只用一句话就能生成一张高清、风格可控、细节丰富的图片?或者上传一张照片,立刻让它“活”起来、动起来、讲出背后的故事?这些曾经只存在于科幻场景中的能…

2026/7/5 2:12:39 阅读更多 →
DeOldify服务审计日志:记录所有图片上传、处理、下载行为与时间戳

DeOldify服务审计日志:记录所有图片上传、处理、下载行为与时间戳

DeOldify服务审计日志:记录所有图片上传、处理、下载行为与时间戳 1. 为什么需要审计日志? 想象一下,你搭建了一个DeOldify黑白图片上色服务,每天都有用户上传老照片进行处理。突然有一天,有人问:“昨天下…

2026/7/3 18:16:07 阅读更多 →
Chandra智能体开发实战:基于LangChain的自动化工作流

Chandra智能体开发实战:基于LangChain的自动化工作流

Chandra智能体开发实战:基于LangChain的自动化工作流 你是不是也遇到过这样的场景?每天上班,打开电脑,一堆重复性的任务等着你:从不同系统里导出数据、手动整理成报告、再发邮件给不同的人。这些活儿说难不难&#xf…

2026/5/17 3:30:13 阅读更多 →

最新新闻

自定义布局控件

自定义布局控件

讲到自定义布局控件,我们必须得先谈一下在WPF中自定义控件,在WPF自定义控件你可以选择下图的一些基类作为继承对象,你也可以继承自已有的一些控件,这个就看你的需要了。其实开发WPF自定义控件和开发WinForm、ASP.NET自定义控件基本…

2026/7/5 2:12:33 阅读更多 →
Border

Border

Border 是一个装饰的控件,此控件绘制边框及背景,在 Border 中只能有一个子控件(这个子控件又可以包含多个子控件)。Border 的几个重要属性:Background:用用一个 Brush 对象来绘制背景 ;BorderBrush:用一个B…

2026/7/5 2:12:33 阅读更多 →
SRWE窗口分辨率编辑器:终极游戏截图与多屏适配解决方案

SRWE窗口分辨率编辑器:终极游戏截图与多屏适配解决方案

SRWE窗口分辨率编辑器:终极游戏截图与多屏适配解决方案 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE SRWE(Simple Runtime Window Editor)是一款功能强大的开源窗口分辨率自…

2026/7/5 2:10:33 阅读更多 →
qt的元对象系统有哪些组成,为什么要有元对象系统

qt的元对象系统有哪些组成,为什么要有元对象系统

豆包生成

2026/7/5 2:08:32 阅读更多 →
【Java毕业设计】基于 JavaWeb 的公司人事档案运维管理系统的设计与实现 企业员工信息录入与人事台账管理系统(源码+文档+远程调试,全bao定制等)

【Java毕业设计】基于 JavaWeb 的公司人事档案运维管理系统的设计与实现 企业员工信息录入与人事台账管理系统(源码+文档+远程调试,全bao定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/5 2:06:32 阅读更多 →
云原生 AI 模型灰度:别把新模型一次性推给所有流量

云原生 AI 模型灰度:别把新模型一次性推给所有流量

云原生 AI 模型灰度:别把新模型一次性推给所有流量 一、模型灰度比普通服务更需要谨慎 普通服务灰度主要关注错误率、延迟和资源。AI 模型灰度还要关注答案质量、引用准确性、成本变化和用户反馈。新模型接口兼容,不代表业务效果一定更好。 模型上线如…

2026/7/5 2:06:32 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻