让 Agent 拥有记忆能力。LLM 的上下文窗口有上限,多轮对话中早期信息会被「挤出」。 Memory 系统解决的是:Agent 如何在有限资源下记住更多、记得更准。
上下文窗口有上限
GPT-4o 是 128K tokens,约 10 万汉字。 长对话积累下来,迟早超出。
对话历史不能全塞进去
塞太多无关的历史,噪声淹没重点, LLM 反而更容易「失焦」。
需要跨会话积累经验
Agent 不应该每次新会话都从零开始。 好的 Memory 让 Agent 越用越懂你。
Agent 当前正在处理的信息,如当前任务的中间步骤、已收集的信息碎片。
同一会话中的对话历史,让 Agent 知道「你们之前聊过什么」。
Agent 的「个人经验」——跨会话积累的知识、偏好、已完成的任务记录。
当对话历史超过窗口上限时,需要压缩。最常见的方式是「摘要」:
分层摘要策略
# 对话历史结构示例
conversation = [
# 最近 3 轮:详细保留
{"role": "user", "content": "帮我查一下 XX 项目的进展"},
{"role": "assistant", "content": "好的,正在查询..."},
{"role": "user", "content": "谢谢"},
# 更早的对话:只保留摘要
{"role": "system", "content": "[摘要] 用户讨论了 YY 项目需求,"
"决定采用方案 A,技术栈为 Next.js + Supabase"}]
当 context 使用率超过 70% 时,触发摘要。每完成一个完整任务,也做一次总结。 摘要 prompt 示例:「将以下对话压缩成 200 字的摘要,保留关键信息、决定和待办。」
Supabase 实现会话存储
-- 创建会话表
CREATE TABLE sessions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES auth.users(id),
messages JSONB DEFAULT '[]',
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
-- 设置过期时间(7 天后自动清理)
ALTER TABLE sessions SET (
timescaledb.job_queue前景 = 'interruptive'
);
-- 读取会话历史
SELECT messages FROM sessions
WHERE user_id = auth.uid()
ORDER BY created_at DESC LIMIT 1;会话搜索
「查找上次关于 XX 的讨论」:将 messages 向量化,检索相关历史。
会话归档
重要会话可标记为「重要」,不设置过期,持久保存为长期记忆。
经验、总结、已完成任务的记录,存入向量数据库。检索时召回。
工具:Supabase Vector / Pinecone / Chroma
实体 + 关系存储,支持推理查询。比向量更擅长回答「A 和 B 是什么关系」类问题。
工具:Neo4j / Supabase(用 JSONB 模拟简单图关系)
Agent 每完成一个任务 → 自动提炼关键信息(LLM 摘要)→ 判断存入哪种记忆 → 写入向量库 / 图库。不需要每次对话都写入,只写入「有价值的沉淀」。
Memory = Agent 的「经历记录」
Agent 自己产生的信息——对话历史、任务记录、个人偏好
RAG = Agent 的「知识库查询」
外部导入的信息——文档、网站、结构化数据
两者共同构成 Agent 的认知体系
收到问题时,Agent 同时从 Memory(自身经验)和 RAG(外部知识)两个维度检索, 合并作为上下文输入 LLM。