什么是好的提示词:从 Token 原理到开源实践
为什么大多数提示词指南只讲”是什么”不讲”为什么” #
网上充斥着”提示词技巧 100 条”之类的文章,列出各种模板和套路,却很少解释为什么这些技巧有效。结果就是:换一个模型、换一个任务,技巧就失灵了。
本文反过来,先从 LLM 的底层工作原理(Token 分词、注意力机制、上下文窗口)出发,推导出提示词设计的原则,再用 OpenAI GPT-5.5、Anthropic、Google 的开源实践验证这些原则。理解了”为什么”,你就能自己推导出”是什么”。
一个重要前提:随着模型能力提升(如 GPT-5.5),提示词的”最佳实践”正在变化——从”过程堆叠”转向”结果导向”。但底层原理不变,变的是模型对提示词的依赖程度。下文会标注哪些原则在新模型上需要调整。
消息角色:提示词的权限层级 #
Developer > User > Assistant #
OpenAI 在 Model Spec 中定义了消息角色的权限链(Chain of Command),这直接影响提示词的组织方式:
| 角色 | 权限 | 类比 | 内容 |
|---|---|---|---|
developer | 最高 | 函数定义 | 系统规则、业务逻辑、输出格式 |
user | 次之 | 函数参数 | 任务输入、配置数据 |
assistant | 最低 | 函数返回值 | 模型生成的回复 |
从 token 角度理解:developer 消息中的指令在注意力计算中享有更高权重——模型被训练为优先服从 developer 指令,即使 user 消息与之矛盾。这意味着:
1 | # 差:把规则和任务混在 user 消息里 |
分离 developer 和 user 消息不仅是 API 规范,更是利用模型训练时的注意力偏好——规则放在高权限区,模型遵循更稳定。
官方推荐的 Developer Message 结构 #
OpenAI 指南给出了 developer message 的标准段落顺序:
1 | # Identity |
为什么 Context 放末尾?因为上下文是每次请求变化的,放末尾便于 prompt caching(后文详述),同时不干扰前面指令区的注意力。
Token:模型看到的世界不是文字 #
LLM 不读字,它读 Token #
大语言模型处理的最小单位不是字符,也不是词,而是 Token。Token 由 BPE(Byte Pair Encoding)算法对文本切分得到:
1 | "提示词工程" → ["提示", "词", "工程"] # 中文,约 3 token |
关键特性:
| 现象 | 说明 | 对提示词的影响 |
|---|---|---|
| 常见词是单个 token | “the”、”is”、”你好” 各占 1 token | 常见表达更省 token、更稳定 |
| 生僻词被拆碎 | 罕见术语可能拆成 3-5 个子词 | 模型对生僻词理解更模糊 |
| 空格也是 token | “ hello” 和 “hello” 是不同的 token | 多余空格可能影响模式匹配 |
| 标点边界 | “你好。”和”你好” 是不同的 token 序列 | 标点影响模型对句子边界的感知 |
| 中英文混合成本高 | 中文一字约 1-2 token,英文一词约 1-3 token | 同样上下文窗口,中文能放更多内容 |
从 Token 角度理解提示词质量 #
一个 8192 token 的上下文窗口,不是 8192 个”信息单元”。如果提示词中充满冗余表述、模糊指代、无关上下文,有效信息密度很低,模型需要在大量噪声 token 中寻找关键信号。
好的提示词 = 高信息密度的 token 序列。
1 | # 差:低密度,大量 token 浪费在客套上 |
注意力机制:模型如何”阅读”你的提示词 #
自注意力的本质 #
Transformer 的核心是自注意力(Self-Attention):对于序列中的每个 token,模型计算它与所有其他 token 的关联强度(注意力分数),然后加权聚合信息。
1 | 注意力分数 = softmax(Q · K^T / √d_k) |
这意味着:
- 每个 token 都在和所有其他 token “对话”
- 距离近的 token 通常注意力更高(但非绝对)
- 重复出现的 token 会强化对应位置的注意力
- 关键词越独特,越容易获得高注意力权重
从注意力角度理解提示词原则 #
原则 1:关键信息放前面或后面,别埋在中间 #
研究表明,LLM 存在 “中间遗忘”(Lost in the Middle)现象:位于上下文中间位置的信息,注意力分数系统性偏低。
1 | # 差:关键要求埋在中间 |
原则 2:用分隔符划清注意力边界 #
分隔符(如 ###、---、XML 标签)在 token 层面创造了清晰的边界,帮助模型区分”指令区”和”数据区”,避免注意力跨区泄漏。
1 | # Anthropic 的 XML 标签法(Claude 推荐) |
为什么 XML 标签更好?因为 <document> 和 </document> 是明确的 token 序列,模型在训练数据中见过大量类似结构,注意力能精确匹配开闭标签。而 """ 在代码中常表示多行字符串,语义不如 XML 标签明确。
原则 3:重复关键词强化注意力信号 #
注意力机制中,重复出现的 token 会在多个位置产生注意力峰值,形成”注意力锚点”。
1 | # 差:每次换不同说法 |
上下文窗口:有限空间的分配艺术 #
上下文窗口是零和博弈 #
模型能处理的 token 总量是固定的(如 GPT-4o 128K、Claude Sonnet 200K)。每多一个 token 的提示词,就少一个 token 的生成空间,同时也稀释了已有 token 的注意力。
1 | 总窗口 = 系统提示词 + 用户输入 + 历史对话 + 模型输出 |
上下文分配策略 #
| 组成部分 | 建议占比 | 说明 |
|---|---|---|
| 系统提示词 | 5-15% | 角色、规则、输出格式 |
| 参考/示例 | 10-30% | Few-shot 示例、参考文档 |
| 用户输入 | 10-20% | 实际任务数据 |
| 模型输出预留 | 30-50% | 留足生成空间 |
| 缓冲 | 10% | 分词误差、意外长输出 |
Prompt Caching:复用 token 降低成本 #
OpenAI 支持 prompt caching:如果多次请求的前缀 token 相同,缓存命中后只需计算增量部分,降低成本和延迟。
从 token 角度理解:缓存以前缀精确匹配为基础。这意味着:
- 不变的内容放前面:Identity、Instructions、Examples 放 developer message 开头
- 变化的内容放后面:用户输入、动态 context 放末尾
- 一个字符的差异就会 break cache:前缀必须逐 token 一致
1 | # 差:动态内容在前,每次都 break cache |
Few-Shot 示例的 token 成本 #
每个 few-shot 示例都占用上下文窗口。示例越多,模型理解越好,但可用空间越少。
1 | # 0-shot:省 token,但模型可能误解格式 |
OpenAI 官方推荐用 XML 标签 + id 属性组织 Few-Shot 示例,便于模型精确匹配输入输出对:
1 | <product_review id="example-1"> |
id 属性让模型在注意力计算时能精确关联输入和输出对,避免示例之间的注意力串扰。
检索预算:搜索的停止规则 #
GPT-5.5 引入了检索预算(Retrieval Budget)概念——本质是搜索任务的停止条件,告诉模型”什么时候证据够了”。
1 | # 差:没有停止规则,模型可能反复搜索 |
从 token 角度看,检索预算的价值在于:避免搜索结果token 挤占上下文窗口。每次检索返回的内容都进入上下文,过多的检索结果会稀释注意力,反而降低回答质量。
Token 生成:为什么”思考过程”影响输出质量 #
自回归生成的本质 #
LLM 的生成是自回归的:每次只生成一个 token,然后将这个 token 加入序列,再预测下一个。这意味着:
- 已生成的 token 是后续 token 的上下文
- 中间推理 token 会影响最终答案的质量
- 早期的错误 token 会级联放大
Chain of Thought 为什么有效 #
1 | # 不带 CoT:直接生成答案,中间没有推理 token |
CoT 有效的本质是:推理过程中的每个 token 都成为后续 token 的注意力上下文,相当于把”一步到位”的难题拆成了多步简单的 token 预测。
温度与采样:确定性 vs 创造性 #
| 温度 | 行为 | 适用场景 | 提示词策略 |
|---|---|---|---|
| 0-0.3 | 高确定性,倾向最高概率 token | 代码、数学、事实问答 | 严格格式,明确约束 |
| 0.4-0.7 | 平衡 | 通用任务 | 适度示例,清晰指令 |
| 0.8-1.0 | 高随机性,探索低概率 token | 创意写作、头脑风暴 | 开放式,鼓励发散 |
低温时提示词的每个 token 都至关重要(模型严格遵循);高温时提示词更像”方向指引”(模型会自由发挥)。
Reasoning 模型 vs GPT 模型:不同的提示词策略 #
资深同事 vs 初级同事 #
OpenAI 官方用一个精妙的类比区分两类模型的提示词策略:
| 模型类型 | 类比 | 提示词策略 | 典型模型 |
|---|---|---|---|
| Reasoning 模型 | 资深同事 | 给目标,信任它自己规划细节 | o3、o4-mini |
| GPT 模型 | 初级同事 | 给明确指令,逐步指导 | GPT-5.5、GPT-4o |
这与前述的 CoT vs Outcome-first 对应:
- Reasoning 模型:内置 CoT(内部生成推理 token),提示词只需高层目标。过度指定过程会干扰模型自身的推理链。
- GPT 模型:需要外部 CoT 辅助(提示词中铺设推理步骤),但也随版本提升逐渐向 outcome-first 靠拢。
选择模型的决策树 #
1 | 任务复杂度高? |
模型版本化:生产环境的必修课 #
OpenAI 强烈建议生产环境固定模型快照(如 gpt-5.5-2026-06-14 而非 gpt-5.5),因为同一模型的不同快照可能产生不同输出。
提示词也应版本化管理:
- 提示词存在代码中(而非平台保存的可复用对象)
- 用类型化函数参数注入动态值
- 配套测试和评估套件
- 通过部署系统灰度发布
结果导向 vs 过程堆叠:新一代模型的范式转变 #
CoT 不是万能的——推理效率的提升 #
CoT 在早期模型(GPT-3.5、GPT-4)上效果显著,因为这些模型的推理能力较弱,需要人类在提示词中铺设推理步骤。但随着模型推理能力的提升(GPT-5.5、Claude Sonnet 4),过度指定过程反而成了负担。
OpenAI GPT-5.5 官方指南明确指出:
Shorter, outcome-first prompts usually work better than process-heavy prompt stacks.
原因从 token 角度理解:
| 过程堆叠的问题 | Token 层面的影响 |
|---|---|
| 过多步骤指令 | 占用上下文窗口,挤压生成空间 |
| 过度约束搜索路径 | 缩小模型的概率搜索空间,导致机械输出 |
| 遗留旧提示词的冗余 | 噪声 token 稀释注意力,干扰模型自身推理 |
描述终点,而非每一步 #
1 | # 差:过程堆叠,逐步指挥 |
这不是说不需要 CoT——模型内部的推理仍然需要。而是说不需要在提示词中替模型规划推理路径,让模型自己选择最高效的解决方案。
何时该用 CoT,何时该用 Outcome-first #
| 场景 | 推荐策略 | 原因 |
|---|---|---|
| 早期模型(GPT-3.5/4) | CoT + 过程指导 | 模型推理弱,需人工铺设路径 |
| 新一代模型(GPT-5.5+) | Outcome-first | 模型推理强,过度约束反而降质 |
| 数学/逻辑题 | CoT 仍有效 | 明确的推理步骤有助正确性 |
| 开放式任务 | Outcome-first | 路径不唯一,约束路径会限制创造力 |
| Agent 工作流 | Outcome + 停止条件 | 需要目标 + 何时停止的规则 |
开源实践验证 #
OpenAI GPT-5.5:结果导向 + 结构化模板 #
GPT-5.5 官方提示词指南代表了最新范式,核心原则:
| 原则 | 底层原理 | 实践方法 |
|---|---|---|
| 结果优先 | 推理效率提升,过程约束变噪声 | 描述目标 + 成功标准,不指定路径 |
| 消息角色分层 | 注意力权限链 developer > user | 规则放 developer,任务放 user |
| Markdown + XML 格式化 | 注意力边界 + 语义标记 | Markdown 标记结构层级,XML 标记内容边界 |
| 停止条件 | 上下文窗口零和博弈 | 明确何时重试、回退、放弃、停止 |
| 检索预算 | 搜索结果 token 挤占窗口 | 定义”证据够了”的判断规则 |
| 人格分离 | 注意力分区 | personality(声音)与 collaboration style(工作方式)分开 |
| Preamble | 自回归生成的首 token 延迟 | 多步任务先输出简短状态更新 |
| 验证循环 | 自回归错误的级联效应 | 要求模型用工具检查输出 |
| Prompt Caching | 前缀 token 复用降低成本 | 静态内容前置,动态内容后置 |
Markdown 与 XML 的分工:
1 | # Identity ← Markdown 标题标记结构层级 |
Markdown 负责结构层级(标题、列表),XML 负责内容边界(开闭标签包裹数据)。两者互补,不混用。
GPT-5.5 推荐的结构化提示词模板:
1 | Role: [1-2 句定义模型的功能、上下文和职责] |
关键洞察:避免滥用绝对规则。 旧提示词常用 ALWAYS、NEVER、must 来控制行为。GPT-5.5 指南建议:这些词只用于真正的不可变规则(安全规则、必需输出字段),而非判断类决策(何时搜索、何时询问、何时使用工具)。判断类决策应该用决策规则替代绝对规则。
Agent 场景的特殊实践:
GPT-5.5 在 agentic 任务中有三个额外要求:
- 规划与持久性:要求模型分解子任务,每次工具调用后反思是否完整解决
- Preamble:调用工具前简短说明原因(但仅在关键步骤,非每步都说)
- TODO 跟踪:用 TODO 列表或 rubric 跟踪进度,避免遗漏步骤
1 | 你是一个 agent,持续工作直到用户问题完全解决。 |
Anthropic:结构化标签 + 角色预填 #
Anthropic(Claude)的实践强调两点:
1. XML 标签结构化
1 | <role>你是代码审查专家</role> |
为什么有效:XML 标签在 token 层面创造了明确的语义边界,模型的注意力能精确定位到每个区块,不会把”角色”和”指令”混为一谈。
2. 预填充回答前缀
1 | Human: 请用 JSON 格式输出分析结果。 |
让模型从 { 开始续写,因为第一个 token 已被固定为 {,后续 token 的概率分布被强烈约束在 JSON 格式内。
Google:CRISPE 框架 #
Google 提出的 CRISPE 框架,本质是对提示词的 token 分区设计:
| 字母 | 含义 | Token 分区 |
|---|---|---|
| CR | Capacity & Role(角色) | 前置 token,设定模型行为模式 |
| I | Insight(洞察) | 背景上下文,提供注意力素材 |
| S | Statement(指令) | 核心任务,最高注意力权重区 |
| P | Personality(个性) | 输出风格约束 |
| E | Experiment(实验) | 迭代优化 |
提示词反模式 #
反模式 1:过度礼貌 #
1 | # 差:浪费 token,分散注意力 |
反模式 2:负面指令过载 #
1 | # 差:大量"不要"指令,注意力分散在禁止项上 |
注意力机制对”不做什么”的处理弱于”做什么”——因为”不要 X”中的 X 本身会被注意力捕获,反而激活了相关概念。
反模式 3:模糊的格式要求 #
1 | # 差:"格式好看一点" |
反模式 4:上下文过载 #
1 | # 差:把整个项目代码塞进上下文,信号被噪声淹没 |
反模式 5:过程堆叠(GPT-5.5 特别警告) #
1 | # 差:逐步指挥,缩小模型搜索空间 |
反模式 6:滥用绝对规则 #
1 | # 差:ALWAYS/NEVER/must 泛滥,判断类决策被僵化 |
提示词评估清单 #
基于上述原理,一份好的提示词应通过以下检查:
- 信息密度:是否每个句子都在传递有效信息?有无客套话和冗余?
- 消息角色分层:规则是否放在 developer 消息中?任务数据是否放在 user 消息中?
- 注意力聚焦:关键要求是否在开头和结尾?是否被埋在中间?
- 边界清晰:是否用 Markdown 标记结构层级、XML 标签标记内容边界?
- 关键词一致:同一概念是否始终用同一个词?避免同义词分散注意力?
- 正面表述:是否用”做什么”替代了”不做什么”?
- 上下文精简:是否只包含必要的信息?有无过载?
- 格式明确:输出格式是否用具体示例或模板定义?
- Few-Shot 必要性:0-shot 能否完成?1-shot 是否足够?避免过度示例?
- 模型类型匹配:Reasoning 模型用 outcome-first?GPT 模型是否需要更多约束?
- CoT vs Outcome-first:模型是否足够强到用 outcome-first?还是需要 CoT 辅助?
- 停止条件:是否定义了何时重试、回退、放弃、询问或停止?
- 检索预算:搜索任务是否有明确的”证据够了”规则?
- 绝对规则克制:ALWAYS/NEVER/must 是否只用于真正的不变量?判断类决策是否改用决策规则?
- Prompt Caching:静态内容是否前置?动态内容是否后置?前缀是否可缓存?
- 版本固定:生产环境是否固定模型快照?提示词是否版本化管理?
- Token 预算:提示词长度是否在上下文窗口的合理占比内?
总结 #
好的提示词不是”技巧堆砌”,而是对 LLM 工作原理的理解应用:
| 底层原理 | 推导出的原则 | 对应实践 |
|---|---|---|
| Token 分词 | 信息密度最大化 | 删除冗余,精炼表达 |
| 消息角色权限链 | 规则高权限、数据低权限 | 规则放 developer,任务放 user |
| 注意力机制 | 聚焦关键信息 | 首尾放置重点,Markdown+XML 划界 |
| 上下文窗口 | 合理分配空间 | 精简上下文,控制 Few-Shot,设检索预算 |
| Prompt Caching | 前缀复用降成本 | 静态前置,动态后置 |
| 自回归生成 | 利用中间 token | CoT 让模型”先想后答”(早期模型);Outcome-first 让模型自选路径(新模型) |
| 温度采样 | 匹配任务确定性 | 严格任务用低温,创意任务用高温 |
| 模型类型差异 | Reasoning 自主推理,GPT 需引导 | 资深同事给目标,初级同事给步骤 |
| 推理效率提升 | 结果导向优于过程堆叠 | 描述终点 + 成功标准 + 停止条件,不指定每一步 |
理解这些原理后,面对任何新模型、新任务,你都能自己推导出合适的提示词策略,而不是死记硬背别人的模板。
参考资料 #
- OpenAI Prompt Engineering Guide — 消息角色、Markdown+XML 格式化、Few-Shot、模型选择
- OpenAI GPT-5.5 Prompting Guide — 结果导向、停止条件、检索预算、人格分离
- OpenAI Model Spec: Chain of Command — developer > user > assistant 权限链
- Prompt Engineering Guide (DAIR.AI) — CoT、Few-Shot、ReAct 等技术全集
- Anthropic Prompt Engineering — XML 标签结构化、前缀预填
- Wei et al. (2022) Chain-of-Thought Prompting Elicits Reasoning in Large Language Models — CoT 原始论文
- Liu et al. (2023) Lost in the Middle: How Language Models Use Long Contexts — 中间遗忘现象