Skip to content

引言

2023 年中,一个独立开发者做了一件令社区震惊的事:他用一个 3000 字的 system prompt 构建了一个编程助手,在很多场景下比 GitHub Copilot 更好用。

这个 system prompt 包含了详细的编码规范、错误处理模式、代码风格约束、禁止事项,甚至还有「如何组织代码」的具体指导。模型就像一个读过完整员工手册的新员工——它知道公司的规矩,知道什么该做什么不该做。

这个故事揭示了一个核心洞察:system prompt 是你控制模型行为最强大的工具。它是整个上下文工程的基石。


System Prompt 是什么?

三种消息角色回顾

对话结构:

  system 消息    → 「你是一个专业的翻译助手,只输出翻译结果,不加任何解释。」
  user 消息      → 「Hello World」
  assistant 消息 → 「你好世界」

类比:
  system    = 员工手册(公司规章制度)
  user      = 客户的提问
  assistant = 员工的回答

System prompt 的特殊之处:

特性说明
位置永远在对话的最开头
优先级高于 user 消息中的指令
不可见通常不展示给最终用户
持久在整个对话生命周期中有效
成本每次调用都会发送,占 token 预算

为什么 System Prompt 如此重要?

没有 system prompt:
  用户:帮我写一段代码
  模型:(可能输出 Python、JavaScript、Java...不确定)
       (可能带注释、可能不带...不确定)
       (可能很长、可能很短...不确定)

有 system prompt:
  System: "你是 Python 后端开发专家。只输出 Python 代码。
          使用 type hints。每个函数写 docstring。
          代码简洁,不超过 50 行。"
  用户:帮我写一段代码
  模型:(确定输出 Python)
       (确定带 type hints 和 docstring)
       (确定不超过 50 行)

System Prompt 的设计模式

1. 角色设定

python
# 基础角色
{"role": "system", "content": "你是一个有帮助的助手。"}

# 专业角色
{"role": "system", "content": "你是一位有 20 年经验的心内科医生,擅长用通俗语言解释医学知识。"}

# 带约束的角色
{"role": "system", "content": "你是一个严格的事实核查员。只基于已知事实回答。
对于不确定的内容,明确说「我不确定」而不是猜测。"}

2. 输出格式控制

python
# JSON 输出
{"role": "system", "content": """你是一个数据分析助手。
始终以 JSON 格式输出,schema 如下:
{
  "analysis": "分析内容",
  "confidence": 0.0-1.0,
  "recommendation": "建议"
}
不要输出 JSON 以外的任何内容。"""}

# Markdown 输出
{"role": "system", "content": "用 Markdown 格式输出。标题用 ##,代码用代码块,列表用 - 符号。"}

# 结构化分段
{"role": "system", "content": "按以下结构回答:1. 摘要(一句话)2. 详细分析 3. 建议"}

3. 约束与禁止

python
# 禁止事项(比正向指令更有效)
{"role": "system", "content": """你是一个翻译助手。
规则:
- 只输出翻译结果
- 不要添加任何解释或注释
- 不要说「以下是翻译」之类的话
- 保留原文的格式(段落、列表等)
- 遇到无法翻译的内容,原样保留"""}

# 安全约束
{"role": "system", "content": """你是一个客服助手。
- 不要讨论竞争对手的产品
- 不要承诺具体的价格或折扣
- 涉及退款问题,引导用户联系人工客服
- 不要透露公司内部信息"""}

4. 思维链引导

python
{"role": "system", "content": """你是一个数学问题解答者。
回答前,先在 <thinking> 标签中进行推理:
1. 理解问题
2. 列出已知条件
3. 选择方法
4. 逐步计算
5. 验证答案

然后在 <answer> 标签中给出最终答案。"""}

好的 vs 坏的 System Prompt

反面案例

python
# 太模糊
"你是一个助手。"                           # 没有指导意义

# 太长太杂
"你是一个助手,你要...(省略 5000 字)..."  # 模型会忽略后面的内容

# 矛盾指令
"简洁地回答。给出详细完整的解释。"           # 模型该听哪个?

# 假设模型有人格
"请你开心一点,带着微笑回答问题"             # 模型没有情绪

正面案例

python
# 清晰、具体、有结构
{"role": "system", "content": """你是一个 Python 代码审查助手。

任务:审查用户提交的 Python 代码,找出潜在问题。

输出格式:
- 每个问题一行,格式:[严重程度] 位置:描述
- 严重程度:🔴 严重 / 🟡 警告 / 🔵 建议
- 最后给出总体评分(1-10)

关注点:
1. 安全漏洞(SQL 注入、XSS 等)
2. 性能问题
3. 代码风格(PEP 8)
4. 逻辑错误

不要修改代码,只指出问题。"""}

一个完整的生产级 System Prompt 示例

python
SYSTEM_PROMPT = """你是「智答」AI 客服助手,代表 TechCorp 公司。

## 身份
你是 TechCorp 的官方 AI 客服,帮助用户解决产品使用问题。

## 知识范围
- TechCorp 全线产品(S1-S5 系列)
- 官方文档和 FAQ
- 不了解:未发布的产品、内部定价策略

## 回答规则
1. 先确认用户的问题
2. 给出清晰的步骤式解答
3. 如有相关文档链接,附上链接
4. 不确定时说「我需要确认一下」,不要编造信息

## 禁止事项
- 不要讨论竞品
- 不要承诺具体退款金额
- 不要提供个人联系方式
- 不要讨论与 TechCorp 无关的话题

## 特殊处理
- 用户情绪激动时:先表示理解,再提供解决方案
- 涉及安全问题时:优先引导联系人工客服
- 超出能力范围时:提供人工客服转接方式"""

# 字数:约 200 中文字 ≈ 300-400 tokens
# 这是 system prompt 成本和效果的平衡点

System Prompt 的局限

System Prompt 能做到:
  ✓ 设定角色和行为框架
  ✓ 控制输出格式
  ✓ 设定禁止事项
  ✓ 引导思维过程
  ✓ 保持多轮对话的一致性

System Prompt 做不到:
  ✗ 保证 100% 遵守规则(模型可能「越狱」)
  ✗ 替代实时数据(它是静态文本)
  ✗ 解决长对话中的「遗忘」问题
  ✗ 保证输出格式永远合法(需要 Structured Outputs)

本节小结

概念要点
System Prompt对话开头的全局指令,类似员工手册
核心作用角色设定、格式控制、行为约束、思维引导
设计原则清晰具体、有结构、不矛盾、长度适中
成本考量每次调用都发送,控制在 300-500 token 为宜
局限性不能 100% 保证遵守,不能替代实时数据

思考题

  1. 如果你给模型设定的 system prompt 是「你是一个永远说真话的助手」,模型就一定会说真话吗?为什么?
  2. 为什么说 system prompt 是「上下文工程的基石」?它和后续课程要讲的 RAG、Tool Call 有什么关系?
  3. 设计一个 system prompt,让模型扮演一个「只会用比喻来解释概念」的老师。测试一下它有效吗?