【30分钟上手】GLM-4V-9B本地部署与多模态推理全流程:从0到1构建你的视觉大模型应用
引言:告别云服务依赖,本地部署视觉大模型不再是难题
你是否还在为使用云端大模型API而担忧数据隐私泄露?是否因高昂的调用费用而却步?或者因网络延迟影响多模态应用体验?现在,这些问题都将成为过去。本文将带你从零开始,在本地环境中部署GLM-4V-9B多模态大模型,让你在个人电脑上即可体验强大的视觉理解与文本生成能力。
读完本文后,你将能够:
- 理解GLM-4V-9B模型的核心特性与技术优势
- 准备并配置符合要求的本地运行环境
- 完成模型下载与依赖安装的全流程
- 使用Python代码实现图像描述、视觉问答等多模态任务
- 优化模型运行性能,解决常见部署问题
- 探索GLM-4V-9B在实际场景中的应用可能性
一、GLM-4V-9B模型深度解析:技术架构与性能优势
1.1 模型概述与核心特性
GLM-4V-9B是智谱AI推出的最新一代预训练模型GLM-4系列中的开源版本,是一个具备强大视觉理解能力的多模态语言模型。与传统的纯文本语言模型不同,GLM-4V-9B能够同时处理文本和图像输入,实现跨模态的理解与生成。
该模型的主要特性包括:
- 多模态能力:融合文本与图像理解,支持图像描述、视觉问答等复杂任务
- 长上下文支持:支持最大8K上下文长度,能够处理长文本输入与多轮对话
- 多语言支持:覆盖包括日语、韩语、德语在内的26种语言
- 高效推理:优化的模型架构与量化方案,适合本地部署运行
1.2 技术架构解析
GLM-4V-9B的技术架构融合了先进的语言模型与视觉编码器,其核心结构如下:
- 文本编码器:基于GLM架构的Transformer编码器,将文本转换为向量表示
- 图像编码器:EVA2-CLIP模型,负责将图像转换为视觉特征向量
- 多模态融合层:实现文本与视觉特征的有效融合,支持跨模态注意力机制
- GLM-4-9B语言模型:28层Transformer结构,隐藏层维度4096,32个注意力头
- 输出生成:基于上下文预测下一个token,支持文本生成与视觉问答
1.3 性能评估:多模态任务表现
GLM-4V-9B在多个权威多模态评测集上表现优异,尤其在中文场景下具有明显优势:
| 评测集 | 任务类型 | GLM-4V-9B | GPT-4v | Qwen-VL-Max | Claude-3V Opus |
|---|---|---|---|---|---|
| MMBench-EN-Test | 英文综合 | 81.1 | 81.0 | 77.6 | 63.3 |
| MMBench-CN-Test | 中文综合 | 79.4 | 80.2 | 75.7 | 59.2 |
| SEEDBench_IMG | 综合能力 | 76.8 | 73.0 | 72.7 | 64.0 |
| MME | 感知推理 | 2163.8 | 2070.2 | 2281.7 | 1586.8 |
| OCRBench | 文字识别 | 786 | 656 | 684 | 694 |
从表格数据可以看出,GLM-4V-9B在中文综合能力和文字识别任务上表现尤为突出,OCR任务得分786,领先于其他模型,这使得它特别适合处理包含中文文本的图像理解任务。
二、本地部署环境准备:硬件要求与软件配置
2.1 硬件要求与性能预估
部署GLM-4V-9B对硬件有一定要求,以下是推荐配置:
| 配置项 | 最低要求 | 推荐配置 |
|---|---|---|
| 显卡 | NVIDIA GPU, 10GB VRAM | NVIDIA GPU, 24GB+ VRAM (如RTX 4090, A10) |
| CPU | 8核 | 12核及以上 |
| 内存 | 32GB | 64GB |
| 存储 | 50GB SSD可用空间 | 100GB+ NVMe SSD |
| 操作系统 | Linux (Ubuntu 20.04+) | Linux (Ubuntu 22.04 LTS) |
不同量化精度下的性能与显存占用预估:
- FP16 (全精度):约28GB显存,最佳性能
- INT8:约14GB显存,性能损失约10%
- INT4:约8GB显存,性能损失约20%
2.2 软件环境配置
2.2.1 基础依赖安装
首先安装必要的系统依赖:
# 更新系统包
sudo apt update && sudo apt upgrade -y
# 安装基础工具
sudo apt install -y build-essential git wget curl python3 python3-pip
2.2.2 CUDA环境配置
GLM-4V-9B需要NVIDIA CUDA支持以实现GPU加速:
# 安装CUDA Toolkit 11.8 (根据你的GPU型号选择合适版本)
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt update
sudo apt install -y cuda-11-8
# 设置环境变量
echo 'export PATH=/usr/local/cuda-11.8/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc
# 验证CUDA安装
nvcc --version
nvidia-smi
2.2.3 Python虚拟环境配置
创建并激活Python虚拟环境,避免依赖冲突:
# 安装虚拟环境工具
pip3 install virtualenv
# 创建虚拟环境
virtualenv -p python3.10 glm4v-env
# 激活虚拟环境
source glm4v-env/bin/activate
# 验证Python版本
python --version # 应显示Python 3.10.x
三、模型部署全流程:从代码获取到首次推理
3.1 获取模型代码与权重
首先克隆GLM-4V-9B的官方仓库:
# 克隆代码仓库
git clone https://gitcode.com/openMind/glm-4v-9b.git
cd glm-4v-9b
# 查看仓库结构
ls -la
仓库主要文件结构:
README.md: 项目说明文档configuration_chatglm.py: 模型配置文件modeling_chatglm.py: 模型结构定义tokenization_chatglm.py: 分词器实现visual.py: 视觉编码器相关代码model-xxxx-of-00015.safetensors: 模型权重文件(15个分块)
注意:模型权重文件较大(约28GB),确保有足够存储空间和稳定的网络连接
3.2 安装Python依赖
根据项目要求安装必要的Python依赖:
# 创建requirements.txt文件
cat > requirements.txt << EOL
torch>=2.0.0
transformers>=4.44.0
pillow>=9.5.0
numpy>=1.24.0
accelerate>=0.24.0
sentencepiece>=0.1.99
cpm_kernels>=1.0.11
einops>=0.6.1
timm>=0.9.7
EOL
# 安装依赖
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
3.3 模型加载与初始化
创建模型加载脚本load_model.py:
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from PIL import Image
def load_glm4v_model(model_path="."):
"""加载GLM-4V-9B模型和分词器"""
print("正在加载模型和分词器...")
# 加载分词器
tokenizer = AutoTokenizer.from_pretrained(
model_path,
trust_remote_code=True
)
# 加载模型
model = AutoModelForCausalLM.from_pretrained(
model_path,
torch_dtype=torch.bfloat16, # 使用bfloat16节省显存
low_cpu_mem_usage=True, # 低CPU内存使用模式
trust_remote_code=True
).eval() # 设置为评估模式
# 移动到GPU
if torch.cuda.is_available():
model = model.cuda()
print("模型已移至GPU")
else:
print("警告: 未检测到GPU,将使用CPU运行,速度会很慢")
return model, tokenizer
if __name__ == "__main__":
# 加载模型
model, tokenizer = load_glm4v_model()
# 打印模型基本信息
print(f"模型配置: {model.config}")
print("模型加载完成,准备进行推理")
运行模型加载脚本:
python load_model.py
首次加载模型会比较慢,因为需要读取并处理15个模型权重文件,请耐心等待
3.4 首次推理:图像描述任务实现
创建图像描述脚本image_captioning.py:
import torch
from PIL import Image
import argparse
def generate_image_caption(model, tokenizer, image_path, device="cuda"):
"""
使用GLM-4V-9B生成图像描述
参数:
model: 加载好的GLM-4V-9B模型
tokenizer: 对应的分词器
image_path: 图像文件路径
device: 运行设备
返回:
str: 生成的图像描述
"""
# 打开并预处理图像
image = Image.open(image_path).convert('RGB')
# 构建对话历史
query = "描述这张图片的内容,包括场景、物体和颜色等细节"
inputs = tokenizer.apply_chat_template(
[{"role": "user", "image": image, "content": query}],
add_generation_prompt=True,
tokenize=True,
return_tensors="pt",
return_dict=True
)
# 将输入移至指定设备
inputs = inputs.to(device)
# 生成配置
gen_kwargs = {
"max_length": 2500, # 最大生成长度
"do_sample": True, # 启用采样
"top_k": 1, # top_k采样参数
"temperature": 0.8 # 温度参数,控制生成多样性
}
# 生成图像描述
with torch.no_grad(): # 禁用梯度计算,节省显存
outputs = model.generate(**inputs, **gen_kwargs)
outputs = outputs[:, inputs['input_ids'].shape[1]:]
caption = tokenizer.decode(outputs[0], skip_special_tokens=True)
return caption
if __name__ == "__main__":
# 解析命令行参数
parser = argparse.ArgumentParser(description='使用GLM-4V-9B生成图像描述')
parser.add_argument('--image', type=str, required=True, help='图像文件路径')
args = parser.parse_args()
# 加载模型和分词器
from load_model import load_glm4v_model
model, tokenizer = load_glm4v_model()
# 生成图像描述
device = "cuda" if torch.cuda.is_available() else "cpu"
caption = generate_image_caption(model, tokenizer, args.image, device)
# 打印结果
print("\n===== 图像描述结果 =====")
print(caption)
print("=======================")
准备一张测试图像(如test_image.jpg),运行图像描述脚本:
# 下载一张测试图像(可选)
wget https://img95.699pic.com/xsj/0n/6b/7u/ys.jpg -O test_image.jpg
# 运行图像描述
python image_captioning.py --image test_image.jpg
预期输出类似:
===== 图像描述结果 =====
这张图片展示了一片美丽的自然风光。画面中央是一片平静的湖泊,湖水呈现出清澈的蓝色,倒映着天空中的白云。湖的周围环绕着茂密的绿色森林,树木高大挺拔。远处可以看到连绵起伏的山脉,山顶覆盖着皑皑白雪。天空湛蓝,点缀着几朵白云,阳光明媚,整个场景给人一种宁静、清新的感觉。
=======================
3.5 多轮视觉问答:构建交互式对话
创建多轮视觉问答脚本visual_qa.py:
import torch
from PIL import Image
import readline # 用于命令行历史记录和编辑
def visual_qa_demo(model, tokenizer, image_path, device="cuda"):
"""
视觉问答交互演示
参数:
model: 加载好的GLM-4V-9B模型
tokenizer: 对应的分词器
image_path: 图像文件路径
device: 运行设备
"""
# 打开并预处理图像
image = Image.open(image_path).convert('RGB')
print(f"已加载图像: {image_path}")
print("进入视觉问答交互模式,输入'quit'退出")
print("-" * 50)
# 初始化对话历史
conversation = []
while True:
# 获取用户输入
try:
user_question = input("你: ")
except (EOFError, KeyboardInterrupt):
print("\n退出程序")
break
# 检查是否退出
if user_question.lower() in ["quit", "exit", "q"]:
print("谢谢使用,再见!")
break
# 添加用户问题到对话历史
conversation.append({"role": "user", "image": image, "content": user_question})
# 构建模型输入
inputs = tokenizer.apply_chat_template(
conversation,
add_generation_prompt=True,
tokenize=True,
return_tensors="pt",
return_dict=True
).to(device)
# 生成回答
gen_kwargs = {
"max_length": 2500,
"do_sample": True,
"top_k": 1,
"temperature": 0.7
}
with torch.no_grad():
outputs = model.generate(**inputs, **gen_kwargs)
outputs = outputs[:, inputs['input_ids'].shape[1]:]
answer = tokenizer.decode(outputs[0], skip_special_tokens=True)
# 显示回答
print(f"GLM-4V: {answer}")
print("-" * 50)
# 添加模型回答到对话历史
conversation.append({"role": "assistant", "content": answer})
# 移除图像,只保留第一个提问中的图像
if len(conversation) > 1:
for msg in conversation[:-1]:
if "image" in msg:
del msg["image"]
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser(description='GLM-4V-9B视觉问答交互演示')
parser.add_argument('--image', type=str, required=True, help='图像文件路径')
args = parser.parse_args()
# 加载模型和分词器
from load_model import load_glm4v_model
model, tokenizer = load_glm4v_model()
# 启动交互演示
device = "cuda" if torch.cuda.is_available() else "cpu"
visual_qa_demo(model, tokenizer, args.image, device)
运行视觉问答交互演示:
python visual_qa.py --image test_image.jpg
交互示例:
已加载图像: test_image.jpg
进入视觉问答交互模式,输入'quit'退出
--------------------------------------------------
你: 图片中有什么物体?
GLM-4V: 图片中包含湖泊、森林、山脉和天空等元素。具体来说,有一片蓝色的湖泊,周围环绕着绿色的森林,远处是带雪顶的山脉,天空中有白云。
--------------------------------------------------
你: 图片中的天气如何?
GLM-4V: 图片中的天气看起来非常晴朗。天空湛蓝,只有少量白云,阳光明媚,没有明显的云层或降雨迹象。
--------------------------------------------------
你: 这是什么季节?
GLM-4V: 从图片中的元素判断,这可能是夏季或春季。虽然远处山脉有积雪,但近处的森林呈现出茂密的绿色,没有落叶,湖泊也没有结冰,这些都表明是温暖的季节。
--------------------------------------------------
你: quit
谢谢使用,再见!
四、性能优化与常见问题解决
4.1 显存优化策略
当显存不足时,可以尝试以下优化策略:
4.1.1 使用INT8/INT4量化
修改load_model.py,添加量化加载选项:
def load_glm4v_model(model_path=".", quantize=None):
"""
加载GLM-4V-9B模型和分词器,支持量化
参数:
model_path: 模型路径
quantize: 量化方式,可选None, "int8", "int4"
"""
print(f"正在加载模型和分词器,量化方式: {quantize}")
# 加载分词器
tokenizer = AutoTokenizer.from_pretrained(
model_path,
trust_remote_code=True
)
# 加载模型
model_kwargs = {
"trust_remote_code": True,
"low_cpu_mem_usage": True
}
# 根据量化方式设置参数
if quantize == "int8":
model_kwargs["load_in_8bit"] = True
elif quantize == "int4":
model_kwargs["load_in_4bit"] = True
else:
model_kwargs["torch_dtype"] = torch.bfloat16
model = AutoModelForCausalLM.from_pretrained(
model_path,** model_kwargs
).eval()
# 移动到GPU(如果使用量化,会自动处理)
if not quantize and torch.cuda.is_available():
model = model.cuda()
print("模型已移至GPU")
return model, tokenizer
使用INT8量化加载模型:
python load_model.py --quantize int8
4.1.2 启用CPU卸载(CPU Offloading)
对于显存非常有限的情况,可以启用CPU卸载:
from transformers import BitsAndBytesConfig
def load_model_with_offloading(model_path="."):
"""使用CPU卸载加载模型,适合显存较小的GPU"""
# 配置量化参数
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_use_double_quant=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16
)
# 配置CPU卸载
offload_folder = "./offload"
model = AutoModelForCausalLM.from_pretrained(
model_path,
quantization_config=bnb_config,
device_map="auto",
offload_folder=offload_folder,
trust_remote_code=True
)
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
return model, tokenizer
4.2 推理速度优化
提升推理速度的几种方法:
4.2.1 使用Flash Attention
GLM-4V-9B支持Flash Attention加速,修改modeling_chatglm.py中的注意力实现:
# 在CoreAttention类定义中,将默认注意力实现替换为FlashAttention
# 找到这行:self.core_attention = CoreAttention(config, self.layer_number)
# 替换为:
if is_flash_attn_2_available():
self.core_attention = FlashAttention2(config, self.layer_number)
else:
self.core_attention = CoreAttention(config, self.layer_number)
启用Flash Attention后,推理速度可提升30-50%,同时显存占用减少。
4.2.2 调整生成参数
修改生成参数以平衡速度和质量:
gen_kwargs = {
"max_length": 1024, # 限制最大长度
"do_sample": False, # 关闭采样,使用贪婪解码
"temperature": 0.0, # 温度设为0,确定性输出
"top_k": 1, # 只考虑top 1 token
"num_beams": 1, # 关闭beam search
"eos_token_id": tokenizer.eos_token_id,
"pad_token_id": tokenizer.pad_token_id
}
4.3 常见问题解决方案
4.3.1 模型加载失败
问题:OSError: Error no file named pytorch_model.bin
解决方案:
- 检查模型文件是否完整下载(共15个.safetensors文件)
- 确保使用最新版本的transformers库:
pip install -U transformers - 检查文件权限:
chmod -R 755 glm-4v-9b
4.3.2 CUDA内存不足
问题:RuntimeError: CUDA out of memory
解决方案:
- 使用量化加载:
load_in_8bit=True或load_in_4bit=True - 减少批处理大小(设置为1)
- 降低输入图像分辨率
- 启用CPU卸载:
device_map="auto"
4.3.3 图像推理结果质量低
问题:生成的图像描述或回答质量不高
解决方案:
- 调整生成参数:提高temperature(如0.7-0.9)
- 使用beam search:
num_beams=3 - 提供更明确的问题或提示
- 确保输入图像质量良好,分辨率适中
4.3.4 中文显示乱码
问题:生成的中文文本显示乱码
解决方案:
- 检查终端编码:
echo $LANG应显示包含UTF-8 - 设置Python文件编码:在脚本开头添加
# -*- coding: utf-8 -*- - 使用支持UTF-8的终端软件
五、实际应用场景:从原型到产品化
5.1 智能图像分析系统
基于GLM-4V-9B构建一个智能图像分析系统,可应用于:
- 电商平台商品自动描述生成
- 社交媒体图像内容审核
- 新闻图片自动标注
- 医学影像初步诊断辅助
系统架构:
实现示例代码片段:
def analyze_product_image(model, tokenizer, image_path):
"""分析产品图像,生成电商描述"""
image = Image.open(image_path).convert('RGB')
# 多维度产品分析提示
queries = [
"描述这个产品的外观、颜色和材质",
"这个产品有什么功能和用途?",
"这个产品适合什么人群使用?",
"这个产品的尺寸和重量大概是多少?",
"从图片中看,这个产品有什么特点或优势?"
]
results = {}
for query in queries:
inputs = tokenizer.apply_chat_template(
[{"role": "user", "image": image, "content": query}],
add_generation_prompt=True,
tokenize=True,
return_tensors="pt",
return_dict=True
).to("cuda")
with torch.no_grad():
outputs = model.generate(** inputs, max_length=1000, do_sample=True, temperature=0.7)
outputs = outputs[:, inputs['input_ids'].shape[1]:]
results[query] = tokenizer.decode(outputs[0], skip_special_tokens=True)
# 生成综合产品描述
综合_prompt = f"""基于以下产品分析结果,生成一段吸引人的电商产品描述:
外观描述:{results[queries[0]]}
功能用途:{results[queries[1]]}
适用人群:{results[queries[2]]}
尺寸重量:{results[queries[3]]}
产品特点:{results[queries[4]]}
要求:语言生动,突出卖点,适合电商平台展示。"""
inputs = tokenizer.apply_chat_template(
[{"role": "user", "content": 综合_prompt}],
add_generation_prompt=True,
tokenize=True,
return_tensors="pt",
return_dict=True
).to("cuda")
with torch.no_grad():
outputs = model.generate(** inputs, max_length=1500, do_sample=True, temperature=0.8)
outputs = outputs[:, inputs['input_ids'].shape[1]:]
product_description = tokenizer.decode(outputs[0], skip_special_tokens=True)
return {
"detailed_analysis": results,
"product_description": product_description
}
5.2 多模态内容创作助手
构建一个辅助内容创作的多模态助手,支持:
- 图像到文本的创意描述
- 根据图像生成故事或诗歌
- 基于图像内容的营销文案创作
- 教育场景中的图像解释与知识扩展
实现示例:
def creative_writing_assistant(model, tokenizer, image_path, task_type="story"):
"""
基于图像生成创意内容
参数:
task_type: 任务类型,可选"story"(故事)、"poem"(诗歌)、"marketing"(营销文案)、"education"(教育解释)
"""
image = Image.open(image_path).convert('RGB')
# 根据任务类型构建不同提示
prompts = {
"story": "根据这张图片创作一个简短的故事,包含角色、情节和情感元素",
"poem": "根据这张图片创作一首诗歌,注意押韵和意境",
"marketing": "为这张图片中的场景或产品创作一段吸引人的营销文案",
"education": "详细解释这张图片中的科学原理或知识点,适合教育用途"
}
if task_type not in prompts:
raise ValueError(f"不支持的任务类型: {task_type},可选类型: {list(prompts.keys())}")
query = prompts[task_type]
inputs = tokenizer.apply_chat_template(
[{"role": "user", "image": image, "content": query}],
add_generation_prompt=True,
tokenize=True,
return_tensors="pt",
return_dict=True
).to("cuda")
# 根据任务类型调整生成参数
gen_params = {
"max_length": 2000,
"do_sample": True,
"top_p": 0.9,
"temperature": 0.85 if task_type in ["story", "poem"] else 0.7
}
with torch.no_grad():
outputs = model.generate(** inputs, **gen_params)
outputs = outputs[:, inputs['input_ids'].shape[1]:]
result = tokenizer.decode(outputs[0], skip_special_tokens=True)
return {
"task_type": task_type,
"prompt": query,
"result": result
}
六、总结与未来展望
6.1 部署流程回顾
本文详细介绍了GLM-4V-9B多模态模型的本地部署流程,主要包括:
- 环境准备:配置CUDA、Python环境和必要依赖
- 代码与模型获取:克隆仓库并下载模型权重
- 模型加载与初始化:支持全精度和量化加载
- 推理实现:图像描述与视觉问答功能
- 性能优化:显存管理与推理速度提升
- 实际应用:构建图像分析与内容创作系统
通过这些步骤,你已经成功在本地环境中部署并运行了GLM-4V-9B模型,实现了从图像到文本的多模态交互。
6.2 进阶学习路径
为了进一步提升你的GLM-4V-9B应用开发能力,建议探索以下方向:
- 模型微调:使用自定义数据集微调模型,适应特定场景
- 多模态API开发:构建RESTful API,将模型集成到应用系统
- 前端界面开发:设计用户友好的交互界面
- 批量处理优化:实现高效的批量图像分析
- 模型压缩:进一步优化模型大小和速度
相关学习资源:
- GLM-4官方文档:https://gitcode.com/openMind/glm-4v-9b
- Hugging Face Transformers文档:https://huggingface.co/docs/transformers
- PyTorch官方教程:https://pytorch.org/tutorials/
6.3 本地部署的价值与挑战
本地部署GLM-4V-9B的主要优势:
- 数据隐私:敏感数据无需上传到云端
- 低延迟:避免网络传输延迟,响应更快
- 成本效益:一次性下载,长期使用,无调用费用
- 定制化:可根据需求自由修改和优化
面临的挑战:
- 硬件要求高:需要较大显存的GPU支持
- 技术门槛:需要解决环境配置和依赖问题
- 维护成本:需自行处理模型更新和bug修复
- 性能限制:本地部署性能通常低于云端优化服务
6.4 社区与资源
GLM-4V-9B相关社区和资源:
- GitHub仓库:https://gitcode.com/openMind/glm-4v-9b
- 模型卡片:https://huggingface.co/THUDM/glm-4v-9b
- 技术论坛:智谱AI开发者社区
- 示例项目:GitHub上搜索"glm-4v"获取第三方应用案例
- 更新日志:关注仓库的RELEASE页面获取最新动态
结语
通过本文的指导,你已经掌握了GLM-4V-9B多模态模型的本地部署与应用开发技能。随着大模型技术的快速发展,本地部署将变得越来越普及,为隐私敏感型应用和边缘计算场景提供强大支持。
现在,你可以开始探索更多创新应用,将GLM-4V-9B的能力融入到你的项目中,创造出更智能、更便捷的多模态应用体验。祝你在AI开发之路上取得成功!
如果你觉得本文对你有帮助,请点赞、收藏并分享给更多需要的开发者!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



