本文基于 Meta 开源项目 SAM 3(Segment Anything with Concepts)源码,深入剖析其 Agent 系统的设计思路与工程实现。SAM3 Agent 将多模态大语言模型(MLLM)与 SAM3 分割模型相结合,构建了一个具备迭代推理能力的视觉概念定位系统。

术语速查

在正式开始之前,先简要解释本文涉及的几个核心术语,方便不同背景的读者阅读:

术语 全称 通俗解释
分割(Segmentation) Image Segmentation 将图像中的目标对象从背景中"抠"出来,精确到每一个像素
掩码(Mask) Segmentation Mask 一张与原图同尺寸的二值图,用 1 标记目标像素、0 标记背景像素。将掩码叠加到原图上,就能看到目标被"高亮"出来
MLLM Multimodal 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 逐个查看并判断每个掩码是否应被保留。

# 源码中的逐一审查逻辑(简化)
for i in range(num_masks):
    # 生成单个掩码的全图视图和放大视图
    image_w_mask_i, image_w_zoomed_in_mask_i = visualize(current_outputs, i)
    # 将两张图片发送给 MLLM,由其判断 Accept 或 Reject
    verdict = send_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 函数实现了精细的消息裁剪策略:

三段式保留规则:

  1. 始终保留前两条消息(系统提示词 + 用户原始输入)
  2. 从后向前搜索,保留最近一次包含 segment_phrase 工具调用的助手消息及其后续所有消息
  3. 中间的历史消息全部丢弃

图片数量硬约束:

# 确保上下文中永远不超过 2 张图片
assert count_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 的设计体现了几个值得借鉴的工程思路:

  1. 关注点分离:MLLM 负责理解和推理,SAM3 负责感知和分割,各自发挥所长
  2. 防御性编程:重复 prompt 检测、消息历史裁剪、图片数量硬约束,每一处都在防止系统进入异常状态
  3. 提示词即规范:通过精心设计的系统提示词,将复杂的业务逻辑编码为 MLLM 的行为规范,而非硬编码在程序中
  4. 可插拔的 MLLM 后端:系统支持 DashScope API、vLLM 本地部署等多种 MLLM 接入方式,通过 send_generate_request 抽象层实现解耦

8. 参考资料

  • SAM 3 论文:https://arxiv.org/abs/2511.16719
  • SAM 3 项目主页:https://ai.meta.com/sam3
  • SAM 3 GitHub 仓库:https://github.com/facebookresearch/sam3

本文基于 SAM3 开源代码分析撰写,代码版本为 SAM 3.1(2026 年 3 月发布)。文中代码片段经过简化处理,完整实现请参考原始仓库。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐