一句话看懂:System Prompt 是给模型写的“最高优先级规章制度”——决定它是谁、按什么原则做事、输出长什么样。

1. 什么是 System Prompt?

在大多数 LLM 的 API 结构中,消息通常分为三种角色:SystemUserAssistant

  • User Prompt (用户提示词): 决定了 AI “现在要做什么”(例如:帮我写一个按钮组件)。

  • System Prompt (系统提示词): 决定了 AI “它是谁” 以及 “它做事的绝对原则”(例如:你是一个资深的 Flutter 架构师,你的代码必须严格遵循无状态优先原则,并给出完整的类型推断)。

核心隐喻:System Prompt 像操作系统的 Root 配置文件——全局约束行为、语气、边界与输出格式;用户怎么跑偏,都能拉回“轨道”。


2. System Prompt 的黄金结构(可复用模板)

一个工业级、高稳定性的 System Prompt,通常包含以下五个核心模块(你可以按需组合):

2.1 Role / Persona(角色设定)

不要只写“你是一个程序员”。赋予其具体的头衔、经验和性格,模型调用的内部权重会截然不同。

示例: “你是一位拥有 10 年经验的前端与移动端跨平台架构师,极度注重代码的可维护性、性能优化和 UI 细节。你的表达风格是极客、幽默、且一针见血。”

2.2 Context & Objective(背景与全局目标)

告诉模型它所处的业务环境,这能大幅减少它产生的“幻觉”和不切实际的建议。

示例: “我们正在维护一套核心的移动端 UI 组件库,该组件库需要在复杂的业务场景下保持极高的帧率和跨端一致性。你的目标是协助开发高质量的组件代码并提供技术决策。”

2.3 Rules & Constraints(核心法则与绝对禁忌)

这是防范大模型“自作聪明”的最重要防线。明确告诉它不该做什么(Negative Prompting)。

示例: > * 必须优先使用 StatelessWidget,仅在绝对必要时使用 StatefulWidget。

  • 严禁使用任何已经废弃 (Deprecated) 的 API。

  • 永远不要生成带有 // 在这里添加你的代码 这种敷衍占位符的半成品代码,必须输出可直接运行的完整代码。

2.4 Workflow / Methodology(工作流)

将你推崇的开发哲学(比如 MVP 极速交付原则、或者测试驱动开发)刻入它的基因。

示例: “在编写代码前,先思考架构;在实现功能时,遵循‘先让它跑起来 (Make it work),再让它变优雅 (Make it right)’的 MVP 迭代思路。”

2.5 Output Format(输出规范)

强制规范输出结构,方便解析或直接 Copy/Paste。

示例: “所有思考过程请放在 <thought> 标签内,核心代码必须包裹在 ```dart 中,并附带 JSDoc 风格的注释。”


3. 实战演练:一个高水准的开发 Agent 设定

假设你需要配置一个专门帮你写跨平台 UI 组件的 AI 助手,以下是一个结构化的 System Prompt 示例(使用了 XML 标签来区分模块,这是目前对大模型最友好的格式):

XML

<system_directive>
  <role>
    你是一个名为 BetterThanChatGPT 的顶级跨平台研发专家,精通前端及移动端工程化体系。
  </role>
  
  <context>
    我们正在重构一套高频使用的 UI 组件库,要求代码具备极高的复用性、可读性以及丝滑的动画表现。你需要作为我的结对编程伙伴,协助我快速完成功能迭代。
  </context>

  <core_principles>
    1. 极简主义:能用 10 行代码解决的问题,绝不用 20 行。
    2. 防御性编程:必须处理好 Null Safety 和边界状态。
    3. 性能至上:在涉及到复杂渲染或动画时,主动规避不必要的重绘 (Rebuild)。
  </core_principles>

  <interaction_style>
    - 不要说“好的”、“明白”等废话,直接给出技术分析或代码。
    - 遇到需求模糊时,不要盲目猜测,必须反问我以获取确切上下文。
    - 偶尔可以在代码注释里留点幽默的彩蛋,保持 Vibe。
  </interaction_style>
</system_directive>

4. 高阶避坑指南(最容易翻车的点)

  1. 避免逻辑冲突: 如果你在前面说“详细解释每一行代码”,后面又说“输出尽可能简短”,大模型就会精神分裂,导致输出质量崩塌。

  2. 长上下文的“注意力衰减”: 大模型通常存在“首尾效应”。把最最核心的绝对禁忌(比如“绝不输出占位符代码”),放在 System Prompt 的最前面或最后面,效果最好。

  3. 动态注入 (Dynamic Context): 在成熟的工程化应用中,System Prompt 不是写死的。通常会留出占位符,比如 今天是 {{current_date}} 或者 当前使用的框架版本是 {{framework_version}},在调用前动态替换。

5. 相关笔记