All posts
Updated

How Cursor layers chat prompts, and what Cadau aligned

Long chats stay on the latest ask because that turn is the task, and topic plus history stay background. What Cadau changed to follow the same split.

Source docs/技术博客/Cursor对话提示词机制与Cadau对照.md

This article is maintained in Chinese. The interface is English; the body below is the original text.

表述:给开发和运维。说明 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/chatsvc/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. 本轮增量:关键词 + 分类模型只负责新打开什么;再与工作集合并。

上下文快满时仍走滚动摘要(压缩的是对话原文,不是卸掉工具)。摘要须保留未完成的问数/报表;工作集本身不因压缩而清空。预算按质量阈值设(路由 profile context_max_runes,建议 240000),不要跟满窗口走——大窗口模型质量会更早下降。HTML 报表默认用平台 ECharts 画图,不要用 Python / chart PNG 塞进报表;正文超过一屏分段 append_to。

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


4. 刻意没有照搬的部分

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

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

按这个顺序查:

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

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


6. 2026-09-08 复盘:差距不只在提示词分层

对照 9 月 4~5 日的真实对话镜像,「答非所问」与「半途中断」还有三层原因,都已按下表处理(实现见 docs/core-mechanisms/智能体对话编排.md §4.3):

CursorCadau 过去现在
模型单一前沿模型、整段任务不换、思考常开「自动」按权重随机,一次任务里可能换 2~3 次模型模型服务台「自动时首选」固定 MiniMax-M3,失败先走同一模型另一供应商
分工平台不猜用户意图;模型自己判断做完没做完400+ 处关键词判断替模型拿主意:预定义查询拦截探表、续跑猜「用户要 HTML」、强制 tool_choice、代模型发工具匹配只作建议;续跑只核对「模型说做成了」与「回执」;不再强制、不再代发
提示系统提示写原则,工具用法写在工具自己的说明里,技能按需读每轮 2~3 万字说明书、100~200 条禁令八条做事原则 + 目录;说明书改 guide_read 按需读、首次调用随回执附;禁令 ≤ 30 有测试守着
工具有 shell 可随手算、有待办清单记进度模型心算合计与比例、无进度清单python_calc(受限 Python)、todo_write(界面勾选清单)
交接压缩摘要固定字段自由文本固定字段模板

一句话:过去是「平台想得太多、模型被信任得太少」;现在把判断交回模型,平台只管工具、回执与政策闸门。