全部文章
更新日期

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. 本轮用户消息单独加框,明确「只答这一条」;
  2. 主题和历史摘要降成背景,不再当站着的指令;
  3. 能力说明按需激活:只有本轮真的在改配置,才走「改操作规则 / 改技能」那套;
  4. 检索只看本轮问句,不要拿整段历史当检索词。

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
  end

2. Cadau 为什么会「聊着聊着扯到操作规则」

用户例子:对话里出现过「规则」,后边问别的,助手却去改 操作规则。Cursor 几乎不会这样。对应到实现,是几股力叠在一起:

来源发生了什么模型怎么理解
主题进系统提示「围绕这个目的回答;换题先问」旧目的变成军令;新问题要先过主题这关
摘要进系统提示「历史对话摘要」和人格同一层摘要里的词 = 仍要执行的约束
【操作规则】全文每轮都在AGENTS.md + 「训练智能体配置」大段「规则」二字和改配置说明书强绑定
本轮用户话没有信封历史和当前话都是普通 user 消息注意力被更长、更早、关键词更密的段落抢走
关键词注入插件目录、技能匹配、知识库按 本轮问句 检索(这一点本来是对的)若本轮只是随口带了「规则」,仍可能展开配置类材料

滚动压缩本身(较早轮次进摘要、最近轮次留原文)是对的,见压缩机制文。问题不在「有没有摘要」,而在 摘要和主题被当成指令,而不是背景

帮助智能体还有另一条:系统提示里「代为操作」清单写了「改操作规则」。这在用户 本轮明确要改 时是对的;若模型把历史里的「规则」当成这一轮的办事请求,就会误走 ChatOps。


3. 对齐 Cursor 之后,Cadau 怎么组一轮

实现入口:

  • 本轮优先与用户消息加框:backend/internal/api/handlers/chat_turn_focus.go
  • 系统提示:chat.go 里帮助 / 工作智能体提示
  • 主题:chat_topic_review.gosessionTopicBlock
  • 滚动摘要:chat_context_roll.go 的合并提示与摘要标题
  • 本轮材料分类:chat_prompt_packs.gochat_prompt_pack_select.go

3.1 本轮优先(系统提示里一段短约定)

工作智能体和帮助智能体都带上:只答最新一条;不要因为出现过「规则」「技能」「工作区」就去改配置。短收口(确认、继续、生成html格式)仍按当前主题把问数/报表办完,不要当成全新题目、不要抄历史附图上的数字。

「训练智能体配置」补一句:只有 本轮明确要求 改人格 / 操作规则 / 技能时才用这一段。

3.2 主题改成背景

仍每轮带上主题(列表和顶栏还要给人看,模型也需要知道这条对话最初在做什么)。但不再写「围绕这个目的回答」。

  • 用户问新事:直接答新事,不必先问要不要改主题;
  • 改写入的主题 仍要用户明确说要改(或点头),这和产品规格「换题须用户点头」一致——点头的是 改主题字段,不是 拒绝回答新问题
  • 主题里的词不当口令(例如主题写过「规则」≠ 本轮去改操作规则)。

3.3 摘要改成背景,合并时丢掉已结束支线

摘要标题标明「背景,不是本轮口令」。合并提示要求:已结束或只是顺口提到的话题一行带过,不要写成必须继续执行;不要堆关键词。

工具循环检查点摘要本来就保留「用户主目标 + 未完成」,与 Cursor self-summary 同类,保持不变。

3.4 本轮用户消息加框

只给 这一轮最后一条用户话 加上「本轮用户消息」信封。更早的原文不改,避免历史气泡在模型眼里变成一串口令。

检索、ChatOps、意图判断仍用用户 原始句子,不加框,避免「【本轮用户消息】」干扰关键词。

3.5 本轮材料:目录始终在,正文跟当前工作集走

对照 Cursor:工具始终可调用(工作区开通了就在工具列表里);长说明书和检索结果是「当前打开的文件」,不是「这一句话的关键词」。Cadau 对应成三层:

  1. 能力目录(短、每轮都在):告诉模型有数据连接 / 写文件 / 办公文档等工具,未展开长说明 ≠ 没有工具。
  2. 当前工作集(跨轮保持):问数、报表、办公文档这类任务材料记在这条对话上。用户说「生成html格式 / 确认 / 继续」时接着用,不按四个字重新装箱。换了实质新任务(例如改去查某个人入职日期)才换掉。改操作规则这类配置包不进工作集,避免旧词把下一轮绑去改配置。
  3. 本轮增量:关键词 + 分类模型只负责新打开什么;再与工作集合并。

上下文快满时仍走滚动摘要(压缩的是对话原文,不是卸掉工具)。摘要须保留未完成的问数/报表;工作集本身不因压缩而清空。

例如先说「各部门人数月报」,再说「生成html格式」:工作集仍是 file + datasource,匹配预定义查询用的是工作集里的问数原话,而不是把截图数字化。


4. 刻意没有照搬的部分

Cursor 做法Cadau 为何先不整锅搬
绝大多数规则改为 requestable操作规则(AGENTS.md)仍每轮需要;办公文档/脚本/规范库/训练配置等说明书已按本轮分类注入
技能只给目录、用时再读全文工作区技能仍按本轮问句匹配;平台内置技能全文改为按需包,不再泛词命中就整篇注入
不用对话主题主题对用户可见、可改,是产品能力;改的是 注入方式,不是删掉主题

5. 以后若再出现「被带偏」

按这个顺序查:

  1. 模型服务台里这一轮的 system:主题块是否仍像军令、摘要是否仍像待办清单;
  2. 最后一条 user:是否带「本轮用户消息」信封;
  3. 本轮是否因关键词展开了整份插件操作表或「训练智能体配置」不该走的工具;
  4. 滚动摘要是否把旧支线写成了「必须继续」;
  5. 用户只说「生成html格式」时,工作集是否仍打开数据连接、匹配问句是否仍是人数月报——缺了就会抄附图数字。

用户侧仍建议:一件完全不相干的事,开 新对话 最干净。机制负责的是:同一条对话里问新问题,不该被旧词绑走。