news 2026/9/2 23:49:09

Qwen3VL部署与LoRA微调实战:从环境配置到量化推理全流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Qwen3VL部署与LoRA微调实战:从环境配置到量化推理全流程

这次我们直接聊 Qwen3VL 的部署与微调。如果你关注多模态大模型,想在本机跑通一个能看图、能理解文档、能做视觉问答的模型,并想用自己手里的数据做 LoRA 微调,再顺手把推理速度压下来,那这篇文章可以认真看一下。

先回答最核心的问题:这个项目到底解决什么?Qwen3VL 是 Qwen 系列的多模态视觉语言模型,和纯文本模型不同,它能同时理解图像和文本输入,你给它一张图,它可以描述画面、回答图中问题、读取文档文字、解析图表信息。而“部署与微调”才是真正的主题——不是只下载权重跑一下 demo,而是从环境配置开始,走完本地部署、LoRA 微调、量化推理、接口调用整条链路。

这篇文章会按“先看能不能用,再看怎么用”的顺序展开,内容包括硬件门槛、环境准备、模型下载、启动部署、LoRA 微调流程、量化推理、API 调用示例和批量任务设计。阅读完你应该能判断:这套方案适不适合你的显卡,微调需要准备什么格式的数据,量化后精度损失是否可接受,以及如何把模型接入自己的工具链。

1. 部署前先回答三个问题

很多人看到大模型教程的第一反应是“我的显卡能不能跑”。先说结论:Qwen3VL 不是一个单一模型,而是一个模型系列。不同参数规模的版本对显存的需求差距非常大,部署前需要先明确三点。

第一,你选哪个参数版本。从社区讨论和官方公开信息看,Qwen3VL 系列覆盖了从较小规模到大规模的不同版本。如果你只是做功能验证和接口测试,选择较小版本就够用;如果你要处理复杂图表、高精度文档解析或高质量视觉问答,那就需要考虑更大参数版本。参数规模直接决定显存占用和推理速度,没有“一个版本通吃所有场景”的说法。

第二,你的显卡型号和显存容量。显存是第一个硬门槛。推理一个视觉语言模型,显存占用由模型权重、图像特征、KV Cache 和运行时开销共同决定。小模型在消费级显卡上有机会运行,大模型则基本需要多卡或大显存设备。如果你只有一块 8GB 或 12GB 显存的显卡,建议优先考虑量化方案,或者直接选择小参数版本。

第三,你是否需要微调。如果只是部署和调用,那主要关注推理显存。如果要微调,显存需求会明显上升,因为训练过程除了权重之外,还需要保存梯度、优化器状态和中间激活值。LoRA 是降低微调门槛的重要手段,它只训练一小部分附加参数,可以明显减少显存占用,这也是这篇文章后面要重点展开的部分。

从材料来看,和 Qwen3VL 部署微调强相关的关键词包括 Qwen3VL、LoRA、VLM、部署、微调,以及 Llama-Factory、GPU 微调大模型、本地部署大模型等。可以判断,这篇教程的受众主要是想在本机或是单卡服务器上跑通多模态模型,并完成 lora 微调的开发者。

2. 本地部署的硬件配置与平台选择

2.1 显存、内存、磁盘怎么估

关于显存,最稳妥的口径是“以实际版本和推理参数为准”。但我们可以给出一个通用评估思路:

  • 推理场景:模型权重占用的显存约等于模型参数的字节数。以 FP16 精度为例,一个 4B 规模的模型,权重引入的显存开销在 8GB 上下;如果加上图像特征和 KV Cache,实际占用会更高。也就是说,8GB 显卡跑小版本已经比较紧张,通常需要量化或减少上下文长度。
  • 微调场景:LoRA 微调虽然只训练少量参数,但仍需要加载完整基座模型。GPU 显存至少要在推理需求基础上再预留 30% 到 50%,否则容易显存溢出。
  • CPU 推理:材料没有明确支持程度,但更稳妥的判断是,Qwen3VL 这类多模态模型在 CPU 上可以运行,但速度会明显偏慢,适合功能验证,不适合高并发或实时场景。如果你只有 CPU 环境,建议降低图像输入分辨率,减小 batch size。

内存建议 32GB 起步,磁盘空间按模型大小预留。一个模型文件从几 GB 到几十 GB 不等,还需要留出数据集、输出结果和日志的空间。

2.2 Windows、Linux 还是 Docker

部署多模态大模型,Linux 环境通常是最顺的,CUDA、PyTorch、深度学习框架的兼容性最好。Windows 也可以跑,但遇到编译依赖或 CUDA 版本问题时,解决成本更高。

如果你使用的是 Llama-Factory 这类微调框架,它本身就提供了 Docker 镜像支持。用 Docker 的好处是环境隔离,避免多个项目之间的 Python 包版本冲突。我个人建议:如果机器上有 Docker,直接用 Docker 部署会省去很多麻烦;没有 Docker 就创建独立的 conda 环境,不要往系统 Python 里直接装依赖。

2.3 深度学习框架与 CUDA 版本

Qwen3VL 的推理和微调离不开 PyTorch 生态。CUDA 版本需要和 PyTorch 版本匹配,显卡驱动也需要足够新。这里有一个容易踩的坑:先装 PyTorch,再根据 PyTorch 的报错反推 CUDA 版本,而不是先装最新 CUDA。PyTorch 官方安装命令在官网首页就能找到,选择适合自己系统的版本。

另外,如果你的显卡是较新的 50 系,需要确认 PyTorch 和 CUDA 是否已提供对应支持;如果是老显卡,反而要留意新版本 PyTorch 是否已经放弃对应算力。这类问题以官方发布说明为准,不要盲目追新。

3. 环境准备:从零开始搭一套可运行的环境

以下是一套通用流程,按顺序执行即可。具体版本号以你实际安装时为准。

3.1 创建独立 Python 环境

这里以 conda 为例。如果没有 conda,可以用 venv 替代。

conda create -n qwen3vl python=3.10 -y conda activate qwen3vl

Python 版本不建议直接上最新的,很多深度学习框架对最新 Python 的 wheel 包支持有滞后。3.10 是当前生态兼容性较好的选择。

3.2 安装 PyTorch

先确认自己的 CUDA 版本,然后去 PyTorch 官网选择对应的安装命令。命令格式大致如下,实际版本号按官网为准:

# 以 CUDA 12.1 为例,实际命令请从 PyTorch 官网复制 pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

安装完成后,验证一下 GPU 是否可用:

import torch print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0))

如果torch.cuda.is_available()返回True,说明 PyTorch 和 CUDA 已经打通。

3.3 安装 Transformers 和微调框架

Transformers 是加载和运行 Qwen3VL 的基础库,建议安装最新版本,因为多模态模型的代码更新很频繁。微调框架方面,如果你的目标是做 LoRA 微调,可以直接使用 Llama-Factory,它把数据加载、LoRA 训练、模型导出集成了,不需要自己手写训练循环。

pip install transformers accelerate pip install llama-factory

如果不使用 Llama-Factory,也可以安装 peft 和 datasets 手动写训练脚本:

pip install peft datasets

3.4 下载模型权重

模型权重可以从 Hugging Face 或 ModelScope 下载。国内环境用 ModelScope 通常更快。

# 用 modelscope 下载示例,实际模型名需要替换 pip install modelscope modelscope download --model Qwen/Qwen3-VL-4B-Instruct

如果下载网络不稳定,推荐使用huggingface-climodelscope的断点续传功能。下载完成后,记录模型目录路径,后面加载模型时需要用到。

4. 启动部署:从加载权重到跑通推理

4.1 用 Transformers 直接加载模型启动

模型下载完成后,可以用一个简单的 Python 脚本验证推理是否正常。以下代码是一个通用示例,实际的模型名和路径需要按你下载的版本替换:

from transformers import Qwen3VLForConditionalGeneration, Qwen3VLProcessor from PIL import Image import torch model_name = "Qwen/Qwen3-VL-4B-Instruct" # 替换为实际模型路径 processor = Qwen3VLProcessor.from_pretrained(model_name) model = Qwen3VLForConditionalGeneration.from_pretrained( model_name, torch_dtype=torch.float16, device_map="auto", ) image = Image.open("test.jpg") prompt = "请描述这张图片的内容。" # Qwen3VL 的多模态输入需要按 processor 的格式组织 messages = [ { "role": "user", "content": [ {"type": "image", "image": image}, {"type": "text", "text": prompt}, ], } ] text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) inputs = processor(text=[text], images=[image], return_tensors="pt") inputs = inputs.to(model.device) output = model.generate(**inputs, max_new_tokens=512) response = processor.decode(output[0], skip_special_tokens=True) print(response)

这里需要特别说明:device_map="auto"可以让模型自动分配到可用显存上,但如果显存不足,启动就会报 CUDA out of memory。如果你发现加载失败,第一步是把torch_dtype改成torch.float16torch.int8,然后减小max_new_tokens,再次尝试。

4.2 用 Llama-Factory 启动 WebUI 或 API 服务

如果你已经安装了 Llama-Factory,可以直接通过命令行启动 WebUI,在浏览器里完成模型加载和测试,不需要手写 Python 脚本。

llamafactory-cli webui

启动后浏览器访问http://localhost:7860,在页面里选择模型路径、精度类型,点击加载模型,就可以上传图片、输入文本进行对话测试。

如果想把模型以 API 服务的方式暴露出来,Llama-Factory 也提供了类似的启动参数。启动后服务会监听在指定端口上,其他程序可以通过 HTTP 请求调用。这种方式适合后续做批量任务或系统集成。

4.3 启动失败:先看日志再看显存

部署阶段最常见的失败原因是显存不足和依赖版本冲突。如果是显存不足,日志里通常会有CUDA out of memorytorch.cuda.OutOfMemoryError;如果是依赖冲突,日志里会出现 ImportError 或版本不兼容的提示。

我的建议是:不要一上来就追求大模型高精度,先用小版本、低分辨率、短输出跑通流程,再逐步增加参数。

5. LoRA 微调:用自己的数据训练 Qwen3VL

部署跑通只是第一步。如果你需要对特定领域的图片、文档或业务场景有更好的识别效果,就要做微调。LoRA 是目前门槛最低、性价比最高的微调方式。

5.1 数据格式与数据准备

微调 VLM 模型的常用数据格式是对话格式,每条数据包含一张图片和多轮问答。Llama-Factory 支持的标准数据格式大致如下:

[ { "images": ["path/to/image1.jpg"], "conversations": [ { "from": "human", "value": "这张图片里有什么?" }, { "from": "gpt", "value": "图片里有一辆红色的汽车,停在路边。" } ] } ]

数据质量决定微调效果,这句话在视觉模型上尤其成立。图片清晰度、问答内容与目标任务的匹配程度,直接决定微调后的效果上限。建议至少准备几十条高质量样本跑通流程,再逐步扩充到几百条甚至更多。

5.2 用较少数据微调:注意过拟合

最近热词里有一个问题很常见:“比较少的数据怎么微调”。对于 LoRA 来说,几千条数据都可以跑,但数据量太少容易过拟合。解决思路有三个:

  • 降低 LoRA 的 rank 值,减少可训练参数数量。rank 从 8 改到 4,模型学到的模式会更保守。
  • 增加数据增强,比如对图片做随机裁剪、翻转、亮度调整。
  • 做多轮评估,连续观察验证集上的 loss 和输出质量,发现过拟合就提前停止。

5.3 用 Llama-Factory 执行 LoRA 微调

下面是 Llama-Factory 命令行方式的通用示例。实际参数需要按你的模型和数据路径调整:

llamafactory-cli train \ --model_name_or_path /path/to/Qwen3-VL-4B-Instruct \ --dataset my_vlm_dataset \ --dataset_dir ./data \ --template qwen \ --finetuning_type lora \ --lora_rank 8 \ --output_dir ./output/qwen3vl_lora \ --per_device_train_batch_size 1 \ --gradient_accumulation_steps 4 \ --learning_rate 1e-4 \ --num_train_epochs 3.0 \ --lr_scheduler_type cosine \ --fp16

这里需要说明:dataset名称需要提前在dataset_info.json里注册;per_device_train_batch_size建议先设为 1,因为视觉模型的输入比较吃显存;如果显存不够,可以增加gradient_accumulation_steps来模拟更大的 batch。

微调完成后,LoRA 权重会保存在output_dir下,不会改动原来的基座模型。

5.4 微调后的模型合并与推理

LoRA 训练产物只是一个附加权重,推理时需要把 LoRA 权重合并回原始模型,或者在加载时指定 LoRA 适配器。Llama-Factory 提供了模型合并的入口。合并完成后再用之前部署章节的代码加载,即可验证微调效果。

如果你不想合并,也可以在 Transformers 里用 peft 库动态加载 LoRA 权重,这样原始模型保持不动,方便对比微调前后的效果差异。

6. 量化推理:降低显存占用与加速

部署和微调都跑通之后,很多人会问:怎么让模型跑得更快、占用更少?答案是量化。

6.1 量化级别怎么选

目前常用的量化方式包括 8-bit 量化和 4-bit 量化:

  • 8-bit 量化:精度损失较小,显存占用相对 FP16 降低约一半,属于稳妥选择。
  • 4-bit 量化:显存占用更低,但精度损失更大,尤其在 OCR、图表理解等细粒度视觉任务上,可能出现识别错误。

对于 Qwen3VL 这类视觉语言模型,需要考虑量化对图像特征提取的影响。如果只是做普通图片描述,4-bit 量化问题不大;如果做文档解析或图表数值提取,建议先用 8-bit 量化测试效果,再决定是否进一步压缩。

6.2 在 Transformers 中启用量化加载

以 BitsAndBytes 为例,加载量化模型的通用代码框架如下:

from transformers import BitsAndBytesConfig, Qwen3VLForConditionalGeneration import torch quant_config = BitsAndBytesConfig( load_in_8bit=True, ) model = Qwen3VLForConditionalGeneration.from_pretrained( "Qwen/Qwen3-VL-4B-Instruct", quantization_config=quant_config, device_map="auto", )

启动后可以观察nvidia-smi中的显存占用,与 FP16 加载时的数值做对比。量化后如果显存占用下降明显,说明配置生效。

6.3 量化与 LoRA 微调的配合

这里有一个容易踩的坑:如果你先量化模型再微调,LoRA 训练精度会受到影响。更稳妥的流程是:先用 FP16 加载模型完成 LoRA 微调,导出合并后的全量模型,再对合并后的模型做量化推理。也就是说,量化和微调不要同时进行。

7. 接口 API 与批量任务

如果只是自己在网页里对话,模型的价值很有限。真正实用的是把模型封装成 API,接入自动化流程,对一批图片做批量推理。

7.1 用 FastAPI 封装一个视觉问答接口

假设你已经能加载模型,可以用 FastAPI 把它包成一个 HTTP 接口。下面的代码是一个通用示例,实际路径和参数需要按你的模型调整:

from fastapi import FastAPI, UploadFile, File from pydantic import BaseModel import uvicorn from transformers import Qwen3VLForConditionalGeneration, Qwen3VLProcessor from PIL import Image import io app = FastAPI() # 启动时加载模型,避免每次请求都重新加载 model_dir = "Qwen/Qwen3-VL-4B-Instruct" processor = Qwen3VLProcessor.from_pretrained(model_dir) model = Qwen3VLForConditionalGeneration.from_pretrained( model_dir, torch_dtype=torch.float16, device_map="auto" ) class ChatRequest(BaseModel): prompt: str max_new_tokens: int = 512 @app.post("/vqa") async def vqa(prompt: str, image: UploadFile = File(...)): image_bytes = await image.read() pil_image = Image.open(io.BytesIO(image_bytes)).convert("RGB") messages = [ { "role": "user", "content": [ {"type": "image", "image": pil_image}, {"type": "text", "text": prompt}, ], } ] text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) inputs = processor(text=[text], images=[pil_image], return_tensors="pt") inputs = inputs.to(model.device) output = model.generate(**inputs, max_new_tokens=max_new_tokens) response = processor.decode(output[0], skip_special_tokens=True) return {"response": response} if __name__ == "__main__": uvicorn.run(app, host="127.0.0.1", port=8000)

注意:这里把模型加载放到了全局变量中,避免每个请求都做一次耗时很长的模型加载。

7.2 curl 调用示例

服务启动后,用 curl 测试:

curl -X POST http://127.0.0.1:8000/vqa \ -F "prompt=请识别这张图片中的文字内容" \ -F "image=@/path/to/test.png"

如果返回 JSON 中包含模型生成的文本,说明接口已通。

7.3 批量任务的正确设计

批量任务和高并发之间是有区别的。如果你的场景是“离线处理 1000 张图片”,最好的方式不是并发打 API,而是一个文件一个文件地顺序处理,记录每个文件的输入输出状态。

推荐的做法是:准备一个input目录放待处理图片,一个output目录放结果,一个log文件记录进度。写一个 Python 脚本遍历目录,调用本地模型或 API,把结果写入文件。

import os import json from PIL import Image input_dir = "./input" output_dir = "./output" log_file = "./log.jsonl" os.makedirs(output_dir, exist_ok=True) seen = set() if os.path.exists(log_file): with open(log_file, "r") as f: for line in f: data = json.loads(line) seen.add(data["filename"]) for filename in sorted(os.listdir(input_dir)): if filename in seen: continue if not filename.lower().endswith((".png", ".jpg", ".jpeg")): continue image_path = os.path.join(input_dir, filename) try: # 调用模型或 API 获得结果 # result = model_vqa(image_path, prompt) result = {"filename": filename, "status": "mock_success"} output_path = os.path.join(output_dir, f"{os.path.splitext(filename)[0]}.json") with open(output_path, "w", encoding="utf-8") as f: json.dump(result, f, ensure_ascii=False, indent=2) with open(log_file, "a", encoding="utf-8") as f: f.write(json.dumps({"filename": filename, "time": time.time()}) + "\n") print(f"done: {filename}") except Exception as e: print(f"failed: {filename}, error: {e}")

这种设计的优点是:中断后可以继续跑,已经处理的文件不会重复处理;日志和结果分离,方便排查失败原因。

7.4 批量任务卡住怎么办

批量推理最怕的不是报错,而是卡住。常见原因是显存耗尽后进程挂起,或是单张图片过大导致推理时间过长。建议对每张图片设置超时机制,并控制图片输入分辨率。如果发现某张图片处理时间异常,先单独测试这张图片,再决定是跳过还是调整参数。

8. 资源占用与性能观察

8.1 实时观察显存占用

启动模型后,在另一个终端运行:

watch -n 0.5 nvidia-smi

重点看Memory-UsageGPU-Util两列。推理过程中显存是动态变化的,max_new_tokens越长,KV Cache 占用越多。

8.2 影响性能的主要参数

  • 图像分辨率:视觉模型需要把图片切块后输入,分辨率越高,视觉 token 越多,计算量越大。对于文档截图,分辨率低了会看不清文字;对于自然图片,可以适当压缩。
  • max_new_tokens:生成长度越长,推理耗时越长,显存占用越大。
  • batch size:批量推理时一次送入的样本数量,batch 越大,吞吐越高,但显存峰值也会提升。
  • 量化精度:4-bit 量化通常比 8-bit 快,但两者差距在不同显卡上表现不同。

8.3 降低资源占用的实操建议

  • 优先使用device_map="auto",让框架自动分配显存。
  • 如果显存不够,优先调低max_new_tokens,再考虑换更小的模型。
  • 如果推理速度过慢,优先检查图像输入尺寸,而不是盲目改模型参数。
  • 不要同时启动多个推理进程,容易把显存打满导致进程崩溃。

9. 常见问题与排查方法

问题现象可能原因排查方式解决方案
启动后页面或接口打不开端口被占用或服务未启动检查日志,netstat -ano查端口换端口,或杀掉占用进程后重启
CUDA out of memory模型权重 + 输入图像 + KV Cache 超出显存观察 nvidia-smi 中的显存占用降低精度、减少 max_new_tokens、缩小图片尺寸、换更小模型
模型加载很慢从磁盘读取权重,或 PyTorch 首次创建 CUDA context观察磁盘 IO 和 CPU 占用使用 SSD,升级内存,避免频繁重启加载
图片描述结果与图片无关数据预处理错误检查图片是否被正确读取打印输入图片尺寸和格式,确保 RGB 模式
LoRA 微调 loss 不下降学习率过大或数据格式错误查看训练日志调低学习率,检查数据格式
量化后识别准确率明显下降4-bit 量化对视觉特征的精度损失对比 8-bit 和 4-bit 在同一批数据上的结果改用 8-bit,或在量化后进行短数据量的继续微调
微调后效果比原来差数据量太少、过拟合、学习率过高检查训练集和验证集 loss 差异增加数据量,降低 LoRA rank,减少训练轮数
API 请求超时单次推理时间过长查看请求耗时日志拆分任务、缩小图像、减少输出长度
批量任务中途卡住某张图片格式异常或显存不足查看日志文件定位到具体文件名跳过异常图片,增加超时逻辑,控制并发数

10. 最佳实践与合规提醒

到这里,整条链路已经讲完了。最后补充几条工程化建议,这些内容在真实项目中比模型参数更重要。

第一,第一次跑通时不要急着追求效果,先用默认参数跑通部署和微调的完整流程,记录每一步的成功或失败,再逐步调参。很多人在部署阶段就失去了耐心,就是因为一上来用了太大的模型。

第二,模型文件、数据集、输出结果要分目录管理。一个清晰的项目目录结构能大幅提升排错效率。建议至少包含modelsdataoutputlogs四个目录。

第三,批量任务一定要加日志和失败重试机制。中断后能从上次进度继续,是从“能跑”到“能生产使用”的关键一步。

第四,接口服务默认只监听127.0.0.1,不要直接暴露到公网。如果确实需要远程访问,要加认证和访问控制。

第五,合规问题必须放在重要位置。Qwen3VL 这类视觉模型可以识别图片、提取文档文字、分析图表,但也可能涉及到人脸信息、私人文档、版权图片等敏感数据。使用模型处理这些数据时,务必确认已经获得合法授权。涉及真实人物肖像的数据,需要获得本人同意;涉及版权材料的微调,请确认训练数据来源的合法性和发布权限。不要用这类工具制作虚假内容、冒用他人身份或从事任何违反法律法规的行为。在测试环境验证时,建议使用自己拍摄或公开授权的素材。

第六,LoRA 微调不是万能的。如果你的数据与模型原有能力偏离太大,LoRA 能起到的修正作用有限。此时需要重新评估基座模型的选择,或者考虑全参数微调(前提是显存充足)。

11. 总结

Qwen3VL 的部署与微调,本质上是一个“选择 — 部署 — 微调 — 量化 — 集成”的链式过程。每个环节的决策都受上游制约:模型参数规模影响显存需求,显存需求影响是否量化,量化影响推理精度,推理精度影响业务可用性。先把最小链路跑通,再逐步优化,是成本最低的路径。

值得优先验证的功能包括:图片内容描述、文档文字识别、图表问答、接口调用和批量任务处理。最容易踩的坑集中在显存溢出、数据格式错误和量化后精度下降。推荐从 Llama-Factory 加 Transformers 的组合入手,先跑通部署和 LoRA 微调,再按业务需求决定是否引入量化与 FastAPI 封装。后续可以继续尝试更大参数版本、更复杂的多轮对话数据构造,以及将模型接入 RAG 流程,让视觉理解和知识检索结合起来。

这套方案建议收藏备用。不管你是做文档自动化、图像内容审核,还是图表数据抽取,先把本地环境搭起来,再决定要不要在项目里用。

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

PHP代码解密实战:从Zend Guard到eval混淆的完整工具链

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/2 23:42:33

从零搭建QQ机器人:基于NoneBot2与go-cqhttp的本地部署与AI集成指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/2 23:40:49

Codex与Claude Code接入第三方模型:配置技巧与排错指南

Codex 和 Claude Code 是目前最常用的两款终端编程助手,分别来自 OpenAI 和 Anthropic。很多人装好之后的第一件事,就是把默认模型换成第三方平台:要么官方额度不够用,要么团队已经在用 DeepSeek、智谱、Kimi、通义这些平台的 API…

作者头像 李华
网站建设 2026/9/2 23:39:54

元初混沌体系 第三卷 卫星互联网全域周天拓扑体系:第九十七篇 国防全域通信周天拓扑安全加固体系

第九十七篇 国防全域通信周天拓扑安全加固体系本篇章单元定位本篇隶属第三卷卫星互联网全域周天拓扑体系 第六单元工程落地、产业标准、星际拓展篇(91–108),为全卷军民融合、国防兜底、天基攻防安全体系定型核心篇章。上承第九十六篇民用宽带…

作者头像 李华
网站建设 2026/9/2 23:39:43

明星投资转向硬科技:从流量变现到资本配置的逻辑变迁

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华