背景
在多 Agent 协作场景中,Agent 需要跨会话保持上下文记忆,避免重复提问、遗忘关键信息。传统方案需要自建 Mem0 + Redis + Neo4j 等多套中间件,运维复杂且数据分散。
云数据库 PostgreSQL 提供原生的 Agent 长期记忆能力,基于向量 + 图 + 关系三位一体架构,在一个 PostgreSQL 实例内解决 AI Agent 的全部记忆需求。
架构设计
三位一体记忆模型
┌─────────────────────────────────────────────────────┐│ Agent 长期记忆层 │├─────────────────────────────────────────────────────┤│ ││ ┌─────────────┐ ┌──────────────┐ ┌───────────┐ ││ │ 语义记忆 │ │ 关系记忆 │ │ 事实记忆 │ ││ │ (pgvector) │ │ (Apache AGE) │ │ (关系表) │ ││ │ │ │ │ │ │ ││ │ 模糊回忆 │ │ 实体关系 │ │ 精确查询 │ ││ │ 相似度检索 │ │ 因果推理 │ │ 元数据 │ ││ │ RAG 增强 │ │ 知识图谱 │ │ 审计日志 │ ││ └─────────────┘ └──────────────┘ └───────────┘ ││ ││ ┌─────────────────────────────────────────────┐ ││ │ RLS 行级安全 → 多租户 / 多 Agent 数据隔离 │ ││ └─────────────────────────────────────────────┘ │└─────────────────────────────────────────────────────┘
数据模型
-- 核心表结构CREATE SCHEMA memory;-- 记忆记录表(append-only,不可变)CREATE TABLE memory.records (id UUID PRIMARY KEY DEFAULT gen_random_uuid(),tenant_id UUID NOT NULL, -- 租户隔离agent_id UUID NOT NULL, -- 所属 Agentproject_id UUID, -- 所属项目(可选)content TEXT NOT NULL, -- 记忆内容embedding vector(1024), -- 向量嵌入memory_type TEXT DEFAULT 'episodic', -- 记忆类型importance FLOAT DEFAULT 0.5, -- 重要性权重metadata JSONB DEFAULT '{}', -- 扩展元数据created_at TIMESTAMPTZ DEFAULT NOW(),expires_at TIMESTAMPTZ -- 过期时间(可选));-- 向量索引CREATE INDEX idx_memory_embedding ON memory.recordsUSING hnsw (embedding vector_cosine_ops);-- RLS 策略ALTER TABLE memory.records ENABLE ROW LEVEL SECURITY;CREATE POLICY tenant_isolation ON memory.recordsUSING (tenant_id = current_setting('app.tenant_id')::uuid);
记忆类型
类型 | 说明 | 典型用途 |
episodic | 情景记忆 | 对话历史、操作记录 |
semantic | 语义记忆 | 知识片段、概念定义 |
procedural | 程序记忆 | 工作流程、操作步骤 |
preference | 偏好记忆 | 用户偏好、习惯模式 |
核心功能
说明:
以下示例中的
<your-llm-model>、bge-m3 等模型名称仅为示意;请根据实际开通的 tencentdb_ai 模型列表替换。记忆写入
-- 写入一条记忆INSERT INTO memory.records (tenant_id, agent_id, content, embedding, memory_type)VALUES ('550e8400-e29b-41d4-a716-446655440000','agent-planner-001','用户偏好使用 Python 进行数据分析,喜欢简洁的代码风格',tencentdb_ai.get_embedding('bge-m3', '用户偏好使用 Python 进行数据分析'),'preference');
记忆检索(语义搜索)
-- 根据当前上下文检索相关记忆SELECT content, memory_type,1 - (embedding <=> query_vec) AS relevanceFROM memory.recordsWHERE agent_id = 'agent-planner-001'AND (expires_at IS NULL OR expires_at > NOW())ORDER BY embedding <=> tencentdb_ai.get_embedding('bge-m3', '用户的编程偏好是什么?')LIMIT 5;
记忆衰减与遗忘
-- 基于时间和重要性的记忆衰减SELECT content,importance * EXP(-0.01 * EXTRACT(EPOCH FROM (NOW() - created_at)) / 86400) AS current_weightFROM memory.recordsWHERE agent_id = 'agent-planner-001'ORDER BY current_weight DESCLIMIT 10;
记忆总结与压缩
-- 使用大模型对旧记忆进行总结压缩SELECT tencentdb_ai.chat_completions('<your-llm-model>','请将以下多条记忆总结为一段话:' || string_agg(content, E'\\n'))FROM memory.recordsWHERE agent_id = 'agent-planner-001'AND created_at < NOW() - INTERVAL '7 days'GROUP BY DATE(created_at);
多租户隔离
基于 PostgreSQL RLS(行级安全策略)实现多租户数据隔离:
-- 每个 Agent / 租户只能访问自己的记忆SET app.tenant_id = '550e8400-e29b-41d4-a716-446655440000';SET app.agent_id = 'agent-planner-001';-- RLS 自动过滤,无需应用层判断SELECT * FROM memory.records; -- 只返回当前租户的数据
接入方式
接入形态 | 操作方式 |
PG 协议 | 直接执行 SQL 读写 memory.* 表 |
REST API | 通过 PostgREST 调用 /memory/records 端点 |
适用场景
AI 助手:记住用户偏好,提供个性化服务。
客服机器人:记住客户历史问题,避免重复询问。
代码 Agent:记住项目架构和约定,保持一致性。
研究 Agent:积累调研结论,避免重复搜索。