概述
Zeus 的记忆系统为 Agent 提供跨会话的用户认知能力。通过从对话中提取、存储并检索关键信息,Agent 能够持续积累对用户和项目的理解,从而提供个性化、有上下文连贯性的交互体验。 记忆系统解决三个核心问题:- 个性化:记住用户偏好(编程风格、语言、工具链),无需每次重复说明
- 上下文连续性:跨会话保持对项目背景、技术决策的认知
- 智能推理:基于历史记忆做出更准确的判断和建议
架构
四层记忆模型
Zeus 的记忆系统由四个生命周期不同的层级组成,从短暂的运行时状态到永久的用户画像,形成一个完整的认知体系。| 层级 | 生命周期 | 存储 | 职责 |
|---|---|---|---|
| Working Memory | 单次 Agent 调用 | 内存 | 任务执行的临时上下文:todo_list、tool_calls、推理状态 |
| Short-term Memory | 单个会话 | PostgreSQL (message 表) | 当前会话的对话历史,通过 SummarizationMiddleware 自动压缩 |
| Long-term Memory | 永久(用户可管理) | PostgreSQL + pgvector | 跨会话的用户/项目信息,支持语义检索 |
| Episodic Memory | 可恢复 | PostgreSQL (checkpoint 表) | 会话状态快照,支持页面刷新、中断后继续、错误重试 |
三层数据架构 (memU)
Long-term Memory 采用 memU 启发的三层结构,将原始资源逐步抽象为结构化画像:| 层级 | 名称 | 内容 | 说明 |
|---|---|---|---|
| Layer 1 | Resource Layer | Chat 对话、Knowledge Base 文档、Project Resource | 原始数据来源 — 记忆提取的原始素材 |
| Layer 2 | Memory Item Layer | preference、fact、skill、habit、event、context、constraint、decision | 从原始数据中提取的结构化记忆条目,按类型分类 |
| Layer 3 | Profile Layer | User Profile(全局偏好、专业背景)、Project Profile(技术栈、约束、决策) | 由记忆条目聚合而成的画像,直接注入系统提示词 |
数据模型
Memory Item
记忆条目是系统的核心数据单元,每条记忆包含内容、分类、作用域和元数据。主要字段包括:- content:记忆内容文本
- memory_type:记忆类型分类
- scope / scope_id:作用域(user / project / session)及对应 ID
- source / source_id:来源(user / ai / knowledge_base / project_resource)及关联 ID
- confidence:置信度(0.0 ~ 1.0)
- visibility:可见范围(public / members / owner_only),仅 project scope 生效
- status:状态(active / archived / superseded)
- last_used_at:最后被检索的时间
Memory Type
每种类型对应不同性质的信息,Agent 在提取记忆时需选择正确的类型:| Type | 语义 | 示例 |
|---|---|---|
preference | 用户偏好 | 喜欢简洁代码、偏好深色主题 |
fact | 事实信息 | 用户是前端工程师、名字叫张三 |
skill | 技能水平 | 熟悉 React、精通 TypeScript |
habit | 使用习惯 | 常用 VS Code、习惯用 Git Flow |
event | 重要事件 | 完成了项目 A 的上线 |
context | 项目上下文 | 当前在开发支付模块 |
constraint | 约束条件 | 项目必须支持 PostgreSQL 16 |
decision | 决策记录 | 选择了 Next.js 而不是 Remix |
Memory Scope
作用域决定记忆的可见范围和生命周期:User Profile
用户画像聚合了用户的全局特征,在每次对话时注入到系统提示词。主要字段包括:- username:用户名
- background:用户背景描述
- profession:职业
- communication_style:沟通风格(concise / detailed / technical)
- response_format:响应格式偏好(markdown / plain / code)
- language_preference:语言偏好(zh-CN / en / ja 等)
- characteristics:个性特征
- content:自定义指令(Custom Instructions)
- expertise_areas:专业领域
- programming_languages:编程语言
- frequently_used_tools:常用工具
Project Profile
项目画像记录团队共享的项目上下文。主要字段包括:- project_goal:项目目标
- tech_stack:技术栈
- constraints:约束条件
- key_decisions:关键决策(含决策内容、原因和时间)
- team_conventions:团队规范
- current_phase:当前阶段
核心组件
MemoryService
MemoryService 是记忆系统的核心服务,统一管理记忆的读写和检索。它同时与 PostgreSQL(元数据)和 pgvector(向量索引)交互。
关键方法
| 方法 | 职责 |
|---|---|
add_explicit_memory() | 保存记忆 — 门控验证 → pgvector 写入 → PostgreSQL 写入 |
search_memories() | 语义检索 — 多 scope 搜索 → 合并排序 → 返回 Top K |
validate_memory() | 内容验证 — 置信度、敏感信息、内容长度 |
check_duplicate() | 去重检测 — pgvector 相似度 ≥ 0.85 判定为重复 |
check_rate_limit() | 速率限制 — 每 session 每 24h 最多 3 次提取 |
get_profile_for_agent() | 获取用户/项目画像,用于注入系统提示词 |
format_memories_for_prompt() | 将记忆格式化为 prompt 可读文本 |
Memory Gate(门控)
门控层在记忆写入前执行多维验证,防止低质量、敏感或重复的信息进入记忆库: 门控配置支持环境变量覆盖:| 参数 | 默认值 | 环境变量 |
|---|---|---|
| 最低置信度 | 0.7 | MEMORY_MIN_CONFIDENCE |
| 去重阈值 | 0.85 | MEMORY_DUPLICATE_THRESHOLD |
| 速率限制 | 3 次/session/24h | MEMORY_MAX_EXTRACTIONS |
| 最小内容长度 | 5 字符 | MEMORY_MIN_LENGTH |
| 最大内容长度 | 2000 字符 | MEMORY_MAX_LENGTH |
Memory Tools
Agent 通过四个内置工具自主管理记忆:| 工具 | 触发场景 | 参数 |
|---|---|---|
memory_save | 用户说「记住」「帮我记住」「我是…」等 | content, memory_type, scope |
memory_search | Agent 需要回忆用户信息 | query, k, memory_type, scope |
memory_delete | 用户要求删除过时信息 | memory_id |
memory_stats | 查看记忆统计 | 无 |
RunnableConfig 接收 user_id、project_id、session_id,在 Agent 模式下默认启用 (enable_memory=True)。
上下文集成
记忆通过两种机制参与 Agent 的上下文(Context):- 被动注入:在系统提示词组装阶段,系统自动获取用户/项目画像和语义相关的记忆条目,以结构化文本追加到提示词末尾
- 主动提取:在 Agent 执行阶段,Agent 主动调用
memory_save提取并持久化重要信息
_init_context() 调用 _fetch_profile() 获取用户/项目画像,调用 _fetch_relevant_memories() 进行语义检索获取 Top K 记忆条目,两者格式化后追加到系统提示词末尾。
主动提取流程:在 Agent 执行阶段,Agent 调用 memory_save 工具,经 Gate 门控验证后,同时写入 pgvector(向量索引)和 PostgreSQL(元数据)。
完整的系统提示词组装流程参见系统提示词,更广泛的上下文组装参见上下文。
检索排序算法
多 scope 记忆检索后,通过加权评分进行合并排序: final_score = similarity × 0.5 + confidence × 0.3 + scope_priority × 0.2 其中 scope 优先级:| Scope | 优先级权重 | 说明 |
|---|---|---|
| session | 1.0 | 当前会话最相关 |
| project | 0.8 | 项目上下文次之 |
| user | 0.6 | 全局信息基础 |
权限模型
项目级记忆具有细粒度的权限控制:| 角色 | 读取 | 创建 | 编辑 | 删除 |
|---|---|---|---|---|
| Owner | 全部 | 全部 | 全部 | 全部 |
| Admin | 全部 | 全部 | 全部 | 全部 |
| Editor | 全部 | 全部 | 仅自己创建 | 仅自己创建 |
| Viewer | 全部 | 不可 | 不可 | 不可 |
visibility 字段进一步控制可见范围:
public:所有项目成员可见members:项目成员可见(默认)owner_only:仅创建者可见
向量存储
记忆的向量存储使用 PostgreSQL pgvector 扩展,与 RAG 知识库共享底层基础设施:| 配置项 | 默认值 | 说明 |
|---|---|---|
| Embedding Model | text-embedding-3-small | 支持用户自定义模型 |
| Vector Dimensions | 1536 | 与模型对应 |
| Similarity Metric | Cosine | 余弦相似度 |
| Collection Name | memory | 记忆专用集合 |
create_embeddings(user_id) 自动加载对应配置。
Episodic Memory 与 Checkpoint
Episodic Memory 通过 LangGraph 的PostgresSaver 实现,负责会话状态的持久化与恢复:
Checkpoint 存储的内容:
| 数据 | 说明 |
|---|---|
| messages | 完整消息历史 |
| agent_state | Agent 内部状态(todo_list、推理上下文) |
| tool_states | 工具执行状态 |
| pending_tool_calls | 待用户审批的操作 (HITL) |
session_state_snapshot 表和 checkpoint_archive 表分别用于会话状态快照和过期 checkpoint 归档。