大型语言模型(LLM)常因上下文限制而遗忘对话历史,导致服务不连贯。PolarDB PostgreSQL版提供了一种长期记忆解决方案,该方案基于Mem0框架,整合了向量数据库引擎与图数据库引擎,使得AI Agent能够在跨会话中持久化存储与检索用户的偏好与历史,从而实现真正的长期记忆智能体验。
功能简介
本方案的核心是利用Mem0框架为AI Agent构建一个统一的记忆层。Mem0能够将对话信息转化为结构化或非结构化的记忆,并存储在后端的数据库中。PolarDB PostgreSQL版作为底层数据引擎,为此提供了两种实现路径:
纯向量数据库方案 利用PolarDB PostgreSQL版内置的
pgvector
(向量数据库引擎),将对话中的关键信息转换为向量并存储。当AI Agent需要回忆时,通过向量相似度搜索快速检索相关记忆。此方案实现简单且成本较低,适合在线客服、实时聊天机器人等需要快速语义检索的场景。向量数据库+图数据库方案 结合PolarDB PostgreSQL版内置的
pgvector
(向量数据库引擎)和polar_age
(图数据库引擎)插件,不仅存储对话的语义信息,还通过图结构的三元组(实体1-关系-实体2)存储实体间的复杂关系。例如,在用户说“我喜欢诺兰导演的《星际穿越》”时,系统不仅记住这句话,还会建立“我-喜欢-《星际穿越》”和“诺兰-导演-《星际穿越》”的实体关系。此方案适用于需要长期个性化服务的场景(如智能座仓AI助手、AI伴侣等)、复杂关系推理场景(如医疗诊断、旅行规划等)以及追踪复杂实体演变与关联场景(如企业知识库、金融风控动态规则库等)。
两种方案的互补性体现在:向量数据库+图数据库方案虽能处理复杂关系,但在检索效率上带来了更大的挑战,而纯向量数据库方案在简单场景中表现出更高的效率,但缺乏对深层关系的建模能力。在实际部署过程中,应根据业务复杂度和实时性需求进行混合架构设计。
方案架构
PolarDB PostgreSQL版的一站式的长期记忆解决方案包含以下五个主要部分:
记忆体引擎:建议采用Mem0框架,该框架是一个为AI Agent设计的先进记忆框架,它不仅能融合长短期记忆,还能将信息分层为工作、事实、情景等多种类型,并已支持了PolarDB的向量数据库引擎与图数据引擎能力。
基础数据引擎:PolarDB PostgreSQL版在产品内原生集成了PGVector向量引擎和兼容Apache AGE的图引擎,这种一站式架构避免了多系统拼接的复杂性,并依托云原生能力确保了卓越的性能与扩展性。
模型服务:大语言模型在方案中负责自动从对话中提取、转换和向量化关键信息,您可在PolarDB中直接添加带GPU规格的AI节点,实现数据与模型推理的紧密耦合,从而大幅提升处理效率。
AI应用构建平台:Mem0框架可以作为插件轻松集成到Dify、LangChain等主流AI应用开发框架中,从而构建功能更强大的整体解决方案。
KV缓存增强:对于实时性要求极高的场景,PolarDB PostgreSQL版支持开启分布式KVCache作为上下文缓存加速层,此举能有效减少重复计算,显著稳定并降低推理延迟。
优势
一站式解决方案:PolarDB PostgreSQL版在单一产品内同时提供高性能的向量数据库引擎和图数据库引擎。相比需要采购和维护多个独立数据库产品的方案,本方案可将您的采购成本降低至少50%,并显著简化系统架构,降低运维复杂度和项目风险。
高可扩展性:基于云原生分布式架构,向量存储和图数据管理均支持百亿级规模,能够有效应对业务增长。向量索引的创建和搜索过程中无内存溢出(OOM)风险,图数据库引擎具备百亿级(点+边)大图管理的能力,并支持万级以上的高QPS图搜索可扩展性。此外,系统还支持TTL记录的生命周期自动回收,并提供控制台功能以开启图管理节点进行可视化管理。
高性能:支持向量与图数据的实时写入与查询(写入即可查),查询RT(响应时间)最低可优于50毫秒。若结合AI节点进行本地模型推理,效率可提升1-2倍,再配合分布式KVCache缓存,推理速度可进一步提升5倍以上,同时降低30%-50%的显存占用。
计费说明
本方案涉及的阿里云产品均为付费服务,具体费用说明如下:
PolarDB PostgreSQL版:按规格和使用时长计费。
ECS实例:用于部署Mem0记忆框架,按规格和使用时长计费。
模型服务:本方案使用阿里云大模型服务平台百炼,调用LLM模型和Embedding模型会产生费用,按调用量计费。
使用说明
本教程将引导您结合PolarDB PostgreSQL版纯向量数据库和向量数据库+图数据库方案,以及阿里云大模型服务平台百炼,并基于Mem0框架,构建一个AI Agent长期记忆系统。
开源的Mem0框架版本目前已适配PolarDB PostgreSQL版的pgvector
(向量数据库引擎),但尚未适配polar_age
(图数据库引擎)。如需体验一站式AI Agent长记忆方案,请提交工单与我们联系,以获取经过适配的Mem0框架。
准备工作
一台PolarDB PostgreSQL 16版本集群和一台ECS实例。为确保最佳性能,建议两者位于同一专有网络VPC与交换机内。
在PolarDB PostgreSQL版集群内获取连接地址与端口,并创建对应的数据库账号。
开通阿里云大模型服务平台百炼,并获取API Key。
步骤一:配置ECS环境
登录ECS实例,您可按需选择合适的工具连接实例。
检查Python环境及版本,本方案需使用Python 3.11或更高版本,以下内容以
Alibaba Cloud Linux 3.2104 LTS 64位
操作系统为例进行说明。检查您的环境中是否有Python环境以及Python版本。
python --version
若未安装或版本过低,可执行下述命令安装或更新。
更新系统软件包。
sudo yum update -y
列出所有可用但尚未安装的Python软件包。
sudo yum list available | grep '^python3\([0-9]\|\.[0-3]\+\)\.\(x86_64|aarch64\)*'
从可用的Python软件包中,选择符合Python 3.11的版本进行安装。
sudo yum install python3.11.x86_64 -y
验证环境。
python3.11 --version
将您通过工单获取的Mem0框架(适配PolarDB PostgreSQL版)上传至ECS实例并解压。此处以上传至
/home
目录为例,您可按需选择上传ZIP包的方式。说明若您的ECS环境中未安装zip解压工具,请先执行
sudo yum install -y unzip
命令安装zip解码工具。cd /home unzip mem0.zip
将阿里云大模型服务平台百炼的API Key配置到环境变量。其中,
<YOUR_DASHSCOPE_API_KEY>
为您的API Key。echo "export DASHSCOPE_API_KEY='<YOUR_DASHSCOPE_API_KEY>'" >> ~/.bashrc source ~/.bashrc
将Python环境配置到环境变量。其中,
<mem0_src>
为您的代码目录,依照上述第三步的示例,应设置为/home/mem0
。export PYTHONPATH=<mem0_src>:<mem0_src>/mem0:/home/postgres/.local/lib/python3.11/site-packages/
步骤二:初始化PolarDB数据库
登录PolarDB PostgreSQL版集群。在ECS实例中,请使用PolarDB提供PolarDB-Tools连接您的集群。
说明如需在ECS实例中登录集群,需要先将ECS实例的IP或者所属安全组加入到集群的白名单中。
进入默认的
postgres
数据库,执行以下SQL语句,创建测试数据库和所需插件。创建测试数据库
mem0
。CREATE DATABASE mem0; ALTER DATABASE mem0 SET session_preload_libraries TO 'polar_age';
切换至数据库
mem0
。\c mem0
创建所需插件。
-- 创建图数据库插件 CREATE EXTENSION polar_age; -- 创建向量数据库插件 CREATE EXTENSION vector;
创建图(Graph)。
-- 创建一个名为mem0的图 SELECT ag_catalog.create_graph('mem0'); -- 为图中的顶点(vertex)表增加一个1536维的向量列,用于混合检索 -- 注意:1536维需要与您选用的Embedding模型输出维度一致(如百炼的text-embedding-v2) ALTER TABLE mem0._ag_label_vertex ADD COLUMN embedding vector(1536);
说明PolarDB PostgreSQL版在图(Graph)的点表中增加了向量字段,在底层实现了图+向量混合检索。
设置永久加载插件。
ALTER DATABASE mem0 SET search_path = public,ag_catalog,mem0; ALTER DATABASE mem0 SET session_preload_libraries TO 'polar_age';
说明请注意,使用数据管理 DMS(Data Management)客户端设置
search_path
时,可能会存在兼容性问题。
使用
exit;
命令退出数据库。
步骤三:配置并运行Mem0示例代码
安装PostgreSQL开发工具包。
# 这个命令会安装 pg_config 等构建psycopg2所需的工具 sudo yum install -y postgresql-devel
在
/home/mem0
代码目录中,创建虚拟环境(venv
)隔离项目依赖,避免全局污染。cd /home/mem0 python3.11 -m venv myenv
激活虚拟环境
source myenv/bin/activate
升级pip到最新版本
python -m pip install --upgrade pip
安装Mem0框架及其所需的Python依赖库。
pip install . pip install rank_bm25 pip install psycopg2-binary
体验长期记忆方案。
实时问答记忆体验
纯向量数据库
在项目根目录直接创建一个
run_memory_test.py
文件。touch run_memory_test.py vi run_memory_test.py
将以下代码复制到文件中。其中,请将代码中的占位符(如
<polardb-host>
、<polardb-port>
、<polardb-username>
、<polardb-password>
)替换为您的集群信息。from mem0 import Memory # This example must connect to a neptune-graph instance with 1536 vector dimensions specified. config = { "llm": { "provider": "bailian", "config": {"model": "qwen-plus"}, }, "embedder": { "provider": "bailian", "config": {"model": "text-embedding-v4", "embedding_dims": 1536}, }, "vector_store": { "provider": "pgvector", "config": { "host": "<polardb-host>", "port": <polardb-port>, "dbname": "mem0", "user": "<polardb-username>", "password": "<polardb-password>", "collection_name": "memories" } } } m = Memory.from_config(config_dict=config) debug = True # Using only user_id result = m.add("I like pizza", user_id="alice") if debug: print(result) result = m.add("I hate pizza", user_id="alice") if debug: print(result) result = m.add("I like football", user_id="alice", metadata={"category": "hobbies"}) if debug: print(result) # Using both user_id and agent_id result = m.add("I like pizza", user_id="alice", agent_id="food-assistant") if debug: print(result) # Get all memories for a user result = m.get_all(user_id="alice") if debug: print(result) # Get all memories for a specific agent belonging to a user result = m.get_all(user_id="alice", agent_id="food-assistant") if debug: print(result) # Search memories for a user result = m.search("tell me my name.", user_id="alice") if debug: print(result) # Search memories for a specific agent belonging to a user result = m.search("tell me my name.", user_id="alice", agent_id="food-assistant") if debug: print(result) # Search memories for a user result = m.search("what food do you like.", user_id="alice") if debug: print(result) # Search memories for a user result = m.search("what sport do you like.", user_id="alice") if debug: print(result) # Delete all memories for a user result = m.delete_all(user_id="alice") if debug: print(result) # Delete all memories for a specific agent belonging to a user result = m.delete_all(user_id="alice", agent_id="food-assistant") if debug: print(result)
保存文件并运行脚本。
python run_memory_test.py
观察命令行输出,您将看到记忆被添加、搜索、查询和删除的全过程。
{'results': []} {'results': [{'id': '7f5af484-e8a5-4cae-b53e-e8be53beaa76', 'memory': 'I like pizza', 'event': 'DELETE'}]} {'results': [{'id': '96ec8a90-5a22-4413-98a6-ff91aeacb3c7', 'memory': 'I like football', 'event': 'ADD'}]} {'results': [{'id': 'c2282f35-f84e-4bcd-ad8f-bcfdd47c5185', 'memory': 'I like pizza', 'event': 'ADD'}]} {'results': [{'id': '96ec8a90-5a22-4413-98a6-ff91aeacb3c7', 'memory': 'I like football', 'hash': 'db38eb7ce206333d12734e4251d964c1', 'metadata': {'category': 'hobbies'}, 'created_at': '2025-08-07T03:48:23.367894-07:00', 'updated_at': None, 'user_id': 'alice'}, {'id': 'c2282f35-f84e-4bcd-ad8f-bcfdd47c5185', 'memory': 'I like pizza', 'hash': '3acb2fb7961d7f09e42b99b96b605f3f', 'metadata': None, 'created_at': '2025-08-07T03:48:25.510270-07:00', 'updated_at': None, 'user_id': 'alice', 'agent_id': 'food-assistant'}]} {'results': [{'id': 'c2282f35-f84e-4bcd-ad8f-bcfdd47c5185', 'memory': 'I like pizza', 'hash': '3acb2fb7961d7f09e42b99b96b605f3f', 'metadata': None, 'created_at': '2025-08-07T03:48:25.510270-07:00', 'updated_at': None, 'user_id': 'alice', 'agent_id': 'food-assistant'}]} {'results': [{'id': '96ec8a90-5a22-4413-98a6-ff91aeacb3c7', 'memory': 'I like football', 'hash': 'db38eb7ce206333d12734e4251d964c1', 'metadata': {'category': 'hobbies'}, 'score': 0.696223974227903, 'created_at': '2025-08-07T03:48:23.367894-07:00', 'updated_at': None, 'user_id': 'alice'}, {'id': 'c2282f35-f84e-4bcd-ad8f-bcfdd47c5185', 'memory': 'I like pizza', 'hash': '3acb2fb7961d7f09e42b99b96b605f3f', 'metadata': None, 'score': 0.707332858224723, 'created_at': '2025-08-07T03:48:25.510270-07:00', 'updated_at': None, 'user_id': 'alice', 'agent_id': 'food-assistant'}]} {'results': [{'id': 'c2282f35-f84e-4bcd-ad8f-bcfdd47c5185', 'memory': 'I like pizza', 'hash': '3acb2fb7961d7f09e42b99b96b605f3f', 'metadata': None, 'score': 0.707332858224723, 'created_at': '2025-08-07T03:48:25.510270-07:00', 'updated_at': None, 'user_id': 'alice', 'agent_id': 'food-assistant'}]} {'results': [{'id': 'c2282f35-f84e-4bcd-ad8f-bcfdd47c5185', 'memory': 'I like pizza', 'hash': '3acb2fb7961d7f09e42b99b96b605f3f', 'metadata': None, 'score': 0.413298897746297, 'created_at': '2025-08-07T03:48:25.510270-07:00', 'updated_at': None, 'user_id': 'alice', 'agent_id': 'food-assistant'}, {'id': '96ec8a90-5a22-4413-98a6-ff91aeacb3c7', 'memory': 'I like football', 'hash': 'db38eb7ce206333d12734e4251d964c1', 'metadata': {'category': 'hobbies'}, 'score': 0.458641203722873, 'created_at': '2025-08-07T03:48:23.367894-07:00', 'updated_at': None, 'user_id': 'alice'}]} {'results': [{'id': '96ec8a90-5a22-4413-98a6-ff91aeacb3c7', 'memory': 'I like football', 'hash': 'db38eb7ce206333d12734e4251d964c1', 'metadata': {'category': 'hobbies'}, 'score': 0.278534250172033, 'created_at': '2025-08-07T03:48:23.367894-07:00', 'updated_at': None, 'user_id': 'alice'}, {'id': 'c2282f35-f84e-4bcd-ad8f-bcfdd47c5185', 'memory': 'I like pizza', 'hash': '3acb2fb7961d7f09e42b99b96b605f3f', 'metadata': None, 'score': 0.483608051645996, 'created_at': '2025-08-07T03:48:25.510270-07:00', 'updated_at': None, 'user_id': 'alice', 'agent_id': 'food-assistant'}]} {'message': 'Memories deleted successfully!'} {'message': 'Memories deleted successfully!'}
向量数据库+图数据库
在项目根目录直接创建一个
run_memory_graph_test.py
文件。touch run_memory_graph_test.py vi run_memory_graph_test.py
将以下代码复制到文件中。其中,请将代码中的占位符(如
<polardb-host>
、<polardb-port>
、<polardb-username>
、<polardb-password>
)替换为您的集群信息。from mem0 import Memory # This example must connect to a neptune-graph instance with 1536 vector dimensions specified. config = { "llm": { "provider": "bailian", "config": {"model": "qwen-plus"}, }, "embedder": { "provider": "bailian", "config": {"model": "text-embedding-v4", "embedding_dims": 1536}, }, "vector_store": { "provider": "pgvector", "config": { "host": "<polardb-host>", "port": <polardb-port>, "dbname": "mem0", "user": "<polardb-username>", "password": "<polardb-password>", "collection_name": "memories" } }, "graph_store": { "provider": "polardb", "config": { "url": "<polardb-host>", "port": <polardb-port>, "database": "mem0", "username": "<polardb-username>", "password": "<polardb-password>", "graphname": "mem0", }, } } m = Memory.from_config(config_dict=config) debug = True # Using only user_id result = m.add("I like pizza", user_id="alice") if debug: print(result) result = m.add("I hate pizza", user_id="alice") if debug: print(result) result = m.add("I like football", user_id="alice", metadata={"category": "hobbies"}) if debug: print(result) # Using both user_id and agent_id result = m.add("I like pizza", user_id="alice", agent_id="food-assistant") if debug: print(result) # Get all memories for a user result = m.get_all(user_id="alice") if debug: print(result) # Get all memories for a specific agent belonging to a user result = m.get_all(user_id="alice", agent_id="food-assistant") if debug: print(result) # Search memories for a user result = m.search("tell me my name.", user_id="alice") if debug: print(result) # Search memories for a specific agent belonging to a user result = m.search("tell me my name.", user_id="alice", agent_id="food-assistant") if debug: print(result) # Search memories for a user result = m.search("what food do you like.", user_id="alice") if debug: print(result) # Search memories for a user result = m.search("what sport do you like.", user_id="alice") if debug: print(result) # Delete all memories for a user result = m.delete_all(user_id="alice") if debug: print(result) # Delete all memories for a specific agent belonging to a user result = m.delete_all(user_id="alice", agent_id="food-assistant") if debug: print(result)
保存文件并运行脚本。
python run_memory_graph_test.py
观察命令行输出。您将看到记忆被添加、搜索、查询和删除的全过程,以及每次操作后返回的包含向量搜索结果(
results
)和图关系(relations
)的JSON数据。这直观地展示了AI Agent如何存储和回忆信息。{'results': [{'id': '5d2007c2-b5b7-4632-a6c7-7f3672f6bf8f', 'memory': 'I like pizza', 'event': 'ADD'}], 'relations': {'deleted_entities': [], 'added_entities': [[{'source': 'user_id:_alice', 'relationship': 'likes', 'target': 'pizza', 'source_id': '3_53', 'destination_id': '3_54', 'relationship_id': '31_1'}]]}} {'results': [{'id': '5d2007c2-b5b7-4632-a6c7-7f3672f6bf8f', 'memory': 'Hate pizza', 'event': 'DELETE'}], 'relations': {'deleted_entities': [[{'source': 'user_id:_alice', 'target': 'pizza', 'relationship': 'likes'}]], 'added_entities': [[{'source': 'user_id:_alice', 'relationship': 'hates', 'target': 'pizza'}]]}} {'results': [{'id': '38dfb9a3-82e2-48d7-a8ab-2905aa40854e', 'memory': 'I like football', 'event': 'ADD'}], 'relations': {'deleted_entities': [], 'added_entities': [[{'source': 'alice', 'relationship': 'likes', 'target': 'football', 'source_id': '3_55', 'destination_id': '3_56', 'relationship_id': '31_2'}]]}} {'results': [{'id': '1b469b78-7caa-4fc4-8195-17860dfb5458', 'memory': 'I like pizza', 'event': 'ADD'}], 'relations': {'deleted_entities': [], 'added_entities': [[{'source': 'i', 'relationship': 'likes', 'target': 'pizza', 'source_id': '3_57', 'destination_id': '3_58', 'relationship_id': '31_3'}]]}} {'results': [{'id': '38dfb9a3-82e2-48d7-a8ab-2905aa40854e', 'memory': 'I like football', 'hash': 'db38eb7ce206333d12734e4251d964c1', 'metadata': {'category': 'hobbies'}, 'created_at': '2025-08-07T19:12:10.363695-07:00', 'updated_at': None, 'user_id': 'alice'}, {'id': '1b469b78-7caa-4fc4-8195-17860dfb5458', 'memory': 'I like pizza', 'hash': '3acb2fb7961d7f09e42b99b96b605f3f', 'metadata': None, 'created_at': '2025-08-07T19:12:16.148090-07:00', 'updated_at': None, 'user_id': 'alice', 'agent_id': 'food-assistant'}], 'relations': [{'source': 'user_id:_alice', 'relationship': 'hates', 'target': 'pizza'}, {'source': 'alice', 'relationship': 'likes', 'target': 'football'}, {'source': 'i', 'relationship': 'likes', 'target': 'pizza'}]} {'results': [{'id': '1b469b78-7caa-4fc4-8195-17860dfb5458', 'memory': 'I like pizza', 'hash': '3acb2fb7961d7f09e42b99b96b605f3f', 'metadata': None, 'created_at': '2025-08-07T19:12:16.148090-07:00', 'updated_at': None, 'user_id': 'alice', 'agent_id': 'food-assistant'}], 'relations': []} {'results': [{'id': '38dfb9a3-82e2-48d7-a8ab-2905aa40854e', 'memory': 'I like football', 'hash': 'db38eb7ce206333d12734e4251d964c1', 'metadata': {'category': 'hobbies'}, 'score': 0.6962242450914439, 'created_at': '2025-08-07T19:12:10.363695-07:00', 'updated_at': None, 'user_id': 'alice'}, {'id': '1b469b78-7caa-4fc4-8195-17860dfb5458', 'memory': 'I like pizza', 'hash': '3acb2fb7961d7f09e42b99b96b605f3f', 'metadata': None, 'score': 0.7073326554295456, 'created_at': '2025-08-07T19:12:16.148090-07:00', 'updated_at': None, 'user_id': 'alice', 'agent_id': 'food-assistant'}], 'relations': [{'source': '"alice"', 'relationship': 'likes', 'destination': '"football"'}]} {'results': [{'id': '1b469b78-7caa-4fc4-8195-17860dfb5458', 'memory': 'I like pizza', 'hash': '3acb2fb7961d7f09e42b99b96b605f3f', 'metadata': None, 'score': 0.7073326554295456, 'created_at': '2025-08-07T19:12:16.148090-07:00', 'updated_at': None, 'user_id': 'alice', 'agent_id': 'food-assistant'}], 'relations': []} {'results': [{'id': '1b469b78-7caa-4fc4-8195-17860dfb5458', 'memory': 'I like pizza', 'hash': '3acb2fb7961d7f09e42b99b96b605f3f', 'metadata': None, 'score': 0.4132988460683351, 'created_at': '2025-08-07T19:12:16.148090-07:00', 'updated_at': None, 'user_id': 'alice', 'agent_id': 'food-assistant'}, {'id': '38dfb9a3-82e2-48d7-a8ab-2905aa40854e', 'memory': 'I like football', 'hash': 'db38eb7ce206333d12734e4251d964c1', 'metadata': {'category': 'hobbies'}, 'score': 0.45864128080397715, 'created_at': '2025-08-07T19:12:10.363695-07:00', 'updated_at': None, 'user_id': 'alice'}], 'relations': []} {'results': [{'id': '38dfb9a3-82e2-48d7-a8ab-2905aa40854e', 'memory': 'I like football', 'hash': 'db38eb7ce206333d12734e4251d964c1', 'metadata': {'category': 'hobbies'}, 'score': 0.27853412116386245, 'created_at': '2025-08-07T19:12:10.363695-07:00', 'updated_at': None, 'user_id': 'alice'}, {'id': '1b469b78-7caa-4fc4-8195-17860dfb5458', 'memory': 'I like pizza', 'hash': '3acb2fb7961d7f09e42b99b96b605f3f', 'metadata': None, 'score': 0.4836079842249751, 'created_at': '2025-08-07T19:12:16.148090-07:00', 'updated_at': None, 'user_id': 'alice', 'agent_id': 'food-assistant'}], 'relations': [{'source': '"alice"', 'relationship': 'likes', 'destination': '"football"'}]} {'message': 'Memories deleted successfully!'} {'message': 'Memories deleted successfully!'}
记忆分类与标签体验
纯向量数据库
在项目根目录直接创建一个
run_memory_category_test.py
文件。touch run_memory_category_test.py vi run_memory_category_test.py
将以下代码复制到文件中。其中,请将代码中的占位符(如
<polardb-host>
、<polardb-port>
、<polardb-username>
、<polardb-password>
)替换为您的集群信息。import json from mem0 import Memory from mem0.configs.base import MemoryConfig, LlmConfig, EmbedderConfig # This example must connect to a neptune-graph instance with 1536 vector dimensions specified. config = { "llm" : { "provider": "bailian", "config": {"model": "qwen-plus", "temperature": 0.2, "max_tokens": 2000, "top_p": 1.0}, }, "embedder": { "provider": "bailian", "config": {"model": "text-embedding-v4", "embedding_dims": 1536}, }, "vector_store": { "provider": "pgvector", "config": { "host": "<polardb-host>", "port": <polardb-port>, "dbname": "mem0", "user": "<polardb-username>", "password": "<polardb-password>", "collection_name": "memories" }, }, "reset_vector_store": True } m = Memory.from_config(config_dict=config) # 添加对话记忆 messages = [ {"role": "user", "content": "我喜欢科幻电影,尤其是星际穿越。"}, {"role": "assistant", "content": "星际穿越确实是一部经典的科幻电影!我会记住你喜欢这类电影。"}, {"role": "user", "content": "我也喜欢克里斯托弗·诺兰的其他电影。"}, {"role": "assistant", "content": "诺兰的作品确实很出色!除了《星际穿越》,他还导演了《盗梦空间》、《信条》、《记忆碎片》等经典作品。您对这些电影有什么特别的看法吗?"}, ] # 添加记忆,并附加元数据 m.add(messages, user_id="alice", metadata={"category": "movies", "tags": ["sci-fi", "preferences"], "importance": "high"}) # 检索记忆 memories = m.search(query="帮我推荐喜欢的电影", user_id="alice", filters={"category": "movies"}) print(json.dumps(memories, indent=2, ensure_ascii=False)) # 获取所有记忆 all_memories = m.get_all(user_id="alice") print(json.dumps(all_memories, indent=2, ensure_ascii=False)) # Delete all memories for a user result = m.delete_all(user_id="alice") print(result)
保存文件并运行脚本。
python run_memory_category_test.py
观察命令行输出,您将看到对话记忆被分类以及标签后的搜索、查询和删除的全过程。
{ "results": [ { "id": "5e4a357a-ca3e-4769-9f80-06c9e74c53f3", "memory": "我喜欢科幻电影,尤其是星际穿越", "hash": "d3747e8081810fc535f641ee28207d90", "metadata": { "tags": [ "sci-fi", "preferences" ], "category": "movies", "importance": "high" }, "score": 0.366387451646842, "created_at": "2025-08-07T18:43:39.167113-07:00", "updated_at": null, "user_id": "alice" }, { "id": "68393dda-e498-430d-bfdb-af4552196478", "memory": "我也喜欢克里斯托弗·诺兰的其他电影", "hash": "77408cade088bfad20138a6b405f9e65", "metadata": { "tags": [ "sci-fi", "preferences" ], "category": "movies", "importance": "high" }, "score": 0.451759159564968, "created_at": "2025-08-07T18:43:39.178665-07:00", "updated_at": null, "user_id": "alice" } ] } { "results": [ { "id": "5e4a357a-ca3e-4769-9f80-06c9e74c53f3", "memory": "我喜欢科幻电影,尤其是星际穿越", "hash": "d3747e8081810fc535f641ee28207d90", "metadata": { "tags": [ "sci-fi", "preferences" ], "category": "movies", "importance": "high" }, "created_at": "2025-08-07T18:43:39.167113-07:00", "updated_at": null, "user_id": "alice" }, { "id": "68393dda-e498-430d-bfdb-af4552196478", "memory": "我也喜欢克里斯托弗·诺兰的其他电影", "hash": "77408cade088bfad20138a6b405f9e65", "metadata": { "tags": [ "sci-fi", "preferences" ], "category": "movies", "importance": "high" }, "created_at": "2025-08-07T18:43:39.178665-07:00", "updated_at": null, "user_id": "alice" } ] } {'message': 'Memories deleted successfully!'}
向量数据库+图数据库
在项目根目录直接创建一个
run_memory_category_graph_test.py
文件。touch run_memory_category_graph_test.py vi run_memory_category_graph_test.py
将以下代码复制到文件中。其中,请将代码中的占位符(如
<polardb-host>
、<polardb-port>
、<polardb-username>
、<polardb-password>
)替换为您的集群信息。import json from mem0 import Memory from mem0.configs.base import MemoryConfig, LlmConfig, EmbedderConfig # This example must connect to a neptune-graph instance with 1536 vector dimensions specified. config = { "llm" : { "provider": "bailian", "config": {"model": "qwen-plus", "temperature": 0.2, "max_tokens": 2000, "top_p": 1.0}, }, "embedder": { "provider": "bailian", "config": {"model": "text-embedding-v4", "embedding_dims": 1536}, }, "vector_store": { "provider": "pgvector", "config": { "host": "<polardb-host>", "port": <polardb-port>, "dbname": "mem0", "user": "<polardb-username>", "password": "<polardb-password>", "collection_name": "memories" }, }, "graph_store": { "provider": "polardb", "config": { "url": "<polardb-host>", "port": <polardb-port>, "database": "mem0", "username": "<polardb-username>", "password": "<polardb-password>", "graphname": "mem0", }, }, "reset_vector_store": True } m = Memory.from_config(config_dict=config) # 添加对话记忆 messages = [ {"role": "user", "content": "我喜欢科幻电影,尤其是星际穿越。"}, {"role": "assistant", "content": "星际穿越确实是一部经典的科幻电影!我会记住你喜欢这类电影。"}, {"role": "user", "content": "我也喜欢克里斯托弗·诺兰的其他电影。"}, {"role": "assistant", "content": "诺兰的作品确实很出色!除了《星际穿越》,他还导演了《盗梦空间》、《信条》、《记忆碎片》等经典作品。您对这些电影有什么特别的看法吗?"} ] # 添加记忆,并附加元数据 m.add(messages, user_id="alice", metadata={"category": "movies", "tags": ["sci-fi", "preferences"], "importance": "high"}) # 检索记忆 memories = m.search(query="帮我推荐喜欢的电影", user_id="alice", filters={"category": "movies"}) print(json.dumps(memories, indent=2, ensure_ascii=False)) # 获取所有记忆 all_memories = m.get_all(user_id="alice") print(json.dumps(all_memories, indent=2, ensure_ascii=False)) # Delete all memories for a user result = m.delete_all(user_id="alice") print(result)
保存文件并运行脚本。
python run_memory_category_graph_test.py
观察命令行输出。您将看到对话记忆被分类和标签后的搜索、查询和删除的全过程,以及每次操作后返回的包含向量搜索结果(
results
)和图关系(relations
)的JSON数据。这直观地展示了AI Agent如何存储和回忆信息。{ "results": [ { "id": "ec8d0528-35f0-43ae-9ff1-ef1a93e6a017", "memory": "我喜欢科幻电影,尤其是星际穿越", "hash": "d3747e8081810fc535f641ee28207d90", "metadata": { "tags": [ "sci-fi", "preferences" ], "category": "movies", "importance": "high" }, "score": 0.36638870038909743, "created_at": "2025-08-05T23:22:16.354730-07:00", "updated_at": null, "user_id": "alice" }, { "id": "d55c9188-e2a4-402b-b59c-658f640ab01b", "memory": "我也喜欢克里斯托弗·诺兰的其他电影", "hash": "77408cade088bfad20138a6b405f9e65", "metadata": { "tags": [ "sci-fi", "preferences" ], "category": "movies", "importance": "high" }, "score": 0.4517598055411187, "created_at": "2025-08-05T23:22:16.367098-07:00", "updated_at": null, "user_id": "alice" } ], "relations": [] } { "results": [ { "id": "ec8d0528-35f0-43ae-9ff1-ef1a93e6a017", "memory": "我喜欢科幻电影,尤其是星际穿越", "hash": "d3747e8081810fc535f641ee28207d90", "metadata": { "tags": [ "sci-fi", "preferences" ], "category": "movies", "importance": "high" }, "created_at": "2025-08-05T23:22:16.354730-07:00", "updated_at": null, "user_id": "alice" }, { "id": "d55c9188-e2a4-402b-b59c-658f640ab01b", "memory": "我也喜欢克里斯托弗·诺兰的其他电影", "hash": "77408cade088bfad20138a6b405f9e65", "metadata": { "tags": [ "sci-fi", "preferences" ], "category": "movies", "importance": "high" }, "created_at": "2025-08-05T23:22:16.367098-07:00", "updated_at": null, "user_id": "alice" } ], "relations": [ { "source": "user_id:_alice", "relationship": "喜欢", "target": "克里斯托弗·诺兰的电影" }, { "source": "user_id:_alice", "relationship": "喜欢", "target": "科幻电影" }, { "source": "星际穿越", "relationship": "属于", "target": "科幻电影" }, { "source": "user_id:_alice", "relationship": "喜欢", "target": "克里斯托弗·诺兰的其他电影" }, { "source": "user_id:_alice", "relationship": "喜欢", "target": "星际穿越" }, { "source": "克里斯托弗·诺兰", "relationship": "导演了", "target": "星际穿越" }, { "source": "user_id:_alice", "relationship": "喜欢", "target": "科幻电影" }, { "source": "星际穿越", "relationship": "属于", "target": "科幻电影" }, { "source": "克里斯托弗·诺兰", "relationship": "导演了", "target": "星际穿越" }, { "source": "克里斯托弗·诺兰", "relationship": "导演了", "target": "盗梦空间" }, { "source": "克里斯托弗·诺兰", "relationship": "导演了", "target": "盗梦空间" }, { "source": "克里斯托弗·诺兰", "relationship": "导演了", "target": "信条" }, { "source": "克里斯托弗·诺兰", "relationship": "导演了", "target": "信条" }, { "source": "克里斯托弗·诺兰", "relationship": "导演了", "target": "记忆碎片" }, { "source": "克里斯托弗·诺兰", "relationship": "导演了", "target": "记忆碎片" } ] } {'message': 'Memories deleted successfully!'}
结语
本文详细阐述了基于PolarDB PostgreSQL版与Mem0框架构建的AI Agent长记忆融合方案。该方案不仅整合了短期记忆的即时性与长期记忆的持久性,更凭借PolarDB的独特优势,在激烈的市场竞争中脱颖而出。与同类方案相比,本方案的核心优势体现在:
架构统一,无缝集成:将向量数据库与图数据库能力集于一身,彻底告别了复杂的多系统拼接方案,显著降低了开发与运维成本。
云原生高性能:深度融合云原生弹性、模型推理加速及分布式KVCache技术,确保了AI Agent在处理复杂任务时,依然能提供毫秒级的低延迟响应。
企业级扩展性与成熟度:依托PolarDB久经考验的稳定性和卓越的水平扩展能力,为AI应用的规模化落地提供了坚实与可靠的基础。