提示词的基本结构(Prompt Structure)
提示词由角色、指令、上下文和输出格式四部分组成,理解结构才能写出可控的提示词
通过角色定义、行为规则和安全护栏,让 AI 在每次对话中保持一致行为的设计方法
内容摘要
System Prompt(系统提示词)是在对话开始前注入给模型的一段"背景指令",用来告诉模型"你是谁、该做什么、不该做什么"。它和用户消息不同——用户消息每轮都在变,而系统提示词在整个对话过程中持续有效,相当于给模型立了一套"行为准则"。
System Prompt(系统提示词)是在对话开始前注入给模型的一段"背景指令",用来告诉模型"你是谁、该做什么、不该做什么"。它和用户消息不同——用户消息每轮都在变,而系统提示词在整个对话过程中持续有效,相当于给模型立了一套"行为准则"。
为什么需要它?因为大语言模型本身没有固定身份。每次对话对模型来说都是全新的——它不知道自己该扮演客服还是程序员,不知道该用什么格式回复,也不知道哪些话题不能碰。没有系统提示词的模型就像一个什么都会但没有岗位职责的员工:能力很强,但输出不可预测。系统提示词就是那份"岗位说明书",让模型在每次对话中都表现出稳定、可控的行为。
在实际 API 调用中,系统提示词通过专门的 system 参数传递(而不是混在用户消息里),模型会将其视为最高优先级的指令来源。不过需要注意:系统提示词是"概率性约束"而非"硬性规则"——模型倾向于遵循,但不是 100% 保证,特别是面对精心设计的对抗性输入时。
一个完整的系统提示词通常由以下几个模块组成:
| 模块 | 作用 | 重要程度 |
|---|---|---|
| 角色定义(Role) | 定义模型的身份、专业领域和交互风格 | 核心 |
| 行为规则(Rules) | 规定模型处理任务的方式和优先级 | 核心 |
| 输出格式(Output Format) | 约定回复的结构,确保后端可解析 | 核心 |
| 安全护栏(Guardrails) | 划定禁区,指导模型拒绝不当请求 | 核心 |
| 背景信息(Context) | 提供业务知识、术语定义等领域信息 | 重要 |
| 兜底策略(Fallback) | 指定模型在信息不足或超出范围时的行为 | 重要 |
角色定义不是简单写一句"你是一个助手",而是要从三个维度描述清楚:
Anthropic 官方文档指出:即使只用一句话定义角色,也能显著改变模型的行为和语气。角色越具体,模型的回答越聚焦。
行为规则告诉模型在执行任务时应该遵循什么原则。有三种常见类型:
微软 Azure OpenAI 文档特别强调:避免写出互相矛盾的规则(如同时要求"简洁"和"详尽"),否则模型无所适从。
如果你的应用需要解析模型的输出(比如 Agent 系统需要解析 JSON 来调用工具),必须在系统提示词中明确格式要求。常见格式包括 JSON、Markdown、XML 等。
OpenAI 在 GPT-4.1 提示指南中指出:新一代模型对指令的遵循更加字面化(literally),格式要求写得越具体,输出越稳定。
安全护栏明确告诉模型什么不能做,以及遇到违规请求时如何反应。典型的护栏规则包括:
需要注意:仅靠系统提示词中的护栏是不够的,生产环境需要多层防护——输入过滤、系统提示词、输出检查三层配合使用。
告诉模型在信息不足或超出能力范围时该怎么办。微软 Azure 文档将其列为系统提示词设计清单的必备项。例如:
系统提示词的工作机制可以分为四步:
第 1 步:加载系统提示词。 API 调用时,系统提示词作为 system 角色的消息被优先加载,成为整个对话的"背景板"。
第 2 步:合并上下文。 系统提示词、对话历史、当前用户输入被拼接成一个完整的上下文,一起送入模型。系统提示词通常排在最前面,享有较高的注意力权重。
第 3 步:受约束的推理。 模型在生成回复时,会参考系统提示词中的角色、规则和格式要求来"引导"自己的输出方向。这不是硬性约束,而是概率层面的倾向——系统提示词让符合要求的 token 被选中的概率更高。
第 4 步:输出。 生成的回复返回给用户。在生产环境中,通常还会在输出端加一层校验(Output Guardrails),检查回复是否违反了系统提示词中的安全规则。
关键点:系统提示词的"约束力"来自模型在训练阶段被教会了"优先遵循 system 角色的指令"。但这种约束不是绝对的——精心设计的对抗性 prompt 仍然可能绕过它,这也是为什么需要多层防护。
图中的关键流转:系统提示词和用户消息合并后一起送入模型,模型在系统提示词的约束下生成输出。生产环境中通常还有一道输出检查环节——如果输出违反了安全规则,会被拦截或改写后再返回。
以下展示系统提示词在 API 调用中的实际传递方式。
OpenAI 格式:
# 基于 openai>=1.0.0 验证(截至 2026-03)
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{
"role": "system", # 系统提示词通过 system 角色传递
"content": """你是一个 Python 编程助手。
【规则】只回答 Python 相关问题,其他语言的问题请用户另找工具。
【格式】代码用 Markdown 代码块包裹,先给代码再给解释。
【护栏】不执行任何系统命令,不处理用户的个人数据。"""
},
{"role": "user", "content": "怎么把列表去重?"}
],
temperature=0.3
)
print(response.choices[0].message.content)
Anthropic(Claude)格式:
# 基于 anthropic>=0.30.0 验证(截至 2026-03)
import anthropic
client = anthropic.Anthropic()
message = client.messages.create(
model="claude-sonnet-4-5-20250514",
max_tokens=1024,
system="你是一个 Python 编程助手。只回答 Python 相关问题。", # system 是独立参数
messages=[
{"role": "user", "content": "怎么把列表去重?"}
]
)
print(message.content[0].text)
两个代码的核心差异:OpenAI 把系统提示词放在 messages 列表中作为 role: "system" 的消息;Anthropic 把系统提示词作为 system 独立参数传递。效果一样——都是让模型在回答前先"读"到这份背景指令。
| 概念 | 与系统提示词设计的区别 | 更适合关注的重点 |
|---|---|---|
| User Prompt(用户提示词) | 每轮对话都变化的具体任务指令,不是持久性约束 | 具体任务的描述和要求 |
| Prompt Engineering(提示词工程) | 更大的范畴,涵盖所有类型提示词的设计与优化 | 整体的提示词优化策略 |
| Context Engineering(上下文工程) | 关注如何管理送入模型的全部信息(包括但不限于系统提示词) | 多来源信息的选择、压缩和组织 |
| Fine-Tuning(微调) | 通过修改模型参数来永久改变行为,系统提示词只在推理时临时生效 | 任务固定、精度要求极高时的方案 |
核心区别:
| 常见误区 | 正确理解 |
|---|---|
| "系统提示词写得越详细越好" | 过长的系统提示词(超过 5000 字)会稀释指令效果。微软 Azure 文档明确指出:过长的系统消息会消耗上下文窗口,减少留给用户内容的空间。应该把核心规则写在系统提示词中,任务级指令放在用户消息里。 |
| "有了系统提示词就不需要其他安全措施了" | 系统提示词只是概率性约束。生产环境需要输入过滤(Input Guardrails)+ 系统提示词 + 输出检查(Output Guardrails)三层配合。研究显示 LLM 应用存在持续的提示词注入弱点,即使系统消息中包含了明确的安全护栏。 |
| "系统提示词对所有模型效果一样" | 不同模型对系统提示词的遵从度和敏感点不同。Anthropic 文档指出 Claude 4.5/4.6 对系统提示词的响应比之前的模型更强——原来需要用"CRITICAL: You MUST..."这种强调语气的指令,现在用普通语气就够了。 |
| "只要不告诉用户系统提示词的内容,就是安全的" | 安全护栏不能依赖"保密"。攻击者可以通过各种技巧尝试提取系统提示词内容。安全设计应该假定系统提示词可能被泄露,即使泄露了也不会导致严重后果。 |
参考答案:
核心区别在于作用范围和持久性。系统提示词在整个对话过程中持续有效,定义的是模型的"身份和行为准则";用户提示词是每轮变化的具体任务指令。把所有指令写在用户消息里的问题:(1) 每轮都要重复发送,浪费 token;(2) 用户消息中的指令优先级低于 system 角色,模型更容易忽视;(3) 难以维护——角色定义和任务指令混在一起,修改时容易遗漏。
参考答案:
这是典型的规则冲突——微软 Azure 文档将"互相矛盾的指令"列为系统提示词设计的首要陷阱。模型面对矛盾指令时行为不可预测:有时偏向详尽而超字数,有时为了控制字数而省略关键信息。解决方法:(1) 确定优先级,如"简洁优先,控制在 200 字以内";(2) 按场景拆分规则,如"简单问题简洁回答,复杂问题分步说明但每步不超过 100 字";(3) 用条件句替代绝对规则,如"除非用户要求详细展开,否则回复控制在 200 字以内"。
参考答案:
必须包含的安全护栏:(1) 明确声明"不提供医疗诊断和处方建议,仅提供健康科普信息";(2) 遇到紧急症状描述(如胸痛、呼吸困难)时,立即建议拨打急救电话;(3) 不收集或处理用户的具体病历、检查报告等隐私数据;(4) 任何建议都附带"请咨询专业医生"的免责声明。仅有系统提示词不够的原因:系统提示词是概率性约束,精心构造的输入可能绕过护栏诱导模型给出诊断建议。生产环境还需要:输入端的敏感词过滤、输出端的合规检查(检测是否包含具体药物或剂量建议)、以及人工审核抽检机制。
优先展示同分类且标签更接近的内容,方便继续串联学习。
提示词由角色、指令、上下文和输出格式四部分组成,理解结构才能写出可控的提示词
通过组合图像、文本等多种信息形式来引导多模态模型完成视觉理解与推理任务的提示技术
像管理代码一样管理提示词的版本、环境和发布,保证线上可追溯、可回滚