概述
PAI 为每位用户维护独立的长期记忆库,实现跨会话持久化。当前实现采用PostgreSQL 保存业务真值,Milvus 保存向量索引;写入时先落真值,再由独立 memory_index_worker 异步同步索引,读取时优先做相关记忆召回,再回 PostgreSQL 取真值内容。
真值与索引解耦
PostgreSQL 保存正式记忆,Milvus 只负责召回,不承担业务真值职责。
双通道写入
Agent 显式工具调用 + 对话后异步提取,最终统一写入长期记忆表。
异步索引同步
记忆写入后先标记为 DIRTY,再由
memory_index_worker 批量生成 embedding 并写入 Milvus。检索模式可切换
支持
full_inject 和 dense 两种模式,可按环境配置切换。记忆类型
系统支持以下 5 种长期记忆类型:profile 类型用于用户档案字段,不进入长期记忆表,避免昵称、AI 名称、emoji 等身份信息与记忆系统混用。数据模型
长期记忆保存在long_term_memories 表:
双通道写入
通道一:Agent 显式工具
Agent 在对话过程中可直接调用以下工具:
这条路径直接写 PostgreSQL 真值,并同步标记向量状态。
通道二:异步提取管道
每轮对话结束后,系统会调度长期记忆提取管道;独立memory_worker 也会补扫 PENDING / FAILED 的用户消息,确保最终一致性。
三阶段提取流程
1
候选提取 (extract_memory_candidates)
LLM 以当前用户消息为触发源,结合会话摘要与完整上下文提取结构化候选记忆。助手回复仅作上下文,不作为事实来源。候选包含
op、memory_type、key、content、importance、confidence、ttl_days 等字段。2
精炼去重 (_llm_refine_memory_candidates)
第二轮 LLM 调用结合用户已有记忆,对候选逐条裁决:保留、合并到已有记忆、复用既有 key,或直接丢弃。
3
持久化写入 (upsert_long_term_memories)
最终将候选写入
long_term_memories,并根据 key 匹配或语义重复阈值执行覆盖、合并、删除和去重。提取边界
会被保留为长期记忆的内容:- 稳定偏好和习惯
- 30 天后仍有价值的事实信息
- 长期目标、长期项目、长期约束
- 用户明确要求“以后都按这个来”的长期规则
- 短期提醒、待办和执行步骤
- 今晚、明天、这周、本月这类明确时间窗要求
- 仅在短期窗口内成立的条件规则
- 天气快照、日/周/月汇总、短期财务统计
- 可用工具清单、系统状态、技术实现细节、流式开关等内部信息
- 昵称、AI 名称、emoji 等身份档案字段
- 明显错误的档案槽位值,例如把纯数字写进城市、国家、省份等字段
例如“下雨时提醒我带伞”可视为长期约束;“明后天有雨时提醒我带伞”属于短期规则,不会写入长期记忆。
事实来源与硬过滤
- 提取由
user消息驱动;完整上下文和会话摘要只用于判断这条信息是否稳定、是否覆盖旧记忆 assistant回复不会被当作新的事实来源,不会单独生成长期记忆- 当前实现会对一批已知噪声 key 做硬过滤,例如
weather-date_*、tool-*、system-*、reminder-last_*、finance-monthly_* / weekly_* / daily_* - 对工具清单、天气快照、流式输出设置、系统格式说明等内容,即使误进入候选,也会在写入和读取阶段被再次过滤
向量同步
长期记忆写入 PostgreSQL 后,会统一标记为vector_status = DIRTY。独立 memory_index_worker 定时扫描 DIRTY / FAILED 记录并执行:
- 构造索引文本:
[{memory_type}] {memory_key}: {content} - 调用 embedding 模型生成向量
upsert到 Milvus collection- 成功后将对应行更新为
SYNCED
检索流程
系统支持两种读取模式,由LONG_TERM_MEMORY_RETRIEVE_MODE 控制:
dense 模式流程
PostgreSQL决定“这条记忆真实是什么”Milvus决定“当前最该召回哪几条记忆”
生命周期管理
TTL 过期
- 默认 TTL:
730天 - 支持按条目设置
ttl_days - 检索时自动过滤已过期记忆
语义去重
后台清洗
系统提供 consolidate 能力,可按用户批量审查长期记忆,执行保留、删除、合并和规范化更新。后台进程
memory_worker
扫描 PENDING / FAILED 消息并重新执行提取管道,保证消息侧最终一致性。
memory_index_worker
扫描 DIRTY / FAILED 记忆并同步 Milvus,保证向量索引最终一致性。