这次我们来看一个在多模态大模型微调这条路上很值得跑的实战项目:基于 Qwen3-VL 的完整微调链路。Qwen3-VL 是通义千问团队开源的多模态大模型,核心能力是同时理解图像、视频、文字,并且能做 OCR、文档解析、图表推理和视觉问答。相比纯文本大模型,它的价值在于“看得见图”。很多开发者拿到这类模型后的第一个问题不是“它好不好”,而是“我怎么在自己的数据集上微调它”。这篇文章就把这条链路完整走一遍:环境准备、模型下载、多模态数据集构造、LoRA/QLoRA 微调、权重导出、推理验证,最后再聊显存优化和常见坑。
先说结论:这篇文章不是概念科普,而是可以照着操作的实战流程。微调框架采用 LLaMA-Factory,数据集格式采用多模态对话格式,训练方式以 LoRA 和 QLoRA 为主。如果你有一张 NVIDIA 显卡,显存 8G 以上,建议优先从 4B 或 8B 规模开始练手;如果显卡显存更大,可以尝试更大规模的模型。文章里的命令都给到可直接复制的程度,但版本号、模型 ID、工具参数在不同时期可能变化,实际使用时请以官方仓库的最新说明为准。
文章适合三类读者:第一次接触多模态微调的入门者,想把自己的业务数据灌进 Qwen3-VL 的工程师,以及准备做多模态 Agent 应用但需要定制模型输出的开发者。阅读本文后,你应该能独立完成一次 Qwen3-VL 微调,并且知道怎么验证效果、怎么排查 OOM、怎么合并 LoRA 权重。
1. Qwen3-VL 核心能力速览
先给一张能力速览表,方便快速判断这个模型和本文流程是否匹配你的场景。
| 能力项 | 说明 |
|---|---|
| 项目类型 | 多模态大模型(视觉语言模型,VLM) |
| 开源来源 | 阿里通义实验室,Qwen 系列模型 |
| 主要能力 | 图像理解、视频理解、OCR、文档解析、图表推理、视觉问答、Agent 工具调用 |
| 典型模型规模 | 2B / 4B / 8B / 30B 等,具体以官方发布为准 |
| 推荐微调方式 | LoRA、QLoRA、全参微调 |
| 常见微调框架 | LLaMA-Factory、ms-swift、Transformers + TRL |
| 推荐硬件 | NVIDIA GPU,显存 8G 以上优先;规模越大,显存要求越高 |
| 启动方式 | WebUI、命令行 CLI、Python 推理脚本 |
| 是否支持 API 封装 | 微调后可通过 FastAPI、vLLM 等封装为服务 |
| 是否支持批量任务 | 可对图像、视频、文档进行批量推理,需自行编写批处理脚本 |
| 适合场景 | 垂直领域 OCR、票据/文档信息抽取、多模态问答、多模态 Agent、图文审核辅助 |
从材料覆盖的信息看,Qwen3-VL 最核心的竞争力是“视觉理解 + 文本生成”一体化。它不像传统 OCR 只能输出文本框坐标,而是能理解整张图的语义并生成结构化结果。比如你给它一张发票图片,可以直接让它输出“金额、日期、发票号”的 JSON 字段,不需要额外接规则引擎。这也是为什么要做微调:基座模型能理解通用图片,但对你业务里的专有版式、行业术语、输出格式不够“听话”,微调就是把模型拉向你的业务格式。
2. 适用场景、微调必要性以及合规边界
很多开发者拿到模型的第一反应是“我要微调”。但更稳妥的做法是先判断:这个场景是否真的需要微调,还是提示词工程就能解决。
2.1 可以先用提示词和 Few-shot 解决的场景
如果任务可以写清楚规则,并且基座模型在少量示例下已经能稳定输出,那就没必要微调。典型场景包括:通用图片描述、常见物体识别、简单 OCR、标准表格转 Markdown、通用视觉问答。这些任务在现代 VLM 基座上表现已经不错,微调反而可能引入数据偏差,降低泛化能力。建议在上微调之前,先构造 20 到 50 条测试样本,用提示词和 few-shot 方式跑一遍,看基座模型的能力底线在哪里。
2.2 值得微调的典型场景
真正值得微调的场景一般有四个特征:领域专有、格式固定、术语特殊、输出要求强约束。
第一类是垂直领域 OCR。比如医学报告、法律文书、老式扫描件、手写票据,这些版式和术语基座模型见过不多,微调能明显提升识别准确率。第二类是文档结构化抽取。例如从合同里抽取条款、从发票里抽取关键字段、从论文里抽取公式和表格,且输出要求是固定 JSON Schema。第三类是特定风格的视觉问答。比如教育场景中要求模型“只输出解题步骤”“不准直接给答案”,这属于输出策略定制。第四类是多模态 Agent 工具调用。模型需要根据截图或界面图像判断当前状态,然后输出结构化的工具调用指令,这种任务也可以通过微调提升稳定性。
2.3 微调的数据合规与安全边界
微调一个多模态大模型,数据合规是硬门槛。用作训练集的图片、视频、文档必须拥有合法授权,不能抓取未经许可的版权素材。涉及人脸的图片,必须获得肖像者授权并做好脱敏处理;涉及身份证、发票、病历等敏感信息,应使用脱敏后的合成数据或测试数据。另外,模型微调后可能保留训练数据中的某些模式,不要把未脱敏的隐私数据直接放进训练集,否则存在泄露风险。商用前,建议做一轮定向测试,确认模型不会输出越界内容。
3. 环境准备与前置条件
微调 Qwen3-VL 不是一个“双击就能跑”的事,但也远没有到需要公司级算力的程度。只要环境配好,一张消费级 NVIDIA 显卡也能完成 LoRA 微调。
3.1 硬件要求
推荐使用 NVIDIA 显卡。显存是最大瓶颈,模型规模、量化方式、序列长度、batch size 都会影响显存占用。一般来说,8B 级别模型使用 QLoRA(4bit 量化 + LoRA)微调,在开启梯度检查点时,显存占用会明显低于全参微调;如果是全量 LoRA 且序列较长,占用则会更高。比较稳妥的经验是:显存 8G 起步,16G 更从容。如果使用更大的 14B 或 30B 模型,建议使用多卡或更大显存。CPU 训练不推荐,速度太慢,主要用于推理。
3.2 软件依赖
系统层面建议使用 Linux,Ubuntu 20.04 或 22.04 都行。Windows 用户可以通过 WSL2 或 Docker 运行,但显卡驱动和 CUDA 配置要额外处理。下面是通用依赖检查清单:
- Python 3.10 或更高版本
- CUDA 11.8 或 12.x,驱动版本要匹配
- PyTorch 2.1 或更高版本,具体版本需要和 CUDA 匹配
- transformers、accelerate、peft、bitsandbytes、tiktoken、sentencepiece
- modelscope 或 huggingface_hub,用于下载模型
- LLaMA-Factory,用于微调训练管理
- flash-attn(可选,用于加速和节省显存,但编译较繁琐)
3.3 依赖安装示例
创建虚拟环境后,可以先安装 PyTorch,再安装其他依赖。PyTorch 安装命令请根据你的 CUDA 版本从官网选择。这里给出通用示例:
python -m venv venv source venv/bin/activate pip install --upgrade pip # PyTorch 安装请根据 CUDA 版本到 pytorch.org 选择 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121接着安装微调相关库:
pip install transformers accelerate peft bitsandbytes modelscope pip install llama-factory[torch]如果你的网络环境下载不稳定,可以给 pip 配置国内镜像源。另外,flash-attn 如果编译困难,可以先不装,训练时去掉 flash attention 相关参数即可。
4. 模型下载与微调前推理验证
正式微调之前,先把原版模型下载到本地,同时跑一次基础推理,确认环境、模型和代码都没有问题。这一步很关键,省得数据集都准备好了才发现推理环境有问题。
4.1 从 ModelScope 下载模型
国内网络下,从 ModelScope 下载通常比 HuggingFace 更稳。使用 modelscope 的 snapshot_download 接口:
from modelscope import snapshot_download model_id = "Qwen/Qwen3-VL-8B-Instruct" # 请替换为官方实际模型 ID cache_dir = "./models" snapshot_download(model_id, cache_dir=cache_dir)也可以直接用命令行:
modelscope download --model Qwen/Qwen3-VL-8B-Instruct --local_dir ./models/Qwen/Qwen3-VL-8B-Instruct模型 ID 会随官方发布变化,下载前建议先去 ModelScope 或 HuggingFace 搜索最新版本。如果你选择的是更小的 2B 或 4B 模型,修改 model_id 即可。
4.2 微调前基础推理验证
下载完成后,先用一个简单的推理脚本验证模型能不能正常加载和输出。这里使用 transformers 的 AutoProcessor 和 AutoModelForImageTextToText,不同版本下类名可能不同,建议先检查当前 transformers 版本是否支持 Qwen3-VL。
from transformers import AutoProcessor, AutoModelForImageTextToText from PIL import Image import torch model_path = "./models/Qwen/Qwen3-VL-8B-Instruct" processor = AutoProcessor.from_pretrained(model_path, trust_remote_code=True) model = AutoModelForImageTextToText.from_pretrained( model_path, torch_dtype=torch.bfloat16, device_map="auto" ) image = Image.open("test.png") prompt = "请描述这张图片的内容,并输出为中文。" messages = [ {"role": "user", "content": [ {"type": "image", "image": image}, {"type": "text", "text": prompt} ]} ] text = processor.apply_chat_template(messages, add_generation_prompt=True) inputs = processor(text, images=image, return_tensors="pt") inputs = {k: v.to(model.device) for k, v in inputs.items()} with torch.no_grad(): outputs = model.generate(**inputs, max_new_tokens=512) print(processor.decode(outputs[0], skip_special_tokens=True))运行前需要准备一张 test.png 测试图片。如果脚本能正常输出对图片的描述,说明模型加载、处理器、模板和 GPU 环境都正常,可以进入下一步数据准备。如果这一步报错,优先检查 transformers 版本和模型路径。
5. 多模态微调数据集准备
数据集是微调质量的上限。模型结构决定它能学到什么,数据质量决定它学得好不好。Qwen3-VL 是多模态模型,所以数据集里不能只有文本,还要包含图片路径或图片内容。
5.1 数据集格式
LLaMA-Factory 支持多种数据格式,多模态微调常用的是 sharegpt 格式。每个样本包含 messages 对话列表,以及 images 图片路径列表。下面是一份票据信息抽取训练数据的示例:
[ { "messages": [ { "role": "user", "content": "请识别这张票据中的金额、日期和编号,并以JSON格式输出,字段名为 amount、date、invoice_no。" }, { "role": "assistant", "content": "{\"amount\": \"128.50\", \"date\": \"2026-01-12\", \"invoice_no\": \"INV20260112001\"}" } ], "images": ["data/images/001.png"] }, { "messages": [ { "role": "user", "content": "这张图片里有哪些商品,请列出名称和数量。" }, { "role": "assistant", "content": "1. 可乐 x2\\n2. 薯片 x1\\n3. 面包 x3" } ], "images": ["data/images/002.png"] } ]注意:图片路径是相对于数据集文件所在位置的相对路径,也可以使用绝对路径。如果图片较多,建议把图片集中放在一个目录,不要散落多个层级。LLaMA-Factory 实际支持的多模态字段命名可能随版本变化,使用前查看官方 data/README 示例更稳妥。
5.2 注册数据集
数据集文件要放在 LLaMA-Factory 的 data 目录下,并在 data/dataset_info.json 中注册。注册内容指向文件名、格式类型和列名:
{ "qwen3_vl_instruct": { "file_name": "qwen3_vl_instruct.json", "formatting": "sharegpt", "columns": { "messages": "messages", "images": "images" }, "tags": { "role_tag": "role", "content_tag": "content", "user_tag": "user", "assistant_tag": "assistant" } } }这里的键名qwen3_vl_instruct是数据集别名,训练时通过--dataset qwen3_vl_instruct引用。如果注册后训练报错,先检查 dataset_info.json 的 JSON 格式是否合法,以及 messages 和 images 字段是否和样本数据对应。
5.3 数据质量检查
提交数据前,至少做三点检查。第一,图片路径是否真实存在,很多微调失败是因为路径写错。第二,指令和答案是否匹配。第三,输出格式是否统一,例如所有票据样本都输出 JSON,不要一部分输出 JSON,一部分输出散文。数据量方面,LoRA 微调不建议一上来就堆几万条。先准备 100 到 500 条高质量样本跑通流程,确认效果后,再逐步扩展数据量。如果数据量很少,比如只有几十条,也可以先做小规模实验,观察训练损失能否下降。
6. Qwen3-VL LoRA / QLoRA 微调实操
环境没问题、数据也没问题,接下来就是训练。这里提供两种方式:WebUI 和命令行。命令行更适合脚本化和批量实验,WebUI 适合第一次上手观察参数变化。
6.1 使用 LLaMA-Factory WebUI 配置训练
启动 WebUI:
llamafactory-cli webui启动后浏览器访问http://localhost:7860。在界面中按以下思路配置:
- 模型名称选择 Custom,模型路径填入本地 Qwen3-VL 模型目录
- 微调方法选择 LoRA 或 QLoRA
- 数据集勾选刚才注册的
qwen3_vl_instruct - 模板选择 qwen_vl,如果模板列表里没有,需要升级 LLaMA-Factory 版本
- 学习率设置为 5e-5 左右,训练轮数可以先设 3 轮
- 批次大小设置为 1,梯度累积根据显存调整
- 如果显存不足,开启 4bit 量化,即 QLoRA
WebUI 的好处是配置项可视化,适合检查参数是否合法。但实际跑训练时,命令行脚本更可控,也方便记录每次实验的配置。
6.2 命令行训练脚本
下面是一份基于 llamafactory-cli 的训练脚本,使用 QLoRA 方式,适合显存不宽裕的情况:
llamafactory-cli train \ --model_name_or_path ./models/Qwen/Qwen3-VL-8B-Instruct \ --template qwen_vl \ --stage sft \ --finetuning_type lora \ --quantization_bit 4 \ --dataset qwen3_vl_instruct \ --cutoff_len 2048 \ --learning_rate 5e-5 \ --num_train_epochs 3 \ --per_device_train_batch_size 1 \ --gradient_accumulation_steps 8 \ --lr_scheduler_type cosine \ --warmup_ratio 0.1 \ --logging_steps 10 \ --save_steps 200 \ --bf16 true \ --output_dir ./output/qwen3_vl_lora参数说明:
--quantization_bit 4:使用 4bit 量化加载基座模型,显著降低显存占用--cutoff_len 2048:输入序列最大长度,按需求调整,文档类任务可能需要更长--per_device_train_batch_size 1:单卡显存有限时建议从 1 开始--gradient_accumulation_steps 8:等效 batch 增大,不影响显存峰值--bf16 true:Ampere 及以上架构支持 bf16,能省显存且更稳
如果显存充足,可以去掉--quantization_bit 4,改用标准 LoRA。训练开始后,日志会输出 loss、学习率、已用显存和当前 step。观察前几百步,如果 loss 明显下降,说明数据和配置基本没问题。
6.3 训练过程中的观察点
训练不是把命令跑完就结束。训练过程中要重点看三个指标。第一个是 loss 是否稳定下降,如果 loss 震荡剧烈,优先考虑降低学习率;如果 loss 完全不降,检查数据集是否有大量错误标注。第二个是显存占用,如果训练中途出现 OOM,模型会直接退出,需要降低 cutoff_len 或 batch size。第三个是保存的 checkpoint 是否完整,默认每 200 步保存一次,确认 output_dir 下有完整文件,后面合并权重时要用。
7. LoRA 权重导出与模型合并
训练完成后,output_dir 下保存的是 LoRA adapter 权重,不是一个完整模型。如果你要把微调后的模型用在推理脚本里,通常需要把 LoRA 权重合并回基座模型,导出成一个完整的模型目录。
使用 llamafactory-cli export 命令:
llamafactory-cli export \ --model_name_or_path ./models/Qwen/Qwen3-VL-8B-Instruct \ --adapter_name_or_path ./output/qwen3_vl_lora \ --template qwen_vl \ --finetuning_type lora \ --export_dir ./output/qwen3_vl_lora_merged \ --export_size 4 \ --export_legacy_format False导出过程会加载基座模型和 LoRA adapter,合并后写入新目录。合并后的模型目录可以直接被 AutoProcessor 和 AutoModelForImageTextToText 加载。如果导出时报显存不足,可以尝试加上--quantization_bit 4或减小--export_size。注意:如果训练时使用了 QLoRA,导出合并时同样需要能够加载 4bit 基座模型,确保 bitsandbytes 环境正常。
如果不想合并,也可以在推理时同时加载基座模型和 adapter,但这样每次推理都要额外处理 adapter,容易出错,工程上更推荐合并后使用。
8. 微调结果推理验证与效果对比
合并完权重,用测试图片验证微调效果。这一步要回答的核心问题是:模型在你的业务数据上,是否真的比微调前更强。
8.1 加载合并后模型进行推理
推理脚本和微调前基本一致,只需把 model_path 改成合并后的目录:
from transformers import AutoProcessor, AutoModelForImageTextToText from PIL import Image import torch model_path = "./output/qwen3_vl_lora_merged" processor = AutoProcessor.from_pretrained(model_path, trust_remote_code=True) model = AutoModelForImageTextToText.from_pretrained( model_path, torch_dtype=torch.bfloat16, device_map="auto" ) image = Image.open("test_2.png") prompt = "请识别这张票据中的金额、日期和编号,并以JSON格式输出。" messages = [ {"role": "user", "content": [ {"type": "image", "image": image}, {"type": "text", "text": prompt} ]} ] text = processor.apply_chat_template(messages, add_generation_prompt=True) inputs = processor(text, images=image, return_tensors="pt") inputs = {k: v.to(model.device) for k, v in inputs.items()} with torch.no_grad(): outputs = model.generate(**inputs, max_new_tokens=512) print(processor.decode(outputs[0], skip_special_tokens=True))8.2 效果对比方法
建议准备至少 20 条与训练集分布接近、但训练时没见过的测试图片。让基座模型和微调后模型分别对这些图片推理,对比输出。主要看三个维度:字段准确率、格式正确率、错误样本类型。如果微调后能稳定输出目标 JSON,而基座模型经常漏字段、多字段或输出散文,说明微调方向正确。如果微调后出现了幻觉或过拟合,可能原因是训练数据太少、学习率太高或训练轮数过多,需要回退参数重新实验。
这个环节建议保留微调前后所有输入输出日志,方便后续调优时对比。没有日志,就没有办法判断是哪一步出了问题。
9. 显存占用与性能优化建议
显存是微调多模态模型最常见的瓶颈。以下方法和观察思路可以帮你把模型“塞进”有限显存。
9.1 如何观察显存占用
训练时另开一个终端,运行:
nvidia-smi -l 1每秒刷新一次显存占用。重点关注“进程占用显存”而不是“总显存”。如果模型在训练开始几秒内就报 CUDA OOM,说明初始加载就超了显存,优先降低量化精度或模型规模。如果训练到中途 OOM,可能是序列长度和 batch size 导致的峰值变高,优先减小这两个参数。
9.2 LoRA、QLoRA、全参微调的显存差异
从经验上看,全参微调需要的显存最高,因为优化器状态和梯度都要保留;LoRA 只训练 adapter,显存低于全参;QLoRA 在 LoRA 基础上把基座模型量化到 4bit,显存占用最低。如果你是第一次跑,强烈建议直接用 QLoRA,也就是在命令里加--quantization_bit 4。虽然训练速度会比全参略慢,但对显存的要求低很多,性价比最高。
9.3 降低显存占用的实用手段
如果 QLoRA 仍然 OOM,可以按顺序尝试以下手段:
- 开启梯度检查点,在命令中加
--gradient_checkpointing true - 将
cutoff_len从 2048 降到 1024,这是影响显存最大的参数之一 - 将
per_device_train_batch_size保持为 1,通过梯度累积补等效 batch - 如果使用 flash-attn,加上
--flash_attn true,可以降低显存峰值 - 关闭
--bf16改为纯 FP16,某些卡上显存占用会略降,但有精度风险 - 换更小的模型版本,从 8B 换到 4B,是最有效的降显存手段
多模态模型的输入图片也会占用显存。如果图片分辨率很高,模型处理器会把它缩放成固定尺寸,但过长序列仍然会影响显存。控制输入图片数量和分辨率,也能缓解显存压力。
10. 常见问题与排查方法
微调过程会踩到不少坑。下面整理一张排查表,基本覆盖从环境到训练再到导出的高频问题。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 模型下载慢或失败 | 网络问题、模型 ID 错误 | 检查网络,确认 ModelScope 仓库是否存在 | 使用 modelscope 下载,或切换网络镜像源 |
| 启动训练后立刻 OOM | 显存不足、模型加载精度太高 | 观察 nvidia-smi,查看报错日志 | 开启 QLoRA、减小 batch size、减小 cutoff_len |
| 训练过程中途 OOM | 序列长度超限、显存峰值偏高 | 检查是否加载了过多图片样本 | 开启梯度检查点、减小序列长度、减小 batch size |
| flash-attn 安装失败 | 编译环境与 GPU 不匹配 | 查看 pip install 日志 | 暂时不装,去掉 --flash_attn 参数 |
| 数据集格式报错 | messages/images 字段不匹配 | 查看 LLaMA-Factory 日志中的 key 信息 | 对照官方多模态数据示例调整字段 |
| loss 不下降 | 学习率异常、数据错误、模板错误 | 查看前几百步 loss 曲线 | 降低学习率,检查训练数据和模板名 |
| 推理输出乱码或重复 | 模板不一致、tokenizer 与模型不匹配 | 检查 generate 输出和 processor 版本 | 确保使用合并后模型目录,升级 transformers |
| LoRA 合并失败 | adapter 路径错误、显存不足 | 检查训练输出目录 | 修正 adapter 路径,降低 export_size |
| 端口被占用 | WebUI 或推理服务端口冲突 | 查看启动日志 | 加 --port 参数换端口 |
遇到问题时,先看日志,不要盲目改参数。训练日志和推理日志是最直接的信息来源。如果报错信息指向某个库的内部函数,优先检查 transformers、peft、bitsandbytes 的版本是否匹配 LLaMA-Factory 的版本要求。
11. 后续进阶:Agent、RAG 与多模态应用
微调不是终点,而是接入业务的起点。Qwen3-VL 微调完成后,最常见的扩展方向有三个:多模态 Agent、文档检索增强(RAG)、批量推理服务。
多模态 Agent 是当前热度很高的方向。模型通过截图或实时画面理解界面状态,再输出工具调用指令,完成点击、填写、翻页等操作。Qwen3-VL 本身具备视觉理解能力,微调可以让它更准确地理解特定系统的界面,以及按规定的工具调用格式输出。这个场景下,你的训练数据不再只是“图片-文本”对,而是“图片-工具调用指令”对。训练数据要模拟真实的 Agent 交互流程,输出必须是标准的 JSON 指令,例如{"action": "click", "target": "submit_button"}。
RAG 方向则是把多模态模型与文档检索结合。你可以先用大模型把图片、PDF 解析成结构化文本或图表摘要,存入向量库;用户提问时先检索相关片段,再把片段交给 Qwen3-VL 生成回答。微调在这里的作用是优化“图片到文本”的解析质量,让检索前的文档结构化更准确。
批量推理服务方面,微调后的模型可以使用 FastAPI 封装成一个 HTTP 接口。每个请求传入图片路径或 base64 图片,模型返回结构化结果。封装后可以接进现有业务系统,也可以配合消息队列做异步批量任务。注意接口服务要加访问控制,不要把接口暴露到公网,避免被滥用。
12. 总结:最值得跑通的点
这篇文章的核心内容是:用 Qwen3-VL 作为基座,用 LLaMA-Factory 跑通一次多模态 LoRA/QLoRA 微调,并完成模型导出和效果验证。按这个流程,你至少能得到一个“能用”的微调模型,以及一套可以反复使用的方法论。
最开始要验证的不是训练效果多好,而是链路是否能跑通。建议先准备一份很小的数据集,比如 50 条样本,用最小的模型规模、最短的序列长度、QLoRA 方式,完整跑一遍训练和导出。链路通了之后,再逐步增加数据量和序列长度,调优学习率和训练轮数。
最容易踩的坑有三个:一是多模态数据集格式没有按 LLaMA-Factory 规范写,导致训练直接报错;二是显存不够,没有开启量化或梯度检查点;三是合并权重后推理时 tokenizer 或模板不匹配,输出乱码。这三个坑在本文对应章节都给了具体排查方法。
后续可以继续扩展的方向包括:换更大的 Qwen3-VL 模型版本、使用 ms-swift 做对比实验、把微调后的模型封装成多模态 Agent 服务、接入 RAG 管线做文档智能问答。推荐先把本文流程跑通,再根据业务需求选择扩展方向。建议收藏备用。