Cursor 的 AI 编程助手最近备受瞩目,原因显而易见——它的表现就像是一位真正有用的结对编程伙伴。对于那些曾为让 AI 遵守系统提示而苦苦挣扎的开发者来说,Cursor 的表现引发了强烈好奇心:它是如何做到如此顺畅协作的?
为了解决这个疑问,有技术人员尝试拦截 Cursor 与 API 之间的调用数据,令人惊讶的是——这个操作成功了。本文将逐步解析 Cursor 的提示词为何如此有效,并探讨其中可供借鉴的设计原则。
系统提示(System Prompt)
Cursor 的 AI 系统提示构成了整个助手行为的基石。正如那句老话所说,“每一条警告都源于过去有人做过某件傻事。” Cursor 的提示内容恰恰体现了这种经验积累。
完整的系统提示内容展示如下:
你是一名由 GPT-4.1 驱动的 AI 编程助手,运行在 Cursor 中。
你正在与 USER 一起进行结对编程,解决代码任务。每当 USER 发送消息时,我们可能会附带一些有关其当前状态的信息,比如打开了哪些文件、光标位置、最近查看的文件、编辑历史、linter 报错等。这些信息是否相关需由你判断。
你是一名代理(agent)——请持续工作直至完全解决用户的问题,然后再结束回复。请自主解决问题,尽可能完整地响应用户请求。
…
使用 markdown 格式书写代码时,使用反引号标注文件、目录、函数和类名,数学表达使用 和 。
使用工具时请遵循以下规则……
永远不要在用户面前提及工具名称,而是用自然语言表达行为……
…
以上提示充满细节与结构,从基础行为准则到具体操作边界,都为 AI 指明方向。
1. 明确赋予“角色身份”
Cursor 并没有模糊地指示 AI “请表现得有帮助”,而是赋予其一个具体、明确的身份:
“你是由 GPT-4.1 驱动的编程助手,运行在 Cursor 中。你正在与 USER 进行结对编程……你是一名代理。”
通过这些句子,AI 明确知道自己是专属编程助手,运行在特定 IDE 中,并拥有一定程度的自主权。这种设定使其能够更精准地筛选知识并采取合适的行为。
启示:为 AI 赋予明确的角色定位、运行环境与行为风格,有助于其更贴切地完成任务。
2. 巧用“XML 标签”进行结构划分
为有效管理超千词的提示内容,Cursor 使用类似 XML 的标签进行结构划分:
<communication>...</communication>
<tool_calling>...</tool_calling>
<making_code_changes>...</making_code_changes>
尽管 AI 并不真正解析 XML,这些标签仍起到了划分语义块的作用,帮助模型快速定位内容,防止关键指令被忽略。
同时,这种结构化标签也促使提示设计者思考结构逻辑,将相关内容归类。这样的提示更容易维护和扩展。
启示:对于内容复杂的提示,采用明确的结构标记(如 XML 标签、Markdown 标题、编号列表)有助于 AI 准确吸收信息。
3. 强调“自主行动”
Cursor 的提示频繁强调自主行为的重要性:
“你是一名代理——请持续工作直到完全解决问题。”
“请在不需要用户确认的情况下,立即执行计划。”
“倾向于自己寻找答案而非询问用户。”
这种多次重复的表述,目的就是赋予 AI 行动的主动权,使其像一名真实开发者那样解决问题。
启示:若希望 AI 像代理一样自动执行任务,就必须明确授予其权限,并提供足够工具以实现自主操作。
4. 明确沟通方式
Cursor 在如何表达 AI 行动上也做出明确限制。例如,在 <tool_calling>
段中指出:
“绝对不要向用户提及工具名称,而是使用自然语言表达行为。”
因此,AI 不会说“正在调用 read_file 工具”,而是说“正在读取该文件”,大大增强了人机交互的自然性。
启示:对 AI 该如何“说话”进行指导,尤其是在涉及内部机制时,能提升整体用户体验。
5. 设置实用的“约束条件”
尽管 AI 强大,也需要设定界限,例如:
“禁止生成极长哈希或非文本代码。”
“不要在同一文件上尝试修复 linter 错误超过三次。”
这些限制不仅能防止资源浪费,也可降低运行成本。
启示:通过系统提示设置明确的资源、行为与迭代限制,有助于维持 AI 行为的可控性与经济性。
6. 使用两个“User Prompt”
Cursor 的一大亮点是使用了两个用户消息:
第一个 User Prompt 包含定制化规则和项目背景,不需要用户在每次提问中重复;第二个则是用户的实际请求,并附带大量动态上下文。
其中,第一个提示例如:
<custom_instructions>
- 保证类型安全,避免使用 `any`
- 尽量保持文件在 200 行以内
- 敏感信息使用环境变量
- 后端修改需阅读 di.arch.mdc,前端则看 svelte5.mdc
</custom_instructions>
启示:通过“提示注入”方式,把用户个性化需求与上下文分离开来,可以有效防止提示注入问题。
7. 提供丰富上下文信息
第二个用户消息包含的是核心请求,例如修改某个 Svelte 文件的布局。但它还包含了:
- 来自 @链接的文档内容
- 当前正在编辑的文件片段
- 终端路径状态
- 当前文件夹下的结构内容
并明确告诉 AI:
“请将以上信息视为你‘已知’的信息,不要再声称无法上网。”
启示:上下文决定 AI 行为表现。越是明确、相关、动态的上下文信息注入,AI 就能越好地做出响应。
8. 设置合理的“数据访问限制”
Cursor 工具如 read_file
强调必须分段读取内容(200-250 行),避免一次性传输整个文件。
启示:面对大型数据源时,应设计工具机制以分批处理,避免系统负载与上下文溢出。
9. 保持状态一致性(Stateful Context)
当工具调用如 run_terminal_cmd
完成后,不仅返回执行结果,还更新“环境状态”:
“下次调用时,shell 目录已经在 /home/byte/code/ai-dashboard。”
这种状态传递让 AI 不必重新猜测上下文,大大提高后续操作准确性。
启示:让工具反馈环境状态,使得连续操作更智能连贯,提升复杂任务执行效率。
附录:数据来源揭秘
作者通过在 Cursor 设置中的“自定义 API 端点”功能,借助本地 ngrok 服务器,拦截到了完整的系统提示与 API 调用日志。
设置环境如下:
- Cursor 版本:0.49.6(更新于 2025-04-25)
- 模型:gpt-4.1
- 模式:Agent
- 系统:Arch Linux 6.14.3
- Shell:/usr/bin/fish
- 项目路径:/home/byte/code/ai-dashboard
结语
深入分析 Cursor 的系统提示,不难发现,它的强大并非魔法,而是精细提示工程的成果。
关键启示如下:
- 明确角色与行为定位
- 使用结构化提示组织复杂内容
- 赋予 AI 行动自主权
- 注入详细而即时的上下文信息
- 设计高效且受控的工具调用
- 引导 AI 以自然、友好的方式沟通
希望这些经验为 AI 开发者带来启发,帮助构建更智能、可靠的 AI 协作系统。