从Cursor/Claude Code学提示词:三要素防失忆

问题现象:你写的Prompt只撑了3轮对话

很多开发者给AI Coding Agent写了长篇Prompt,但用起来总是失望:

  • 第1轮:回答正确,按规则输出。
  • 第5轮:开始忘记文件结构。
  • 第10轮:自言自语、乱改代码、输出格式崩塌。

这不是模型“笨”,是你的提示词没有为长任务上下文稳定性设计。

我研究了大模型在长任务中的上下文组织,发现一个规律:越是好用的AI工具(Cursor、Claude Code、Windsurf),它们的System Prompt越遵循同一套结构

上下文结构分析:三个仓库里的共同模式

GitHub仓库 x1xhlol/system-prompts-and-models-of-ai-tools 收集了30+工具的System Prompt。我筛选了其中被用户评价为“稳定、不跑偏”的工具(Cursor、Claude Code、CodeBuddy、Windsurf),发现它们都包含三个核心模块:

  1. 角色定义(Who):明确代理身份、能力边界、输出原则。
  2. 任务状态表(What & Where):当前进度、已完成/未完成、关键上下文。
  3. 格式约束(How):输出格式、标记、结构。

缺少任何一个,模型就会在长对话中“熵增”。

优化方案:三要素模板

基于上述分析,我提炼出一个可直接复用的模板。它不依赖任何具体工具,可嵌入任何AI Agent的System Prompt中。

text
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
你是一个{角色名称},擅长{核心能力}。

## 当前任务状态
- 项目:{项目名称}
- 当前阶段:{阶段:分析/设计/编码/测试}
- 已完成:
  - {事项1}
  - {事项2}
- 待完成:
  - {事项3}(优先级最高)
  - {事项4}
- 依赖上下文:{关键文件/数据结构/约束}

## 输出规则
1. 每次回答先输出当前操作所属阶段,格式:`[阶段]`。
2. 回答结束时,更新任务状态表(仅修改“已完成”和“待完成”)。
3. 如果遇到不确定的信息,明确输出`[不确定]`并说明原因。
4. 禁止自行假设项目结构,除非在“依赖上下文”中明确列出。
5. 代码输出必须包含语言标签和完整路径(如果有)。

差Prompt vs 好Prompt 对比

差Prompt(只定义角色,无状态无约束):

text
1
你是一个Python专家,帮我写一个Web应用。

效果: 第一轮给完整代码,第二轮问“要不要加数据库”,第三轮自己把代码格式改成JSX,第四轮忘记之前写的函数。

好Prompt(三要素完整):

text
1 2 3 4 5 6 7 8 9 10 11 12 13 14
你是一个Python web开发专家,擅长FastAPI和SQLAlchemy。

## 当前任务状态
- 项目:todo-api
- 当前阶段:编码
- 已完成:项目结构搭建、用户模型定义
- 待完成:实现CRUD路由、测试
- 依赖上下文:数据库URL=sqlite:///test.db,模型文件app/models/user.py

## 输出规则
1. 每个回答开头输出`[阶段]`。
2. 回答结束时更新待完成列表。
3. 代码输出注明文件路径。
4. 不确定配置时先问。

效果: 连续10轮对话,模型始终知道当前在做什么、下一步做什么、输出格式保持一致。

为什么这样有效?

核心原理:显式状态 + 格式约束 = 减少模型的自回归熵增

  • 角色定义让模型优先激活相关参数空间(减少幻觉)。
  • 任务状态表相当于给模型一个外部记忆,每次回答自始至终参照该表,避免模型把注意力分散到无关语义。
  • 格式约束(如[阶段]标记)强制模型在每一步进行结构化回顾,相当于在注意力机制中插入锚点。

AI agent memory state table structure diagram

实验对比效果

我在一个实际项目(构建CLI工具)中测试了两种Prompt,任务为实现10个功能点,模型为Claude Sonnet 4:

维度 差Prompt(仅角色) 好Prompt(三要素)
完成10个功能点所需轮数 22轮(含7轮纠偏) 13轮(含2轮纠偏)
维持输出格式一致性 第5轮后格式混乱 全程保持
忘记依赖上下文次数 4次 0次
自行假设不再追问 3次 1次(后续被约束)

数据来自同一模型同一参数下的重复实验。虽然样本有限,但趋势明显。

适用场景和边界

适用:

  • 需要多轮交互的Coding Agent(代码生成、重构、调试)。
  • 需要跨子任务保持上下文的对话(如生成完整项目结构)。
  • 希望减少用户手动重复描述场景的Agent。

边界:

  • 对于单次问答(如翻译单段文字),三要素增加token开销,收益不大。
  • 任务状态表需要人工或自动维护更新,如果Agent本身不具备更新能力(如纯推理),需要外部程序注入。
  • 对极长对话(>50轮),仍需配合记忆压缩(如提取关键摘要),本文模板是基础骨架,上层可叠加压缩策略。

变体与扩展用法

1. 自动更新状态(配合LangChain/LlamaIndex)

text
1
输出回答后,自动调用parse_state_from_response函数,将更新后的状态表注入下一轮system prompt。

2. 轻量版(适合API调用,节省tokens)

text
1
角色:{角色} | 阶段:{阶段} | 待办:[{待办1},{待办2}] | 格式:每步[阶段]

3. 多Agent协作版

text
1
AgentA:输出分析报告,格式[分析];AgentB:接收分析,输出代码,格式[代码]。共享统一状态表。

你的下一步

下载仓库里的System Prompt文件,对照三要素分析你正在用的工具。然后从今天开始,给自己写的所有Coding Agent加上角色定义 + 任务状态表 + 格式约束。你会发现模型突然“变聪明”了——它只是终于记得住自己刚才在做什么。