
多模态大模型越来越强但真正卡住训练进度的往往不是网络结构而是高质量的多模态指令数据。人工标注贵、采集周期长、分布覆盖有限。VISA 这篇工作给出的思路是用智能体自动合成指令数据并让合成过程自我进化——先由多模态大模型合成一批图文指令样本用这批数据训练一个小模型再用小模型的表现反过来指导下一轮数据合成循环往复。从标题拆开看VISA 本质上在做三件事Agentic数据合成不是模板拼接而是由智能体分工协作完成Self-Evolving合成策略会根据已训练模型的反馈持续调整Multimodal Instruction Following目标任务是让多模态大模型更好地遵循图文混合指令。换句话说VISA 是一套面向多模态指令跟随任务的自动化数据生产框架。这篇文章不打算复述论文里的每一个公式而是提炼对工程实践有用的内容这类框架为什么重要、内部循环怎么设计、如果想自己搭一套类似的合成流水线需要准备什么环境、如何验证效果、最容易踩哪些坑。如果你正在做多模态数据清洗、合成、增强或者想给 MLLM 补充一批高质量的图文指令数据这篇文章适合直接收藏。1. VISA 核心能力速览在看细节之前先把这套框架的规格摆出来。需要说明的是论文的完整实现细节以正式版本为准下面的速览表综合了标题信息与同类框架的通用能力边界。能力项说明项目类型多模态指令跟随数据合成框架研究性质核心机制Agentic 智能体协作 Self-Evolving 自我进化迭代目标任务多模态指令跟随如图文问答、视觉指令执行、图像描述等数据出口合成后的图文指令训练数据用于 SFT 或继续预训练依赖基础模型需要可用的多模态大模型MLLM作为生成器与评估器推荐硬件训练侧按目标模型规模确定参考常见开源 MLLM 训练配置显存占用不确定需按所选基座模型、分辨率与批大小实际测试是否支持批量任务支持数据合成天然是批量生产场景是否支持接口 API需要调用 LLM/MLLM 的生成接口或本地推理服务适合场景多模态指令数据扩充、分布覆盖增强、弱监督自动标注从这张表可以得出一个基本判断VISA 不是某个开箱即用的“一键数据生成器”而是一套方法论。参考价值在于它的循环设计而不只是一个能下载的模型权重。想复现需要自己组基座模型、评估器和训练流程。2. 适用场景与使用边界先回答“这东西到底解决什么问题”。多模态指令跟随模型训练依赖大量“图片 指令 期望回答”的三元组。传统获取方式有三种人工标注、爬取已有数据集、用规则模板批量生成。人工标注最准但最贵公开数据集覆盖度有限规则模板生成的数据同质化严重。VISA 这类框架瞄准的正是这个空白用智能体自动生成多样化、分布贴合需求的指令数据并通过自我进化逐步提升数据质量。适用人群比较明确在做 MLLM 微调、SFT 数据工程的算法工程师需要扩充特定领域图文指令数据的团队比如文档理解、图表问答、UI 截图理解做数据合成、数据增强方向的研究者想理解“agent 如何反哺数据生产”的产品或平台开发人员。不适合的场景也要说清楚如果只是需要“把图片批量转成文字描述”传统 captioning 工具就够不需要一套多智能体自我进化框架如果对数据质量要求极端严格比如医疗影像诊断、自动驾驶感知标注合成数据只能做预筛和辅助不能替代专业标注如果训练目标模型规模很小而合成成本高于人工标注成本框架的优势就不明显。使用边界集中在版权和隐私两块。合成数据的原始素材如果是网络图片需要确认图片的使用授权指令文本如果参考了已有数据集需要注意数据集的 License如果图片中包含人脸、车牌、证件等个人信息必须做匿名化处理。涉及商用项目要保留数据溯源记录不能把来源不明的素材直接灌进训练集。3. VISA 框架Agentic 自进化合成思路拆解从方法论角度可以把 VISA 的循环拆成三个组件合成引擎、评估反馈、进化调度。3.1 Agentic 数据合成引擎“Agentic”的含义是数据合成由多个分工明确的智能体协作完成而不是单次 prompt 一次性生成。按这类框架的通用设计合成引擎通常包含任务规划智能体根据目标领域和现有数据缺口生成一批待合成的任务描述。比如“生成一张包含商品价签和促销信息的货架图片并让模型指出最低价商品”。图像生成/选择智能体从已有图片池中挑选合适的图或调用文生图模型生成新图。指令编写智能体针对图片内容编写指令与参考答案。这一环最考验多模态推理能力因为指令必须与图中内容严格对应模型回答才能被验证。质量批评智能体对生成的“图片 指令 回答”三元组打分输出修改建议。这种分工的价值是每个环节可以独立调优。比如想提高数据难度只需要修改任务规划智能体的 prompt不需要改动图像生成逻辑想提高答案准确性可以强化批评智能体的验证规则。3.2 自我进化循环“Self-Evolving”是整个框架最核心的部分。它通常是一个四步循环用当前的数据合成策略生成一批训练数据用这批数据微调一个基座 MLLM在验证集上评估微调后的模型找到它表现最差的指令类型把失败样本反馈给任务规划智能体调整下一轮合成任务的难度、覆盖度和风格然后进入下一轮。这样每一轮数据都不是简单重复上一轮而是围绕模型当前的弱点做针对性补充。这个思路和语言模型领域的 self-instruction、self-refine 一脉相承区别在于 VISA 把进化压力放到多模态指令跟随任务上。3.3 反馈机制设计反馈机制决定了进化方向是否正确。从公开的同类工作看常见反馈信号有三类模型在基准集上的得分比如按指令类型分组的准确率自动评估器对生成数据的质量打分包括图文一致性、指令清晰度、答案正确性人类抽查后的修正意见虽然频次低但对纠偏很有效。反馈信号粒度越细进化越有效。如果只给一个总分任务规划智能体很难知道该往哪个方向调整。建议把验证集按指令类型、图片类型、难度等级分组逐组统计得分再把这些分组指标拼进下一轮的合成 prompt。这里有一个关键判断自我进化并不是无限提升。第二轮、第三轮通常收益明显越往后收益递减甚至可能出现数据同质化。实际使用时应该设定轮次上限或收益阈值每轮之间做数据多样性对比。4. 一套通用 VISA 式数据合成工作流如果你不想等论文代码可以先按下面的通用工作流搭建一个简化版。这套流程不绑定特定模型任何支持视觉输入的 MLLM 都能当生成器。4.1 定义任务池任务池决定合成数据的分布。建议用一个 JSONL 文件维护每一行是一条任务描述模板{task: find_object, seed_prompt: 图中有一个目标物体请描述它的位置、颜色和数量并回答它与其他物体的空间关系。, target_topic: [货架商品, 桌面杂物, 街景]} {task: chart_reading, seed_prompt: 这是一张统计图表请读取纵轴和横轴含义给出趋势变化并指出最大值和异常点。, target_topic: [销售趋势, 温度变化, 流量统计]}任务池要覆盖简单感知类、关系推理类、计数类、图表理解类、多图对比类。覆盖度越广进化循环对模型弱点的诊断越准。4.2 调用 MLLM 生成数据用 OpenAI 兼容的视觉接口即可调用基座模型。下面是通用调用模板实际部署时需要替换模型名和服务地址import base64 import requests def encode_image(image_path): with open(image_path, rb) as f: return base64.b64encode(f.read()).decode(utf-8) def synthesize_one(vlm_url, image_path, seed_prompt, temperature0.9): payload { model: your-mllm-name, messages: [ { role: user, content: [ {type: text, text: seed_prompt}, {type: image, data: encode_image(image_path)}, ], } ], temperature: temperature, max_tokens: 512, top_p: 0.95, } resp requests.post(f{vlm_url}/v1/chat/completions, jsonpayload, timeout180) resp.raise_for_status() return resp.json()[choices][0][message][content]生成时注意三点temperature 不要设太低否则数据多样性不够每张图片可以生成多条指令但指令必须来自不同角度避免同义改写要记录每条数据的生成 prompt方便后续溯源。4.3 质量过滤与去重生成的数据不能直接进训练集至少要做四道过滤def quality_filter(item, min_score0.8): scores { answer_relevance: item.get(relevance, 0), image_grounding: item.get(grounding, 0), # 回答是否可被图中内容支撑 instruction_clarity: item.get(clarity, 0), } return all(v min_score for v in scores.values()) def deduplicate(items): # 简单去重按指令文本归一化后的哈希判断 seen set() result [] for item in items: norm .join(item[instruction].strip().lower().split()) if norm not in seen: seen.add(norm) result.append(item) return result更严格的做法是加一轮“翻转验证”和“对抗验证”。翻转验证指把指令中的否定词去掉或加上看模型回答是否相应改变对抗验证指故意把图片换掉看模型是否仍然“坚持”原回答。这两种方法能识别出模型靠语言先验蒙对、实际没有看图的数据。4.4 微调与下轮规划过滤后的数据转成训练格式进入 SFT。一轮完整循环的脚本流程如下# 一轮自进化循环的通用流程按实际项目调整路径 python 01_synthesize.py --task_file tasks.jsonl --image_dir ./images --out_dir ./round1 python 02_filter.py --input ./round1/raw.jsonl --out ./round1/filtered.jsonl python 03_format.py --input ./round1/filtered.jsonl --out ./round1/train.jsonl python 04_train.py --data ./round1/train.jsonl --base_model your-mllm --epochs 1 python 05_evaluate.py --model ./round1/checkpoint --benchmark ./benchmarks --report ./round1/report.json拿到report.json后把得分最低的指令类型提取出来生成新的任务池进入第二轮。这一步是整个工作流的灵魂不要在过滤后直接停住必须有“评估结果 → 调整任务池”的回路。从工程角度看建议把每一轮的原始数据、过滤后数据、评估报告分目录保存目录名带上轮次号。这样既能对比数据分布变化也能在后续出现训练污染时回溯是哪一轮引入的问题。5. 环境准备与前置条件运行 VISA 式的工作流不需要太特殊的硬件但需要规划好两套资源生成侧和训练侧。生成侧建议基座 MLLM 如果只有 7B 到 14B 参数量化后常见消费级显卡可以跑推理如果使用闭源视觉模型 API则本地不需要高显存但要考虑调用成本和并发限制图片池存储按数据量估算1 万条样本的图片、原数据、过滤中间结果建议预留 50GB 以上磁盘空间。训练侧建议7B 级模型 LoRA 微调常见配置下 24GB 显存起步全参数微调需要按批次大小扩容13B 到 70B 级别模型训练基本要依赖多卡集群或云上租赁如果只跑推理和评估不需要训练卡。软件环境按常见深度学习实践配置即可没有特别的硬性版本要求# 通用环境检查清单 python --version nvcc --version nvidia-smi pip list | grep torch实际显存占用取决于图片分辨率、token 长度、批大小和是否量化。建议第一次运行时把批大小设为 1记录显存峰值后再逐步放大。6. 功能测试与效果验证验证合成数据是否有效不能只看数据“看起来像不像”要看它能不能提升目标模型。建议按以下顺序做验证。6.1 基础生成能力测试先验证合成引擎本身能产出符合预期的数据。取 100 张图跑一轮合成人工抽查 20 条检查三个维度指令是否与图片强相关、答案是否可被图片内容支撑、指令是否存在重复或语病。合格率低于 70% 时不要进入训练先调 prompt 和过滤规则。6.2 训练收益验证最关键的验证是 A/B 测试。固定基座模型和训练超参数用三组数据分别微调数据组说明基线组只用原有数据合成组原有数据 第一轮合成数据进化组原有数据 第二轮进化后合成数据三组模型在相同基准集上评估观察指标变化。如果合成组的指标不低于基线组说明数据可用如果进化组优于合成组说明自我进化机制真正起了作用。6.3 多模态基准评估评估时建议同时看综合得分和分组得分。常用做法包括 MMBench、MME、SEED-Bench、LLaVA-Bench 等通用多模态基准也可以针对目标场景自建小验证集。分组得分尤其重要因为 VISA 这类框架的价值就是补足模型在某类指令上的短板综合分容易被强项掩盖。6.4 多样性验证合成数据的多样性直接决定进化效果。可以用 embedding 对指令做聚类观察每轮生成的指令类别数量也可以统计图片来源分布、指令长度分布、答案句式分布。如果连续两轮的分布几乎一致说明进化已经收敛后续轮次很难再带来收益。7. 资源占用与性能观察这类框架的资源占用分三个观察点。第一是生成阶段。批量调用 MLLM 时显存主要被生成模型占用图片分辨率越高视觉 tower 的显存开销越大。观察方式是启动服务后跑一次单条生成记录nvidia-smi的峰值再估算并发倍数。更稳妥的做法是先用小批并发生成观察延迟和显存逐步增加并发找到吞吐和显存的平衡点。第二是过滤阶段。质量过滤通常需要加载一个评估模型此时显存占用与评估模型规模挂钩。如果生成器和评估器同时挂在同一张卡上要注意两者显存之和。常见做法是把评估器量化或者将生成与过滤分时执行。第三是训练阶段。训练显存由基座模型大小、批大小、序列长度、LoRA 秩共同决定。并行度低时可以用梯度累积模拟大 batch但总显存需求不会消失。显存不足时优先降低图片分辨率预处理其次减小批大小最后再考虑更激进的量化方案。另一个容易被忽略的性能瓶颈是 I/O。每轮循环要读写大量图片和 JSONL单机机械硬盘会成为吞吐瓶颈。条件允许时把工作目录放到 SSD 上数据量大时提前做分片避免单个 JSONL 文件达到 GB 级后读写缓慢。8. 常见问题与排查方法问题现象可能原因排查方式解决方案生成的数据指令与图片无关基座 MLLM 视觉能力不足或 prompt 未约束抽查生成日志检查传入图片路径是否错乱换更强基座模型或在 prompt 中强制要求“必须引用图中具体物体”答案明显是模型编造图片无法支撑生成 temperature 过高或基座模型产生幻觉做翻转验证和对抗验证统计通过率降低 temperature 到 0.7 以下增加质量批评智能体重写环节过滤后剩余数据过少过滤阈值过严或生成器本身质量差查看各过滤维度的得分分布先放开一项阈值观察召回率再逐项收紧训练后指标不升反降合成数据与原有数据分布冲突或重复样本过多检查去重前后样本量对比数据来源比例控制合成数据占比增强去重必要时按比例采样显存不足OOM分辨率、批大小或序列长度超出显存查看报错栈定位到具体模块降分辨率、batch1、启用梯度累积或量化调用接口超时生成时长超出客户端超时设置查看服务端日志确认任务是否在排队增大 timeout或使用异步队列提交多轮进化后数据多样性下降任务池收敛到少数容易生成的任务统计每轮任务分布在任务池中定期注入人工编写的新任务模板API 调用失败返回 401服务地址或密钥配置错误用 curl 直接测试接口连通性核对服务地址、模型名和鉴权配置排查时坚持一个原则先定位问题发生在哪个环节再改对应环节。不要一遇到指标下降就盲目调训练参数先确认是数据问题还是训练问题。9. 最佳实践与使用建议把这套框架真正用到项目里有几条值得长期遵守的实践。第一建立数据治理规范。每一轮生成的原始数据、过滤数据、评估报告、任务池版本都要有明确的目录结构和命名规则。建议目录按round_{n}/组织任务池文件用时间戳保存版本。这样出现训练污染时可以快速定位是哪一轮引入的。第二合成数据占比要控制。合成数据用于扩充原有数据集而不是完全替代。从常见经验看先按 10% 到 30% 的比例掺入观察训练指标变化再决定是否提高比例。直接用合成数据全量替换风险很大。第三保证验证集独立性。进化循环中每轮评估都要用同一份固定验证集不能把过滤后的合成数据混入验证集否则进化方向会被污染。验证集的指令分布也要固定分组指标才可跨轮比较。第四引入人机协同。每轮循环结束后安排人工抽查 50 到 100 条数据作为自动评估之外的兜底。自动评估器本身也可能被同样的问题误导人的抽查是纠偏成本最低的方式。第五注意授权与合规。使用的图片素材、参考数据集的许可证、生成内容的版权归属都要在项目早期确认。涉及人物肖像、隐私数据的必须在进入训练前置匿名化和脱敏流程。第六设置明确的停止条件。不是轮数越多越好。建议每轮记录“指标提升幅度”连续两轮提升低于阈值就停止进化把时间花在扩大图片池或优化任务池上。10. 总结与下一步VISA 最值得关注的点不是“能生成多少条数据”而是“让数据生成策略随着模型能力提升而进化”这个闭环。它把数据生产从一次性静态任务变成和模型训练绑定的迭代工程。对于正在做 MLLM 数据扩充的团队最值得先验证的不是完整复现论文而是把“生成 → 过滤 → 微调 → 分组评估 → 调整任务池”的最小闭环先跑通。最容易踩的坑有两个一是把合成数据直接全量灌入训练不做 A/B 对比和占比控制二是跳过分组评估只用综合分判断进化效果。绕开这两点整个框架的收益会明显更稳。后续可以扩展的方向包括把进化反馈从基准得分扩展到奖励模型打分把单模态图片任务扩展到视频帧序列指令以及在任务规划智能体中引入用户提供的领域知识库。如果你已经在做类似工作建议先保存一份最小可运行的合成流水线再逐步叠加进化模块。