多模态大模型mPLUG-Owl:从图文对齐到指令微调的实践指南

news2026/5/7 18:55:17
1. 项目概述从图文理解到多模态对话的跃迁最近在折腾多模态大模型一个绕不开的名字就是“X-PLUG/mPLUG-Owl”。这可不是什么猫头鹰插件而是一个在开源社区里相当有分量的多模态大语言模型家族。简单来说它让AI不仅能看懂文字还能理解图片并且能用自然语言跟你聊图片里的内容。比如你拍一张办公桌的照片问它“怎么整理更高效”它真能给你指出显示器位置不对、文件散乱等问题并给出建议。这种能力正是当下AI从“单科状元”向“通才”演进的关键一步。我最初关注到它是因为在尝试给一些传统行业做智能化升级时遇到了瓶颈很多场景的信息是“图文混杂”的。比如一份设备维护报告既有表格数据描述又附带了现场仪表盘的截图。纯文本模型处理不了图片而传统的视觉模型又看不懂表格旁边的文字注释。mPLUG-Owl这类模型的出现恰好填补了这个空白。它背后的核心思路很清晰——不是简单地把图像和文本模型拼在一起而是设计了一个精巧的“对齐”与“融合”机制让两种模态的信息能在一个统一的模型框架下深度交互最终用语言的形式输出智能化的回应。这个项目对于开发者、研究者乃至AI应用创业者都极具价值。对于开发者它提供了强大的开源基座可以基于此开发客服、教育、内容创作等领域的多模态应用对于研究者其模块化设计和训练策略为多模态学习提供了宝贵的范本对于创业者则意味着可以更低成本地验证和落地那些需要“眼脑并用”的AI创意。接下来我就结合自己的实践和拆解带你深入看看这只“猫头鹰”到底是如何构建的以及怎么把它用起来。2. 核心架构与训练策略拆解要理解mPLUG-Owl的强大之处得先抛开“黑箱”思维看看它的内部构造。它的设计哲学可以概括为“分而治之协同进化”即先让视觉和语言两个专家模块各自变得强大再教会它们高效合作。2.1 视觉编码器与语言大模型的选型与耦合模型的核心输入是图像和文本。对于图像处理mPLUG-Owl没有从头造轮子而是选择了经过大规模预训练的视觉TransformerViT作为视觉编码器例如CLIP的ViT-L/14。这是一个非常务实的选择。CLIP模型已经在数亿的图文对上训练过它学会的视觉特征表示具有极强的泛化能力能识别成千上万的物体、场景乃至一些抽象概念。直接利用这个强大的视觉专家等于站在了巨人的肩膀上。那么图像特征如何进入语言模型的世界呢这里有一个关键设计视觉抽象器。原始图像经过ViT编码后会得到一系列图像块patch的特征序列。如果直接把这个长序列扔给语言模型会极大增加计算负担并且语言模型可能无法有效处理这种密集的、未经筛选的视觉信息。视觉抽象器的作用就是作为一个“信息过滤器”和“翻译官”它将冗长的视觉特征序列压缩和提炼成固定数量的、语义更丰富的“视觉令牌”。这个过程可以理解为它把一张图片的细节像素、边缘总结成几个关键短语如“一只棕色的猫在沙发上睡觉”的语义核心只不过这些“短语”是以特征向量的形式存在的。这些提炼后的视觉令牌会被当作一种特殊的“视觉词汇”与文本词汇的嵌入向量拼接在一起形成多模态序列然后输入给语言模型。语言模型方面mPLUG-Owl通常基于开源的LLaMA或类似架构。它的任务就是基于之前的文本历史以及这些新加入的视觉上下文来预测下一个词。通过这种方式语言模型学会了在生成文本时同时“考虑”到图片内容。注意视觉抽象器的设计是性能关键。太简单的池化操作会丢失重要空间和细节信息太复杂的结构又会增加训练难度。mPLUG-Owl通常采用可学习的查询向量Learnable Queries通过交叉注意力机制与图像特征交互动态地“抽取”关键信息这是一个非常有效的设计。2.2 两阶段训练策略的深意训练一个多模态大模型绝非易事mPLUG-Owl采用的两阶段训练策略是其成功的关键这个策略深刻体现了“循序渐进”的学习思想。第一阶段预训练对齐这个阶段的目标是建立视觉和语言两个模态之间的“基础通信协议”。想象一下把一位只懂中文的作家和一位只懂法语的画家关在一起让他们合作完成一部作品。第一阶段就是教他们一些基本的共同词汇和手势让他们能初步理解对方的意图。具体做法是使用海量的图像-文本对例如LAION、COCO等数据集进行训练。输入是图像和对应的文本描述例如“一只狗在接飞盘”训练目标是让语言模型能够根据图像特征生成或重构出这段描述文本。在这个过程中视觉编码器保持冻结或轻微微调负责提取图像特征视觉抽象器学习如何提炼这些特征而语言模型则学习如何将这些视觉特征与文本词汇关联起来。这个阶段结束后模型已经具备了基础的“看图说话”能力但它可能还无法进行复杂的推理和对话。第二阶段指令微调如果说第一阶段是学习“词汇和语法”那么第二阶段就是学习“思考和对话”。在这个阶段视觉编码器通常被冻结只训练视觉抽象器和语言模型。使用的数据也从简单的描述性图文对变成了高质量的指令-回答对。这些数据可能是人工精心标注的例如“指令描述这张图片中人物的情绪。图片[一张人物图片] 回答图中人物眉头微皱嘴角向下看起来有些沮丧。” 也可能是通过大模型如GPT-4自动生成的。通过在这些数据上进行微调模型学会了遵循人类的复杂指令进行推理、解答、创作等高级任务。它不再是简单地描述“有什么”而是能回答“为什么”、“怎么样”、“如果…会怎样”等问题。这就是mPLUG-Owl能进行多轮对话和深度问答的原因。实操心得两阶段训练的资源消耗是天壤之别。预训练阶段需要巨大的算力数百甚至上千张GPU卡和数据集。对于绝大多数团队更现实的路径是直接使用开源的预训练权重然后专注于第二阶段的指令微调。你可以用自己领域特定的指令数据例如医疗影像问答、电商产品分析对话进行微调从而快速得到一个垂直领域的专家模型这是性价比最高的落地方式。3. 从零开始实践部署与微调指南理论说得再多不如亲手跑起来。这里我以基于Hugging Face Transformers库和公开模型权重为例带你走一遍本地部署和轻量微调的核心流程。假设你已经有一定的Python和深度学习环境基础。3.1 环境准备与模型加载首先确保你的环境有足够的资源。推理至少需要10GB以上的GPU显存例如RTX 3080/4080或以上微调则需要更大的显存或采用参数高效微调技术。我们创建一个干净的conda环境并安装依赖。# 创建并激活环境 conda create -n mplug_owl python3.10 conda activate mplug_owl # 安装核心库推荐使用PyTorch官方命令安装对应CUDA版本的PyTorch pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 以CUDA 11.8为例 pip install transformers accelerate sentencepiece pillow接下来是加载模型。mPLUG-Owl的模型权重通常在Hugging Face Model Hub上发布。我们需要找到对应的模型仓库例如MAGAer13/mplug-owl-llama-7b。加载模型和处理器负责图像预处理和文本tokenize的代码如下from transformers import MplugOwlForConditionalGeneration, MplugOwlProcessor import torch from PIL import Image # 指定模型名称 model_name MAGAer13/mplug-owl-llama-7b # 加载处理器和模型 processor MplugOwlProcessor.from_pretrained(model_name) model MplugOwlForConditionalGeneration.from_pretrained( model_name, torch_dtypetorch.bfloat16, # 使用bfloat16节省显存并保持精度 device_mapauto, # 使用accelerate库自动分配模型层到多GPU或CPU trust_remote_codeTrue # 因为模型可能包含自定义代码 ) # 将模型设置为评估模式 model.eval()这里有几个关键点torch_dtypetorch.bfloat16这是在大模型推理和训练中常用的半精度格式能在几乎不损失精度的情况下大幅减少显存占用和加速计算。device_map”auto”这是Hugging Faceaccelerate库的功能能自动将模型的不同层分配到可用的GPU和CPU内存上对于显存不足加载整个大模型的情况是救命稻草。trust_remote_codeTrue由于模型实现可能包含不在标准Transformers库中的自定义建模代码需要此参数来加载。3.2 进行多模态推理加载好模型后我们就可以进行图文对话了。准备一张图片和一个问题。# 1. 准备输入 image_path “your_image.jpg” # 替换为你的图片路径 image Image.open(image_path).convert(‘RGB’) prompt “|image|Describe what is happening in this image.” # 注意特殊的图像占位符 |image| # 2. 使用处理器处理输入 inputs processor(text[prompt], images[image], return_tensors“pt”) # 3. 将输入数据移动到模型所在的设备如GPU inputs {k: v.to(model.device) for k, v in inputs.items()} # 4. 生成回答 with torch.no_grad(): # 推理时关闭梯度计算节省内存 generated_ids model.generate(**inputs, max_new_tokens512) # max_new_tokens控制生成文本的最大长度 # 5. 解码生成的token id为文本 generated_text processor.batch_decode(generated_ids, skip_special_tokensTrue)[0] print(generated_text)这个流程是标准的多模态生成流程。特别需要注意的是提示词Prompt中的|image|这个特殊标记。它告诉模型在这个位置需要注入图像信息。处理器会识别这个标记并用对应的视觉令牌替换它。Prompt的构建对于模型表现至关重要通常遵循其训练时的指令格式例如“Human: |image|\n{你的问题}\nAI:”。3.3 使用LoRA进行指令微调如果你有特定领域的图文对话数据想让模型更擅长某个领域比如医学影像报告生成、时尚单品推荐那么进行指令微调是必要的。全参数微调成本高昂这里介绍使用LoRALow-Rank Adaptation这种参数高效微调方法。LoRA的核心思想是不对原始庞大的模型权重进行直接更新而是为模型中的线性层如Attention中的QKV投影层注入一组可训练的“低秩适配器”。在推理时适配器的效果会叠加到原权重上。这样需要训练的参数量可能只有原模型的0.1%-1%极大降低了资源需求。我们需要安装peft库pip install peft微调代码框架如下from peft import LoraConfig, get_peft_model, TaskType from transformers import TrainingArguments, Trainer import datasets # 1. 准备数据集 # 假设我们有一个dataset每条数据包含image (PIL Image), instruction (str), output (str) # 需要将instruction构造成包含|image|标记的完整prompt def format_prompt(example): example[‘prompt’] f“Human: |image|\\n{example[‘instruction’]}\\nAI:” return example dataset datasets.load_dataset(‘your_dataset_path’) dataset dataset.map(format_prompt) # 2. 定义数据处理函数 def tokenize_function(examples): # 处理图像 images [img.convert(‘RGB’) for img in examples[‘image’]] # 处理文本prompt作为输入output作为标签 text_inputs processor(textexamples[‘prompt’], padding“max_length”, truncationTrue, max_length512) with processor.tokenizer.as_target_tokenizer(): labels processor(textexamples[‘output’], padding“max_length”, truncationTrue, max_length512)[“input_ids”] # 将标签中用于填充的pad token id替换为-100以便在计算损失时被忽略 labels [[-100 if token processor.tokenizer.pad_token_id else token for token in label] for label in labels] return {“pixel_values”: processor.image_processor(images, return_tensors“pt”)[“pixel_values”], “input_ids”: text_inputs[“input_ids”], “attention_mask”: text_inputs[“attention_mask”], “labels”: labels} tokenized_dataset dataset.map(tokenize_function, batchedTrue) # 3. 配置LoRA lora_config LoraConfig( task_typeTaskType.CAUSAL_LM, # 因果语言模型任务 r8, # LoRA秩即适配器的内在维度通常8或16 lora_alpha32, # 缩放参数 lora_dropout0.1, target_modules[“q_proj”, “v_proj”] # 针对Attention的Q, V投影层注入适配器 ) # 4. 包装原模型 model MplugOwlForConditionalGeneration.from_pretrained(...) # 同上加载 model get_peft_model(model, lora_config) model.print_trainable_parameters() # 查看可训练参数量应该非常少 # 5. 定义训练参数并开始训练 training_args TrainingArguments( output_dir“./mplug-owl-lora-checkpoint”, per_device_train_batch_size4, gradient_accumulation_steps4, num_train_epochs3, logging_steps10, save_steps100, learning_rate1e-4, fp16True, # 使用混合精度训练进一步节省显存 remove_unused_columnsFalse, ) trainer Trainer( modelmodel, argstraining_args, train_datasettokenized_dataset[“train”], data_collatorlambda data: {key: torch.stack([d[key] for d in data]) if key“pixel_values” else torch.tensor([d[key] for d in data]) for key in data[0].keys()} ) trainer.train()这段代码包含了从数据准备到训练启动的完整流程。其中最关键的是理解LoRA的配置和数据处理。target_modules需要根据模型的具体结构来指定对于LLaMA架构的模型通常对q_proj查询投影和v_proj值投影层应用LoRA效果较好。数据处理部分要小心构建labels确保只有答案部分参与损失计算。4. 应用场景深度探索与实战案例mPLUG-Owl的能力远不止简单的“看图说话”。它的多模态理解与生成能力可以在许多实际场景中创造价值。下面我结合几个深度案例拆解其应用逻辑和实现要点。4.1 智能内容审核与敏感信息识别传统的文本或图像审核模型是孤立的。文本模型审核评论区视觉模型审核配图但有些违规内容恰恰出现在“图文结合”的上下文里。比如一张普通的街道图片图配文“在这里集合”文分开看都没问题结合看可能就有风险。mPLUG-Owl可以同时理解图文进行更精准的综合判断。实现思路构建指令数据收集或生成一批违规图文对和正常图文对。为每对数据构建审核指令例如“指令请判断以下图文内容是否包含违规的暴力信息。图片[图片]文本‘看我这新买的玩具帅吗’”。微调模型使用LoRA在上述数据上微调模型。训练目标不是生成描述而是生成判断结果如“该内容包含暴力暗示违规。”或“该内容为正常生活分享合规。”部署推理服务将微调后的模型部署为API服务。前端将待审核的图片和文本拼接成Prompt|image| 文本发送给模型并解析其生成的自然语言判断结果可以进一步通过规则或关键词匹配将其转化为结构化的“通过/拒绝”标签。注意事项审核场景对准确率和召回率要求极高且违规类型多样。单一模型可能难以覆盖所有情况。一个更稳健的方案是采用“mPLUG-Owl 专项分类器”的级联架构。先用mPLUG-Owl进行粗筛对模型判断模糊或高风险的案例再调用更专业的、针对特定违规类型如血腥、政治敏感训练的小型分类器进行复核平衡效果与成本。4.2 交互式教育辅导助手在教育领域尤其是STEM科学、技术、工程、数学学科图表、公式、实验装置图是核心内容。一个能理解这些多模态内容并互动答疑的助手价值巨大。实战案例物理习题辅导假设我们想做一个能讲解物理电路图题目的助手。数据准备收集大量包含电路图图像和对应问题、分步解答文本的数据。将问题作为指令将解答作为期望的输出。指令“根据图中的电路如果电源电压为12VR12ΩR24Ω请问流过R1的电流是多少请给出计算步骤。”输出“首先识别这是一个并联电路...根据欧姆定律IU/R...因此流过R1的电流为6A。”领域适应微调使用LoRA在物理电路图文数据集上微调模型。这能让模型更好地理解电路元件符号电阻、电源、开关的连接关系。系统集成开发一个前端界面学生可以上传电路图照片或手绘图并用语音或文字提问。后端调用微调后的mPLUG-Owl模型生成解答。更进一步可以结合代码执行引擎让模型不仅能给出公式还能自动计算数值结果并返回。这个场景的难点在于模型的推理链可靠性。模型可能会“幻觉”出错误的公式或计算步骤。为了缓解这个问题可以在训练数据中强化“思维链”格式要求解答必须一步步推导。在推理时也可以采用“自我验证”策略让模型先生成解答再基于同一个问题生成一个验证性问题如“请检查上述解答中计算总电阻的步骤是否正确”通过多次生成和一致性检查来提高答案的可信度。4.3 电商场景下的智能客服与营销文案生成在电商平台用户经常对着商品详情页的图片提问“这件衣服的材质是什么”“这个沙发适合放在20平米的客厅吗”传统的客服机器人基于文本关键词匹配完全无法处理这类与具体视觉内容强相关的问题。应用落地步骤构建商品知识-视觉关联库对于每个商品SKU除了传统的属性文本标题、描述、参数还需要提取其主图、细节图、场景图的深度视觉特征可以使用mPLUG-Owl的视觉编码器提前提取并存储。实时问答当用户上传一张商品图可能是截图或自己拍的并提问时步骤一视觉检索。用同样的视觉编码器提取用户图片的特征在商品库中进行快速向量相似度检索找到最匹配的1-3个商品。步骤二多模态问答。将检索到的商品主图和其详细的文本描述属性、详情页文案作为上下文与用户的问题一起构建给mPLUG-Owl的Prompt。例如“Human: |image|\n结合该商品图片和以下信息[商品标题纯棉衬衫材质100%棉尺码M/L/XL]回答用户问题这件衣服起球吗\nAI:”。步骤三生成回复。模型会综合视觉信息图片显示的是衬衫纹理和文本信息材质为100%棉生成如“纯棉材质在正常穿着和洗涤下抗起球性较好但剧烈摩擦可能导致轻微起球建议反面轻柔洗涤。”这样的专业回复。营销文案生成同样可以指令模型根据商品图和核心卖点生成小红书风格、微博风格等不同平台的营销文案实现“一键出稿”。在这个场景中检索增强Retrieval-Augmented的思路至关重要。直接让大模型记忆所有商品信息是不可能的也不安全容易导致信息泄露或幻觉。通过先检索后生成的方式既保证了信息的实时性和准确性又发挥了模型强大的语言组织和推理能力。5. 常见问题、优化策略与避坑指南在实际部署和调优mPLUG-Owl的过程中你会遇到各种各样的问题。下面我整理了一份从实践中总结出来的问题排查清单和优化技巧。5.1 性能与效果相关问题问题1模型响应速度慢特别是首次生成时。排查与解决检查硬件确保使用了GPU进行推理并且CUDA已正确安装。使用nvidia-smi命令查看GPU利用率。优化加载首次加载模型慢是正常的因为要从硬盘加载数十GB的权重。之后可以使用.to(‘cuda’)将模型常驻GPU内存或使用更快的NVMe SSD。调整生成参数max_new_tokens不要设置得过大够用即可。使用num_beams1贪婪解码而不是束搜索beam search可以大幅加快生成速度但可能略微降低生成质量。对于对话场景贪婪解码通常足够。使用量化这是提升推理速度、降低显存占用的最有效手段。可以使用bitsandbytes库进行8位或4位量化加载模型。from transformers import BitsAndBytesConfig bnb_config BitsAndBytesConfig(load_in_4bitTrue, bnb_4bit_compute_dtypetorch.bfloat16) model MplugOwlForConditionalGeneration.from_pretrained(model_name, quantization_configbnb_config, device_map“auto”)4位量化后一个7B模型可能只需4-6GB显存即可运行速度也有提升。问题2模型生成的内容存在“幻觉”即编造事实或描述图片中不存在的东西。排查与解决Prompt工程在指令中明确要求模型“仅根据图片内容回答”或“如果你不确定请说不知道”。例如“Human: |image|\n请严格根据你看到的图片内容描述画面中的人物在做什么。如果图片中没有人请直接回答‘图片中没有人’。\nAI:”。温度参数降低生成时的temperature参数如设为0.1或0.2减少随机性使输出更确定性、更倾向于高频可能更准确的词汇。后处理与验证对于关键应用可以引入一个验证步骤。例如让模型先生成描述再让另一个专门训练的“事实核查”分类器或规则判断描述中的关键实体物体、动作是否与图片检测出的标签高度吻合。微调数据质量如果进行了微调请检查训练数据中是否有图文不匹配的情况。高质量、精准对齐的指令数据是减少幻觉的根本。问题3模型对图片细节理解不足比如看不清小字、数错数量。原因分析这是当前视觉语言模型的普遍局限。视觉编码器如ViT通常将图片分割成固定大小的块如14x14像素每个块被编码为一个特征。这意味着原始的高分辨率细节在编码过程中已经被“平滑”或丢失了。小字、密集物体在低分辨率下会变得模糊。优化策略高分辨率处理尝试在预处理时不直接将原图缩放到标准尺寸如224x224而是先保持其高分辨率或者将图片分割成多个区域patches分别输入模型再融合结果。但这会极大增加计算成本。使用更强大的视觉编码器关注mPLUG-Owl的后续版本或类似模型它们可能集成了更高分辨率的ViT或更先进的视觉骨干网络如Swin Transformer。任务分解对于需要精确识别的任务如OCR读字不要完全依赖端到端的VLM。最佳实践是结合专用工具。例如先用OCR引擎如PaddleOCR、Tesseract提取图片中的文字将这些文字作为附加文本上下文和图片一起输入给mPLUG-Owl。Prompt可以设计为“Human: |image|\n图片中识别出的文字有‘产品说明书’‘成分水、甘油’。请根据图片和这些文字总结这是什么产品。\nAI:”。这样模型就能综合利用视觉信息和精确的文本信息。5.2 训练与部署工程问题问题4LoRA微调后模型效果提升不明显甚至变差。排查清单数据量与质量指令微调数据是否足够通常需要数千到数万条高质量数据指令和输出是否匹配、准确LoRA配置target_modules是否设置正确对于LLaMA架构尝试包含q_proj,v_proj,k_proj,o_proj。r秩值是否过小尝试从8增加到16或32。学习率lr是否合适1e-4是常用起点可以尝试3e-4, 5e-4。训练超参数batch_size是否太小尝试增大per_device_train_batch_size或gradient_accumulation_steps。训练轮数num_epochs是否足够或过多过拟合会导致泛化能力下降。基础模型确认你下载的预训练模型权重是完整的并且确实具备良好的基础多模态能力。可以先用原始模型在标准测试集如VQA上验证效果。问题5如何将微调后的模型部署为高并发API服务解决方案直接使用Transformers库运行模型无法应对高并发。推荐以下方案使用推理服务器将模型部署到TensorRT-LLM或vLLM等高性能推理服务器上。这些服务器对Transformer模型进行了深度优化支持动态批处理、持续批处理、PagedAttention等高级特性能极大提高GPU利用率和吞吐量。你需要将Hugging Face格式的模型转换为对应引擎的格式如TensorRT。模型轻量化在部署前对模型进行量化如AWQ、GPTQ和编译优化减少模型体积和延迟。异步处理与队列使用FastAPI或Flask构建Web API但将耗时的模型推理请求放入任务队列如Redis Queue, Celery由后台工作进程处理避免阻塞Web请求。前端可以通过轮询或WebSocket获取结果。硬件选择对于生产环境考虑使用推理专用卡如NVIDIA T4, L4或高显存消费级卡如RTX 4090并根据QPS每秒查询率预估所需GPU数量。问题6处理包含多张图片的输入如PDF、长文档。当前限制标准的mPLUG-Owl模型通常设计为单图输入。直接将多张图片平铺拼接成一张大图输入会超出视觉编码器的处理能力且会破坏每张图片自身的结构信息。实用方案分而治之将文档按页或按区域分割成多个单张图片。分别处理对每张图片单独调用模型获取每张图片的描述或问答结果。信息聚合将上一步得到的所有文本结果输入给一个纯文本的大语言模型如ChatGLM、Qwen并给出聚合指令如“请根据以下对多页文档每一页的描述总结整个文档的核心内容。”。这样通过“VLM处理单页 LLM聚合全文”的两阶段流水线间接实现了多图理解。这是目前工程上最可行的办法。最后我想分享一点个人体会。多模态大模型就像给AI装上了眼睛但让它真正“看懂”并“说清”依然有很长的路要走。mPLUG-Owl是一个强大的开源工具但它不是魔法。在实际项目中它的价值往往不是作为独立的解决方案而是作为智能流水线中的核心“理解与推理”模块。你需要清晰地定义它的边界——擅长做什么整体场景理解、跨模态推理不擅长做什么精细定位、超高精度识别——然后用更专业的工具OCR、目标检测、向量数据库去弥补它的短板。这种“大模型专业工具”的混合智能架构才是当前最务实、最有效的落地路径。当你把它用在对的、边界清晰的地方时你会惊叹于它带来的效率提升和体验变革。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2592349.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;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…