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

为什么你的 n8n AI Agent 会遗忘对话——以及如何修复它(2026)

在构建过程中,你的 n8n AI Agent 表现得非常完美。它能回答后续问题,记住用户三条消息前说的话,并且处理上下文时显得非常专业。然而,当你激活工作流后——它却开始把每条消息都当成它见过的第一条消息来对待。

直接的原因是:Simple Memory 节点将聊天历史记录保存在工作流自身的数据中,仅保留一小部分最近的对话窗口,并在实例重启时消失。n8n 的官方文档明确指出,在运行队列模式(queue mode)的实例上,该节点无法在处于激活状态的生产工作流中正常工作。即使你将其更换为 Postgres 或 Redis 聊天记忆(你也确实应该这样做),你得到的也只是绑定到单个会话的聊天记录,而不是关于你业务的记忆。

本指南将解释每种失效模式,然后向你展示如何赋予你的 Agent 能够跨执行、跨工作流和跨工具持久存在的记忆。

为什么你的 n8n Agent 会遗忘

Simple Memory 是一个窗口,而且这个窗口很小

Simple Memory 节点的“上下文窗口长度”(Context Window Length)设置决定了要包含的历史交互次数,默认值为 5。一次交互代表一轮对话——即用户消息加上 Agent 的回复——因此默认设置大约保留最近的 10 条消息。更早的内容会静默地移出窗口。系统不会报错,Agent 只是单纯地不再引用同一对话中较早发生的内容,这就是为什么长对话的质量会逐渐下降而不是直接中断。

它存在于工作流数据中,因此无法持久保存

Simple Memory 将聊天历史记录存储在工作流自身的数据中,并绑定到一个会话密钥(session key)。这在编辑器中很方便,但在其他地方却非常脆弱:历史记录与实例的运行状态绑定,一旦重启或重新部署就会消失。这就是经典的“开发时正常,部署后全忘”的现象,而官方给出的标准建议——在上线前迁移到 Postgres 或 Redis 聊天记忆——也正是因为这个原因。

队列模式会直接导致其失效

n8n 的文档清楚地说明了这一限制:如果你的实例使用队列模式(queue mode),该节点在激活的生产工作流中将无法工作,因为无法保证记忆调用会被路由到同一个 worker。如果你对 n8n 进行了水平扩展,然后纳闷为什么记忆变得不稳定——时而记得,时而忘记——原因就在这里。请求落在了不同的 worker 上,而每个 worker 对之前说过的话都有不同的记录。

会话密钥决定了谁记住什么

记忆是按会话密钥(session key)分组的。使用 Chat Trigger 时,n8n 会从传入的 sessionId 中填充它,这通常符合预期。但有两种常见的错误配置会导致截然相反的症状:

  • 硬编码的静态密钥意味着所有用户共享同一个记忆——Agent 会混淆对话并在不同用户之间泄露上下文。
  • 每次执行都改变的密钥意味着每条消息都会开启一个新对话——尽管记忆功能在技术上正在运行,但 Agent 看起来就像失忆了一样。

记忆的作用域仅限于每个 Agent 节点、每个工作流

记忆节点连接到单个 AI Agent 节点。它不是跨自动化流程的共享存储。工作流 A 中的支持 Agent 对工作流 B 中的入职 Agent 昨天得出的结论一无所知(即使是针对同一个客户),而且两者都不知道你的团队在管理这两者的 SOP 中写了什么。如果你运行多个 Agent,这种碎片化会进一步加剧——这一普遍问题在 multi-agent memory 中有详细讨论。

团队通常会先尝试什么

增加上下文窗口长度

这是最显而易见的手段,而且短期内确实有帮助。但你必须为每次调用中保留的每条消息付费,窗口依然是有界的,而且依然是易失的。你只是让遗忘发生得更晚一些,并没有阻止它。

切换到 Postgres 或 Redis 聊天记忆

这是正确的生产环境做法,你也应该这样做:历史记录可以在重启后存活,并且能在队列模式下工作。不过,要清楚它能给你带来什么。它是一个由会话键控的持久聊天记录存储——它保存的是输入的内容,而不是你组织所掌握的知识。它不包含你的产品文档、价格规则、上季度的决策,或者该客户在三月份提交的工单解决方案。只要询问该会话消息之外的任何内容,它都一无所知。

将上下文塞进系统提示词(System Prompt)

团队会将政策、语气指南和常见问题解答粘贴到 Agent 的系统消息中。每次执行都要为这些 token 付费,文本会逐渐过时,而更新它意味着需要逐个编辑工作流。这在自动化领域相当于永远在 re-explaining context to your AI

自建检索系统

下一步通常是向量数据库加上嵌入(embedding)流水线,再加上检索子工作流。这确实可行,但也是一个真正的工程项目:分块、嵌入刷新、排序、作用域划分、过期处理。而且它本身并不能解决记忆问题,原因值得阅读 why RAG isn't memory——检索寻找的是文档,而记忆保存的是结论。

解决方案:为你的 n8n Agent 赋予持久记忆层

聊天记忆(Chat memory)和记忆(Memory)是两项不同的工作。保留 Postgres 或 Redis 记忆节点以维持会话内的对话连贯性,并将持久知识放在一个不与工作流、worker 或会话密钥绑定的层中。这就是 MemoryLake 所扮演的角色:一个供你的 Agent 读取和写入的统一记忆库,可以通过 MCP 或 API 从你构建的任何工作流中访问。

步骤 1:创建 API 密钥

生成密钥并在大约 30 秒内发出你的第一次请求。

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

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

放入你的 Agent 持续需要的文档、图片和文件:产品文档、SOP、价格和政策规则、升级路径、先前的解决方案。这些是永远不应该放在聊天缓冲区中的知识。

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

步骤 3:连接你的 AI 和 Agent

通过 MCP 或 API 让 Claude、Codex、OpenClaw 以及你的 n8n Agent 访问该记忆——在工具支持的地方使用 MCP 连接,或者直接从工作流本身发起普通的 HTTP 请求。在任何 worker 上的每次执行都能访问相同的记忆。如果你还向 Agent 开放了自己的工具,adding memory to a custom MCP servermemory for stateless MCP servers 涵盖了这方面的内容。

通过 MCP 连接你的 AI 和 Agent
通过 MCP 连接你的 AI 和 Agent

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

算一算你目前的工作流重复了多少内容。如果每次执行都携带 1,500 个 token 的粘贴政策和产品上下文,并且该工作流每天运行 500 次,那么每天就是 750,000 个 token——每月大约 2200 万个 token——都花在重新发送从未改变的文本上。而仅从记忆层检索相关的片段,其成本通常只是其中的一小部分。

更大的收获在于行为层面。一个能够看到客户早期工单的支持 Agent 不会再次询问账户 ID。一个与支持 Agent 读取相同记忆的入职 Agent 不会与其产生矛盾。当你下个季度重构工作流时,知识会保留在原处,而不是被困在你删除的版本中。

n8n Agent 记忆的最佳实践

将聊天记录和知识分开存放

使用聊天记忆节点来保留当前对话的最后几轮。使用记忆层来存放明天依然有效的任何内容。将它们混在一起会导致存储库既庞大得无法读取,又浅显地无法提供实质帮助。

将记忆键控到实体,而不是执行

会话密钥适用于对话。持久记忆应该键控到客户、项目或账户——这些在不同工作流和不同月份中代表相同含义的实体。这样才能让第二个工作流在第一个工作流停止的地方继续进行。

在运行结束时写回结论

添加最后一个步骤来存储该次运行所做出的决定:解决方案、授予的特例、用户声明的偏好。只读记忆的 Agent 永远不会变得更聪明;而向记忆中写入的 Agent 会不断积累。保持这些写入简短且符合事实,并且优先替换过时的事实,而不是在上面堆叠新的事实。

结论

你的 n8n Agent 并没有损坏。Simple Memory 正在准确地执行其文档中所说明的功能:在工作流数据中保留少数最近的交互,这就是为什么它在重启时会蒸发,并且在生产环境的队列模式下无法工作。迁移到 Postgres 或 Redis 解决了聊天记录的持久性问题——但留下了更大的空白,因为单个会话的聊天记录永远不等同于了解你的业务。

将这两项工作分开。对话的连贯性属于聊天记忆节点;机构知识则属于你的工作流通过 MCP 或 API 读取的记忆层。这样,你构建的下一个 Agent 就可以从上一个 Agent 学到的所有内容开始,而不是面对一个只有五次交互深度的空白窗口。

常见问题

为什么我的 n8n Agent 在测试时能记住,但在生产环境中会遗忘?

Simple Memory 将历史记录保存在工作流的数据中,这在重启或重新部署后无法存活,且 n8n 文档指出它在队列模式实例的激活生产工作流中无法工作。切换到 Postgres 或 Redis 聊天记忆可以解决持久性这一半的问题。

Simple Memory 节点中的默认上下文窗口长度(Context Window Length)是多少?

5 次历史交互——大约 10 条消息,因为一次交互包含一条用户消息和一条回复。更早的对话轮次会静默移出窗口而不会报错,这就是为什么长对话会逐渐退化的原因。

Postgres 聊天记忆(Postgres Chat Memory)能给我的 Agent 带来长期记忆吗?

它为你提供绑定到会话密钥的持久对话历史记录。这不等同于对你组织的记忆:它不包含你的文档、政策或先前运行的结论,也无法跨工作流访问。

如何在两个 n8n 工作流之间共享记忆?

不能通过记忆节点——它们的作用域仅限于它们连接的 Agent 节点。将共享知识放在一个外部记忆层中,两个工作流都可以通过 MCP 或 API 调用它,并将其键控到客户或项目,而不是单次执行。

我可以在 n8n 以及 Claude 或 Codex 中使用相同的记忆吗?

可以,只要记忆存在于自动化平台之外。一个可以通过 MCP 或 API 访问的记忆层可以被 n8n 工作流以及 Claude Code 或 Codex 中的 Agent 读取,这就是保持其外部化的意义所在——参见 setting up cross-AI memory with MCP