Cursor 对话提示词机制,以及 Cadau 要对齐的地方
长对话不容易答非所问,靠的是本轮用户那句话单独当任务,主题和历史只当背景。说明 Cadau 已按同一原则改了哪些地方。
来源 docs/技术博客/Cursor对话提示词机制与Cadau对照.md
表述:给开发和运维。说明 Cursor 长对话为什么不容易被前文和关键词带偏,Cadau 当前差在哪,以及已按同一原则做了哪些改动。不粘贴 Cursor 的系统提示原文。
相关:[对话历史与上下文压缩机制解析.md](/blog/chat-compression)、[对话主题的操作.md](/blog/chat-topic-operations)、[docs/core-mechanisms/对话主题与复盘.md](/docs/mech-topic-review)
日期:2026-09-04
结论(先读这段)
Cursor 的长对话几乎不「答非所问」,不是因为模型更好记,而是因为 提示词分层:本轮用户那一句话是任务,更早的对话、规则、检索材料都是背景。Cadau 过去把主题、滚动摘要、操作规则说明都写进系统提示,而且主题要求「围绕这个目的回答」,模型会把前文里的词(例如「规则」)当成仍要执行的口令。
要对齐 Cursor,关键不是再加一段「请认真听用户说话」,而是:
- 本轮用户消息单独加框,明确「只答这一条」;
- 主题和历史摘要降成背景,不再当站着的指令;
- 能力说明按需激活:只有本轮真的在改配置,才走「改操作规则 / 改技能」那套;
- 检索只看本轮问句,不要拿整段历史当检索词。
1. Cursor 实际怎么组一轮提示词
下面根据 Cursor 产品行为(Agent / Rules / Skills、长对话压缩)和对话结构归纳,不复制其系统提示原文。
1.1 不是「把历史和规则拌成一锅」
每一轮发给模型的材料是分层的,大致如下:
| 层 | 放什么 | 权重 |
|---|---|---|
| 身份与沟通 | 你是谁、怎么回用户、先答本轮问题 | 稳定、短、每轮都在 |
| 始终生效的规则 | 安全、仓库约定里标成 always 的那一小撮 | 每轮都在,体积受控 |
| 可按需取的规则 / 技能 | 只给「何时用」的目录;正文要匹配到本轮任务才读进来 | 不匹配就不占注意力 |
| 当前工作快照 | 打开的文件、git 状态、最近看过的文件 | 描述「现在」,不是「曾经说过的所有词」 |
| 对话历史 | 更早的用户 / 助手消息;太长则压缩成任务状态摘要 | 背景 |
| 本轮用户问题 | 单独包一层(可见的任务信封) | 本轮唯一主任务 |
用户能感到「Cursor 不会被带偏」,主要是最后两层分得清:历史在,但 当前问题有明确边界。
1.2 本轮优先,而不是「整条对话的主题优先」
Cursor 没有一份每轮都写进系统提示、还要求「围绕这个目的回答」的对话主题。连续性来自:
- 最近几轮原文还在(近因:模型天然更听最后一条);
- 需要时再去搜过去的对话或代码,而不是把旧话题写成站着的军令;
- 沟通约定是:先回答用户这一次实际问的事,不要默认用户还在办三十分钟前那件事。
所以用户中途问一句不相干的,助手会答这一句,而不会先盘问「要不要换主题」。
1.3 规则和技能:目录,不是全文倾倒
Cursor 把仓库规则分成:
- 始终带上(always):真正每轮都需要的短约定;
- 按需(agent requestable):只在当前打开的文件 / 当前任务对得上时才注入全文。
技能同样:先列出名称和适用场景(description),模型或编排层判断「本轮用不用得上」,再用工具去读 SKILL.md 正文。不会因为历史里出现过「规则」就把「如何改 AGENTS.md」整章灌进这一轮。
这和「关键词命中就把整份操作表塞进系统提示」是相反的策略。
1.4 压缩:保留任务状态,丢掉已结束的支线
上下文快满时,Cursor 一类产品会做 compaction / self-summary:
- 保留:当前目标、已做决定、未完成事项、关键数字和文件;
- 丢掉或一行带过:已经做完的支线、顺口提到的词;
- 摘要放在 对话消息里当交接,最新用户话仍在最后,而不是把摘要提升成与人格同级的系统指令。
工具循环里的检查点摘要也是同一思路:写清「用户主目标 + 未完成」,避免模型去重复已完成步骤。
1.5 检索只服务本轮
代码搜索、文档、技能正文,查询词来自 这一次要办的事(当前用户话 + 当前打开的文件),不是把整条对话拼成检索串。历史里的「规则」不会自动变成「去搜操作规则文档」。
1.6 一张对照图
flowchart TD
subgraph cursor ["Cursor 一轮"]
C1["短而稳的身份与沟通"]
C2["始终规则小集合"]
C3["技能/规则目录:按本轮决定是否读全文"]
C4["当前工作快照"]
C5["历史或任务状态摘要:背景"]
C6["本轮用户问题:单独加框"]
C1 --> C6
C5 --> C6
end
subgraph cadauOld ["Cadau 改之前"]
D1["很长的系统提示:人格 + 操作规则全文 + 训练配置 + 工具说明书"]
D2["主题:围绕这个目的回答"]
D3["滚动摘要也在系统提示里"]
D4["最近原文 + 本轮用户话:同等角色"]
D1 --> D4
D2 --> D4
D3 --> D4
end2. Cadau 为什么会「聊着聊着扯到操作规则」
用户例子:对话里出现过「规则」,后边问别的,助手却去改 操作规则。Cursor 几乎不会这样。对应到实现,是几股力叠在一起:
| 来源 | 发生了什么 | 模型怎么理解 |
|---|---|---|
| 主题进系统提示 | 「围绕这个目的回答;换题先问」 | 旧目的变成军令;新问题要先过主题这关 |
| 摘要进系统提示 | 「历史对话摘要」和人格同一层 | 摘要里的词 = 仍要执行的约束 |
| 【操作规则】全文每轮都在 | AGENTS.md + 「训练智能体配置」大段 | 「规则」二字和改配置说明书强绑定 |
| 本轮用户话没有信封 | 历史和当前话都是普通 user 消息 | 注意力被更长、更早、关键词更密的段落抢走 |
| 关键词注入 | 插件目录、技能匹配、知识库按 本轮问句 检索(这一点本来是对的) | 若本轮只是随口带了「规则」,仍可能展开配置类材料 |
滚动压缩本身(较早轮次进摘要、最近轮次留原文)是对的,见压缩机制文。问题不在「有没有摘要」,而在 摘要和主题被当成指令,而不是背景。
帮助智能体还有另一条:系统提示里「代为操作」清单写了「改操作规则」。这在用户 本轮明确要改 时是对的;若模型把历史里的「规则」当成这一轮的办事请求,就会误走 ChatOps。
3. 对齐 Cursor 之后,Cadau 怎么组一轮
实现入口:
- 本轮优先与用户消息加框:
backend/internal/api/handlers/chat_turn_focus.go - 系统提示:
chat.go里帮助 / 工作智能体提示 - 主题:
chat_topic_review.go的sessionTopicBlock - 滚动摘要:
chat_context_roll.go的合并提示与摘要标题 - 本轮材料分类:
chat_prompt_packs.go、chat_prompt_pack_select.go
3.1 本轮优先(系统提示里一段短约定)
工作智能体和帮助智能体都带上:只答最新一条;不要因为出现过「规则」「技能」「工作区」就去改配置。短收口(确认、继续、生成html格式)仍按当前主题把问数/报表办完,不要当成全新题目、不要抄历史附图上的数字。
「训练智能体配置」补一句:只有 本轮明确要求 改人格 / 操作规则 / 技能时才用这一段。
3.2 主题改成背景
仍每轮带上主题(列表和顶栏还要给人看,模型也需要知道这条对话最初在做什么)。但不再写「围绕这个目的回答」。
- 用户问新事:直接答新事,不必先问要不要改主题;
- 改写入的主题 仍要用户明确说要改(或点头),这和产品规格「换题须用户点头」一致——点头的是 改主题字段,不是 拒绝回答新问题;
- 主题里的词不当口令(例如主题写过「规则」≠ 本轮去改操作规则)。
3.3 摘要改成背景,合并时丢掉已结束支线
摘要标题标明「背景,不是本轮口令」。合并提示要求:已结束或只是顺口提到的话题一行带过,不要写成必须继续执行;不要堆关键词。
工具循环检查点摘要本来就保留「用户主目标 + 未完成」,与 Cursor self-summary 同类,保持不变。
3.4 本轮用户消息加框
只给 这一轮最后一条用户话 加上「本轮用户消息」信封。更早的原文不改,避免历史气泡在模型眼里变成一串口令。
检索、ChatOps、意图判断仍用用户 原始句子,不加框,避免「【本轮用户消息】」干扰关键词。
3.5 本轮材料:目录始终在,正文跟当前工作集走
对照 Cursor:工具始终可调用(工作区开通了就在工具列表里);长说明书和检索结果是「当前打开的文件」,不是「这一句话的关键词」。Cadau 对应成三层:
- 能力目录(短、每轮都在):告诉模型有数据连接 / 写文件 / 办公文档等工具,未展开长说明 ≠ 没有工具。
- 当前工作集(跨轮保持):问数、报表、办公文档这类任务材料记在这条对话上。用户说「生成html格式 / 确认 / 继续」时接着用,不按四个字重新装箱。换了实质新任务(例如改去查某个人入职日期)才换掉。改操作规则这类配置包不进工作集,避免旧词把下一轮绑去改配置。
- 本轮增量:关键词 + 分类模型只负责新打开什么;再与工作集合并。
上下文快满时仍走滚动摘要(压缩的是对话原文,不是卸掉工具)。摘要须保留未完成的问数/报表;工作集本身不因压缩而清空。
例如先说「各部门人数月报」,再说「生成html格式」:工作集仍是 file + datasource,匹配预定义查询用的是工作集里的问数原话,而不是把截图数字化。
4. 刻意没有照搬的部分
| Cursor 做法 | Cadau 为何先不整锅搬 |
|---|---|
| 绝大多数规则改为 requestable | 操作规则(AGENTS.md)仍每轮需要;办公文档/脚本/规范库/训练配置等说明书已按本轮分类注入 |
| 技能只给目录、用时再读全文 | 工作区技能仍按本轮问句匹配;平台内置技能全文改为按需包,不再泛词命中就整篇注入 |
| 不用对话主题 | 主题对用户可见、可改,是产品能力;改的是 注入方式,不是删掉主题 |
5. 以后若再出现「被带偏」
按这个顺序查:
- 模型服务台里这一轮的 system:主题块是否仍像军令、摘要是否仍像待办清单;
- 最后一条 user:是否带「本轮用户消息」信封;
- 本轮是否因关键词展开了整份插件操作表或「训练智能体配置」不该走的工具;
- 滚动摘要是否把旧支线写成了「必须继续」;
- 用户只说「生成html格式」时,工作集是否仍打开数据连接、匹配问句是否仍是人数月报——缺了就会抄附图数字。
用户侧仍建议:一件完全不相干的事,开 新对话 最干净。机制负责的是:同一条对话里问新问题,不该被旧词绑走。