MemoryLake
返回全部文章
Tutorial2026 年 8 月 7 日·11 分钟阅读

为什么 ChatGPT 会忘记你的代码风格——以及如何修复它(2026 年)

你粘贴了一个组件,解释说你使用具名导出(named exports)、尽早返回(early returns)、不使用默认导出(no default exports)以及 const 箭头函数。它配合得非常好。第二天早上,开启新聊天,同一个项目:它又写出了一个带有嵌套三元运算符和 function 声明的默认导出。

直接的答案是:ChatGPT 没有规则文件。编程智能体(coding agents)将风格保存在 .cursor/rulesCLAUDE.mdAGENTS.md 中——这些文件会在每次请求时加载。而聊天应用只有三个小得多的地方可以存放它:自定义指令(custom-instructions)块、大小仅适用于偏好而非风格指南的记忆库(memory),以及项目的上下文(Project's context)。它们都不是真正的风格指南,因此你的规范只能存在于你上次解释它们的对话中,并随之过期。解决方案是分层的:将风格中机械化的那一半放入格式化工具中,这样它就不会被忘记;将格式化工具无法表达的那一半放入 ChatGPT 每次请求都会读取的存储中。

本文将介绍为什么聊天上下文与 IDE 有着本质的不同,每个内置选项能容纳和不能容纳什么,以及如何停止每周重复传授你的规范。

为什么 ChatGPT 会忘记你的代码风格

聊天应用中没有任何东西能起到规则文件的作用

这就是全部的结构性差异,在讨论解决方法之前,这一点值得阐明。Cursor 自己的文档解释了为什么规则文件会存在:“大型语言模型在两次补全之间不会保留记忆。规则在提示词级别提供了持久、可复用的上下文。”

每个看起来能记住你风格的编程工具都在做这件事——在每次请求时,重新提供来自磁盘文件的相同文本。Cursor 读取 .cursor/rules,Claude Code 读取 CLAUDE.md,Codex 读取 AGENTS.md。这就是为什么 Claude 忘记你的代码风格Cursor 忘记它 通常可以通过编写一个更好的文件来修复。

ChatGPT 没有这样的文件。你的机器上没有它在回答前会读取的路径。因此,让风格在其他所有工具中保持持久的机制在 ChatGPT 中根本不可用,而替代方案的容量都小得多。

记忆库的大小是为偏好设计的,而不是风格指南

ChatGPT 保存的记忆在设计上就很短——它随每个提示词一起携带,因此其大小是每次请求的成本。目前没有公布的数据;流传的估计认为总共大约有 1,200 到 1,400 个单词,或者大约 200 个条目,且彼此并不一致。就把它当成一两页纸吧。

一份真正的风格指南是放不进一两页纸里的。如果你尝试这样做,就会遇到上限:一旦记忆库满了,ChatGPT 就会停止添加新的长期事实,直到你删除某些内容——这本身就是一种令人沮丧的体验。OpenAI 在 2026 年 6 月 4 日宣布的重建记忆系统改善了这一点——一个能够随时间保持更新的可读记忆摘要,并且为 Plus 和 Pro 用户提供了两倍的容量——但将一两页纸翻倍依然不是一份风格指南。同样值得注意的是,较新的系统会合成而不是存储你的确切字句,因此表述精准的规范在返回时可能会被改写。

风格是一百个微小的决定,而不是一条指令

“遵循我们的代码风格”听起来像是一条指令。但它实际上包含:布尔值的命名、错误处理的形式、类型定义的位置、是否使用 barrel 导出、如何排序 props、何时需要注释、在不写循环时使用哪个工具函数、测试如何命名。

其中大部分从未被明确说明。你只有在看到违规时才会注意到它们——这意味着你的风格指南是在聊天中被逐步发现的,而且每次发现都只存在于你提出它的那个对话中。十次会话下来,ChatGPT 被告知了十个不同的规范子集,却一个也没记住。

粘贴的内容会逐渐退化

每个人最终都会选择在会话开始时粘贴一段规范块。然后它会变得越来越短。你是凭记忆输入的,而例外情况又是无聊的部分,所以第四周粘贴的内容就成了第一周精简后的一半。风格会发生漂移,因为你自己对它的重新表述也在漂移——这是手动重新解释上下文的常见版本。

有必要将此与一个临近的问题区分开来:如果你确实将规范放在了自定义指令中,但它们仍然被忽略了,那就是指令已设置但未应用的问题——这是另一种失败。本篇讨论的是根本不存在的规范。

人们尝试过的方法

自定义指令(Custom instructions)。 正确的第一步,对少数硬性规则确实有效。这个块很小,所以你必须选择最重要的五个规范,而且它适用于你的所有工作——如果你在公司写 Go,在家里写 TypeScript,这就不合适了。

保存的记忆(Saved memory)。 适用于两三个稳定的偏好(“我使用 TypeScript 严格模式”)。它不适合用来装指南,用风格规则填满它会消耗你本想用于记录关于你的其他信息的预算。

附加了规范文件的项目(Project)。 内置选项中最好的一个:范围限定在该项目中,没有全局溢出,并且是一份真正的文档而不是摘要。限制在于它仅限于 ChatGPT,在长会话中文件无法可靠地保持在上下文中,而且它对你在普通聊天中提出的快速问题没有帮助。

在指令中包含风格指南的自定义 GPT。 有效且是真正的进步,因为其指令比自定义指令块更长。现在你必须为每个项目维护一个单独的助手并记住使用它,而更新指南意味着要编辑一个 GPT。

每次会话都粘贴指南。 原则上可靠,实践中会逐渐退化,并且每次对话都会消耗 token。

Linter 和格式化工具。 针对所有机械化问题的专业答案,它理应获得首要推荐,而不是作为脚注——见下文。

解决方案:给 ChatGPT 一个每次都会读取的风格指南

首先将你的风格一分为二,因为其中有一半根本不应该出现在提示词中。

机械化的那一半属于工具。 引号风格、分号、缩进、导入顺序、行宽、尾随逗号以及大多数命名模式,都可以通过 Prettier、ESLint、Black、gofmtrustfmt 或你所用语言的同等工具来强制执行——并将配置文件提交到仓库中。格式化工具是不会忘记的。如果你要求 AI 记住你的缩进偏好,你就是在把语言模型当成 linter 来用,而它的表现永远会比 linter 差。这是整篇文章中杠杆率最高的举措,而且它与记忆力毫无关系。

需要判断的那一半需要一个记忆层。 没有任何格式化工具能表达“我们不在服务层中使用继承”、“宁要命名辅助函数,也不要聪明的单行代码”、“我们允许在生成的 API 客户端中使用 any,其他地方都不允许”或“错误消息是面向用户的,请相应地编写”。这些是有原因的规范,而原因正是阻止它们被重新争议的关键。

这第二半才是应该放入 ChatGPT 每次请求都会读取的存储中的内容——而不是你重新输入的粘贴内容,也不是与它竞争的两页纸记忆预算。MemoryLake 就是为此而生的记忆层:你的规范文档存在一个存储中,在相关时被检索,并且也可以被 Claude、Codex 和其他智能体读取——因此风格指南不再是针对单个工具的产物。

一个坦诚的界限。可靠地提供规范可以提高它们被遵循的频率;它不能保证完全合规,因为模型是否根据它读取的内容采取行动属于模型行为。这正是为什么机械化的那一半要交给格式化工具的原因——对于任何你需要强制执行的事情,请使用具有强制力的工具。

步骤 1:创建 API 密钥

生成一个密钥,并在大约 30 秒内发出你的第一次请求。将其保存在你的环境中或机密管理器中,而不是粘贴到聊天中或提交到代码库中。

创建 MemoryLake API 密钥
创建 MemoryLake API 密钥

步骤 2:上传你的第一批记忆

放入保存你实际规范的文档、图像和文件:风格指南、“我们如何编写服务”文档、你团队争论时使用的评审清单、你认为堪称典范的代码示例。写明原因。没有原因的规范在第一次不方便时就会被推翻——无论是被模型还是被你。

上传你的第一批记忆到 MemoryLake
上传你的第一批记忆到 MemoryLake

步骤 3:连接你的 AI 和智能体

通过 MCP 或 API 授予 Claude、Codex、OpenClaw 和其他 AI 智能体访问记忆的权限。ChatGPT 没有 MCP 客户端,因此那里的路径是 API:检索相关的规范并将其注入到提示词、自定义 GPT 的指令或调用模型的日常工作流中。支持 MCP 的工具会直接读取相同的存储,这就是重点——一个风格指南,适用于所有助手。

通过 MCP 连接你的 AI 和智能体
通过 MCP 连接你的 AI 和智能体

这在实践中带来了什么改变

第一个改变是你的规范不再缩水。ChatGPT 看到的是文档,而不是你的回忆,因此第二十周的输出与第一周保持相同的标准。

第二个改变是指南能够正确地成长。当你在评审过程中注意到一个新的规范时,你会向文档中添加一行,而不是向一个即将结束的聊天中添加一句话。几个月下来,这就是真正的风格指南与口头记忆之间的区别。

第三个改变是评审变得有用。“这符合我们的规范吗?”只有在规范可检索时才有意义。目前,答案往往是通用的最佳实践——这也是为什么 ChatGPT 在没有项目上下文的情况下加入 会让它的代码评审显得既自信又答非所问的原因。

而且它不再特定于 ChatGPT。规范是你代码库的属性,而不是你助手的属性。一旦它存在于共享存储中,迁移到不同的工具就不会重新开始教学过程。

让 ChatGPT 保持一致风格的最佳实践

让 linter 成为它可以表达的任何内容的唯一事实来源

提交配置,然后让 AI 的输出接受它的检查,而不是由你的提示词来支配。这缩减了必须记住的内容,只留下真正需要判断的部分,并使违规行为变得可见,而不是引发争论。

将规范写成带有原因的规则

“使用尽早返回”是一种偏好,很容易被推翻。“使用尽早返回——此代码库中的嵌套条件曾导致两个生产环境 bug,因为遗漏了 else 分支”是一条带有防御理由的规则。原因也有助于你注意到规范何时不再适用。

包含一个示例,而不仅仅是文字描述

传达风格最快的方法是一个你认为正确的简短文件。模型从示例中泛化的效果比从形容词列表中泛化的效果更可靠,而且一个示例承载了你从未阐明过的数十个微小决定。

保持始终加载的部分尽可能小

无论每次请求中注入什么——自定义指令、简短的规范头部——都应该是你最常被违反的五条规则,而不是整个指南。其余部分属于检索。在每个问题前堆砌一堵风格规则墙会挤占问题本身的空间。

明确指出例外情况

每个真实的代码库都有“我们在 Y 情况下除外,其他都做 X”。未写明的例外情况是 AI 在完全遵循你声明的规则时看起来最错的地方——也是你最终反复纠正同一件事的地方,因为纠正措施从未写入指南。

结论

ChatGPT 会忘记你的代码风格,是因为在回答之前没有它会读取的文件。编程智能体通过在每次请求时加载规则文件来解决这个问题;聊天应用则提供了一个微小的自定义指令块、一个大小适用于偏好而非指南的记忆库,以及项目范围限定——你的规范最终只能存在于你上次解释它们的对话中。

解决方案是拆分,而不是单一的举措。将所有机械化的内容放入带有已提交配置的格式化工具和 linter 中,因为格式化工具不会忘记,而且语言模型在缩进方面的表现永远不如专门为此构建的工具。将需要判断的那一半——带有原因的规范、例外情况、示例——放入你的助手在每次请求时都会读取的存储中。这样,指南就不会再以你自身记忆衰退的速度退化,也不再属于单一的产品。

常见问题

为什么 ChatGPT 在一个对话中会遵循我的风格,但在下一个对话中就不行了?

在一个对话中,你的指令处于上下文中,因此它会随每条消息重新提供。当对话结束时,该上下文就消失了,磁盘上没有任何东西可以替代它。编程智能体通过每次读取规则文件来避免这种情况;ChatGPT 没有等效功能,因此持久性必须来自自定义指令、记忆库、项目(Project)或你注入的外部存储。

我不能直接把我的整个风格指南放进自定义指令中吗?

只能放一小部分。该区块在设计上就很短,因为它会被添加到每次请求中,所以你必须挑选出最重要的几条规则,而不是粘贴整份文档。这里适合存放 ChatGPT 最常违反的五条规范,而不适合存放完整的指南。

将我的规范保存到记忆库中可行吗?

对于两三个稳定的偏好,是可以的。但对于指南来说不行——记忆库大约只有一两页纸的大小(没有官方数据,第三方估计也各不相同),它会与你希望被记住的其他所有内容竞争,而且一旦满了就会停止接受新条目。较新的记忆系统还会进行合成,而不是存储确切的字句,因此表述精准的规则在返回时可能会被改写。

在这方面,自定义 GPT 比项目(Project)更好吗?

它们解决的问题略有不同。自定义 GPT 为你提供了更长的指令字段,因此可以容纳更多指南内容,但你必须记住去使用它。项目(Project)则可以附加一个真实的规范文件并限定其范围,但在该项目之外就无能为力了。两者都比手动粘贴要好;但除了 ChatGPT 之外,其他任何工具都无法读取它们。

这与 ChatGPT 忽略我的自定义指令有什么不同?

这是不同的失败类型。前者是指令存在但未生效——已设置但未应用。而后者是规范根本不存在,因为它们只在已结束的对话中被提及过。值得诊断一下你遇到的是哪一种,因为第一种关乎位置和强调,而第二种关乎持久性。

我应该使用 linter 还是记忆层?

两者都需要,用于不同的部分。Linter 强制执行所有可表达为字符和语法规则的内容,并且它不会忘记。记忆层则承载了 linter 无法表达的内容——架构规范、原因、例外情况以及你的代码库中“优秀”的代码是什么样的。用其中一个去代替另一个的工作是错误的:提示词做不好 linter 的工作,而 linter 对你的服务层没有任何意见。