跳转到内容

Memory · 让 Agent 记得上次说啥

第 5 章 · 第 3 节

默认情况下,Agent 是”金鱼脑”——每次对话独立,不记得 5 秒前你说了啥。要让它”记得”,挂一个 Memory 子节点就行。这一节讲三种主流 Memory 类型,以及”什么时候该挂哪个”。

🐟 no-memory.txt
用户:我叫 Alice。 Agent:你好 Alice,有什么我可以帮你的? 用户:刚才我告诉你我叫什么? Agent:抱歉,我不知道你的名字。 ↑ 没挂 Memory,每次都是新对话

挂上 Window Buffer Memory 后:

🧠 with-memory.txt
用户:我叫 Alice。 Agent:你好 Alice,有什么我可以帮你的? 用户:刚才我告诉你我叫什么? Agent:你刚才说你叫 Alice。 ↑ 因为有 Memory,上一轮对话被自动注入到这次推理的上下文里

保留最近 N 轮对话——超出就丢掉旧的。

📦 window-buffer.txt
配置: Session Key: ={{ $json.sessionId }} 用户标识,区分会话 Context Window Length: 5 保留最近 5 轮 行为: 对话 1-5:全部记得 对话 6 来了:忘掉对话 1,记 2-6 对话 7 来了:忘掉对话 2,记 3-7 适合:短对话场景(客服、问答),不在意远古对话。

② Summary Buffer Memory(长对话省 token)

Section titled “② Summary Buffer Memory(长对话省 token)”

保留摘要 + 最近几轮。LLM 自动把”老对话”压缩成摘要,新对话保持原样。

📝 summary-buffer.txt
配置: Session Key: ={{ $json.sessionId }} Max Token Limit: 2000 摘要 + 最近对话总 token 数上限 行为: 对话 1-10:占用 1800 token,原样保留 对话 11 来了:超 2000 → 自动调 LLM 总结对话 1-5,变成 200 token 的摘要 接下来:摘要(200) + 对话 6-11(剩余) → 总量回到 2000 以内 适合:长对话、客服多轮排障、追剧式聊天,你不想让最久远的内容彻底丢。

注意:摘要本身要花一次 LLM 调用,比 Window Buffer 贵一点

③ Postgres / Redis Chat Memory(持久化)

Section titled “③ Postgres / Redis Chat Memory(持久化)”

Window/Summary Buffer 默认存内存——workflow 重启就丢。要让”用户一周后回来还能续上”,需要把记忆存到数据库:

🗄 postgres-memory.txt
配置: Session Key: ={{ $json.userId }} 每个用户独立 Table Name: chat_history Postgres 里的表名 Credential: <Postgres connection> 行为: 每次 Agent 跑完,把对话历史 INSERT 到 chat_history 新会话开始,按 session_key 查最近 N 条 适合:跨会话延续的真实产品(聊天助手 SaaS、AI 角色扮演)。

Redis 版本类似——更适合短期、高频访问、不需要持久。

每个 Memory 都必须有 Session Key——它是”这是谁的对话”的标识:

🔑 session-key-examples.txt
Telegram bot: Session Key: ={{ $json.message.from.id }} 用 Telegram 用户 ID Slack bot: Session Key: ={{ $json.user }} Slack user ID Web chat: Session Key: ={{ $json.userId }} 你前端传的用户 id 测试期间: Session Key: test-session 固定字符串,所有对话共享 ❌ 千万别这么写: Session Key: 不填 / 留空 → 所有用户共享同一份记忆!会串台!
🌳 memory-decision.txt
Q1: 这是单次问答还是多轮对话? [单次问答 - 用户提一个问题就走] ─→ 不挂 Memory [多轮对话] → Q2 Q2: 对话长度大概多长? [< 10 轮的短对话] ──────────→ Window Buffer Memory [可能很长的对话] ───────────→ Summary Buffer Memory Q3: 用户回来还要续上之前的吗? [否,刷新就清] ──────────────→ 用上面的内存版 [是,跨会话/设备续上] ───────→ Postgres / Redis Chat Memory
💬 telegram-with-memory.txt
Workflow: [Telegram Trigger] ↓ [AI Agent] Chat Model: [OpenAI Chat Model] Memory: [Postgres Chat Memory] Session Key: ={{ $json.message.from.id }} Table: telegram_chat_history Tool: ... (按需) ↓ [Telegram - Send Message] Chat ID: ={{ $('Telegram Trigger').item.json.message.chat.id }} Text: ={{ $json.output }} 结果:每个 Telegram 用户有独立、持久的对话记忆,重启 n8n 也不丢。
  • 默认 Agent 没记忆 —— 挂 Memory 子节点才行
  • Window Buffer:最近 N 轮(最常用)
  • Summary Buffer:摘要 + 最近几轮(长对话省 token)
  • Postgres / Redis Chat Memory:跨会话持久化
  • Session Key 必填且必动态——错了会串台
  • 别贪心 Window Length,监控 token 成本

下一节Vector Store + Embedding——给 Agent 装”长期记忆”。