本文基于 Meta 开源项目 SAM 3Segment Anything with Concepts源码深入剖析其 Agent 系统的设计思路与工程实现。SAM3 Agent 将多模态大语言模型MLLM与 SAM3 分割模型相结合构建了一个具备迭代推理能力的视觉概念定位系统。术语速查在正式开始之前先简要解释本文涉及的几个核心术语方便不同背景的读者阅读术语全称通俗解释分割SegmentationImage Segmentation将图像中的目标对象从背景中抠出来精确到每一个像素掩码MaskSegmentation Mask一张与原图同尺寸的二值图用 1 标记目标像素、0 标记背景像素。将掩码叠加到原图上就能看到目标被高亮出来MLLMMultimodal Large Language Model多模态大语言模型既能理解文本又能理解图像的 AI 模型如 Qwen-VL、GPT-4o 等开放词汇Open-Vocabulary—不限于预定义类别用户可以用任意自然语言描述来指定目标1. 背景与动机SAM3 是 Meta 于 2025 年 11 月发布的新一代分割一切模型相较于前代 SAM2其核心突破在于支持开放词汇Open-Vocabulary概念分割——用户可以通过自然语言描述来分割图像中的目标对象。然而SAM3 的文本 prompt 接口要求输入简洁的名词短语如 “person”、“brown handbag”无法直接处理复杂的指代表达。例如面对 “the leftmost child wearing blue vest” 这样的查询SAM3 本身无法独立完成推理。为解决这一问题SAM3 引入了 Agent 架构将 MLLM如 Qwen-VL作为大脑SAM3 作为眼睛和手通过工具调用Tool Calling机制实现闭环推理。2. 整体架构SAM3 Agent 的核心架构可概括为以下协作模式用户输入复杂文本查询 图像 │ ▼ ┌─────────────────────┐ │ MLLM如 Qwen-VL │ ◄── 系统提示词System Prompt │ 负责理解、推理、决策 │ └─────────┬───────────┘ │ 工具调用Tool Call ▼ ┌─────────────────────┐ │ SAM3 分割模型 │ │ 负责生成分割掩码 │ └─────────┬───────────┘ │ 返回掩码结果 可视化图像 ▼ ┌─────────────────────┐ │ MLLM 评估结果 │ │ 决定接受/重试/筛选 │ └─────────────────────┘整个流程由agent_core.py中的agent_inference函数驱动形成一个多轮对话循环。3. 四大工具详解Agent 系统为 MLLM 提供了四个工具各司其职3.1 segment_phrase —— 核心分割工具该工具接收一个简洁的名词短语作为text_prompt调用 SAM3 模型对图像进行分割返回所有匹配实例的掩码即标记出目标对象所在像素区域的二值图。关键约束输入必须是简短的名词短语不能包含复杂的关系描述或比较级每次调用会清除所有先前生成的掩码同一text_prompt不允许重复使用这意味着 MLLM 需要将用户的复杂查询翻译为 SAM3 能理解的简单短语。例如对于 “a person holding a blender with their left hand”MLLM 应调用segment_phrase(person)而非segment_phrase(left hand)。3.2 examine_each_mask —— 逐一审查工具当segment_phrase生成了多个小型或重叠的掩码时该工具会将每个掩码逐一叠加到原图上进行可视化包括放大视图然后由 MLLM 逐个查看并判断每个掩码是否应被保留。# 源码中的逐一审查逻辑简化foriinrange(num_masks):# 生成单个掩码的全图视图和放大视图image_w_mask_i,image_w_zoomed_in_mask_ivisualize(current_outputs,i)# 将两张图片发送给 MLLM由其判断 Accept 或 Rejectverdictsend_generate_request(iterative_checking_messages)值得注意的是该工具使用了独立的系统提示词system_prompt_iterative_checking.txt专门用于掩码质量评估与主推理流程的提示词分离。3.3 select_masks_and_return —— 最终选择工具MLLM 在确认当前掩码集合满足用户查询后通过该工具选择最终的掩码子集作为输出。参数final_answer_masks是一个整数数组表示被选中的掩码编号。3.4 report_no_mask —— 无结果报告工具当图像中确实不存在与用户查询匹配的对象时MLLM 调用此工具报告无结果。系统对该工具的使用设置了严格限制——只有在确认图像与查询完全无关时才允许调用。4. 消息历史管理上下文窗口的精细控制Agent 系统面临的一个核心工程挑战是多轮对话会导致上下文窗口快速膨胀尤其是包含多张图片时。SAM3 Agent 通过_prune_messages_for_next_round函数实现了精细的消息裁剪策略三段式保留规则始终保留前两条消息系统提示词 用户原始输入从后向前搜索保留最近一次包含segment_phrase工具调用的助手消息及其后续所有消息中间的历史消息全部丢弃图片数量硬约束# 确保上下文中永远不超过 2 张图片assertcount_images(messages)2这一设计确保了 MLLM 始终能看到原始图像和最新的分割结果图像同时避免上下文溢出。重复 prompt 警告机制当存在已使用过的text_prompt时系统会在用户消息中注入警告文本明确告知 MLLM 哪些短语已经尝试过且效果不佳避免无效重试。5. 系统提示词工程精细到极致的规则设计SAM3 Agent 的系统提示词是整个系统的灵魂其篇幅超过数千字包含了极为详尽的行为规范。以下是几个值得关注的设计要点5.1 用户意图理解规则系统提示词用大量篇幅指导 MLLM 如何正确理解用户查询区分主要目标与辅助描述对于 “a man carrying a young girl”应定位 “man” 而非 “young girl”处理用户错误如用户说 “red laptop” 但图中是紫色笔记本MLLM 应自行修正处理语法错误和拼写错误如 “left back to us guy” 应理解为左边背对我们的男人5.2 segment_phrase 使用规则18 条这些规则覆盖了各种边界情况不使用 OCR 相关描述SAM3 不具备 OCR 能力避免使用动作、关系或比较级作为 prompt当目标是人时必须使用整体描述如 “person”而非局部如 “hand”prompt 覆盖范围不能大于也不能小于用户查询的目标范围5.3 select_masks_and_return 使用规则18 条在最终选择阶段同样设置了严格的验证流程调用前必须重新审视原始图像和用户查询必须逐一说明每个被选中掩码的理由必须说明每个未被选中掩码被排除的理由处理视觉幻觉当掩码 “1” 和 “2” 靠得太近时可能看起来像 “12”6. 一个完整的推理示例以查询 “the leftmost child wearing blue vest” 为例Agent 的典型推理流程如下Round 1: MLLM 分析图像识别出多个儿童 → 调用 segment_phrase(child) → SAM3 返回 5 个掩码 Round 2: MLLM 查看掩码渲染图识别穿蓝色背心的儿童 → 需要进一步确认哪个是最左边的 → 调用 examine_each_mask 逐一审查 Round 3: MLLM 根据审查结果确认 mask 2 是目标 → 调用 select_masks_and_return([2]) → 返回最终结果7. 工程亮点总结SAM3 Agent 的设计体现了几个值得借鉴的工程思路关注点分离MLLM 负责理解和推理SAM3 负责感知和分割各自发挥所长防御性编程重复 prompt 检测、消息历史裁剪、图片数量硬约束每一处都在防止系统进入异常状态提示词即规范通过精心设计的系统提示词将复杂的业务逻辑编码为 MLLM 的行为规范而非硬编码在程序中可插拔的 MLLM 后端系统支持 DashScope API、vLLM 本地部署等多种 MLLM 接入方式通过send_generate_request抽象层实现解耦8. 参考资料SAM 3 论文https://arxiv.org/abs/2511.16719SAM 3 项目主页https://ai.meta.com/sam3SAM 3 GitHub 仓库https://github.com/facebookresearch/sam3本文基于 SAM3 开源代码分析撰写代码版本为 SAM 3.12026 年 3 月发布。文中代码片段经过简化处理完整实现请参考原始仓库。