本文基于 SAM3 Agent 系统的系统提示词源码,深入分析其提示词工程的设计哲学与实现策略。SAM3 Agent 通过一套精心设计的、长达 6 万余字符的系统提示词,将多模态大语言模型(MLLM)从一个通用对话模型约束为一个稳定、可靠的视觉概念定位系统。本文将从规则分类、防御性设计、意图理解策略、格式控制等维度展开分析。

1. 提示词工程的核心挑战

在 SAM3 Agent 系统中,MLLM 承担着"大脑"的角色——理解用户意图、规划工具调用、评估分割结果、做出最终决策。然而,MLLM 本质上是一个通用对话模型,其行为具有不确定性。系统提示词的核心目标是:

  1. 将 MLLM 的行为空间从"无限可能"收敛到"有限且正确"的操作集合
  2. 覆盖尽可能多的边界情况,防止模型进入异常状态
  3. 在不硬编码业务逻辑的前提下,通过自然语言规则实现精确的行为控制

SAM3 的系统提示词总计约 66,000 字符(约 16,000 词),包含主推理提示词(system_prompt.txt)和掩码审查提示词(system_prompt_iterative_checking.txt)两部分。

2. 提示词的整体结构

主系统提示词采用分层递进的结构组织:

┌─────────────────────────────────────────┐
│  第一层:角色定义与能力边界               │
│  "你是一个视觉概念定位助手"               │
├─────────────────────────────────────────┤
│  第二层:用户意图理解规则(9 条)          │
│  如何正确解读用户查询                     │
├─────────────────────────────────────────┤
│  第三层:工具定义与使用规则               │
│  ├── segment_phrase(18 条规则)         │
│  ├── examine_each_mask(7 条规则)       │
│  ├── select_masks_and_return(18 条规则)│
│  └── report_no_mask(7 条规则)          │
├─────────────────────────────────────────┤
│  第四层:响应格式与流程控制               │
│  分场景的强制步骤定义                     │
└─────────────────────────────────────────┘

这种分层设计确保了规则之间的逻辑递进关系:先理解用户意图,再决定使用哪个工具,再按照工具的具体规则执行,最后按照固定格式输出。

3. 用户意图理解规则:语义解析的精细指导

系统提示词的第一个重要板块是指导 MLLM 如何正确理解用户查询。这 9 条规则覆盖了自然语言理解中的多种歧义场景。

3.1 主目标与辅助描述的区分

这是最核心的语义理解规则。系统通过大量示例明确了"什么是用户真正要找的目标":

规则 2:找到用户实际要求定位的目标对象。
- "a giraffe with its head up" → 定位整只长颈鹿,而非头部
- "a person holding a blender with their left hand" → 定位人,而非搅拌机或左手
- "two lovely ladies conversing while walking a dog, behind a bicycle" → 定位女性,而非狗或自行车
- "guy with white hat" → 定位人,而非白帽子
规则 3:不要为仅用于辅助识别的对象生成掩码。
- "a man carrying a young girl" → 只定位 man,不包含 young girl
- "a small girl staring at something, along with her older sister" → 只定位 small girl

这些规则的设计反映了一个关键洞察:用户的自然语言描述中,修饰语和从句往往是用来帮助识别目标的上下文信息,而非目标本身。MLLM 如果不加区分地处理所有名词,会导致严重的定位错误。

3.2 间接指代的处理

规则 4:有时目标对象未被直接命名但被明确指代。
- "something that shows the man is playing golf" + 图中有人拿高尔夫球杆
  → 定位 "golf club" 而非 "man"

该规则要求 MLLM 具备推理能力——从描述中推断出实际的物理对象,而非机械地匹配名词。

3.3 用户错误的容错处理

规则 6:用户查询可能存在轻微错误但仍与图像高度相关。
- 用户说 "the red laptop" 但图中笔记本是紫色的 → 仍应定位该笔记本
- 用户说 "girl left" 但左边是一位成年女性 → 定位左边的女性
规则 7:用户查询可能存在语法错误、拼写错误或无关信息。
- "left back to us guy" → 理解为"左边背对我们的男人"
- "big maybe hotdog middle back taste good" → 推断为后排中间的三明治

这两条规则体现了系统的鲁棒性设计哲学:在真实应用场景中,用户输入往往不规范,系统不应因为输入质量问题而拒绝服务,而应尽最大努力理解用户意图。

3.4 宽容匹配原则

规则 5:不应因为微小的技术性差异而放弃定位。
- 用户要找 "dry space" → 相对干燥的区域(如陆地)即可满足
- 用户要找 "objects that help you focus" → 耳机甚至窗帘都可能符合
- 用户要找 "containers for holding hot water" → 杯子或水壶都可以

该规则防止 MLLM 过于"字面化"地理解查询,鼓励其进行合理的语义推理和常识判断。

4. segment_phrase 工具规则:精确控制分割行为

segment_phrase 是 Agent 系统的核心工具,其 18 条使用规则构成了整个系统中最复杂的规则集。这些规则可归纳为以下几个维度。

4.1 输入约束规则

SAM3 模型的文本接口仅支持简短名词短语,因此系统提示词必须严格约束 MLLM 的输入格式:

规则 1:可使用颜色等视觉形容词,但不得使用数字或图像上的文字(SAM3 无 OCR 能力)。
- 正确:"black ball"(用于定位 8 号球)
- 错误:"8-ball"

规则 4:避免使用动作、关系或比较级;使用更通用的短语。
- 正确:"vase"(而非 "the bigger vase")
- 正确:"dog"(而非 "the dog lying down")

规则 7:保持简洁,提取关键词。
规则 8:不得重复使用相同的 text_prompt。

4.2 覆盖范围规则

这组规则确保 text_prompt 的语义范围与用户查询的目标范围精确匹配:

规则 15:text_prompt 覆盖范围不得大于用户查询目标。
- 用户问 "areas of the jeans that are broken" → 不得使用 "jeans"

规则 16:text_prompt 覆盖范围不得小于用户查询目标。
- 用户问 "the person holding a microphone" → 不得使用 "microphone"

规则 17:应首先尝试精确匹配目标范围的 text_prompt。

规则 15 和 16 构成了一对互补约束,将 MLLM 的选择空间限定在一个精确的语义区间内。

4.3 人物定位特殊规则

规则 9:当目标是人时,必须使用整体描述。
- 正确:"person"、"man"、"girl"、"firefighter"
- 错误:"hand"、"face"(即使用户提到了这些部位)

该规则源于 SAM3 模型的特性——对人体部位的分割质量不如对整体人物的分割质量,且用户通常期望获得完整的人物掩码。

4.4 失败恢复策略

规则 3:如果 text_prompt 未生成有用掩码,尝试更通用的短语。
- "elementary school teacher" 无结果 → 尝试 "person"

规则 5:结果不符合预期时,可使用不同的 text_prompt 重试。
- "nose" 无效 → 尝试 "dog nose" 或 "black marking"

规则 6:目标过于小众时,尝试更通用的类别。
- "sundial" 无结果 → 尝试 "statue"

规则 10:避免重复失败的 text_prompt,尝试间接但有创意的表达。
- 定位蛋糕中心的文字区域 → 尝试 "birthday greeting"

这组规则构成了一个完整的失败恢复策略链:从精确到通用,从直接到间接,从字面到创意。

5. select_masks_and_return 规则:最终决策的严格验证

作为输出最终结果的工具,select_masks_and_return 的 18 条规则着重于防止错误输出。

5.1 强制验证流程

规则 14:调用前必须完成以下验证:
a. 确认能够准确定位所有匹配用户查询的正确掩码
b. 逐一说明每个被选中掩码的理由
c. 逐一说明每个未被选中掩码被排除的理由

该规则强制 MLLM 在输出前进行系统性的自我审查,类似于人类决策中的"检查清单"机制。通过要求模型显式地为每个掩码提供理由,降低了遗漏或误选的概率。

5.2 视觉幻觉防御

规则 11:当掩码 "1" 和 "2" 靠得太近时,可能看起来像 "12"。
如果用户告知只有 3 个掩码,但你看到了 "12",这是视觉错觉。
你只能引用掩码 "1"、"2"、"3"。

该规则针对的是 MLLM 在处理渲染图像时的一个已知问题:当多个掩码的编号标签在空间上相邻时,模型可能将它们误读为一个多位数编号。这是一个极为具体的工程问题,体现了提示词设计者对模型行为的深入观察。

5.3 颜色干扰防御

规则 13:如果用户查询涉及颜色,必须仔细对比原始图像。
因为掩码渲染会改变对象的原始颜色。

掩码以半透明彩色覆盖层渲染在原图上,这会改变被覆盖区域的视觉颜色。如果用户查询涉及颜色属性(如 “the red car”),MLLM 必须参考原始图像而非渲染后的图像来判断颜色。

5.4 格式约束

规则 4:final_answer_masks 数组中不得有重复整数。
规则 8:不得选择已被删除的历史掩码。
规则 12:必须逐一列出所有选中的掩码编号,不得使用缩写或代码。
- 错误:[i for i in range(1, 94)]
- 正确:[1, 2, 3, ..., 93, 94](完整列出)
规则 17:不得选择编号大于 100 的掩码。

这些规则防止了 MLLM 在输出格式上的各种异常行为,确保下游代码能够正确解析工具调用参数。

6. report_no_mask 规则:极度保守的"无结果"策略

report_no_mask 工具的 7 条规则全部指向同一个目标:尽可能避免调用该工具。

规则 1:如果推理过程中曾认为图像中存在匹配目标,则永远不得调用 report_no_mask。
规则 2:只有在确认图像中完全不存在匹配概念时才可调用。
规则 5:用户查询轻微错误时应容错处理,而非报告无结果。
规则 6:应极少调用该工具,仅保留给完全无关的情况。
规则 7:不应因微小技术性差异而放弃定位。

这种极度保守的设计反映了系统的核心价值取向:宁可多尝试几次(即使最终结果不完美),也不轻易放弃。在实际应用中,"找到一个近似结果"通常比"报告无结果"对用户更有价值。

7. 响应格式控制:强制性的思维链结构

系统提示词定义了严格的响应格式,根据上下文中图像数量分为两种场景:

场景 1:仅有原始图像(首轮)

<think>
1. Analyze: 描述和分析原始图像
2. Think: 确定需要定位的目标对象
3. Remind: 提醒自己工具使用规则
4. Plan: 规划工具调用策略
5. Decide: 确定本轮调用的工具和参数
</think>
<tool>{"name": "segment_phrase", "parameters": {"text_prompt": "..."}}</tool>

场景 2:有原始图像 + 掩码渲染图(后续轮次)

<think>
1. Analyze: 分析掩码渲染图中的每个掩码
2. Compare: 将掩码与原始图像和用户查询对比
3. Decide: 确定下一步操作
</think>
<tool>{"name": "select_masks_and_return", "parameters": {"final_answer_masks": [...]}}</tool>

这种强制性的思维链(Chain-of-Thought)结构有两个作用:

  1. 提高推理质量:强制模型在行动前进行系统性思考,减少冲动决策
  2. 提供可解释性:每一步的推理过程都被显式记录,便于调试和审计

8. 掩码审查提示词:独立的质量评估系统

system_prompt_iterative_checking.txt 是一个独立的提示词,专门用于 examine_each_mask 工具的逐一审查环节。其设计体现了"关注点分离"原则。

8.1 输入规范

审查提示词明确定义了 MLLM 将收到的四类信息:

1. 用户的文本查询
2. 原始图像(无掩码干扰)
3. 全图 + 单个掩码渲染图(用于全局位置判断)
4. 放大视图(用于局部细节判断)

8.2 判断规则

审查提示词复用了主提示词中的意图理解规则(主目标 vs 辅助描述),但以更简洁的方式表达,并增加了针对审查场景的特殊指导:

规则 1:判断用户查询是适用于所有实例还是特定实例
规则 2:只接受覆盖主要目标的掩码,拒绝覆盖辅助对象的掩码
规则 3:不接受仅用于辅助识别的对象的掩码
规则 4:处理间接指代的情况
规则 5:综合图像和文本进行仔细推理

8.3 输出格式

<think>分析三张图像,逐步推理掩码是否正确</think>
<verdict>Accept</verdict> 或 <verdict>Reject</verdict>

输出格式极度简化——只有 Accept 或 Reject 两种结果,没有中间状态。这种二值化设计简化了下游代码的解析逻辑,同时避免了模型输出模糊判断(如"可能正确")带来的处理复杂性。

9. 防御性设计模式总结

纵观整个提示词系统,可以提炼出以下防御性设计模式:

9.1 重复强调模式

关键规则在提示词中被多次、以不同措辞重复强调。例如"不得重复使用相同的 text_prompt"这一规则,在 segment_phrase 规则第 8 条、用户意图理解部分、以及响应格式部分均有出现。这种冗余设计是为了应对 MLLM 在长上下文中可能遗忘早期规则的问题。

9.2 正反示例模式

几乎每条规则都配有正确示例和错误示例:

正确:"black ball"(用于定位 8 号球)
错误:"8-ball"

这种模式利用了 MLLM 的 few-shot 学习能力,通过具体示例比抽象规则更有效地传达意图。

9.3 互斥约束模式

通过成对的互斥规则限定行为边界:

规则 15:覆盖范围不得大于目标 ← 上界
规则 16:覆盖范围不得小于目标 ← 下界

两条规则共同定义了一个精确的"合法区间"。

9.4 前置条件检查模式

多个工具的规则中包含"调用前必须满足的条件":

examine_each_mask 规则 1:调用前必须确认所有正确掩码已存在于当前图像中
examine_each_mask 规则 7:必须在上下文中有两张图像时才可调用
select_masks_and_return 规则 14:调用前必须完成三项验证
select_masks_and_return 规则 18:必须在上下文中有两张图像时才可调用

这些前置条件防止了工具在不恰当的时机被调用。

9.5 兜底策略模式

segment_phrase 规则 18:你有无限轮次可以调用每个工具,所以不要着急!
report_no_mask 规则 1:如果曾认为存在匹配目标,则永远不得报告无结果。

这些规则为 MLLM 提供了"安全网"——即使当前轮次失败,也有明确的恢复路径。

10. 提示词与代码的协同防御

值得注意的是,SAM3 Agent 的防御机制并非仅依赖提示词。代码层面同样实现了多重保障,与提示词形成互补:

防御目标 提示词层面 代码层面
重复 text_prompt 规则 8 明确禁止 USED_TEXT_PROMPTS 集合检测 + 拒绝执行
上下文溢出 规则限制每轮只调用一个工具 _prune_messages_for_next_round 裁剪历史
图片数量 场景定义限制最多两张图 assert count_images(messages) <= 2
无限循环 "不要着急"鼓励多次尝试 max_generations 硬性上限
格式错误 强制 <tool>...</tool> 格式 JSON 解析 + 异常处理

这种"提示词软约束 + 代码硬约束"的双层防御架构,确保了即使 MLLM 偶尔违反提示词规则,系统也不会进入不可恢复的异常状态。

11. 设计启示

SAM3 Agent 的提示词工程实践为多模态 Agent 系统的开发提供了以下启示:

  1. 规则数量与模型能力正相关:模型越强大,能够遵循的规则越多,系统行为越可控。SAM3 的 50+ 条规则在 Qwen-VL / Llama-4 级别的模型上能够被有效遵循。

  2. 示例比规则更有效:抽象规则容易被模型误解,具体示例能够精确传达意图。SAM3 提示词中的示例密度极高。

  3. 冗余是必要的:在长上下文中,关键规则需要多次重复以对抗模型的"遗忘"倾向。

  4. 格式控制是基础:如果模型的输出格式不可预测,下游的所有逻辑都无法正常工作。强制性的思维链结构和工具调用格式是系统稳定运行的前提。

  5. 提示词不是万能的:对于关键的安全约束(如防止无限循环、防止重复调用),必须在代码层面实现硬性保障,不能仅依赖提示词的"软约束"。


本文基于 SAM3 开源代码中的系统提示词分析撰写。提示词原文约 66,000 字符,本文仅摘录了具有代表性的规则片段。完整提示词请参考原始仓库中的 sam3/agent/system_prompts/ 目录。

参考资料

  • SAM 3 GitHub 仓库:https://github.com/facebookresearch/sam3
  • Prompt Engineering Guide:https://www.promptingguide.ai/
  • Chain-of-Thought Prompting:https://arxiv.org/abs/2201.11903
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐