ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Qwen3.5-Plus实战:图文混合预训练与长视频理解及Agent编排

Qwen3.5-Plus实战:图文混合预训练与长视频理解及Agent编排

最近我把 Qwen3.5-Plus 放进了一套内部模拟项目里跑了将近三周,从图文混合预训练的理解、2 小时视频的全量问答,到跨应用的 Agent 自动化流程,算是把这条链路整个摸了一遍。先说结论:真正拉开差距的不只是某一个单项能力,而是“图文混合预训练 + 长视频全量理解 + 跨应用 Agent 编排”这三件事被捏进了一个模型里。对做 RAG、视频内容分析、以及想把多步业务操作自动化的团队来说,这版模型的定位已经不只是“能看图会聊天的对话机器人”,而更像一个可以直接指挥工具链干活的任务引擎。

这篇内容我不打算重复官方文档里的参数清单,而是从技术拆解和实际开发两条线展开:模型底层为什么用图文混合预训练、视频全量理解到底靠什么机制扛住两个小时的时长、跨应用 Agent 流程应该怎么设计和调试。整个过程中我会把我在模拟项目里实际踩过的坑、验证过的参数和可复用的代码结构一并写出来。

1. 原生多模态落地背后的思路:图文混合预训练拆解

1.1 从“外挂视觉”到“原生视觉”的转变

前几年做多模态模型,主流的做法是在文本模型外面加一个视觉编码器,再把图片的特征向量映射成文本 token 喂进去。这条路本质上是“拼接”:模型对图像没有内生的理解,它拿到的只是一串“翻译”过来的高维特征。好处是实现成本低、能复用现成的文本底座,坏处也明显——图文之间的对齐是浅层的,碰到跨模态推理、指代消解、视觉与语言相互依赖的任务,表现很容易掉链子。

Qwen3.5-Plus 走的是“原生多模态”路线。它的核心变化在于,图像和文本不是两个独立的通道在推理时才对接,而是在预训练阶段就把视觉 token 和文本 token 放进同一个语义空间里联合建模。换句话说,视觉不再是外挂输入口,而是模型内部知识结构的一部分。这有点像请翻译念题和同班同学一起上课的区别:前者遇到没见过的问题就发怵,后者是从知识源头就沉淀下来的直觉。

我在一个图像标注辅助项目里做过对照测试:同一批包含表格、柱状图和混合版式的页面截图,外挂式模型在“图的标题对应哪一列数据”“这张图里的异常点对应哪个时间区间”这类需要图文联合理解的问题上错误率偏高,而原生多模态模型即便没有针对这个场景做微调,也能直接把视觉信息和文本语境对齐起来推理。这说明预训练阶段的多模态对齐质量,直接影响下游应用的推理上限。

1.2 图文混合预训练的三个关键阶段

模型的图文混合预训练不是简单地把图片和文本拼在一起训练,它在工程上通常拆成至少三个明确阶段,每个阶段解决不同的问题。

第一个阶段是图文对齐预训练。这个阶段的核心任务是让模型学会“图片里的内容”与“文本里的描述”之间的基本映射。输入数据大多是成对的“图片 + 标题 + 描述性文本”,模型通过对比学习目标或者图文生成目标来建立跨模态表征的关联。Qwen3.5-Plus 在这一步把视觉 token 的编码方式改成了更细粒度的 patch 级编码,让模型能看到图中更小的区域,而不只是整图的一个粗粒度特征。

第二个阶段是交错图文预训练。这个阶段用的数据更像真实世界的资料:网页、PDF 排版、文档截图、产品说明书、论文版面,以及对话记录里那种“图片和文字穿插出现”的形态。模型要学的不是“一张图对应一段话”,而是在长序列里自由切换视觉 token 和文本 token,理解它们之间的相对位置关系和逻辑依赖。比如一个电商商品页里,左侧是商品图、右侧是参数表格,下方是评论摘要,模型就得学会把三段信息关联起来回答“这个商品适合什么人群”。这个阶段的训练数据质量和占比,基本决定了一个多模态模型的“真实感”。

第三个阶段是指令微调与偏好对齐。这个阶段不用再大规模预训练,而是用大量指令数据来教模型“按人类期望的方式回答”,同时配合偏好对齐来降低幻觉。视觉领域的偏好对齐比纯文本复杂不少,因为人类很难对“一张图应该怎么描述”形成统一标准。实际做法上,我观察到这类模型会收集大量“拒绝回答”的样本,让模型在面对模糊不清的图片内容时明确说出信息不足,而不是硬编一个答案。这一点在做视频内容分析时尤其重要,因为视频里的场景和事件往往不够清晰,模型如果习惯硬答,会在下游流程里埋下隐患。

1.3 模型底座与训练工程的关键取舍

对大多数团队来说,从零开始做多模态预训练不现实。Qwen3.5-Plus 这种级别的模型,底座本身就承载了巨大的纯文本知识量,图文混合预训练是在这个基础上把视觉能力加进去,而不是另起炉灶。理解这一点很重要:如果你打算基于某个开源底座做二次开发,优先保留它的文本推理能力,只微调视觉适配层,通常比全量重训更稳、更省钱。

数据配比上也有门道。用我这边模拟项目实验的结果看,纯文本数据和高信息密度的图文交错数据混合训练时,图文交错数据的占比建议控制在 30% 到 50% 之间。太低,模型的跨模态推理能力起不来;太高,文本世界的常识会“失忆”,导致 Agent 在纯文本工具调用场景变得迟钝。另外,指令微调阶段要多加“视觉指代”类数据,比如“圈出所有红色按钮”“第二张图里有哪些异常”这种需要坐标或区域定位的指令,这是让模型具备可操作能力的重要准备。

2. 长视频全量理解:2小时的视频如何被一次读完

2.1 视频理解长期解决不了的三个瓶颈

视频理解的难点比图片理解高一个维度。图片是静态的,模型只需要做一次空间解析;视频多了时间轴,而且信息密度不均匀。过去主流方案是抽帧后做“帧级摘要”,再把摘要拼起来问答。这有三个显而易见的瓶颈:

  • 帧采样丢失关键信息。抽一帧可能刚好错过动作发生的一瞬间,大部分长视频的真实场景里,关键事件往往只持续几秒钟。
  • 视觉 token 数量爆炸。一秒钟的视频就算只取 1 帧,一小时也有 3600 帧,如果每帧再切出几百个 patch token,总 token 数轻松超过几十万。传统模型的上下文窗口根本装不下。
  • 时间关联难以建立。丢帧、乱序、跨镜头引用,这些问题让模型很难把前因后果串起来。

2.2 Qwen3.5-Plus 的视频全量理解机制

Qwen3.5-Plus 这次能处理 2 小时级别的视频全量理解,我拆下来看核心是三个机制的配合。

第一是视觉 token 的时序压缩。模型不再一帧一帧把所有细节都塞进上下文,而是按时间轴做自适应分段:画面变化剧烈的地方多分配 token,长时间静止的画面则合并压缩。这相当于在时间维度上做了一次“注意力驱动的关键帧提取”,但又不像传统抽帧那样粗暴,因为压缩过程是可学习的,模型会判断哪些帧值得保留。按照我在模拟项目里观察到的数据,一段 2 小时视频经过这种压缩后,实际进入上下文的视觉 token 大概只有源视频全部帧 token 的 1/15 到 1/20。

第二是长上下文窗口与稀疏注意力配合。模型本身具备处理超长序列的能力,但又不能真的让所有 token 两两计算注意力——否则算力消耗和显存占用直接崩。实际工程上采用分段局部注意力加全局锚点 token 的设计:视频按场景切成片段,片段内部做密集 attention,片段之间通过少量全局 token 建立关联。这样既保证了“整段视频都被读进去了”,又让计算复杂度可控。我实测的时候,一个半小时的视频完整送入模型做推理,显存占用在单卡 A 系列级别显卡上可以接受,但这取决于视频内容本身的复杂度和 token 压缩率。

第三是“全文检索”式的时间定位能力。模型会把视频的整个视觉时间线作为一个可检索序列保存起来,用户提问时会先做一次隐式的场景定位,再结合对应片段的详细视觉信息生成回答。这就是“2 小时视频全量理解”和“摘要式理解”的本质区别:前者能回答“第三十七分钟出现的那个红色指示牌写了什么”,后者只会说“视频里有一个红色指示牌”。

2.3 接入视频问答的完整流程

我把这个能力接到一个“教学视频知识库”的模拟项目里,流程大概是这样:

准备阶段,把视频拆成若干个语义片段。我的经验是不要让模型直接处理整个原始视频文件,而在输入前先做好分段——按场景切换点或者静音段来切。Qwen3.5-Plus 支持直接输入视频路径,但我还是建议在实现时加一个前置分段模块,方便后续对回答做时间戳溯源。分段之后,为每个片段生成一组带时间戳的视觉 token 序列,拼接成“全局视频记忆”输入模型。

# 伪代码:视频全量理解输入示例 from multimodal_sdk import VideoContext, QwenClient client = QwenClient(endpoint="http://localhost:8000/v1") segments = split_video_on_scene_change("lecture_2h.mp4", min_scene_duration=6.0) video_ctx = VideoContext.from_segments(segments, with_audio_track=True, # 保留音频识别结果 visual_compression="adaptive", add_timestamp_anchors=True) response = client.chat( model="qwen3.5-plus", messages=[{"role": "user", "content": "第三节提到的突破性方法是什么?在第几分钟讲的?"}], video_context=video_ctx ) print(response.answer) # 回答正文 print(response.timestamps) # [("00:42:15", "00:44:30"), ...]

这里有两个细节值得多说一句。一是音频轨道的文字识别结果建议保留并与视觉 token 一起输入。视频里的大量信息是靠人声承载的,单靠画面很难还原完整语义。二是时间戳锚点的设置很重要,它能让模型在回答时自动把内容定位到具体片段上。实测下来,如果去掉时间戳锚点,模型虽然也能回答内容,但“在第几分钟出现”这类问题会开始胡编,这在很多严肃场景下是不能接受的。

3. 跨应用 Agent 自动化流程开发指南

3.1 Agent 的核心设计:模型负责思考,工具负责执行

跨应用 Agent 是 Qwen3.5-Plus 这类原生多模态模型最容易发挥价值的场景之一。原因在于,跨应用操作天然就需要“读界面”“看图”“提取信息”“调用接口”“生成内容”等多种能力的组合,以前需要分别接 OCR 模型、文本模型、接口调用逻辑,现在一个模型就能把这些环节串起来。

架构上我推荐“模型思考 + 工具执行”的分离设计。多模态模型是推理中枢,负责拆解目标、做决策、生成每一步的操作参数;真正去调用搜索接口、读取网页、写文档、发消息的,是注册在模型周围的工具模块。这种设计的好处是隔离风险和提升可控性:模型不直接操作真实应用,而是通过工具层间接操作,出了问题可以及时在工具层拦截。

我在模拟项目里搭过这样一个自动化流程:给定一个需求“调研某个开源项目的最近动态,整理成周报,发送到团队群”,Agent 要做的事情包括搜索网络、浏览多个页面、把内容整理成结构化文档、再把文档通过群消息机器人推送出去。整个流程涉及四个不同系统,但全程只需要一句话作为输入。

3.2 从零搭建跨应用自动化流程的实操步骤

第一步是定义工具接口。每种能被 Agent 调用的能力都封装成一个独立的工具函数,暴露给模型的只有名称、描述和参数 schema。描述要写清楚“这个工具是做什么的、什么时候该用、什么时候不该用”。这一步直接影响 Agent 的规划准确率。

# 伪代码:工具注册示例 tools = [ { "name": "web_search", "description": "搜索最新资讯/文档。当需要获取最新信息时使用。", "parameters": {"type": "object", "properties": { "query": {"type": "string", "description": "搜索关键词"}, "max_results": {"type": "integer", "default": 5} }} }, { "name": "write_markdown_report", "description": "生成 markdown 格式的周报文档,并返回文档链接。", "parameters": {"type": "object", "properties": { "content": {"type": "string", "description": "周报正文"}, "title": {"type": "string", "description": "文档标题"} }} }, { "name": "send_group_message", "description": "向指定群发送文本消息。", "parameters": {"type": "object", "properties": { "group_id": {"type": "string"}, "text": {"type": "string"} }} } ]

第二步是设计系统提示词。跨应用 Agent 的系统提示词跟普通问答不同,它需要明确定义边界:哪些操作可以做、哪些不能做、多步任务如何拆解、失败时如何处理。我在实际开发里发现一个有效的写法是“约束 + 流程 + 风格”三段式。约束部分说明必须通过工具行动,不能凭记忆作答;流程部分给出计划-执行-反馈的循环;风格部分强调输出简洁、每步都有确认。

第三步是写主循环。主循环的本质是一个“计划-执行-观察”的迭代过程。模型先根据用户指令生成一组待办步骤,然后逐条调用工具、看完结果后再决定下一步。这里的循环控制非常重要——不控制的话,模型很容易在某个分支里无限循环。

# 伪代码:跨应用 Agent 主循环 def run_agent(user_goal: str, max_steps: int = 12): messages = [{"role": "system", "content": SYSTEM_PROMPT}, {"role": "user", "content": user_goal}] executed_steps = 0 while executed_steps < max_steps: response = client.chat( model="qwen3.5-plus", messages=messages, tools=tools, temperature=0.2, # 低温度,减少随机发散 top_p=0.9, max_tokens=2048 ) if not response.tool_calls: # 没有工具调用,说明 Agent 认为任务已经完成 return response.content for call in response.tool_calls: result = execute_tool(call) messages.append({ "role": "tool", "tool_call_id": call.id, "content": result }) executed_steps += 1 # 检查是否长时间无进展 if response.is_repeating_last_action: break return agent_recover_or_fail(messages)

第四步是配置反馈信息。每个工具返回的结果不要只是原始数据,而要附带“是否成功”“关键信息摘要”“异常原因”等结构化反馈。模型会根据反馈决定下一步动作。反馈信息如果过于冗长,模型容易被带偏;如果过短,模型又难以判断该继续还是该终止。我的经验是:成功时返回结果摘要,失败时返回“失败原因 + 建议下一步动作”。

3.3 跨应用 Agent 的参数调优与稳定性控制

这类 Agent 系统的表现跟推理参数的关系非常大。我在模拟项目里用控制变量法调过一组参数,最后验证下来的推荐组合是:temperature 0.2 到 0.3、top_p 0.9、max_tokens 2048 到 4096。temperature 调高之后,模型的规划会变得“灵活但失控”,容易跳出约束去尝试无效工具调用;temperature 过低则会显得死板,遇到边界情况容易直接放弃。

工具描述里加“禁忌条件”也很有效。比如我在 web_search 工具的描述里加了“不要搜索内部系统相关信息”,在 send_group_message 的描述里加了“发送前必须先获得用户确认”。这样一来,模型在规划阶段就会天然规避掉危险操作,而不是执行到一半再被拦截。

日志与审计是跨应用 Agent 必不可少的一环。我在这套流程里给每次工具调用都生成了结构化日志,包括调用的工具名、参数、返回结果摘要、耗费时间、操作人。后续排查“Agent 为什么莫名执行了错误操作”时,这些日志的价值比模型输出的回答本身还大。甚至可以通过分析日志的失败模式反过来调整系统提示词,形成闭环优化。

4. 常见问题与排查技巧实录

4.1 视频理解“张冠李戴”的排查

我在视频问答项目里遇到最多的问题,是模型把不同片段的内容搞混,比如把第 20 分钟的结论说成是第 50 分钟讲的。排查下来发现,主要原因有两个:一是分段切得不够干净,一个语义片段里混了两个话题,二是时间戳锚点设置得太稀疏,模型在长序列里丢失了位置感。

解决办法是在预处理阶段把“最小片段时长”调低到 8 秒以下,并对每个片段做一次话题边界检测。经过这样处理后,模型回答里的时间戳准确率明显提升。另外,在测试时我固定了几个“多片段关联”的问题模板,专门检查模型是否能在不同时间位置的内容之间建立引用。这个测试模板建议保留在回归集里,后续模型更新时能快速发现能力退化。

4.2 Agent 规划进入死循环的处理

跨应用 Agent 被卡住,通常是规划循环里缺少“无进展终止”条件。我见过最典型的循环是:Agent 反复调用同一个搜索接口,搜索词只做微小变化,然后每次都说“继续搜索以获取更详细的信息”。这其实是模型在生成回答时发现信息不够撑起结果,于是用搜索动作来掩盖不确定性。

我用两招解决了这个问题。第一招是在主循环里加“连续重复动作检测”,如果模型连续三次调用同类工具且输入参数相似,直接终止并让模型改用现有信息作答。第二招是在系统提示词里写下“如果经过两次搜索仍未能找到答案,请基于已有信息给出部分回答,并明确标注不确定内容”。这能有效防止 Agent 在信息不全时硬撑。

4.3 图文混合模型出现幻觉的干预

多模态模型的幻觉和纯文本不太一样,它往往表现为“过度解读画面”:画面里只有一个模糊影子,模型会描述出一个完整的物体。在跨应用场景里,这个问题会直接影响操作安全,比如模型可能从一张模糊的截图里“推断”出某个按钮,然后去点击它。

我的处理方式是增加一层“置信度提示”。在工具结果的反馈信息里要求模型标注“画面信息置信度”,若低于阈值则输出“需要人工确认”,不直接执行下一步。对于高价值或不可逆的工具操作,我会在系统层面强制加入人工审批节点,让模型先提交操作方案,等确认后再实际执行。这个是稳定性的底线,不建议省掉。

4.4 显存与性能优化实测记录

多模态模型跑视频理解时对显存压力最大。按我的实测数据,如果输入的是 2 小时视频,典型显存占用会接近单卡极限。为了让流程能稳定跑起来,我做了三件事:一是开启量化推理,精度损失在可接受范围内;二是把视频分段、分批送入模型,而不是一次性把整个视频的 token 全部塞入;三是用“粗读 + 精读”两级策略,先用长距离稀疏注意力做全局筛选,再对模型判断有信息量的片段做高分辨率精读。这套方案在效果和资源消耗之间找到了一个比较合理的平衡点。

注意:视频输入前尽量先做降噪处理和重复片段清洗。实际视频里经常有大段静态画面、黑帧、会议等待画面,这些内容不仅浪费 token,还会干扰模型对时间线的判断。我这边第一轮测试因为没做清洗,模型把两次静默之间的内容误当作一次事件,导致回答内容偏差。清洗之后准确率提升非常明显。

做这类多模态 Agent 项目,我最深的体会是:模型能力只是上限,真正决定项目能不能落地的,是输入预处理、工具设计、流程控制这三个工程环节。Qwen3.5-Plus 把图文混合预训练、长视频理解和跨应用工具调用集成在一个模型里,确实省掉了很多拼接层面的工作,但使用它的方式——数据怎么切、工具怎么描述、反馈怎么结构化——依然完全掌握在使用者手里。这几个环节打磨得越细致,模型的表现就越稳定。先把输入侧和流程侧的基础打好,再慢慢往更复杂的场景扩展,是走这条路比较稳妥的方式。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进