news 2026/8/31 14:16:46

世界基础模型与后训练:从VLM推理到合成数据生成实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
世界基础模型与后训练:从VLM推理到合成数据生成实战

在物理 AI 概念逐渐落地的过程中,大家讨论最多的不再是“能不能训一个大模型”,而是“怎么让大模型真正理解物理世界、服务具体业务”。NVIDIA 的 Cosmos 3 正是围绕这个需求推出的世界基础模型(World Foundation Model,WFM)平台,它支持视频 tokenization、世界模拟以及可控合成数据生成,常被用在智慧城市、自动驾驶、工业机器人等场景中。本文以“后训练(Post-training)”为主线,串起两条实战线索:一端是智慧城市中的 VLM(Vision-Language Model,视觉语言模型)推理,另一端是农业机器人场景下的合成数据生成。文章会从概念解释开始,逐步拆解环境准备、模型微调思路、推理评估流程,最后给出常见问题和工程建议。

如果你正在做视觉语言模型相关项目,或者需要为机器人业务生成训练数据,这篇文章覆盖了从零开始跑通后训练流程的核心知识。文章中的代码以示例思路为主,实际使用时需要根据模型版本和硬件环境调整。

1. 背景与核心概念

在进入实操之前,先把几个容易混淆的概念理清楚:Cosmos 3、后训练、VLM 推理、合成数据,它们分别解决什么问题,彼此之间是什么关系。

1.1 Cosmos 3 是什么

Cosmos 3 是 NVIDIA 推出的世界基础模型系列,目标是把“物理世界”变成模型可以理解和生成的形态。和传统只处理文本的 LLM 不同,Cosmos 3 同时关注视频、图像、文本、运动轨迹等模态,能够完成视频预测、可控视频生成、token 化、以及为机器人策略模型提供训练数据。

用最简单的话说:你可以输入一段视频,模型预测下一帧或下一段运动;也可以输入文本加初始图像,生成一段符合物理规律的视频;还可以把真实视频转换成 token,供下游模型继续训练。

在智慧城市场景中,Cosmos 3 可以用来模拟车流、行人、天气变化;在农业机器人场景中,它可以生成果实生长、机械臂采摘、农田巡检等合成视频数据。这些数据经过清洗和标注后,就能用于后训练 VLM 或其他感知模型。

1.2 后训练(Post-training)与预训练有什么区别

预训练(Pre-training)是在海量通用数据上训练模型,让模型学会语言、视觉、常识等基础能力。这个过程成本极高,一般由大厂完成。后训练则是在预训练模型的基础上,用特定领域的少量数据继续训练,让模型适配具体业务。

后训练通常包含:

  • SFT(Supervised Fine-tuning,监督微调):用带标签的领域数据微调。
  • LoRA / QLoRA:低秩适配器,冻结原模型参数,只训练少量额外参数,适合消费级 GPU。
  • RLHF / DPO:基于人类偏好或规则反馈对齐模型行为。
  • 蒸馏(Distillation):用大模型指导小模型训练。

在 VLM 后训练中,最常见的是“多模态 SFT + LoRA”。这样做的好处是显存压力小,训练速度快,模型在特定任务上的表现也能显著提升。

1.3 VLM 推理是什么

VLM 推理指的是让视觉语言模型接收图像或视频输入,输出文本结果。常见任务包括:

  • 图像描述:给一张图,生成一句自然语言描述。
  • 视觉问答(VQA):根据图像内容回答用户问题。
  • 图文检索:在图片库中查找与文本描述匹配的图像。
  • 视频理解:对视频片段进行分类、摘要或异常检测。

在智慧城市中,VLM 推理可以应用在交通流量分析、渣土车识别、违规停车检测、极端天气预警等任务上。模型不再只是输出“有没有违规”,而是能输出一段完整的解释,方便运营人员快速决策。

1.4 合成数据在其中的作用

真实业务数据的采集和标注成本通常很高。以农业机器人为例,想要采集一年四季不同光照、不同成熟度的果实图像,需要等待真实作物周期,成本极高。合成数据(Synthetic Data)通过程序化生成或世界模型模拟,可以在短时间内批量产出带标注的数据。

合成数据的作用不只是“增加数据量”,更重要的是:

  • 控制数据分布:可以精确生成边缘场景,比如夜间、雨雾、遮挡。
  • 自动带标注:生成视频时可以同步输出边界框、深度图、轨迹、文本描述。
  • 补充长尾场景:真实数据里很少出现的极端情况,合成数据可以大量生成。

2. 环境准备与版本说明

在开始后训练和推理之前,需要确保硬件、软件环境满足要求。这里不会写死具体版本号,因为不同时间下载到的模型仓库和 CUDA 版本有差异。你先确认自己的环境,再参考下面的配置思路。

2.1 硬件要求

后训练过程对显存要求比较高。不同参数量模型和不同训练方式的显存占用差异很大,下面给一个估算参考:

模型规模全参微调显存需求LoRA 显存需求说明
7B 级 VLM约 48GB~80GB约 12GB~24GB适合 LoRA 或 QLoRA
13B 级 VLM约 80GB~160GB约 24GB~40GB建议多卡或混合精度
70B 级 VLM不太建议单卡全参多卡并行 + 量化生产环境需分布式

推理阶段显存需求明显小于训练,通常 24GB 显存可以流畅运行 7B~13B 级别的 VLM。如果你使用的是云服务器,建议选择带 NVIDIA A100、H100、L40S 或 RTX 4090 / RTX 6000 Ada 的实例。

2.2 软件环境

建议使用 Linux 系统(Ubuntu 20.04 或 22.04),配合以下软件:

  • Python 3.10 或更高版本
  • PyTorch 2.1 或更高版本
  • CUDA 11.8 或 12.x
  • Transformers 库
  • Peft 库(用于 LoRA 微调)
  • Accelerate 库(分布式训练加速)
  • Deepspeed(可选,用于大规模训练)
  • Cosmos SDK 或模型仓库(从 NVIDIA 官方渠道下载)

这些依赖可以通过pip安装,但在安装 PyTorch 和 CUDA 相关组件时,建议根据官方文档选择正确的安装命令,不要直接pip install torch了事,否则可能遇到 CUDA 版本不匹配的问题。

# 示例:创建一个独立的 Python 虚拟环境 python3 -m venv cosmos_env source cosmos_env/bin/activate # 升级 pip pip install --upgrade pip # 根据 PyTorch 官方命令安装,这里以 CUDA 12.1 为例 # pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

2.3 项目结构规划

为了便于后续维护,建议把项目拆分成以下几个目录:

cosmos3-project/ ├── configs/ # 训练和推理配置文件 │ ├── sft_lora.yaml │ ├── inference.yaml │ └── data_config.yaml ├── data/ # 数据保存目录 │ ├── raw/ # 原始视频、图像 │ ├── processed/ # 预处理后的 token 或标注 │ └── synthetic/ # 合成数据输出 ├── scripts/ # 训练、推理、评估脚本 │ ├── train_vlm.py │ ├── infer_vlm.py │ ├── generate_synthetic.py │ └── evaluate.py ├── models/ # 预训练模型权重下载位置 └── outputs/ # 训练日志、checkpoint、评估结果

这种结构的好处是数据、代码、配置、输出互相隔离,不容易误操作。

3. 核心工作流拆解:从数据到后训练再到推理

在写代码之前,先把整体工作流拆开看。很多人一上来就找训练脚本,结果数据格式不对、tokenizer 不匹配,浪费大量时间。下面这条链路是通用做法,也符合 Cosmos 3 生态的常见用法。

3.1 后训练数据准备

后训练 VLM 的数据通常采用这种格式:

{ "image": "path/to/image.jpg", "conversations": [ { "role": "user", "content": "图中发生了什么?" }, { "role": "assistant", "content": "画面显示一辆渣土车在路口违规右转,且未加盖篷布。" } ] }

如果是视频输入,格式会复杂一些,常见做法是把视频抽帧后,按帧序列组织对话,或者在 System Prompt 中说明视频内容。

数据质量直接影响后训练效果。建议遵循以下原则:

  • 每个样本的问答必须和图像内容严格一致。
  • 不要包含模糊、有歧义的描述。
  • 正负样本比例要均衡,避免模型对某一类答案过拟合。
  • 样本数量不需要太多,SFT 场景下几千到几万条高质量数据就有明显效果。

3.2 VLM 后训练的两种常见路径

路径一:全量模型微调(Full Fine-tuning),适合算力充足的场景,效果上限高,但显存和训练时间成本都很高。

路径二:LoRA 微调,只训练额外的低秩矩阵,冻结原模型参数。这是目前最流行的高性价比方案。配合 QLoRA 还可以进一步降低显存。

在工程实践中,我建议先用 LoRA 做一轮实验,验证数据格式和训练流程是否正常,再根据效果决定是否升级到全量微调。

3.3 合成数据生成如何与后训练配合

合成数据生成可以放在后训练的上游或下游:

  • 上游:用 Cosmos 3 生成大量视频和图像数据,再通过规则或人工筛选,变成后训练数据。
  • 下游:后训练完的 VLM 可以作为生成结果的质量评估器,自动筛选出质量更高的合成数据。

因此,一个完整的工程流程通常如下:

  1. 定义场景需求(比如:智慧城市的违停检测、农业机器人的成熟果实识别)。
  2. 用 Cosmos 3 生成一批候选视频。
  3. 用规则脚本 + 基础模型过滤无效样本。
  4. 将有效样本转换成 VLM 对话格式。
  5. 用 LoRA 对 VLM 进行后训练。
  6. 使用后训练的 VLM 走推理服务,再反馈优化合成数据。

4. 完整实战案例一:智慧城市 VLM 推理后训练

现在进入第一个实战案例。这里不会使用真实项目中的私有数据,而是以“车辆违章检测”作为演示场景,展示数据构建、LoRA 后训练、推理验证的完整流程。

4.1 创建项目结构和依赖

按照前面规划的项目结构创建目录:

mkdir -p cosmos3-project/{configs,data/{raw,processed,synthetic},scripts,models,outputs}

安装核心依赖:

pip install transformers peft accelerate datasets pillow

4.2 准备后训练数据

为了方便演示,这里构造一个极小的数据文件。实际项目中,应当通过爬取监控视频抽帧、人工标注或合成数据生成来制作。

# scripts/build_dataset.py import json import os # 示例数据路径,实际项目请替换成自己的图片 data_dir = "data/raw/traffic_events" output_file = "data/processed/traffic_vlm_dataset.json" samples = [ { "image": os.path.join(data_dir, "illegal_turn_001.jpg"), "conversations": [ { "role": "user", "content": "描述图中车辆的行驶行为,判断是否存在违章。" }, { "role": "assistant", "content": "图中车辆在右转车道进行直行,属于不按规定车道行驶,存在违章嫌疑。" } ] }, { "image": os.path.join(data_dir, "normal_turn_001.jpg"), "conversations": [ { "role": "user", "content": "描述图中车辆的行驶行为,判断是否存在违章。" }, { "role": "assistant", "content": "图中车辆在右转车道打右转向灯并减速右转,行驶行为正常,无违章。" } ] } ] with open(output_file, "w", encoding="utf-8") as f: json.dump(samples, f, ensure_ascii=False, indent=2) print(f"数据集已保存到 {output_file},共 {len(samples)} 条样本")

这个脚本演示了数据格式,实际训练时建议至少准备几百条不同场景的样本。

4.3 编写 LoRA 后训练脚本

这里以 Hugging Face 的transformerspeft为例。VLM 的具体结构需要根据你选择的模型(如 LLaVA、Qwen-VL、InternVL 等)调整。下面代码是通用训练思路:

# scripts/train_vlm.py import json import torch from transformers import AutoProcessor, AutoModelForVision2Seq, TrainingArguments, Trainer from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training model_id = "your-vlm-model-id" # 按实际模型替换 processor = AutoProcessor.from_pretrained(model_id) model = AutoModelForVision2Seq.from_pretrained( model_id, torch_dtype=torch.bfloat16, device_map="auto" ) # 冻结原模型参数 model.requires_grad_(False) model = prepare_model_for_kbit_training(model) # 配置 LoRA lora_config = LoraConfig( r=16, lora_alpha=32, target_modules=["q_proj", "v_proj", "k_proj", "o_proj"], lora_dropout=0.05, bias="none", task_type="CAUSAL_LM" ) model = get_peft_model(model, lora_config) # 加载数据,以 JSON 格式为例,实际需要实现数据处理函数 def load_dataset(path): with open(path, "r", encoding="utf-8") as f: return json.load(f) dataset = load_dataset("data/processed/traffic_vlm_dataset.json") # 这里省略了将样本转成 model input 的细节,需要根据 processor API 实现 # 关键是:image -> pixel_values,text -> input_ids training_args = TrainingArguments( output_dir="outputs/vlm_lora_checkpoints", per_device_train_batch_size=1, gradient_accumulation_steps=8, learning_rate=2e-4, num_train_epochs=3, logging_steps=10, save_steps=200, eval_strategy="no", save_total_limit=2, bf16=True, remove_unused_columns=False, ) trainer = Trainer( model=model, args=training_args, train_dataset=dataset, tokenizer=processor, ) trainer.train() model.save_pretrained("outputs/vlm_lora_final") processor.save_pretrained("outputs/vlm_lora_final")

这段代码里的数据处理部分被故意省略了,因为不同 VLM 的processor调用方式差异很大。你需要参考所选模型的官方文档,完成图像张量和文本张量的拼接。

4.4 编写 VLM 推理脚本

后训练完成后,可以写一个推理脚本,测试模型在新图片上的表现。

# scripts/infer_vlm.py import torch from PIL import Image from transformers import AutoModelForVision2Seq, AutoProcessor model_path = "outputs/vlm_lora_final" processor = AutoProcessor.from_pretrained(model_path) model = AutoModelForVision2Seq.from_pretrained( model_path, torch_dtype=torch.bfloat16, device_map="auto" ) image = Image.open("data/raw/traffic_events/illegal_turn_001.jpg") prompt = "描述图中车辆的行驶行为,判断是否存在违章。" inputs = processor( images=image, text=prompt, return_tensors="pt" ).to(model.device) with torch.no_grad(): outputs = model.generate( **inputs, max_new_tokens=128, do_sample=False ) response = processor.decode(outputs[0], skip_special_tokens=True) print("模型输出:", response)

如果模型在训练数据里见过类似图片,输出应该会包含“不按规定车道行驶”或“违章嫌疑”等描述。如果输出结果不理想,一般是数据量太少、数据分布单一,或者训练轮数不足导致的。

4.5 智慧城市项目中的部署建议

推理脚本跑通后,还需要考虑部署问题。常见做法是:

  • 用 FastAPI 包装推理服务,接收图片 URL 或 base64 数据。
  • 服务内部维护模型常驻显存,避免频繁加载。
  • 对单条图片推理增加超时控制,避免请求阻塞。
  • 对于夜间和雨雾天气等特殊场景,额外准备针对性数据增强样本。

5. 完整实战案例二:农业机器人合成数据生成

第二个案例聚焦农业机器人。这个场景的特点是数据获取周期长、标注成本高、环境变化大。用 Cosmos 3 生成合成数据,可以用较短周期覆盖不同光照、不同生长阶段、不同遮挡情况。

5.1 场景需求分析

假设我们要训练一个农业机器人视觉模型,任务是从果园视频中识别成熟果实并估计采摘点。真实采集数据需要等待果实成熟季节,且不同品种、不同天气都要覆盖。合成数据生成的目标是快速补齐这些样本。

5.2 Cosmos 3 合成数据生成流程

使用 Cosmos 3 生成视频的基本思路是:给定一段起始视频或一组文本条件,模型会继续生成后续视频帧。

# scripts/generate_synthetic.py # 示例思路:实际 API 以官方 SDK 为准 import cosmos_sdk # 按实际 SDK 导入 config = { "task": "video_prediction", "input_video": "data/raw/orchard_seed_clip.mp4", "prompt": "果园环境中,机械臂接近成熟苹果并准备采摘", "num_frames": 32, "fps": 16, "resolution": [1280, 720], "seed": 42 } # 生成视频 output_video_path = cosmos_sdk.generate_video(config) print("生成视频保存至:", output_video_path)

实际使用时,API 名称和参数需要以官方文档为准。生成完视频后,还要做后处理:

  1. 抽帧:每隔几帧取一张图。
  2. 标注:用预训练目标检测模型自动标注果实位置。
  3. 过滤:删除运动模糊过大、果实过小、严重遮挡的帧。
  4. 转成 VLM 训练格式:生成问答对,比如“图中苹果的成熟度如何?” -> “果实颜色偏红,成熟度较高,可作为采摘目标。”

5.3 合成数据自动筛选

合成数据不是越多越好,质量差的数据会污染模型。这里可以借助后训练好的 VLM 做自动筛选。

# 伪代码:使用 VLM 筛选合成帧 def filter_frame(frame_path): prompt = "这张图像是否清晰显示至少一个完整果实?请回答是或否。" answer = infer_vlm(frame_path, prompt) return "是" in answer # 对每个抽帧执行筛选 for frame in all_frames: if filter_frame(frame): keep_frames.append(frame)

这种方案把 VLM 和合成数据生成结合成闭环,质量会越筛越好。

5.4 用合成数据增强农业机器人模型

生成并筛选后的数据,可以继续用于后训练果实识别模型或 VLM。在训练过程中,注意不要把合成数据比例推到 100%。一般建议真实数据:合成数据在 1:1 到 1:4 之间比较稳妥,纯合成数据训练出的模型在真实环境中的迁移效果可能打折。

6. 常见问题与排查思路

后训练和推理过程中,很多问题都是环境或数据格式引起的。下面列出最常见的几类问题及解决方向。

问题现象常见原因解决思路
训练时显存不足(OOM)批量大小太大、模型过大降低 batch size、开启梯度累积、使用 QLoRA 量化
推理时输出空白或乱码tokenizer 与模型不匹配使用同一模型的 processor,确保skip_special_tokens=True
图像输入尺寸不一致报错数据预处理不规范统一缩放和处理管道,参考模型官方示例
后训练后效果反而下降学习率过高、数据噪声大降低学习率、清洗数据、增加验证集评测
合成数据背景单一随机种子固定或生成条件太少增加 prompt 多样性、引入天气和角度变化
模型生成视频卡顿显存不够或视频分辨率过高降低生成帧数和分辨率,使用流式生成
训练速度慢单卡算力不足或未开启混合精度开启bf16/fp16,使用多卡并行
LoRA 权重加载后不生效adapter 未合并或路径错误确认加载了 peft 模型,检查adapter_config.json

排查问题时的通用步骤是:先固定随机种子复现问题,再检查模型输入输出的 shape 和数据类型,最后用最小样本集跑通流程。

7. 最佳实践与工程建议

7.1 数据管理:先看数据,再调参数

很多项目效果不好,问题不在模型参数,而是数据。尽量把每个样本都可视化检查一遍。可以用脚本批量输出图像和对应的问答内容,人工抽检 10% 到 20% 的样本。数据质量稳定后,再调整训练参数才有意义。

7.2 配置管理:用 YAML 分离代码与参数

把模型路径、数据路径、LoRA 参数、训练参数放到 YAML 文件里,避免把配置硬编码在 Python 文件中。

# configs/sft_lora.yaml model_id: "your-vlm-model-id" data_path: "data/processed/traffic_vlm_dataset.json" output_dir: "outputs/vlm_lora_checkpoints" lora: r: 16 alpha: 32 dropout: 0.05 training: batch_size: 1 grad_accumulation_steps: 8 learning_rate: 2.0e-4 epochs: 3 bf16: true

这样方便不同实验之间对比,也方便回滚到某一个稳定配置。

7.3 异常处理与日志

在推理服务中,一定要捕获模型推理异常,避免单张图片导致整个进程退出。

import logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) def safe_infer(image_path): try: return infer_vlm(image_path) except Exception as e: logger.error(f"推理失败: {image_path}, 错误: {e}") return None

生产环境建议记录每个请求的耗时、输入图片大小、输出长度和异常信息,方便后期排查。

7.4 评估体系:每次实验都要有量化指标

不要只看几个示例结果就下结论。至少准备一个测试集,计算准确率、召回率、BLEU 或人工评分。在 VLM 后训练中,一个简单的做法是让模型对测试集输出结果,再和标准答案做文本相似度对比。

7.5 安全与合规提醒

如果数据来自真实监控摄像头或涉及个人隐私,必须先完成脱敏和授权流程。涉及城市道路或农业基地的数据采集,要遵守当地数据管理规范。合成数据虽然可以降低隐私风险,但如果合成内容模拟了真实环境,同样需要注意使用范围。

8. 总结与后续学习路线

从 Cosmos 3 的世界模型能力出发,本文梳理了 VLM 后训练和合成数据生成的完整链路。关键点可以归纳为三条:

  • 后训练不是只跑一个训练脚本,而是要先把数据格式、模型结构、评估标准定清楚。
  • 合成数据不是简单生成视频,而是需要生成、筛选、标注、后训练、再评估的闭环流程。
  • 推理部署阶段要关注显存、时延和异常处理,不能只看离线效果。

建议大家先从一个最小规模的闭环开始:用几十条数据跑通 LoRA 后训练,再写一个推理脚本验证结果。等全流程通了,再逐步扩大数据量、尝试更复杂的模型和分布式训练。

接下来可以继续学习这几个方向:

  • Cosmos 3 的官方 SDK 和模型仓库,理解视频 tokenizer 的具体用法。
  • PEFT 库的更多参数配置,尝试不同 target_modules 对效果的影响。
  • 评估方法,比如用 GPT-4 或开源模型对 VLM 输出做自动化打分。
  • 部署优化,比如 TensorRT、vLLM 等框架对推理速度的优化。

如果本文对你有帮助,建议收藏备用。后续我会继续更新关于 VLM 数据构建和合成数据质量评估的实战内容。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/31 14:16:26

Python OpenCV照片转卡通:双边滤波+自适应阈值+K-means全解析

简介:本资源是一套基于Python实现的photo-to-cartoon卡通化图像转换系统源码,面向图像处理初学者、计算机视觉爱好者及轻量级艺术创作需求者,解决真人照片自动转为卡通风格图像的技术落地问题,适用于社交头像生成、游戏原画预处理…

作者头像 李华
网站建设 2026/8/31 14:15:44

小红书校招算法笔试解析:从KMP到聚类与推荐系统

小红书2020校招算法笔试题卷三,算是一套在社区里流传比较广的题目。前阵子有学弟准备秋招,翻出这套题来问我哪些知识点必须吃透,我又把它整体过了一遍。说实话,这套卷子的风格很典型:不考偏门怪题,而是把数…

作者头像 李华
网站建设 2026/8/31 14:12:42

基于AI Agent的个性化信息流系统:原理与实战

最近总能在各种技术群里看到类似“算法推荐把我困在信息茧房里了”的吐槽。刷 B 站全是重复的影视解说,打开小红书全是广告软文,油管和推特更是被同质化内容塞满。平台推荐算法的核心目标并不是“让你看到你真正想看的”,而是“让你停留更久”…

作者头像 李华
网站建设 2026/8/31 14:09:23

AI Agent控制硬件设备:用Plumbing Spec构建标准化管道层

在实验室里让 AI 直接操作设备,最让人头疼的往往不是模型选型,而是设备之间五花八门的通信协议。你在 Agent 侧设计得很漂亮,结果到了设备端,有的走 Modbus,有的走 HTTP,有的只能通过串口读数据&#xff0c…

作者头像 李华
网站建设 2026/8/31 14:03:31

Java实现六爻起卦排盘小程序:从随机算法到规则引擎实战

简介:本资源是一套基于Java实现的六爻起卦排盘小程序完整源码,面向对周易文化与编程实践交叉领域感兴趣的开发者、传统文化爱好者及高校计算机专业学生,旨在解决传统六爻占卜手工起卦繁琐、解读门槛高、缺乏数字化工具支持等问题。压缩包共17…

作者头像 李华
网站建设 2026/8/31 14:01:36

STM32+JQ8900公交车报站语音系统设计与实战经验分享

简介:本资源是一个基于STM32F10x系列微控制器的公交车智能语音报站系统完整工程,面向嵌入式初学者与课程设计开发者,解决公共交通场景中自动语音提示、站点精准播报与硬件协同控制等实际问题。压缩包含222个文件,总大小8.45MB&…

作者头像 李华