大语言模型微调实战:从LoRA原理到ChatGPT定制化应用

news2026/5/1 8:17:18
1. 项目概述从原理到代码深入理解ChatGPT的微调最近在GitHub上看到一个名为“ChatGPT_principle_fine-tuning_code_paper”的项目它吸引我的地方在于它试图将大语言模型LLM的核心原理、微调Fine-tuning的实践代码以及相关的学术论文整合在一起。这恰恰是很多开发者和研究者当前最迫切的需求我们不再满足于仅仅调用API而是渴望理解其内在机制并掌握定制化模型的能力。这个项目标题本身就是一个清晰的学习路径图原理 - 微调 - 代码 - 论文。它指向了一个核心问题如何让一个通用的、强大的ChatGPT模型变成专属于你特定业务或领域的“专家”答案就是微调。但微调远不止是上传数据、运行脚本那么简单。它背后涉及对模型架构的理解、对训练数据的精心设计、对超参数的敏感把握以及对计算资源的权衡。这个项目提供了一个宝贵的切入点让我们可以系统地探索这个领域。对于开发者而言掌握微调意味着你可以打造专属助手为法律、医疗、金融等垂直领域构建具备专业知识的对话机器人。统一输出风格让模型生成符合你公司品牌语调、固定格式的文本内容。优化特定任务在代码生成、文本摘要、情感分析等任务上获得比通用模型更优的性能。降低使用成本通过微调小模型或优化提示在保证效果的同时减少对昂贵大模型的依赖。接下来我将沿着“原理-代码-实践”这条主线结合我对大模型微调的理解和实际项目经验为你深入拆解其中的关键环节、技术细节和避坑指南。2. 大语言模型微调的核心原理与演进要有效进行微调必须理解你正在调整的是什么。这不仅仅是调参更是与一个拥有数百亿甚至数千亿参数的复杂系统进行“对话”。2.1 预训练、指令微调与对齐ChatGPT的能力分层ChatGPT类模型的能力并非一蹴而就而是分阶段构建的。理解这些阶段是理解微调目标的前提。预训练Pre-training这是模型的“通识教育”阶段。模型在海量无标注的互联网文本如网页、书籍、代码上进行自监督学习任务通常是“给定前文预测下一个词”即语言建模。此阶段让模型掌握了语言的统计规律、世界知识、基础逻辑和语法形成了一个“基础语言模型”Base LM。此时的模型更像一个“续写大师”但它可能生成有毒、偏见或不安全的文本且无法可靠地遵循人类指令。指令微调Instruction Tuning这是让模型“学会听话”的关键一步。使用大量指令 期望输出的配对数据对预训练模型进行监督微调。例如指令是“将这句话翻译成法语Hello world”期望输出是“Bonjour le monde”。这个阶段教会模型理解并执行各种形式的指令将其从一个续写模型转变为任务执行模型。项目中的“fine-tuning”通常指的就是这一阶段或其变体。基于人类反馈的强化学习RLHF这是ChatGPT实现“对齐”和“有用、无害、诚实”特性的核心技术。它进一步细化模型行为。第一步收集比较数据。让人类标注员对模型针对同一指令生成的多个回答进行排序指出哪个更好。第二步训练奖励模型。利用上一步的比较数据训练一个“奖励模型”使其学会预测人类对某个回答的偏好程度给出一个分数。第三步强化学习优化。使用奖励模型作为评判标准通过PPO等强化学习算法微调语言模型使其生成的回答能获得更高的奖励分数从而更符合人类偏好。我们通常所说的对开源模型如LLaMA、Qwen进行微调主要是在模仿指令微调阶段有时也会尝试简化版的RLHF如直接偏好优化DPO。而调用OpenAI的微调API则是基于一个已经过指令微调和RLHF的模型如gpt-3.5-turbo进行进一步的适应性调整。2.2 微调的关键技术全参数、LoRA与QLoRA微调所有参数全参数微调虽然直接但对计算资源要求极高。因此参数高效微调PEFT技术成为主流。全参数微调更新模型每一层的所有权重。效果通常最好但需要存储完整的模型梯度、优化器状态显存占用可能是模型本身的数倍。例如微调一个70亿参数的模型可能需要超过200GB的GPU显存这只有高端多卡服务器才能胜任。LoRALow-Rank Adaptation当前最流行的PEFT方法。其核心思想是模型在适应新任务时权重变化具有“低内在秩”的特性。具体操作是冻结预训练模型的原始权重仅在Transformer层的注意力Attention或前馈网络FFN旁插入可训练的“低秩适配器”。实现方式对于一个权重矩阵W(维度 d×k)LoRA不直接更新它而是用两个更小的矩阵A(维度 d×r) 和B(维度 r×k) 的乘积来代表其更新量W W BA。其中r秩远小于d和k通常为4、8、16。优势可训练参数大幅减少通常仅为原模型的0.1%-1%显著降低显存需求训练速度更快且多个LoRA适配器可以轻量级地切换实现一个基础模型服务多个任务。QLoRALoRA的进一步量化版本旨在将微调推向消费级GPU。核心技术将预训练模型权重量化为4-bitNF4格式同时保留一层“反量化”权重用于前向和反向传播计算。在计算梯度时仍然使用LoRA的适配器。效果能在几乎不损失精度的情况下将微调一个大模型如65B的显存需求从780GB降低到48GB使得在单张24GB或48GB的消费级显卡上微调大模型成为可能。实操心得对于绝大多数开发者和研究者QLoRA是当前性价比最高的选择。它平衡了效果、成本和易用性。在决定使用LoRA/QLoRA时关键超参数是r秩和alpha缩放系数。通常起始设置是r8, alpha16。r越大能力越强但可能过拟合alpha影响适配器权重与原始权重的融合比例。一个经验法则是保持alpha是r的2倍但这并非绝对需要根据任务复杂度调整。2.3 微调数据的灵魂格式、质量与构建“垃圾进垃圾出”在微调中体现得淋漓尽致。数据准备是微调成功与否的决定性因素其重要性甚至超过模型结构和超参数。数据格式标准化主流微调框架如Transformers, TRL通常要求数据被组织成特定的对话格式。最常见的格式是ChatML或Alpaca格式。// ChatML 格式示例 [ { messages: [ {role: system, content: 你是一个乐于助人的助手。}, {role: user, content: 解释一下量子计算。}, {role: assistant, content: 量子计算是一种利用量子力学原理如叠加和纠缠来处理信息的新型计算模式...} ] } ]system设定助理的角色和背景。user用户的输入或指令。assistant模型应有的理想回答。 确保你的训练数据严格遵循这种user-assistant的轮次结构。对于多轮对话只需在messages数组中顺序排列多个user和assistant消息即可。数据质量的金字塔多样性指令应覆盖你期望模型处理的所有场景和类型。避免模式单一。真实性回答内容应准确、专业。对于领域知识最好由专家审核或来源于权威资料。复杂性包含简单、中等和复杂难度的任务让模型学会循序渐进地思考。对于复杂任务可以在assistant的回答中展示思维链Chain-of-Thought。格式一致性如果希望模型输出特定格式如JSON、Markdown表格在示例中必须严格统一。数据构建策略种子数据模型生成手动创建少量50-100条高质量种子数据然后用一个较强的基座模型如GPT-4根据指令生成更多回答最后进行人工筛选和修正。这是成本效益较高的方法。真实日志清洗如果你有产品中的真实用户-助理对话日志这是极好的数据源。但需仔细清洗去除无效会话、包含敏感信息的会话并修正其中助理回答不佳的部分。数据量参考对于风格微调或简单任务几百到几千条高质量数据可能就足够了。对于复杂的领域知识注入可能需要数万条。关键在于数据的代表性和质量而非盲目追求数量。3. 微调实战从环境搭建到模型评估理解了原理和数据我们进入实战环节。这里我将以使用Hugging Face Transformers PEFT (QLoRA) TRL这一主流技术栈为例拆解微调一个类似LLaMA或Qwen模型的完整流程。3.1 环境准备与工具选型一个稳定、高效的训练环境是成功的第一步。硬件选择GPU至少需要一张显存 16GB 的GPU如RTX 4090 24GB RTX 3090 24GB。对于70亿参数模型使用QLoRA24GB显存非常充裕。对于130亿或340亿参数模型可能需要40GB或以上的显存如A100。内存与存储建议系统内存32GB以上。准备足够的硬盘空间存放原始模型一个7B模型约15GB和训练过程中的检查点。软件环境搭建# 1. 创建并激活虚拟环境推荐使用conda conda create -n llm-ft python3.10 conda activate llm-ft # 2. 安装PyTorch请根据你的CUDA版本到PyTorch官网选择对应命令 # 例如对于CUDA 11.8 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 3. 安装核心库 pip install transformers accelerate peft trl bitsandbytes datasets scipy # 4. 安装训练效率工具可选但推荐 pip install wandb # 用于实验跟踪和可视化 pip install tensorboardtransformersHugging Face的核心库提供模型加载、训练接口。accelerate简化分布式训练统一训练循环。peft实现LoRA、QLoRA等参数高效微调方法。trlTransformer Reinforcement Learning提供了方便的SFT监督微调和DPO训练流程。bitsandbytes实现模型量化8-bit/4-bit是QLoRA的依赖。datasets方便地加载和处理数据集。3.2 数据预处理与加载假设我们已经按照ChatML格式准备好了一个JSONL文件每行一个JSON对象train_data.jsonl。from datasets import load_dataset import json # 1. 加载数据集 dataset load_dataset(json, data_filestrain_data.jsonl) # 2. 定义格式化函数将数据转换为tokenizer需要的对话格式 def format_conversation(example): # 假设example[messages]已经是ChatML格式的列表 messages example[messages] # 使用tokenizer的apply_chat_template方法如果tokenizer支持 # 这里以通用拼接为例实际使用中应使用tokenizer内置方法 formatted_text for msg in messages: if msg[role] system: formatted_text f|system|\n{msg[content]}\n elif msg[role] user: formatted_text f|user|\n{msg[content]}\n elif msg[role] assistant: formatted_text f|assistant|\n{msg[content]}\n formatted_text |endoftext| # 结束符根据模型调整 return {text: formatted_text} formatted_dataset dataset.map(format_conversation) # 3. 划分训练集和验证集例如90%/10% split_dataset formatted_dataset[train].train_test_split(test_size0.1, seed42) train_dataset split_dataset[train] eval_dataset split_dataset[test]注意不同的基座模型LLaMA, Qwen, ChatGLM有自己特定的对话模板和特殊token。最稳妥的方式是使用该模型官方提供的tokenizer.apply_chat_template()函数来格式化数据这能确保格式完全匹配模型在预训练和指令微调时看到的数据格式对微调效果至关重要。3.3 模型加载与QLoRA配置这里以微调Qwen2.5-7B-Instruct模型为例。from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig, TrainingArguments from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training from trl import SFTTrainer import torch # 1. 配置4-bit量化加载 bnb_config BitsAndBytesConfig( load_in_4bitTrue, # 使用4-bit量化加载模型 bnb_4bit_quant_typenf4, # 量化类型NF4是QLoRA论文推荐 bnb_4bit_compute_dtypetorch.bfloat16, # 计算时使用bfloat16兼顾精度和速度 bnb_4bit_use_double_quantTrue, # 双重量化进一步节省显存 ) # 2. 加载模型和分词器 model_name Qwen/Qwen2.5-7B-Instruct tokenizer AutoTokenizer.from_pretrained(model_name, trust_remote_codeTrue) # 设置padding token如果模型没有 if tokenizer.pad_token is None: tokenizer.pad_token tokenizer.eos_token model AutoModelForCausalLM.from_pretrained( model_name, quantization_configbnb_config, device_mapauto, # 自动将模型层分配到可用的GPU上 trust_remote_codeTrue ) # 3. 为量化模型进行前向传播适配 model prepare_model_for_kbit_training(model) # 4. 配置LoRA参数 lora_config LoraConfig( r8, # LoRA秩 lora_alpha16, # 缩放系数 target_modules[q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj], # 针对Qwen的模块名 lora_dropout0.05, # Dropout概率防止过拟合 biasnone, task_typeCAUSAL_LM, ) # 将LoRA适配器应用到模型 model get_peft_model(model, lora_config) model.print_trainable_parameters() # 打印可训练参数量应该只占原模型的很小比例~0.1%关键参数解析target_modules这是LoRA配置中最关键的一环。它指定了将LoRA适配器添加到模型的哪些线性层。通常针对注意力机制q_proj,k_proj,v_proj,o_proj和前馈网络gate_proj,up_proj,down_proj。不同模型架构的层名可能不同需要查阅模型文档或源码。r和lora_alpha如前所述控制适配器的容量和影响力。可以从r8, alpha16开始尝试。lora_dropout轻微的Dropout有助于提升泛化能力。3.4 训练参数配置与执行# 5. 配置训练参数 training_args TrainingArguments( output_dir./qwen2.5-7b-sft-lora, # 输出目录 num_train_epochs3, # 训练轮数根据数据集大小调整通常1-5轮 per_device_train_batch_size4, # 每个GPU的批次大小受显存限制 per_device_eval_batch_size4, gradient_accumulation_steps4, # 梯度累积步数模拟更大批次 # 实际总批次大小 per_device_train_batch_size * gradient_accumulation_steps * GPU数量 warmup_steps100, # 学习率预热步数 logging_steps10, # 每10步记录一次日志 eval_strategysteps, # 按步数进行评估 eval_steps200, # 每200步评估一次 save_strategysteps, save_steps500, # 每500步保存一次检查点 learning_rate2e-4, # 学习率对于QLoRA通常比全参数微调大1e-4 到 5e-4 fp16False, # 使用bf16如果硬件支持 bf16True, optimpaged_adamw_8bit, # 使用分页的8-bit AdamW优化器节省显存 report_towandb, # 将日志报告到wandb需提前登录 remove_unused_columnsFalse, ) # 6. 创建SFTTrainer并开始训练 trainer SFTTrainer( modelmodel, argstraining_args, train_datasettrain_dataset, eval_dataseteval_dataset, dataset_text_fieldtext, # 数据集中文本字段的名称 max_seq_length2048, # 最大序列长度根据模型和显存调整 tokenizertokenizer, packingFalse, # 是否将多个样本打包到同一序列中以提高效率对于对话数据通常设为False ) trainer.train()训练参数调优心得learning_rateQLoRA的学习率可以设得比全参数微调高一些例如2e-4 vs 1e-5因为可训练参数少需要更大的更新步长。per_device_train_batch_size在显存允许的情况下尽可能调大但要注意过大的批次可能导致泛化能力下降。通过gradient_accumulation_steps来模拟更大的有效批次大小。num_train_epochs避免过拟合的关键。时刻关注验证集损失eval loss当验证损失不再下降甚至开始上升时就应该提前停止训练。对于高质量数据1-3个epoch往往足够。max_seq_length设置为你数据中最大序列长度稍大一点的值。设置过长会浪费显存和计算设置过短会截断长文本。可以先统计一下数据长度的分布。3.5 模型保存、加载与推理训练完成后需要保存和加载你的微调模型。# 保存微调后的模型仅保存LoRA权重 trainer.model.save_pretrained(./my_qwen_lora_adapter) tokenizer.save_pretrained(./my_qwen_lora_adapter) # 如何加载并使用微调后的模型进行推理 from peft import PeftModel # 重新加载基础模型和分词器 base_model AutoModelForCausalLM.from_pretrained( model_name, quantization_configbnb_config, device_mapauto, trust_remote_codeTrue ) tokenizer AutoTokenizer.from_pretrained(model_name, trust_remote_codeTrue) # 加载LoRA适配器权重 lora_model PeftModel.from_pretrained(base_model, ./my_qwen_lora_adapter) # 合并LoRA权重到基础模型可选会得到一个完整的、独立的模型文件 merged_model lora_model.merge_and_unload() merged_model.save_pretrained(./my_qwen_merged) tokenizer.save_pretrained(./my_qwen_merged) # 使用合并后的模型进行推理 inputs tokenizer(用户指令写一首关于春天的诗。, return_tensorspt).to(cuda) outputs merged_model.generate(**inputs, max_new_tokens200) print(tokenizer.decode(outputs[0], skip_special_tokensTrue))重要提示merge_and_unload()操作会将LoRA权重永久合并到基础模型中得到一个标准的Transformers模型便于部署。但合并后无法再切换其他LoRA适配器。如果希望保持灵活性应直接使用PeftModel进行推理。4. 微调效果评估与问题排查训练完成了但模型效果到底如何如何判断是成功还是失败4.1 多维度的评估策略不要只看训练损失必须进行综合评估。自动评估指标困惑度Perplexity, PPL在保留的验证集上计算是衡量语言模型预测能力的基础指标。PPL越低越好。微调后在目标任务数据上的PPL应显著低于基础模型。任务特定指标根据你的微调目标选择。例如文本分类准确率、F1分数。代码生成通过率如HumanEval、BLEU分数。文本摘要ROUGE分数。问答精确匹配EM、F1。 可以编写评估脚本在训练过程中或训练后自动计算这些指标。人工评估至关重要 构建一个包含50-100个未见过的测试指令集让人类评估员可以是你自己或团队成员从以下几个维度对模型输出进行打分例如1-5分相关性回答是否直接解决了用户的问题准确性回答中的事实、数据、逻辑是否正确完整性回答是否全面覆盖了问题的要点风格符合度输出是否符合预期的格式、语气和专业度无害性回答是否避免了偏见、歧视和有害内容 人工评估是检验模型实用性的“金标准”。A/B测试 如果条件允许将微调后的模型与基础模型或微调前的模型进行线上A/B测试比较关键业务指标如用户满意度、任务完成率、对话轮次等。4.2 常见问题与排查指南微调过程中会遇到各种问题以下是一个快速排查表问题现象可能原因排查与解决思路训练损失不下降1. 学习率过低。2. 模型权重被冻结未成功应用LoRA。3. 数据格式错误模型无法学习。1. 逐步提高学习率如从2e-4到5e-4。2. 使用model.print_trainable_parameters()确认有参数可训练。3. 检查数据格式化函数确保与模型预训练格式一致。打印几条tokenized后的样本查看。验证损失先降后升过拟合1. 训练数据量太少。2. 训练轮数过多。3. 模型容量LoRA的r过大。1. 增加数据量或使用数据增强。2. 使用早停Early Stopping在验证损失最低点保存模型。3. 降低LoRA的秩r如从16降到8。增加Dropout。模型输出乱码或重复1. 数据中存在大量噪声或格式错误。2. 生成参数如温度、重复惩罚设置不当。3. 训练不充分或过拟合。1. 彻底清洗训练数据检查特殊字符和格式。2. 推理时调整temperature降低如0.2、repetition_penalty提高如1.2。3. 检查训练曲线可能是欠拟合或过拟合的表现。模型“遗忘”通用知识1. 微调数据领域过于狭窄。2. 学习率过高破坏了预训练权重。1. 在微调数据中混入少量通用指令数据如Alpaca数据集的子集。2. 降低学习率或使用更小的LoRAalpha值。显存溢出OOM1. 批次大小或序列长度过大。2. 未启用梯度检查点或4-bit量化。1. 减小per_device_train_batch_size和max_seq_length。2. 启用梯度检查点model.gradient_checkpointing_enable()。3. 确认bnb_config中load_in_4bitTrue已设置。微调后模型不遵循指令1. 数据中指令-回答对的质量差或不对应。2. 系统提示词System Prompt未正确设置或训练。1. 严格审核数据确保每个回答都是对应指令的高质量回复。2. 在训练数据中确保每条样本都包含清晰的角色设定System Message。4.3 高级技巧与优化方向当你掌握了基础微调后可以尝试以下进阶方法以提升效果渐进式学习率使用学习率调度器如余弦退火在训练后期降低学习率有助于模型收敛更稳定。分层LoRA不为所有层应用相同的LoRA配置。可以为模型深层更抽象和浅层更基础设置不同的秩r深层用更大的r以学习更复杂的任务特征。多任务微调如果你的目标涉及多种相关任务如代码生成、代码解释、代码调试可以将这些任务的数据混合在一起进行微调有助于模型学习更通用的表示提升泛化能力。使用更强的基座模型效果上限往往由基座模型决定。在资源允许的情况下选择能力更强的基座模型如Qwen2.5-14B vs 7B进行微调通常能获得质的提升。从检查点继续训练如果训练中断或想用新数据继续训练可以方便地从保存的检查点恢复训练只需在TrainingArguments中指定resume_from_checkpoint路径。微调大语言模型是一个结合了艺术与科学的实践过程。它没有唯一的“银弹”配方需要你根据具体任务、数据和资源进行反复实验和调优。从“ChatGPT_principle_fine-tuning_code_paper”这样的项目出发深入理解每个环节背后的原理亲手运行每一行代码分析每一次实验的结果你才能真正掌握这项塑造AI能力的关键技术。记住高质量的数据、合理的实验设计和耐心的迭代优化是通往成功微调之路的三个基石。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2571424.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…