最近在做一个全栈小项目,一直用Claude 3.7配合Cline写代码。刚开始还行,但对话一旦超过20轮左右,它就开始“失忆”——比如我明确说过“不要用Tailwind,用普通CSS”,前三轮都遵守,后面突然给我写出一堆className。我试过在system prompt里反复强调,也试过把约束写进项目里的AGENTS.md,但效果还是不稳定。想问下大佬们,有没有什么工程化的办法让长对话保持上下文一致性?比如定期压缩总结对话历史,还是说把关键约束做成独立文件让它每次重新读取?主要是我这个项目逻辑有点绕,不想每轮都重复提醒,太累了。
Claude 3.7在长对话里总忘掉之前的代码约束,怎么破?
全部回复
共 24 条说实话我也被这个问题折磨过一阵子,后来发现AGENTS.md不是没用,而是读取优先级和触发机制的问题。我现在是把所有硬性约束拆成三个独立文件——技术栈规则、代码风格规范、禁止事项清单,然后在Cline的规则里按项目阶段动态引用,比全塞进一个文件效果好很多。另外你提到的对话压缩其实是个双刃剑,我试过让Claude自己总结历史,但压缩过程本身就会丢失细节,尤其是那些否定性的约束,比如“不要用X”,总结时经常被过滤掉。更靠谱的做法是写个小的自动化脚本,每次对话轮次到15左右就强制开启一个新会话,同时把关键约束和当前项目状态生成一个快照文件作为新会话的上下文,这样既避免上下文膨胀,又能保证约束是完整重新加载的。还有个土办法但很有效——在代码里埋注释标记,比如在CSS文件头部写“本文件禁止Tailwind类名”,然后每次让Claude先grep一下这些标记再动手,相当于物理层面的提醒。不过说到底,长对话一致性本质上是模型注意力机制的短板,工程手段只能缓解不能根治,如果项目逻辑太绕,不如拆成多个子任务用独立对话处理,最后再合并,反而比硬刚一个超长对话省心。
我最近也踩过差不多的坑,后来发现把约束写进AGENTS.md其实有个前提,就是得放在文件最顶部,而且每条约束前面加个类似【强制】的标记,效果会好不少。另外我试过把项目规则拆成单独一个CONSTRAINTS.md,然后在每次对话开始的时候先让模型读一遍这个文件再干活,比塞在system prompt里管用,因为system prompt容易被后续内容冲淡。还有个偏门但有效的办法,就是主动开个新对话,把之前的代码和关键决策浓缩成一段总结粘进去,等于给模型一次“重新认识项目”的机会,虽然麻烦点但确实能治失忆。你提到20轮这个临界点我也感觉到了,可能是上下文窗口被中间那些来回修改的对话占满了,真正有效的指令反而被挤出去了。要不你试试把项目拆成几个子任务,每个子任务单独开对话,别让一个对话扛到底,我这边这样改完明显稳定多了。
我试过把约束拆成单独的CONVENTIONS.md,然后在每次对话开始前让Cline先读取那个文件,比AGENTS.md好使,但也不是百分百稳。另一个土办法是把代码约束直接写进prompt的开头,并且每10轮左右手动贴一次,虽然烦但至少不会崩。你那个“压缩总结对话历史”的思路我觉得靠谱,就是需要额外写个脚本或者手动触发,麻烦点但能治本。
把关键约束写成独立规则文件,每轮开头让Cline强制读取一次,比塞进AGENTS.md靠谱多了。